客户端断开连接后,如何防止 samba 持有文件锁?

Jea*_*tte 13 linux samba server-message-block

这里我有一个配置为托管 Windows XP 配置文件的 Samba 服务器(Debian 5.0)。

客户端连接到此服务器并直接在 samba 共享上处理他们的配置文件(配置文件不在本地复制)。

有时,客户端可能无法正常关闭,因此 Windows 不会释放文件锁。查看 samba 锁定表时,我们可以看到即使客户端不再连接,许多文件仍然被锁定。在我们的例子中,这似乎发生在 Mozilla Thunderbird 和 Firefox 创建的锁定文件中。下面是一个 samba 锁定表的例子:

# 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
Run Code Online (Sandbox Code Playgroud)

我们可以看到文件被 Windows 打开并施加了 DENY_ALL 锁。

现在,当客户端重新连接到此共享并尝试打开这些文件时,samba 会说它们已被锁定并拒绝访问。

有什么办法可以解决这种情况,还是我遗漏了什么?

编辑:我们想避免禁用Samba服务器上的文件锁定,因为那里有那些能很好的理由。

小智 12

以下步骤帮助我在许多情况下解决了这个确切的问题:

  1. 登录到 samba 服务器。
  2. 运行“smbstatus”。
  3. 在输出的第三部分中找到锁定文件的进程的 pid。
  4. 验证它是否与 smbstatus 输出的第一和第二部分中的预期用户和主机名匹配。
  5. 运行“ps -ef”并查看带有该 pid 的 smbd 已经运行了多长时间。
  6. 如果它在计算机上次重新启动之前一直在运行,则它是一个遗留的 smbd。杀死那一个 smbd。(并确保你得到正确的 - 它应该是一个父 pid 不等于 1 的。)


3di*_*nce 5

看一下:

reset on zero vc = yes / no
Run Code Online (Sandbox Code Playgroud)

看看这是否会解决您的问题。

smb.conf手册页:

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

编辑
我只是想了另一个可能的解决方案。您可以对相关共享执行类似操作。

veto oplock files = /*.lock/
Run Code Online (Sandbox Code Playgroud)

这只会防止 .lock 文件上的机会锁。