如何防止客户端断开连接后samba保持文件locking?

在这里我有一个Samba服务器(Debian 5.0),它被configuration为承载Windows XPconfiguration文件。

客户端连接到此服务器,并直接在samba共享上处理其configuration文件(configuration文件不在本地复制)。

每隔一段时间,客户端可能无法正常closures,因此Windows不会释放文件locking。 在查看sambalocking表时,我们可以看到,即使客户端不再连接,许多文件仍然被locking。 在我们的例子中,这似乎是由Mozilla Thunderbird和Firefox创build的锁文件发生的。 这是一个桑巴locking表的例子:

# smbstatus -L | grep DENY_ALL | head -n5 Pid Uid DenyMode Access R/W Oplock SharePath Name Time -------------------------------------------------------------------------------------------------- 15494 10345 DENY_ALL 0x3019f RDWR EXCLUSIVE+BATCH /home/CORP/user1 app.profile/user1.thunderbird/parent.lock Mon Nov 22 07:12:45 2010 18040 10454 DENY_ALL 0x3019f RDWR EXCLUSIVE+BATCH /home/CORP/user2 app.profile/user2.thunderbird/parent.lock Mon Nov 22 11:20:45 2010 26466 10056 DENY_ALL 0x3019f RDWR EXCLUSIVE+BATCH /home/CORP/user3 app.profile/user3.firefox/parent.lock Mon Nov 22 08:48:23 2010 

我们可以看到这些文件是由Windows打开的,并施加了一个DENY_ALL锁。

现在,当客户端重新连接到这个共享并尝试打开这些文件时,samba说他们被locking并拒绝访问。

有没有办法解决这种情况,或者我错过了什么?

编辑:我们希望避免禁用samba服务器上的文件locking,因为有足够的理由来启用这些locking。

以下步骤帮助我解决了这个问题:

  1. login到samba服务器。
  2. 运行“smbstatus”。
  3. 在输出的第三部分查找对该文件具有locking的进程的pid。
  4. validation它是否与smbstatus输出的第一部分和第二部分中的预期用户名和主机名匹配。
  5. 运行“ps -ef”并查看该pid的smbd已经运行了多久。
  6. 如果在上次重新启动计算机之前它已经运行,那么它就是smbd。 杀死只是一个smbd。 (并确保你得到正确的 – 它应该是一个父母PID不等于1)。

看一下:

 reset on zero vc = yes / no 

看看是否能解决你的问题。

smb.conf手册页:

这个布尔选项控制传入的会话设置是否应该终止来自同一IP的其他连接。 这匹配默认的Windows 2003行为。 当你有一个脆弱的networking和Windows决定重新连接,而旧的连接仍然有共享模式打开的文件时,将此参数设置为是必要的。 这些文件通过新的连接变得无法访问。 客户端在新的连接上发送一个零VC,并且Windows 2003终止来自同一个IP的所有其他连接。 这样locking的文件可以再次访问。 请注意,启用此选项将会终止伪装路由器后面的连接。

编辑
我只是想另一个可能的解决scheme。 你可以在有问题的部分上做这样的事情。

 veto oplock files = /*.lock/ 

这只会阻止.lock文件上的oplocks。

Samba的一些非常聪明的人决定取消这个选项,而且没有替代的select。

到目前为止,SMB兼容性,因为这确实是默认的赢得行为。

除非用户精通linux命令行,并且如何终止打开的文件/进程,否则必须重新启动SMBD或服务器本身来清除它。

很棒,Samba.org。