我在运行 Debian 的 Raspberry Pi 上托管了一个简单的 Apache Web 服务器,到目前为止,它仅提供其默认/var/www/
目录中的静态内容。
我想/var/www/
通过 Samba 共享文件夹,这样我就可以轻松地从 Windows 机器挂载该文件夹并直接在服务器上进行快速更新。
从 Windows 机器(通过 Samba 共享),我可以……
- 读取任何文件类型的文件
- 重命名、创建或删除任何文件类型的文件
- 修改大多数文件类型的内容
然而,我无法从 Windows修改.html
和.htm
文件(也可能是其他文件类型),并在尝试保存修改时收到以下错误消息:
该进程无法访问该文件,因为它正在被另一个进程使用。
无论我在 Windows 中使用哪种编辑器(例如记事本、Visual Studio 等),都会发生这种情况。
在 Windows 中,这给了我一个有趣的功能:重命名受影响的文件(例如,将其从 更改为*.htm
)*.htm.edit
,修改内容,然后将名称改回来。但是,如果不重命名,我就无法编辑它。
我仍然可以修改全部从 Unix 上可以完美地处理文件。
拥有用户和文件权限对于受影响和不受影响的文件而言是相同的:-rwxrw-rw-
请注意,Apache 服务器提供的其他静态 Web 内容(例如 CSS 文件)仍然可以通过 Samba 从 Windows 客户端进行编辑。
由于它似乎仅限于 HTML 相关文件(到目前为止),我天真的猜测是 Samba 和 Apache 之间存在一些冲突,可能与文件锁定有关。我尝试禁用此 Samba 共享的 OpLocks(我不太熟悉它们,但我听说它们会导致一些锁定问题),但没有成功。
smb.conf
以下是与此 Samba 共享相关的Samba 配置文件部分( ):
[www]
Comment = WWW root folder
Path = /var/www
Browseable = yes
Writeable = Yes
only guest = no
create mask = 0777
directory mask = 0777
Public = yes
valid users = pi
force user = pi
strict locking = no
oplocks = False
level2 oplocks = False
我只是希望能够.html
使用 Samba 共享从 Windows 客户端编辑文件。如果能提供任何有关如何排除故障或解决此问题的建议,我将不胜感激。
答案1
我的问题实际上是 Windows 内部的锁冲突,似乎仅出现在 Samba 共享上。
我发现对于某些文件(包括 HTML 文件),预览处理程序Windows 资源管理器预览窗格使用的 SambaDENY_WRITE
文件锁,因此在 Windows 资源管理器中选择文件将锁定该文件以防止其被编辑。
这让我很惊讶:对于本地 Windows 机器上的 HTML 文件,预览处理程序获得的文件锁不会阻止其他进程写入它;但是当文件在 Samba 共享上时,由于某种原因,Windows 文件锁被转换为DENY_WRITE
Samba 中的锁,因此当第二Windows 机器上的进程(文本编辑器)尝试修改该文件,但由于 Samba 锁的存在,它自然会失败。
我个人不需要 Windows 中的预览处理程序,因此我简单地禁用了它们(文件夹选项 >> “查看”选项卡 >> 取消选中“在预览窗格中显示预览处理程序”)。这更像是一种解决方法;理想情况下,预览处理程序的文件锁不会转换为DENY_WRITE
Samba 中的锁。