Ami*_*rma 393
是!!有一种方法可以立即分离繁忙的设备(即使它很忙,也无法强行卸下).您可以稍后清理所有内容:
umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS(NETWORK-FILE-SYSTEM)
Run Code Online (Sandbox Code Playgroud)
注意:
Fra*_*dor 94
如果可能的话,让我们找到/识别繁忙的进程,终止进程,然后卸载samba共享以最小化损坏.
lsof | grep '<mountpoint of /dev/sda1>' (或任何已安装的设备)
pkill target_process(按名称杀死忙碌程序| kill PID| killall target_process)
umount /dev/sda1 (或任何已安装的设备)
小智 63
当您尝试卸载时,请确保您不在安装的设备中.
Tom*_*ale 58
umount -l在撰写本文时,最高投票的答案建议使用umount -l.
的有用行为umount -l是隐藏文件系统以防止绝对路径名访问,从而最大限度地减少进一步的 moutpoint 使用。
同样的行为可以通过挂载一个空目录来实现,000该目录对要卸载的目录具有权限。
然后,对挂载点下方文件名的任何新访问都将以零权限访问新覆盖的目录 - 从而防止卸载的新阻止程序。
remount,ro要解锁的主要卸载成就是只读重新挂载。当您获得remount,ro徽章时,您知道:
mount -o remount,ro /dev/device 如果有文件打开进行写入,则保证会失败,因此请直接尝试。你可能觉得很幸运,朋克!
如果您不走运,请仅关注打开文件进行写入的进程:
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
Run Code Online (Sandbox Code Playgroud)
然后,您应该能够以只读方式重新安装设备并确保状态一致。
如果此时无法以只读方式重新挂载,请调查此处列出的其他一些可能原因。
只读重装成就解锁?
恭喜,您在挂载点上的数据现在是一致的,并且可以防止将来写入。
fuser不如lsof为什么不fuser早点使用 use呢?好吧,您可以拥有,但 fuser操作的是directory,而不是device,因此如果您想从文件名空间中删除挂载点并仍然使用fuser,则需要:
mount -o bind /media/hdd /mnt到另一个位置就是这样:
null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"
# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked. https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"
# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"
# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"
Run Code Online (Sandbox Code Playgroud)
然后你会有:
fuser.这更复杂[1],但允许您使用:
fuser -vmMkiw <mountpoint>
Run Code Online (Sandbox Code Playgroud)
它将以交互方式要求终止打开文件进行写入的进程。当然,您可以在完全不隐藏挂载点的情况下执行此操作,但是上述模拟方法umount -l没有任何危险。
该-w开关仅限于写入进程,并且-i是交互式的,因此在只读重新挂载后,如果您很着急,则可以使用:
fuser -vmMk <mountpoint>
Run Code Online (Sandbox Code Playgroud)
杀死所有在挂载点下打开文件的剩余进程。
希望此时您可以卸载设备。(umount如果您000在顶部绑定了一个模式目录,则需要在挂载点上运行两次。)
或使用:
fuser -vmMki <mountpoint>
Run Code Online (Sandbox Code Playgroud)
以交互方式杀死阻止卸载的剩余只读进程。
target is busy!打开文件并不是唯一的卸载阻止程序。有关其他原因及其补救措施,请参见此处和此处。
即使您有一些潜伏的小精灵阻止您完全卸载设备,您至少也使您的文件系统处于一致状态。
然后,您可以使用lsof +f -- /dev/device列出包含文件系统的设备上打开文件的所有进程,然后杀死它们。
[1] 使用 不那么复杂mount --move,但这需要mount --make-private /parent-mount-point具有含义的。基本上,如果挂载点挂载在/文件系统下,您应该避免这种情况。
小智 43
尝试以下操作,但在运行之前请注意该-k标志将终止任何正在运行的进程,以保持设备忙碌.
在杀戮之前,-i国旗会fuser问.
fuser -kim /address # kill any processes accessing file
unmount /address
Run Code Online (Sandbox Code Playgroud)
sha*_*ora 15
在卸载文件系统之前。我们需要检查是否有任何进程持有或使用该文件系统。这就是为什么它显示设备正忙或文件系统正在使用中。运行以下命令来找出文件系统使用的进程:
fuser -cu /local/mnt/
它将显示有多少进程持有/使用文件系统。
local/mnt: 1725e(root) 5645c(shasankarora)
ps -ef | grep 1725<-->ps -ef | grep <pid>
kill -9 pid
杀死所有进程,然后您将能够卸载分区/繁忙设备。
我最近有类似的卸载需求,以便用 gparted 更改它的标签。
/dev/sda1 已通过 /etc/fstab 挂载为 /media/myusername。当尝试卸载失败时,我研究了错误。我忘记先卸载挂载点位于 /dev/hda1 上的双分区拇指驱动器。
我按照建议尝试了“lsof”。
$ sudo lsof | grep /dev/sda1
Run Code Online (Sandbox Code Playgroud)
其输出是:
lsof: 警告: 无法 stat() fusion.gvfsd-fuse 文件系统 /run/user/1000/gvfs
输出信息可能不完整。
lsof: 警告: 无法 stat() 熔断文件系统 /run/user/1000/doc
输出信息可能不完整。
由于 lsof 打嗝了两个保险丝警告,我在 /run/user/1000/* 中闲逛,并猜测它可能是打开的文件或安装点(或两者)干扰了事物。
由于挂载点位于 /media/ 中,我再次尝试使用:
$ sudo lsof | grep /media
Run Code Online (Sandbox Code Playgroud)
相同的两个警告,但这次它返回了附加信息:
bash 4350 myusername cwd DIR 8,21 4096 1048577 /media
sudo 36302 root cwd DIR 8,21 4096 1048577 /media
grep 36303 myusername cwd DIR 8,21 4096 1048577 /media
lsof 36304 root cwd DIR 8, 21 4096 1048577 /媒体
lsof 36305根 cwd DIR 8,21 4096 1048577 /media
我还在挠头,就在这时,我想起拇指驱动器从 USB 端口伸出来。也许抓挠有帮助。
因此,我卸载了拇指驱动器分区(卸载一个分区会自动卸载另一个分区)并安全地拔掉拇指驱动器的插头。这样做之后,我能够卸载 /dev/sda1 (不再安装任何东西),用 gparted 重新标记它,重新安装驱动器和拇指驱动器,没有任何问题。
培根得救了。
退房umount2:
Linux 2.1.116添加了umount2()系统调用,与umount()一样,卸载目标,但允许其他标志控制操作的行为:
MNT_FORCE(自Linux 2.1.116起)即使忙碌也强制卸载.(仅适用于NFS挂载.)MNT_DETACH(自Linux 2.4.11起)执行延迟卸载:使挂载点不可用于新访问,并在挂载点停止忙时实际执行卸载.MNT_EXPIRE(自Linux 2.6.8起)将挂载点标记为已过期.如果当前未使用挂载点,则使用此标志对umount2()的初始调用将失败并显示错误EAGAIN,但会将挂载点标记为已过期.只要未被任何进程访问,挂载点将保持过期.指定MNT_EXPIRE的第二个umount2()调用将卸载过期的挂载点.无法使用MNT_FORCE或MNT_DETACH指定此标志.回报价值
成功时,返回零.出错时,返回-1,并正确设置errno.
小智 6
使用exportfs -v检查导出的NFS文件系统.如果找到,请使用exportfs -d share:/ directory删除.这些不会出现在fuser/lsof列表中,并且可以防止umount成功.
sudo fusermount -u -z <mounted path>
Run Code Online (Sandbox Code Playgroud)
注意:不要对路径使用补全,因为这也会冻结终端。
以防万一有人有相同的铅。:
我无法卸载/mntchroot jail的挂载点(此处)。
以下是我输入的用于调查的命令:
$ umount /mnt
umount: /mnt: target is busy.
$ df -h | grep /mnt
/dev/mapper/VGTout-rootFS 4.8G 976M 3.6G 22% /mnt
$ fuser -vm /mnt/
USER PID ACCESS COMMAND
/mnt: root kernel mount /mnt
$ lsof +f -- /dev/mapper/VGTout-rootFS
$
Run Code Online (Sandbox Code Playgroud)
如您所见,即使不lsof返回任何内容。
然后我有了输入这个的想法:
$ df -ah | grep /mnt
/dev/mapper/VGTout-rootFS 4.8G 976M 3.6G 22% /mnt
dev 2.9G 0 2.9G 0% /mnt/dev
$ umount /mnt/dev
$ umount /mnt
$ df -ah | grep /mnt
$
Run Code Online (Sandbox Code Playgroud)
这是我创建的/mnt/dev绑定,/dev以便能够从 chroot jail 内部修复我的系统。
卸载后,我的 pb. 现在解决了。