是否可以将真实文件系统 (远程) 与 tar 存档 (本地) 进行 rsync?如果可以,如何操作?
问题是我需要正确备份用户/组/权限设置,并且虽然我在远程拥有 root 访问权限,但我想避免在本地机器上以 root 身份运行。
我的第一个(也是最重要的)用例是从 Buildroot 生成的 .tar 更新远程嵌入式目标 (ARM9)。我的磁盘上没有“真实的东西”(我可以在 root 身份下生成副本),并且我想避免传输整个 rootfs 来更新一些文件。
答案1
我实际上还没有尝试过,但它应该有效。
使用‘archivemount’(来源于:)
http://www.cybernoia.de/software/archivemount/
并且许多发行版 (suse、redhat 等) 都包含“libarchive”...
或者使用预先构建的:
https://rpmfind.net/linux/rpm2html/search.php?query=archivemount
您可以使用 Linux 中的 fusermount 工具挂载 tar 存档。
从那里,你应该能够直接使用 rsync 到最终系统。
我编写了一个简单的直通批处理文件来测试 rsync 的直通:
#!/bin/bash
# ussh -- use root@ssh to target system
exec ssh root@"$@"
然后,作为测试,使用 rsync 将目录“test1”传递给“ishtar”,在目标上调用它 /tmp/test2:
RSYNC_RSH=$PWD/Ussh rsync -uva /tmp/test1/ ishtar:/tmp/test2
它会要求您输入目标系统的根登录密码,或者您可以设置目标系统以通过证书接受根登录,这样就不需要密码了。
这个会似乎这是做你想做的事情的最有效方法(你可能需要修改 rsync 选项以不复制目录时间之类的东西),但这是你要找的东西吗?
· 阿斯塔拉
答案2
正确的答案似乎是使用 fakeroot 解压 tar 存档(以避免成为 root),然后使用 rsync。如果需要,可以重新打包存档。
不幸的是,事情并没有这么简单,因为 ssh 和 fakeroot 之间的交互很差。我将详细说明我所做的工作,以帮助任何搜索的人。
理论很简单:
- 创建临时目录
- 将 tar 存档解压到其中
- rysnc 根据需要
- 如果本地有变化,则重新打包到新的 tar 存档中
- 清理
为了保留所有用户/组/权限,步骤 2..4 必须在 fakeroot 下完成。
问题是 rsync 使用 ssh 进行通信(我希望它这样做!),因此,由于“假根”,它会尝试打开 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
我仍然收到错误“无法创建目录‘/root/.ssh’。”但它似乎是良性的(没有在那里创建/使用任何文件)。