NFS挂载目录:
$mount -o rw,soft,tcp,intr,timeo=10,retrans=2,retry=1 \ 10.20.0.1:/srv/source /srv/nfs-source
绑定目录:
$mount -o bind /srv/nfs-source/sub1 /srv/bind-target/sub1
这导致此挂载映射
$mount /dev/sda1 on / type ext3 (rw,errors=remount-ro) # ... 10.20.0.1:/srv/source on /srv/nfs-source type nfs (rw,retry=1,addr=10.20.0.100) /srv/nfs-source/sub1 on /srv/bind-target/sub1 type none (rw,bind)
如果服务器(10.20.0.1)发生故障(例如,ifdown eth0),则句柄变为陈旧,这是预期的.
我现在可以用力卸载NFS挂载
$umount -f /srv/nfs-source
这需要几秒钟,但工作没有任何问题.但是,我无法在/ srv / bind-target / sub1中卸载绑定目录.强制卸载导致:
$umount -f /srv/bind-target/sub1 umount2: Stale NFS file handle umount: /srv/bind-target/sub1: Stale NFS file handle umount2: Stale NFS file handle
这是一个跟踪http://pastebin.com/ipvvrVmB
我已经尝试过预先卸载子目录,找到任何进程访问NFS中的任何进程或绑定挂载(没有).
lsof也抱怨:
$lsof -n lsof: WARNING: can't stat() nfs file system /srv/nfs-source Output information may be incomplete. lsof: WARNING: can't stat() nfs file system /srv/bind-target/sub1 (deleted) Output information may be incomplete. lsof: WARNING: can't stat() nfs file system /srv/bind-target/ Output information may be incomplete.
我已经尝试过最近稳定的Linux内核3.2.17,3.2.19和3.3.8(不能使用3.4.x,因为需要grsecurity补丁,但尚未支持 – grsecurity在上面的测试中没有修补!).
我的nfs-utils是版本1.2.2(debian stable).
有没有人知道我怎么能:
>以其他方式强制卸载? (欢迎任何肮脏的技巧,此时数据丢失或损坏可忽略不计)
>使用别的东西而不是mount -o bind? (不能使用软链接,导致挂载的目录将在chroot中使用;通过FUSE的bindfs是一个很慢的选项)
谢谢,
保罗
更新1
>对于2.6.32.59,(陈旧)子安装的卸载工作正常.这似乎是一个内核回归错误.
>以上测试使用NFSv3.使用NFSv4的其他测试显示没有变化.
更新2
>我们现在测试了多个2.6和3.x内核,现在确定,这是在3.0.x中引入的.我们将填写错误报告,希望他们能够弄明白.
解决方法
我有一个autofs树,在/ fs / doom上安装了nfs fs,另一个安装在/ fs / doom / localvol5上.服务器重启后,可以访问/ fs / doom和/ fs / doom / localvol5 / sub,但/ fs / doom / localvol5本身在所有内容上都给了ESTALE,包括umount -f,-l,-fl.
我在没有重启的情况下让客户端运行的做法是将整个/ fs / doom层次结构移动到另一个树:
mkdir /dev/shm/garbage-mount mount --move /fs/doom /dev/shm/garbage-mount
这移动了整棵树,显然只是因为/ fs / doom是可访问的和一个挂载点.我无法卸载任何这些文件系统,但我能够重新启动autofs并获得一个新的工作树.
这适用于任何具有故障nfs子目录的autofs树.
希望有所帮助.