卸载过时的NFS的绑定

我有一个问题,从本地挂载的NFS文件夹中删除使用mount -o bind创build的mount -o bind 。 假设下面的安装结构:

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,soft,tcp,intr,timeo=10,retrans=2,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 ),则手柄将变为过时,这是预期的。

我现在可以用force来卸载NFS挂载

 $ umount -f /srv/nfs-source 

这需要几秒钟,但没有任何问题。 但是,我不能卸载/srv/bind-target/sub1的绑定目录。 强制umount导致:

 $ 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

我已经尝试过预先卸载子目录,find任何访问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没有补丁在上面的testing!)。

我的nfs-utils版本是1.2.2(debian stable)。

有没有人有一个想法我怎么可以:

  • 强制un-mount以其他方式? (任何肮脏的伎俩是值得欢迎的,数据丢失或损坏在这一点上是可以忽略的)
  • 使用别的东西而不是mount -o bind ? (不能使用软链接,导致挂载的目录将在chroot中使用;通过FUSE的bindfs远不是慢的选项)

谢谢,保罗

更新1

  • 随着2.6.32.59的(陈旧)下挂的卸载工作得很好。 这似乎是一个内核回归的错误。
  • 上面的testing用NFSv3来testing。 NFSv4的其他testing显示没有变化。

更新2

  • 我们已经testing了多个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是可访问的和一个挂载点才起作用。 我sitll不能卸载任何这些文件系统,但我能够重新启动autofs并获得一个新的工作树。

这应该适用于任何有故障的nfs subdirs的autofs树。

希望有所帮助。

您可以简单地将远程文件系统安装在/ srv / bind-target / sub1上。

如果你期望这个级别的不可用性,你也应该为NFS指定同步(尽pipe可能是defailt)选项,以降低在你的客户机上没有改变的机会

 $ umount -l 

在没有人工作之前为我工作:

 $ mount -f ...