Ubuntu 20.04 上把文件从一块二十 T 的 xfs 盘 rsync 到新盘,报 failed to set times on 某目录,加 -a 就失败,单独 cp 却能拷过去,源盘上 ls -i 看到的 inode 号是十位数。
真正麻烦的地方在于,几个原因的现象几乎一样。源盘用 inode64 分配 inode,编号超过 32 位有符号整数的上限;老版本 rsync 和服务端的 32 位 stat 结构存不下这么大的 inode 号;两台机器的 rsync 版本不一致,-a 里的 -t 依赖 st_ino 做比对;中间还过了一层 NFS,服务端的 inode 转换把高位截断了。
动手时先确认 inode 号到底有多大
ls -i /data | sort -n | tail -3
然后把两端 rsync 都升级到同一版本
rsync --version | head -1 && apt-get install -y rsync
随后换用不依赖 inode 的比对方式先跑一遍
rsync -rt --size-only /data/ /backup/data/
等前面都确认过,再核对文件数量和总大小
find /data -type f | wc -l && du -sb /data /backup/data
改完先别撤,确认这几项。两端 rsync 版本一致后,-a 全量同步不再报 set times 失败,find 统计的文件数与 du 的总字节数完全对齐。
这里还有个坑。inode64 是大容量 xfs 的默认行为,动不了;真正的解法是把客户端工具链升到支持 64 位 inode 的版本,别想着回退挂载参数。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
