我们公司在处理 Libreoffice 和 samba 共享文档时遇到了一个可怕的错误,并且每次都能重现它。
我们所拥有的:
Windows PC 上的 Samba 共享(我们尝试使用 Linux Samba 共享,结果是一样的)。只需一个帐户即可访问,因此所有 PC 都使用相同的登录名和密码来访问共享,但这并不重要,因为即使使用不同的 Samba 帐户,也会出现错误。
多台 Ubuntu 20.04 PC 和多台 Windows 10 PC。
Ubuntu 20.04 PC 可以通过 cifs utils (fstab) 访问共享://srv-dc-02/uc /mnt/EDU2022 cifs credentials=/etc/win-credentials-1,uid=1000,gid=1000,dir_mode=0777,file_mode=0777,iocharset=utf8,nobrl,_netdev 0 0
Libreoffice 的版本无关紧要。我们尝试了默认的 Ubuntu 20.04 LO 版本和最新版本。
重现此错误的步骤:
Ubuntu User1 打开一个文档并开始处理它。
Ubuntu User2 以“只读”或“复制”模式打开同一个文档。
Ubuntu User1 尝试保存文件并立即收到“文件丢失”错误。
此时该文件已从 samba 共享中删除。
如果 Ubuntu User2 关闭了文件的只读版本,那么 Ubuntu User1 实际上可以保存该文件并将其恢复在 samba 共享上。如果 Ubuntu User1 关闭打开的文件,它将永久地从共享中消失。
此错误仅在 Ubuntu+Ubuntu PC 与共享交互时才会出现。如果是 Ubuntu+Windows,则不会发生此错误。
有没有办法来解决这个问题?
答案1
您似乎没有使用 Samba。您正在使用 cifs-utils 从 Windows 机器安装某些东西,这与 Samba 无关。
您需要了解 Windows 如何执行“oplocks”,这些操作允许发起者控制文件并“阻止”其他人执行除读取之外的操作。您还需要了解 Windows 等如何在 Libreoffice 等程序中打开文件,这些程序通常如下:打开文件、创建临时文件、删除原始文件、处理文件、关闭时写入新文件并删除临时文件。
最后,我再说一遍,这些都与 Samba 无关,或者您的意思是 SMB?
答案2
我目前正在解决这个问题,因为我仍然不确定到底发生了什么。
解决方法如下:
- 在 smb.conf 中,启用 full_audit 和 recycle:
vfs objects = fruit streams_xattr full_audit recycle
。还有recycle:repository = /home/.recycle/%U
。 - 现在,如果文件被删除,它并没有消失;它将被保存到回收目录中和您可以在 SMB 审计日志中跟踪其删除情况。
在 LibreOffice 中保存文件通常是这样的:创建一个临时文件:
smbd_audit: user1|create_file|ok|file|create|server/~gvfRs5N.tmp
smbd_audit: user1|pwrite_send|ok|server/~gvfRs5N.tmp
smbd_audit: user1|close|ok|server/~gvfRs5N.tmp
然后重命名:
renameat|ok|server/~gvfRs5N.tmp|server/document.odt
由于某种原因,我总是找不到重命名;然后,由于某种原因,有时我会找到一条unlinkat
日志消息user2
。那就是文件消失的时刻。
现在的解决方案仍然是手动操作:即找到/home/.recycle/user1/~gvfRs5N.tmp
并将其移动到最初保存 document.odt 的位置。
这比不得不说“抱歉,您的文件丢失了,但我有昨天的版本”要好得多。我认为这仍然不可接受。不幸的是,我无法重现导致文件丢失的确切操作数。审计日志有帮助,但作用有限。