rsync 与 tar 存档之间的同步

rsync 与 tar 存档之间的同步

是否可以将真实文件系统 (远程) 与 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 之间的交互很差。我将详细说明我所做的工作,以帮助任何搜索的人。

理论很简单:

  1. 创建临时目录
  2. 将 tar 存档解压到其中
  3. rysnc 根据需要
  4. 如果本地有变化,则重新打包到新的 tar 存档中
  5. 清理

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

相关内容