是否可以使用 tar 存档(本地)rsync 真正的文件系统(远程)?如果是这样,如何?
问题是我需要正确备份用户/组/权限设置,虽然我在远程有 root 访问权限,但我想避免在本地机器上以 root 身份运行。
我的第一个(也是最重要的)用例是从 Buildroot 生成的 .tar 更新远程嵌入式目标 (ARM9)。我在磁盘上没有“真实的东西”(我可以在作为 root 时生成副本),我想避免传输整个 rootfs 来更新一些文件。
正确的答案似乎是使用 fakeroot 解压 tar 存档(以避免成为 root),然后使用 rsync。如果需要,可以重新打包存档。
不幸的是事情并不那么容易,因为 ssh 和 fakeroot 之间的交互很糟糕。我将详细说明我为帮助任何想要搜索的人所做的事情。
理论很简单:
为了保留所有用户/组/权限,步骤 2..4 必须在 fakeroot 下完成。
问题是 rsync 使用 ssh 进行通信(我希望它这样做!),因此,被“假root”后,它会尝试打开 root 凭据(在 /root/.ssh/ 中),但严重失败。以下一组选项对我有用。
#!/bin/bash
target=myHost
here=$(pwd)
# 1. create a temp directory
cd /tmp
mkdir TMPfs
cd TMPfs
fakeroot bash <<- EOF
# 2. unpack tar archive into it
tar xf $here/archive.tar
# 3. rysnc as needed (ssh options are *the* relevant thing)
rsync -av -e "ssh -i $HOME/.ssh/id_rsa -oUserKnownHostsFile=$HOME/.ssh/known_hosts" . root@$target:/
# 4. if something changed locally repack int a new tar archive (not needed here)
EOF
# 5. cleanup
rm -rf *
cd ..
rmdir TMPfs
Run Code Online (Sandbox Code Playgroud)
我仍然收到错误“无法创建目录 '/root/.ssh'”。但它似乎是良性的(那里没有创建/使用文件)。