macOS - 更新脚本 - 从 rsync 2.6.9 移动到 3.0.6

macOS - updating scripts - moving from rsync 2.6.9 to 3.0.6

我们在 macOS 上使用 rsync 将特定用户的主目录从 OLD(当前)迁移到 NEW 计算机.

用户拥有台电脑...我们拥有台电脑。

两台计算机都绑定到 Active Directory,我们的脚本保留 UID/GID、资源分支等

Apple bundles rsync 2.6.9 我们需要使用 -E 到 "copy extended attributes",但不幸的是,退回已满 vs delta 已损坏...每个 [=71= rsync 的 ] 被视为完整的 运行。

rsync 3 修复了这个问题,能够 "copy extended attributes" 不中断跟进 运行s...但是由于 GNU v2GNU v3, Apple and LinusT have flipped GNU v3 the bird (deservingly so).

我们就如何在不破坏我们开发人员工作流程的情况下将 rsync 更新到 3.0.6 与 Apple 进行了交流,他们建议我们选择一个文件夹并使用特定路径调用...所以我们选择了 /Library/COMPANY/Applications/rsync 作为安装路径,其中 /Library/COMPANY/Applications/rsync/bin/rsync 成为二进制文件的路径。

技术人员将通过 ssh 连接到用户的 OLD 计算机和 运行 /Library/COMPANY/Scripts/rsyncStuff.sh 这将提示输入条件,简而言之 运行 命令像这样:

/usr/bin/rsync --log-file=/Library/Logs/rsyncTransfer_${dateStamp}.log --exclude '<stuff>' --archive --verbose --delete --extended-attributes --progress --recursive --human-readable -e ssh /Users/jdoe adminUser@${NEWcomputerIpAddress}:/Users/Shared/

我们研究了 rsync 2.6.9 和 3.0.6 之间的差异,我们最好的猜测是这个命令基本上会做同样的事情:

/Library/COMPANY/Applications/rsync/bin/rsync --log-file=/Library/Logs/rsyncTransfer_${dateStamp}.log --exclude '<stuff>' --archive --verbose --delete --xattrs --acls --progress --recursive --human-readable -e ssh /Users/jdoe adminName@${NEWcomputerIpAddress}:/Users/Shared/

注意 rsync 2.6.9 使用 --extended-attributes,其中 rsync 3.0.6 使用 --xattrs --acls。健全性检查,这看起来正确吗?

一位同事问我们是否应该使用 2.6.9 中存在的 --rsync-path=PROGRAM,不确定是否需要它,因为技术正在调用我们的脚本,而我们管理包括路径在内的命令到 rsync...完整性检查,以防万一。 :)

[编辑:确认不需要 --rsync-path=PROGRAM。]

TIA, 唐

小结:如果你想要扩展属性,不要在rsync v2和v3之间转换;挑一个,用在两端。

更长的解释:为了支持扩展属性(和 Finder 标志,以及 HFS+ 支持的所有其他非标准元数据),Apple 修改了 macOS 附带的 rsync v2.x 以使用 AppleDouble format .除了所有真实文件之外,它还会同步带有“._”前缀的虚假元数据 "files"——也就是说,如果您有一个名为 "notes.txt" 的文件,它会同时同步两个 [=25] =] 和“._notes.txt”,后者包含文件的元数据。增量传输对于主文件应该可以正常工作,但元数据文件不支持;这无关紧要,因为元数据文件通常很小。

rsync v3 另一方面,以完全不同且不兼容的方式向标准添加了可扩展元数据。我不记得我对此进行了多彻底的测试,但是如果您尝试将扩展元数据从 v3 传输到 v2,IIRC 会拒绝它,因为远程 (v2) 不支持该功能。如果你尝试从 Apple 的 v2 到 v3,你会得到一堆实际的“._”文件,因为接收器不将它们识别为元数据。

此外,关于不同的命令行选项,您是正确的,但在 v3 上,您可能还需要 --ctimes(保留创建时间)和 --fileflags(保留标志)。虽然最后一个带有警告:我 运行 遇到了 v3 锁定文件的麻烦(由于传输 uchg 文件标志)然后未能设置它们的其他属性。

就我个人而言,我更喜欢使用 v3,所以我只是将它复制到我要在它们之间传输的计算机上。我通常将其安装为 /usr/local/bin/rsync3,因此对于正在使用的版本没有歧义。

戈登戴维森的回复非常有帮助。

"answer" 会阅读他的回复,并根据您的环境以及您管理 Mac 的方式选择他提到的有用选项。

简而言之,安装 rsync 3.0.6 非常有效,恰好是 Mike Bombich 用于 Carbon Copy Cloner 的版本。他现在在 Apple 工作,所以我相信他的判断。 :)

在我们的例子中,我们无法启用 root,所以一旦 rsync 完成,将文件夹从 /Users/Shared/jdoe 移动到 /Users/jdoe 并递归地将所有者设置为 jdoe。

George Davisson 的建议真是令人大开眼界,特别是关于为什么 /Users/jdoe(在旧计算机上)rsync'd 到 /Users/shared/jdoe(在新计算机上)必须递归设置为jdoe 作为所有者。我们必须这样做的原因是我们无法启用 root,但有些人可能能够启用 root,这将使 rsync 过程的步骤更少。

这是我们最终测试的命令...一如既往,我们一直在寻求改进我们的流程,因此我们对任何未来都持开放态度suggestions/changes:

/Library/COMPANY/Applications/rsync/bin/rsync --rsync-path=/Library/ATOS/Applications/rsync/bin/rsync --log-file=${logFolder}/rsyncTransfer_${dateStamp}.log --exclude '.Trash' --exclude '.DS_Store' --exclude 'Library/Caches' --exclude 'Library/Keychains' --exclude 'Library/Saved Application State' --exclude 'Box Documents' --exclude 'Box Sync' --archive --verbose --acls --xattrs  --delete --progress --recursive --human-readable -e ssh /Users/${userName} ${adminName}@${ipAddress}:/Users/Shared/

rsync 完成后,运行 sudo mv /Users/Shared/${username} /Users/${username}sudo chown -R ${username} /Users/${username} 并让用户登录。

再次感谢 Gordon Davisson 提供的所有精彩信息!