星期三, 六月 06, 2007

From a Samba I/O problem

昨天调整网络的时候发现一个问题,因为之前都是用 Samba 做网络文件系统共享,使用 mount 挂载到本地来做一些备份操作等,昨天在没有 umount 的情况下更改 IP 地址网段,结果发现再运行 df/fuser/lsof 等命令都会导致其进程挂起,使用 ps 显示为状态"D"(Down or Deadlock?),即 Uninterruptable Sleep (Unusally I/O)。这些进程无法用 kill,即使使用 kill -9 也不行。

在网上查了一下,仔细想了一想,觉得这样的机制还是有道理的,因为这种情况通常反映的是 I/O 错误,最常见的就是磁盘错误,如果磁盘损害,出现了无法修复的错误,应该曝出这个错误,而不能使进程可以被 kill 掉。

事实上,对于 NFS 也是一样的,并且这和先终止服务器端的 smbd 进程不同:如果先终止 smbd,不会出现这样的 I/O 问题。

这些进程只能通过重启机器来消除,或者先把 IP 地址改回来,待 umount 之后再重新更改 IP 地址。对于网络文件系统,可以考虑更改 network SysV init 脚本,将相应的检查和操作加入其中。

没有评论: