rmdir由于“设备或资源忙”而失败

有很多类似的问题,如“设备或资源繁忙”。 但是我觉得我的问题跟他们不一样。

我使用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中挂载共享文件夹,我想在卸载后删除目录,我只是想分享我的解决方案。

  1. 卸载路径

     sudo umount /your_path 
  2. 删除/ etc / fstab中的mout路径

     sudo nano /etc/fstab 
  3. 重启

     sudo reboot 
  4. 删除目录

     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