以 sudo 运行时 rsync --link-dest 的行为

以 sudo 运行时 rsync --link-dest 的行为

为了创建定期备份,我将rsync一起使用--link-dest,以便为未更改的文件创建硬链接。例如:

rsync -ax \
      --partial --delete --delete-excluded --inplace \
      --exclude-from=/tmp/temp_excludes \
      --link-dest=/Volumes/Backup/current \
      /Users /Volumes/Backup/2012-06-25

只要我从我的普通用户帐户启动该过程,它就会运行得很好。虽然我一开始使用这个程序,sudo它就表现得很不稳定,这意味着rsync 副本所有未更改的文件,而不是硬链接他们。

由于sudo修改了环境,我已经尝试过sudo -E确保我的sudoers文件具有相应的选项集。好吧,那也没用。

那么,问题是,我该如何rsync使用sudo虽然上面的例子只显示了目录的备份Users,但我还需要备份一些只能以 root 身份访问的系统文件。

答案1

我建议你rsync先从开始-i --dry-run,以找出它为什么要复制未更改的文件。该-i选项将打印出所有更新以及指定为什么rsync认为文件已更改的代码(校验和、时间戳等)。请参阅手册页以获取代码的完整说明。

您可能还应该指定--numeric-ids源系统和目标系统上的用户 ID 是否不同。

答案2

虽然非常感谢Oliver的建议,但是问题的解决方案如下:

当(外部)设备安装在 OS X 上时,它们有相应的“忽略所有权”标志默认设置。OS X 为此维护一个特殊数据库,可通过vsdbutil(已弃用) 和访问diskutil

根据一些谷歌搜索,这背后的原因似乎是,典型的 OS X 用户是消费产品用户,他们希望从任何其他计算机访问存储在外部 USB 磁盘上的数据,而无需经历所有权、权限等麻烦。

因此,对于所需的备份解决方案来说,使用rsyncsudo关掉这个标志

# sudo diskutil enableOwnership <yourDeviceHere>
sudo diskutil enableOwnership /Volumes/Backup

然后,卸载并重新安装该设备,以确保一切正常。最后,我将调用更新rsync为以下内容:

rsync -aNHAXx -i --fileflags --force-change \
      --partial --delete --delete-excluded --inplace \
      --exclude-from=/tmp/temp_excludes \
      --link-dest=/Volumes/Backup/current \
      /Users /Volumes/Backup/2012-06-25

这个东西现在被塞进了一个(稍微修改过的)bash脚本中,允许增加的在 OS X 下每天备份到外部 USB 磁盘。

答案3

如果你使用备份(rsync 包装器)用于您的备份,在 OS X 系统上运行时它会执行的检查之一是目标磁盘映像/驱动器的权限是否已启用。

如果未启用权限,则备份将不会进行,启用权限的命令将发出警告。

您可能还会发现本文档页面如果您希望继续使用自己的脚本,那么来自 LBackup 项目的内容将会很有趣。

相关内容