rsync 到/从 tar 存档

Zio*_*yte 9 linux rsync tar

是否可以使用 tar 存档(本地)rsync 真正的文件系统(远程)?如果是这样,如何?

问题是我需要正确备份用户/组/权限设置,虽然我在远程有 root 访问权限,但我想避免在本地机器上以 root 身份运行。

我的第一个(也是最重要的)用例是从 Buildroot 生成的 .tar 更新远程嵌入式目标 (ARM9)。我在磁盘上没有“真实的东西”(我可以在作为 root 时生成副本),我想避免传输整个 rootfs 来更新一些文件。

Zio*_*yte 2

正确的答案似乎是使用 fakeroot 解压 tar 存档(以避免成为 root),然后使用 rsync。如果需要,可以重新打包存档。

不幸的是事情并不那么容易,因为 ssh 和 fakeroot 之间的交互很糟糕。我将详细说明我为帮助任何想要搜索的人所做的事情。

理论很简单:

  1. 创建临时目录
  2. 将 tar 存档解压到其中
  3. 根据需要进行 rysnc
  4. 如果本地发生更改,请重新打包新的 tar 存档
  5. 清理

为了保留所有用户/组/权限,步骤 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'”。但它似乎是良性的(那里没有创建/使用文件)。