有很多类似的问题,如“设备或资源繁忙”。 但是我觉得我的问题跟他们不一样。
我使用mount –bind来绑定一个目录
mount --bind /tmp/origin /tmp/mount
然后可以成功卸载
umount /tmp/mount
然后,如果我立即打电话给rm
rm -rf /tmp/mount
我可以得到一个错误Device or resource busy
。 如果我等了2〜3秒钟,然后打电话给rm,就可以成功。
所以这个行为在这里很奇怪。 我尝试使用
lsof +D /tmp/mount
什么都看不见
我也用fuser -vm /tmp/mount
,看不到任何进程保存这个文件夹。
我在umount /tmp/mount
之前和umount /tmp/mount
之后比较了/proc/mounts
。 /tmp/mount
已经被删除。
我在umount /tmp/mount
之前和umount /tmp/mount
之后比较stat /proc/mounts
。 inode也不同,这意味着/tmp/mount
已经移除完成了。
即使我呼叫sync && echo 2 > /proc/sys/vm/drop_caches
并尝试删除文件caching,它仍然无法正常工作。
我在Ubuntu 14.04和CentOS 6.6上都是这样做的。 他们有相同的结果。
我遇到这样的问题,因为我在VM中挂载共享文件夹,我想在卸载后删除目录,我只是想分享我的解决方案。
卸载路径
sudo umount /your_path
删除/ etc / fstab中的mout路径
sudo nano /etc/fstab
重启
sudo reboot
删除目录
sudo rm -rf /your_path
根据我的经验,以下操作在Linux上是异步的:
close()
返回后立即执行异步发布时, umount()
可能会返回EBUSY
。 请参阅此处的讨论: 第1 页 , 第2页 。 即使我呼叫
sync && echo 2 > /proc/sys/vm/drop_caches
并尝试删除文件缓存,它仍然无法正常工作。
请参阅sync(8)
:
在Linux上,
sync
只能保证安排脏块写入; 实际上可能需要很短的时间才能最终完成所有的块。 在调用sync(2)
之后,reboot(8)
和halt(8)
命令通过休眠几秒钟来考虑这个问题。
至于/proc/sys/vm/drop_caches
,请看这里 :
这是一个非破坏性的操作,不会释放任何脏物体。
因此,在您的命令之后,数据可能仍然排队等待写入,并且尚未完成卸载。
更新
但是,当异步卸载正在运行时,内核将返回EBUSY
以便在挂载设备上进行操作,但不会挂载点 。
所以上面的情况不能成为你的问题的原因:P
PS。
其实我不明白为什么手册页说sync(8)
在Linux中不同步。 它调用sync(2)
,其中指出:
根据标准规范(例如,POSIX.1-2001),
sync()
计划写入,但可能在实际写入完成之前返回。 但是,从版本1.3.20开始, Linux确实在等待。 (这仍然不能保证数据的完整性:现代磁盘有很大的缓存。)
感谢@gv的回答。 但是我发现结果是另一个问题。 分叉进程时我们使用CLONE_NEWNS标志。 更多细节可以在CLONE_NEWNS标志和MESOS-3349设备繁忙错误中找到
简而言之,我们在父进程中挂载。 然后在子进程中卸载,由于CLONE_NEWNS,挂载点仍然存在,由父进程处理。 所以当调用rmdir会得到EBUSY错误代码。
为了避免上述问题,我们可以使用共享挂载或从挂载。 更多细节可参见LWN 159092
查
df -h
然后
sudo umount /path