51 linux unmounting
我经常遇到卸载目录的问题:
卸载/mnt/目录 umount: /mnt/dir: 设备正忙
设备繁忙的原因有很多。有时运行的进程上有打开的锁,有时还有其他目录安装在/mnt/dir.
我的问题:
检查为什么无法卸载目录的步骤是什么。
我知道有很多原因,但如果你解释一个具体的解决方案就可以了。
[编辑]
[X] 在安装的卷上运行进程。
[X] 另一个卷安装在我们要卸载的卷的顶部
[_] NFS 锁定我们要卸载的卷
der*_*ert 87
检查的方法是fuser -vm /mnt/dir,必须以root身份运行。它会告诉您哪些进程正在访问挂载点。
另一种方法是lsof /mnt/dir,它将显示挂载上的每个打开的文件。再次最好以 root 身份运行。
您可以以非 root 用户身份运行其中任何一个,但是输出将仅限于您的进程——来自其他用户的进程将不会被静默显示,即使它们会阻止卸载文件系统。
例子:
Watt:~# fuser -vm /mnt/Zia/src
USER PID ACCESS COMMAND
/mnt/Zia/src: root kernel mount /mnt/Zia/src
anthony 24909 ..c.. bash
anthony 25041 F.c.. gvim
Run Code Online (Sandbox Code Playgroud)
“访问”字段告诉您它是如何被访问的。在这种情况下,内核将其用作挂载(废话,但仅使用此卸载就可以了)。bash将它作为当前工作目录(cd在卸载之前必须到不同的目录)并且 gvim 都有当前目录并打开了一个文件(需要关闭那个 gvim)。
Watt:~# lsof /mnt/Zia/src
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 24909 anthony cwd DIR 0,26 12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim 25041 anthony cwd DIR 0,26 12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim 25041 anthony 6u REG 0,26 16384 3526219 /mnt/Zia/src/perl/.utf8.c.swp (zia.vpn.home:/home/anthony/src)
Run Code Online (Sandbox Code Playgroud)
在此输出中,您可以看到 bash 和 gvim(如 type DIR)的当前目录。您还可以查看 gvim 已打开哪个文件进行写入。
如何强制问题:
fuser有一个-k选项,它将向SIGKILL使用挂载的每个进程发送信号(默认:)。这是阻止挂载繁忙的一种相当有力的方法。(当然,要小心你的东西SIGKILL!)
umount可以-l选择执行延迟卸载。挂载将从文件系统命名空间中删除(因此/mnt/Zia/src在示例中您将不会再看到它)但它保持挂载状态,因此访问它的程序可以继续这样做。当最后一个访问它的程序退出时,卸载实际上会发生。
卸载失败还有一个最终可修复的原因,那就是 NFS 服务器出现故障。您可以在此处使用umount -f,但这样做可能会导致数据丢失。(客户端可能已经缓存了尚未被服务器确认的写入,这些写入将被丢弃。但是,应用程序已经被告知写入成功。)
Fel*_*ipe 29
你应该使用:
sudo umount -l <path>
Run Code Online (Sandbox Code Playgroud)
从手册页:
-l, --lazy懒惰卸载。?现在从文件层次结构中分离文件系统,并在它不再忙时清除对该文件系统的所有引用。
如果您打算将此选项用于网络文件系统或带有子挂载的本地文件系统,则预计在不久的将来会重新启动系统。推荐的用例
umount -l是防止由于无法访问的网络共享而在关机时挂起,在这种情况下,正常的卸载将由于服务器关闭或网络分区而挂起。无法重新安装共享。
另一个卷安装在我们要卸载的卷的顶部:
mount如果在不带参数或选项的情况下调用该命令,您将知道所有已安装的卷(除了-v)。您可以通过添加一些 perl 来获得活动挂载点列表:
mount | perl -pe 's/.*on (\S+) type.*/\1/'
Run Code Online (Sandbox Code Playgroud)
然后,只需在您希望卸载的点上 grep,您就会知道是否在该点上安装了文件系统。
mount | perl -pe 's/.*on (\S+) type.*/\1/' | grep '/mnt/dir/'
Run Code Online (Sandbox Code Playgroud)
那么你有两个解决方案。卸载文件系统,或使用mount --move olddir newdir(kernel >2.5.1)移动它们
| 归档时间: |
|
| 查看次数: |
220237 次 |
| 最近记录: |