rsync执行mkstemp失败(错误22)且卡顿,如何解决?
解决rsync同步ext4到NTFS时的文件创建错误问题
问题原因
报错的核心是NTFS文件系统不允许文件名包含某些特殊字符,而源ext4系统支持这些字符。具体来看,出错的文件名里有冒号:(比如17:55:34时间戳部分),NTFS原生不允许这类字符存在于文件名中,导致rsync调用mkstemp创建临时文件时被系统拒绝,抛出Invalid argument错误。
为什么rsync没有跳过问题文件?
rsync默认不会自动跳过引发文件系统错误的文件,它会报告错误,但理论上应该继续处理其他文件。如果出现卡顿,可能是错误触发了重试逻辑,或者--info=progress2的进度输出让你误以为进程停滞(实际可能在处理其他文件)。若要强制rsync跳过错误文件并继续同步,需要显式添加参数。
解决方案
1. 排除垃圾目录(推荐)
.local/share/Trash是系统的垃圾回收目录,里面的文件都是已删除的内容,无需备份。直接在rsync命令中添加排除规则:
sudo rsync -ra --stats --human-readable \ --no-owner --no-group \ --info=progress2 \ --log-file=/home/myuser/rsync-log.log \ --exclude='.local/share/Trash' \ ~ /media/myuser/1234ABCD/
2. 跳过错误文件
如果需要保留垃圾目录但忽略出错的文件,添加--ignore-errors参数让rsync遇到错误时继续执行:
sudo rsync -ra --stats --human-readable \ --no-owner --no-group \ --info=progress2 \ --log-file=/home/myuser/rsync-log.log \ --ignore-errors \ ~ /media/myuser/1234ABCD/
3. 转换非法文件名(进阶)
若要彻底解决文件名兼容性问题,可以使用rsync的--iconv参数将ext4的UTF-8文件名转换为NTFS兼容格式,不过需要搭配字符映射表(比如utf-8,cp1252),但这种方式可能会导致文件名变更,需谨慎使用。
额外注意事项
由于你需要NTFS兼容Windows,需牢记NTFS与ext4的差异:
- NTFS不支持Unix-style的所有者/组权限,所以
--no-owner --no-group参数是正确的; - NTFS对文件名长度、特殊字符有严格限制,同步时尽量避免包含
:*?"<>|等字符的文件; - NTFS的时间戳精度与ext4不同,可添加
--modify-window=1参数来处理时间戳匹配问题。
内容的提问来源于stack exchange,提问作者parsecer
相关产品推荐
相关产品推荐

