it-swarm.cn

umount:设备正忙。为什么?

当运行umount /path我得到:

umount: /path: device is busy.

文件系统很大,所以lsof +D /path不是一个现实的选择。

lsof /pathlsof +f -- /pathfuser /path全部不返回任何内容。 fuser -v /path给出:

                  USER        PID ACCESS COMMAND
/path:            root     kernel mount /path

这对于所有未使用的已挂载文件系统都是正常的。

umount -lumount -f不足以适合我的情况。

我如何弄清楚为什么内核认为这个文件系统很忙?

186
Ole Tange

看来造成我问题的原因是nfs-kernel-server正在导出目录。 nfs-kernel-server可能落后于常规打开的文件,因此lsoffuser未列出。

当我停止nfs-kernel-server我可以umount目录。

到目前为止,我已经制作了一个包含所有解决方案示例的页面: http://oletange.blogspot.com/2012/04/umount-device-is-busy-why.html

149
Ole Tange

要添加到 BruceCrancomment 以上,我刚才出现此问题的原因是陈旧回送安装。我已经检查了fuser -vm <mountpoint>/_lsof +D <mountpoint>mountcat /proc/mounts的输出,检查是否有某些旧的nfs-kernel-server正在运行,是否关闭了配额,并尝试了(但失败了)一个umount -f <mountpoint>,几乎所有人都辞职了,放弃了924天的正常运行时间,然后才最终检查losetup的输出并找到两个陈旧的已配置但未安装的环回:

parsley:/mnt# cat /proc/mounts 
rootfs / rootfs rw 0 0
none /sys sysfs rw,nosuid,nodev,noexec 0 0
none /proc proc rw,nosuid,nodev,noexec 0 0
udev /dev tmpfs rw,size=10240k,mode=755 0 0
/dev/mapper/stuff-root / ext3 rw,errors=remount-ro,data=ordered 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=755 0 0
usbfs /proc/bus/usb usbfs rw,nosuid,nodev,noexec 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,nosuid,noexec,gid=5,mode=620 0 0
fusectl /sys/fs/Fuse/connections fusectl rw 0 0
/dev/dm-2 /mnt/big ext3 rw,errors=remount-ro,data=ordered,jqfmt=vfsv0,usrjquota=aquota.user 0 0

然后

parsley:/mnt# fuser -vm /mnt/big/
parsley:/mnt# lsof +D big
parsley:/mnt# umount -f /mnt/big/
umount2: Device or resource busy
umount: /mnt/big: device is busy
umount2: Device or resource busy
umount: /mnt/big: device is busy

parsley:/mnt# losetup -a    
/dev/loop0: [fd02]:59 (/mnt/big/dot-dropbox.ext2)
/dev/loop1: [fd02]:59 (/mnt/big/dot-dropbox.ext2)

parsley:/mnt# losetup -d /dev/loop0
parsley:/mnt# losetup -d /dev/loop1
parsley:/mnt# losetup -a
parsley:/mnt# umount big/
parsley:/mnt#

Gentoo论坛帖子 还将交换文件列为潜在罪魁祸首;尽管如今交换到文件的情况可能很少见,但检查cat /proc/swaps的输出也无济于事。我不确定配额是否可以防止出现不合时宜的情况-我当时正抓着稻草。

42
ZakW

不必使用lsof来爬行文件系统,而只需使用打开文件的总列表并将其grep即可。我发现此回报必须更快,尽管准确性较差。它应该完成工作。

lsof | grep '/path'
24
Caleb

对我而言,令人讨厌的进程是在chroot中运行的守护程序。由于它位于chroot中,因此无法找到lsoffuser

