强制卸载NFS挂载的目录

163

我在Linux机器上挂载了一个NFS目录,但出现了挂起情况。我已经尝试强制卸载,但似乎没有起作用:

$ umount -f /mnt/data
$ umount2: Device or resource busy
$ umount: /mnt/data: device is busy
如果我输入“mount”,看起来目录不再挂载,但是如果我执行“ls /mnt/data”则会卡住,如果我尝试删除挂载点,则会得到以下错误信息:

如果我输入“mount”,看起来目录不再挂载,但是如果我执行“ls /mnt/data”则会卡住,如果我尝试删除挂载点,则会得到以下错误信息:

$ rmdir /mnt/data
rmdir: /mnt/data: Device or resource busy

除了重新启动机器,我还能做些什么吗?


3
我同意,投票关闭此问题的人严重混淆了事情。这个问题困扰了我多年,而下面的答案——Linux中的umount -l,是我找到的第一个可行的解决方案。 - Lizardx
1
好的,但你可以在Super User上找到它。虽然我不明白为什么这个问题没有被移动而是被关闭了。 - deeenes
对于 umount 命令,使用 --force 选项将更加努力地卸载,而 -v-vvv 选项则会更详细地显示挂载问题。因此,请尝试执行以下命令:umount -vvv --force /badmount - gaoithe
5
因为这个问题是在2008年9月提出的,而Super User直到2009年7月才推出。;-) - Martin Tournoij
@Carpetsmoker,但它在2013年被标记为不相关话题。 - hintss
6个回答

254

你可以尝试使用“懒卸载”:

umount -l

28
@Daniel: 当然可以,但这确实是一个关于Linux的问题(已经标记为这样),而且Linux确实有这个功能。 - Jürgen A. Erhard
这让我的情况变得更糟,因为我仍然无法暂停我的机器。使用eth0别名和umount -f的解决方案起作用了。 - Florian
5
我在Ubuntu上尝试了这个命令,但它不起作用。 - Kieran Andrews
1
这对我有用(Slackware 14.0)。我有一个CIFS挂载,而不是NFS,它使一切都卡住了(包括lsof)。我通过中断我正在编写的备份脚本引起了问题。该脚本挂载和卸载目录,但是中断rsync的某些内容会破坏我的挂载。我不知道懒惰卸载。可能是NAS设备引起了所有麻烦。成功卸载后,结果发现我必须在重新挂载之前重新启动设备。 - paddy
10
@KieranAndrews和其他使用Ubuntu的人,请尝试fusermount -uz /path/to/file。对我来说非常有效! :) - Matt Fletcher
数月未使用此命令后,我通过谷歌搜索回到了这个问题,并找到了这个答案。我注意到我已经点赞了它。我希望我能再次点赞,因为它起作用并再次为我节省了时间。 - Titi

78

如果NFS服务器消失了,而且您无法将其恢复在线状态,我使用的一个技巧是在接口上添加别名,并使用NFS服务器的IP(在此示例中为192.0.2.55)。

Linux

用于执行此操作的命令大致如下:

ifconfig eth0:fakenfs 192.0.2.55 netmask 255.255.255.255

192.0.2.55是掉线的NFS服务器的IP地址。你应该能够ping通这个地址,并且也应该能够卸载文件系统(使用unmount -f)。然后,你应该销毁别名接口,这样你就不会再将流量路由到旧的NFS服务器上了:

ifconfig eth0:fakenfs down

FreeBSD和类似操作系统

命令应该类似于:

ifconfig em0 alias 192.0.2.55 netmask 255.255.255.255

然后将其移除:

ifconfig em0 delete 192.0.2.55

查看 man ifconfig(8) 获取更多信息!


5
对我来说,结合使用ifconfig eth0:fakenfs ...'和umount -f -l /my/mount/dir'解决了我的问题。 - pts
1
我也是,卸载问题让我无法挂起我的笔记本电脑,所以这个解决方案真的很有用。我也制作了自己的脚本来自动化。 - albfan
那么,要从Linux中删除别名,是不是应该使用ifconfig eth0:fakenfs delete命令?还是我需要寻找其他的命令?比如ifconfig eth0 delete 192.0.2.55 - Ehtesh Choudhury
2
@Shurane 在Linux下,使用ifconfig eth0:fakenfs down命令删除别名应该就可以解决问题了。 - Sven
我已经将我的nfs服务器恢复了,但在我ping服务器之前,我无法卸载共享,而且我也不需要进行别名设置。我不确定为什么这样做可以解决问题,但我会把这个留在这里,以防对其他人有所帮助。 - Techwolf
1
谢谢,绝妙的解决方法!在我的情况下,NFS服务器已经恢复在线但仍无法卸载它,这个方法起了作用,干杯。 - nmirceac

20

尝试运行

lsof | grep /mnt/data

这会列出访问/mnt/data的任何进程,防止其卸载。


1
确实有帮助,虽然没有完全解决我的问题,但还是很有用的。 - James T Snell
2
当lsof永远挂起时,请尝试“lsof -b”(与NFS相关的lsof错误,请参见例如https://bugzilla.redhat.com/show_bug.cgi?id=962755)。 - dr0i

11

我遇到了相同的问题,而 无论是 umount /path -f, 还是 umount.nfs /path -f, 亦或是 fuser -km /path, 都没有起作用。

最终,我找到了一个简单的解决方案 >.<

sudo /etc/init.d/nfs-common restart,然后再进行简单的 umount ;-)


5
umount -f -l ... 对我有用。 - mivk
在Ubuntu服务器14.04上,我不得不执行sudo service nfs-kernel-server restart命令,但是你的答案确实让我找到了正确的方向,谢谢! - Murmel

4

在这里找不到可行的答案,但是在Linux上,您可以运行“umount.nfs4 / volume -f”,它肯定会卸载它。


4
umount.nfs4umount命令的一个子命令吗?换句话说,umount -f /some/mountpointumount.nfs4 /some/mountpoint -f是一样的吗? - Ville
1
有趣。在我的电脑上(NFS服务器消失后):umount 调用 umount.nfs,无论选项如何都会一直挂起。umount.nfs4 /mnt -f 需要相当长的时间,但最终完成。umount.nfs4 /mnt -l 立即完成(可能是因为它不等待进程)。 - Tino

4

你的NFS服务器消失了。

理想情况下,最好的办法是等待NFS服务器重新出现。

如果没有出现,"umount -f" 命令应该可以解决问题。这并不总是有效,但通常会有帮助。

如果你知道哪些进程正在使用NFS文件系统,你可以尝试杀死这些进程,然后再尝试卸载。

最后,我建议你重启电脑。

另外,请勿使用软挂载NFS驱动器。使用硬挂载可以保证其可用性,这在进行写操作时是必要的。


软挂载和硬挂载似乎是使用案例的问题。是的,如果NFS服务器出现故障,软挂载会导致当前正在写入的文件损坏,因此可能不适用于系统关键目录,但对于包含非关键文件(如音乐和电影)的驱动器,它将完美地工作。 - zrajm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接