我的 Ubuntu 22.04 VM(在我的 synology nas 上)在写入其本地文件系统时会保留文件时间戳,但在写入 cifs 挂载(在 nas 上)时不会保留。这导致它在下次再次运行时重新获取未保留的文件。
我的笔记本电脑 pop_os 22.04 将在同一个 cifs 挂载上保留文件时间戳。
两者都运行相同版本的 rsync 和 cifs-tools。
此处列出的坐骑:
虚拟机:
//192.168.86.37/files on /home/rob/synner type cifs (rw,relatime,vers=3.1.1,cache=strict,username=rob,uid=1000,noforceuid,gid=0,noforcegid,addr=192.168.86.37,file_mode=0755,dir_mode=0755,soft,nounix,serverino,mapposix,rsize=4194304,wsize=4194304,bsize=1048576,echo_interval=60,actimeo=1)
笔记本电脑:
//192.168.86.37/files on /home/rob/synner type cifs (rw,relatime,vers=3.1.1,cache=strict,username=rob,uid=1000,noforceuid,gid=0,noforcegid,addr=192.168.86.37,file_mode=0755,dir_mode=0755,soft,nounix,mapposix,rsize=4194304,wsize=4194304,bsize=1048576,echo_interval=60,actimeo=1,closetimeo=5)
两者上使用的 mount 命令:
mount -t cifs -o username=rob,password=<redacted>,uid=1000 //192.168.86.37/files /home/rob/synner
正在使用的 rsync 命令:
/usr/bin/rsync -avz --progress root@kp3:/home/backup/ /home/rob/synner/hosting_backups/kp3/
编辑:有更多信息..
当虚拟机查看远程(kp3)时,除了新文件外,它还会重新下载已经抓取的文件,但会使用实际抓取文件的时间为所有内容添加时间戳,因此它会在第二天运行时再次执行所有操作。
我还在虚拟机上的挂载命令中添加了“noserverino”,以摆脱其挂载语句中的“serverino”部分,没有任何区别。
答案1
我在rsync
尝试从来源:exfat 安装到目的地:cifs 挂载。
起初我怀疑是否是源文件系统导致了问题,但结果却是我的 cifs 客户端或服务器版本(安装的二进制文件/库)的问题。
最终对我有帮助的是强制 smb/cifs 客户端版本为mount.cifs -o vers=2.0
。
此后,在使用或时rsync
就能按预期保留目标文件系统时间戳。--archive, -a
--times, -t
以下是导致我出现问题的 smb/cifs 版本。
# client
smbclient -V
Version 4.13.13-Debian
apt-cache policy smbclient
smbclient:
Installed: 2:4.13.13+dfsg-1~deb11u5
# server
smbd -V
Version 4.9.5-Debian
apt-cache policy samba
samba:
Installed: 2:4.9.5+dfsg-5+deb10u1
我碰到Ubuntu 错误 #2007055这让我想到尝试将客户端协议从自动选择降级SMB3_11
为SMB2_02
。我猜测随着最新版本的推出,这个错误已经消失。
答案2
最近,我遇到了这个问题,并开始深入研究它。我更新了Ubuntu 错误@Kyle 在此处提供了大量详细信息,并已向 Synology 提交了一张票。以下是当前状态的简要概述:
我目前的评估是,这是 Synology 服务器端的一个错误,由特定客户端发送的 SMB 消息模式触发。我尝试cp -p
使用最新的 Ubuntu 20/22/23 和 Arch 作为客户端执行了一个简单的操作。Ubuntu 20 和 22 客户端重现了这个问题,而 Ubuntu 23 和 Arch 没有。Windows 在执行命令行时也不会copy
。
此外,更换服务器使用 TrueNAS(13.0-U3.1)或最新的 Ubuntu 22。
检查网络捕获情况表明cp -p
,触发问题的客户端将其 SetInfo SMB 消息与创建文件/关闭文件 SMB 消息包装在一起。未触发问题的客户端则不会。
虽然我不认为 Ubuntu 20/22 做错了什么,但我可以看到额外的创建文件/关闭文件消息导致 Synology 服务器忘记了对文件的最后一个操作是设置修改时间,并且当文件关闭时其修改时间不需要更新。然后,当最后的文件关闭消息进来时,修改时间被错误地更新(因为在设置修改时间之前,文件中有字节被写入)。
我真的我希望可以在 synology box 上运行 strace,因为这会显示 smbd 执行的文件访问和 modtime 更改。不幸的是,synogear 不再包含 strace。
答案3
您遇到的问题可以通过更改 Synology NAS 上的设置来解决。在 SMB 高级设置“其他”选项卡中,选中“根据 SMB 客户端请求立即将数据同步到驱动器”。
此首选项控制 SMBstrict sync
配置值。6 年前在 Samba 4.7.0 中由 False 改为 True。
Synology 设备仍将此值默认为 False。不幸的是,False 值会导致此 Samba 错误修复有助于纠正 modtimes不工作。
strict sync
(禁用时该错误修复不起作用,因为smbd_smb2_flush_send
检查lp_strict_sync
并提前返回而不是设置smbd_smb2_flush_done
要运行的回调;smbd_smb2_flush_done
是进行与 modtime 相关的修复的地方之一。)
我已反复确认正是此设置造成了差异。在 Synology 设备上将其设置为 True 会导致 modtimes 被保留。在保留 modtimes 的 Ubuntu VM 上将其设置为 False 会导致其停止。
我将此信息传递给 Synology,他们表示将在未来的 DSM 版本中修复此问题。我还向 Samba 项目提及了 Samba 针对 modtimes 的 bugfix 问题以防他们感兴趣。
或者,你可以将客户端更新到更高版本的 Ubuntu,以发送“更干净”的 SMB 请求,详情如下在我的另一个答案中。但我认为,更改 Synology 服务器上的设置是一种更强大、更可靠的解决方案。