如果您怀疑您的chroot中还有其他内容,则Sudo ls -l /proc/*/root | grep chroot将找到罪魁祸首(将“ chroot”替换为chroot的路径)。

23
cibyr

打开文件

带有打开文件的进程是常见的罪魁祸首。显示它们:

lsof +f -- <mountpoint or device>

使用/dev/<device>而不是/mountpoint有一个好处:挂载点在umount -l之后会消失,或者可能被覆盖的挂载隐藏。

fuser也可以使用,但是在我看来lsof具有更有用的输出。但是,fuser在消除导致戏剧的过程时很有用,这样您就可以继续生活。

列出<mountpoint>上的文件(请参见上面的注意事项):

fuser -vmM <mountpoint>

以交互方式仅杀死打开了可写入文件的进程:

fuser -vmMkiw <mountpoint>

重新安装只读(mount -o remount,ro <mountpoint>)后,可以安全地杀死所有剩余进程:

fuser -vmMk <mountpoint>

挂载点

罪魁祸首可能是内核本身。您尝试umount挂载在文件系统上的另一个文件系统会引起悲伤。检查:

mount | grep <mountpoint>/

对于环回安装,还请检查以下输出:

losetup -la

匿名索引节点(Linux)

匿名索引节点 可以通过以下方式创建:

  • 临时文件(openO_TMPFILE
  • inotify 手表
  • [eventfd]
  • [事件投票]
  • [timerfd]

这些是口袋妖怪中最难以捉摸的类型,在lsofTYPE列中显示为a_inode(在 lsof手册页中没有说明 ) 。

它们不会出现在lsof +f -- /dev/<device>中,因此您需要:

lsof | grep a_inode

有关杀死持有匿名inode的进程,请参阅: 列出当前inotify监视(路径名,PID)

11
Tom Hale

要使热熔器报告保持安装打开的PID,必须使用-m

fuser -m /path
5
Patrick

我们有一个专有系统,其中根文件系统通常是只读的。有时,当必须复制文件时,会以读写方式重新挂载它:

mount -oremount,rw /

然后重新装回:

mount -oremount,ro /

但这一次,mount一直给mount: / is busy错误。这是由某个进程将一个打开的描述符保存到某个文件(由某个命令以替换)所引起的,该命令在读写文件系统时执行。 lsof -- /输出恰好是(名称已更改):

replicate  1719 admin DEL REG 8,5  204394 /opt/gns/lib/replicate/modules/md_es.so

注意输出中的DEL。只需重新启动保留已删除文件的过程即可解决此问题。

5
pdp

lsoffuser也没有给我任何东西。

在将所有可能的目录重命名为.old并在每次进行更改后每次重新引导系统的过程之后,我发现一个特定的目录(与postfix有关)负责。

原来我曾经从/var/spool/postfix/disk2/pers/mail/postfix/varspool,以最小化基于SDCARD的根文件系统(Sheeva Plug)上的磁盘写入。

使用此符号链接,即使在停止postfixdovecot服务之后(都ps aux 以及 netstat -tuanp没有显示任何相关内容)我无法unmount /disk2/pers

当我删除符号链接并更新postfixdovecot配置文件以直接指向/disk2/pers/我能够成功停止服务和unmount目录。

下次,我将更仔细地观察以下内容的输出:

ls -lR /var | grep ^l | grep disk2

上面的命令将递归列出目录树中的所有符号链接(此处以/var)并筛选出指向特定目标安装点(此处为disk2)的名称。

4
captcha

我遇到了这个问题,结果发现我不知道在后台有活动的屏幕会话。我连接到另一个活动屏幕会话,并且它的Shell当前甚至不在安装目录中。终止其他Shell会话对我来说解决了这个问题。

只是以为我会分享我的决心。

3
colemanm

我的挂载下有几个bindoverlay挂载阻止了我,请检查选项卡补全以获取要卸载的挂载点。我怀疑这特别是覆盖安装,但也可能是绑定

1
ThorSummoner

这不是解决方案,而是答案,但我将其发布,以防它对某人有所帮助。

在我的情况下,我想修改LVM,因为我想使/ var分区更大,所以我需要将其挂载。我尝试了这篇文章中的所有评论并回答了(感谢所有人,尤其是@ ole-tange收集了他们),但仍然出现“设备繁忙”错误。

我也尝试按照0运行级别中指定的顺序杀死大多数进程,以防万一该顺序与我的情况相关,但这也无济于事。因此,我要做的就是为我创建一个自定义运行级别(将chkconfig的输出组合到新的chkconfig --level命令中),它非常类似于1(单用户模式),但是具有网络功能(使用ssh network和xinet)。

当我使用redhat时,运行级别4被标记为“未使用/用户定义”,因此我使用了该级别,然后运行init 4就我而言,这是可以的,因为无论如何我都需要重新启动服务器,但是任何人都需要调整磁盘。

1
Gabriel Xunqueira

今天的问题是一个开放的套接字(特别是tmux):

mount /mnt/disk
export TMPDIR=/mnt/disk
tmux
<<detatch>>
umount /mnt/disk
umount: /mnt/disk: device is busy.
lsof | grep /mnt/disk
tmux      20885             root    6u     unix 0xffff880022346300        0t0    3215201 /mnt/disk/tmux-0/default
1
Ole Tange