AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 755753
Accepted
Vladimir Panteleev
Vladimir Panteleev
Asked: 2016-02-13 00:42:01 +0800 CST2016-02-13 00:42:01 +0800 CST 2016-02-13 00:42:01 +0800 CST

使用 rsync 保留所有权,无需 root

  • 772

我想从机器执行增量备份(针对整个文件系统)。rsync这样做会吗,但是我还想保留文件所有权-意思是,可以恢复它。

如果不在rsync目标机器上以 root 身份运行(存储备份),是否可以这样做?

一些想法...

  • 有没有办法以允许chown非 root 用户的方式挂载文件系统(FUSE?)?(我想可能需要noexec禁止抬高。)
  • 某种方式来存储和恢复元数据文件而不是文件系统本身的所有权?
  • tar可以存储文件所有权,但让它与 rsync 或增量备份一起使用会更复杂一些。能够像常规文件系统一样浏览备份也很好。
  • 也许某种假根环境?虚拟机可以工作,但最好避免相关的维护和性能开销。
backup
  • 6 6 个回答
  • 12226 Views

6 个回答

  • Voted
  1. Best Answer
    shodanshok
    2016-02-13T06:14:47+08:002016-02-13T06:14:47+08:00

    如其他答案所述,要直接保留所有权信息,您需要对目标计算机具有 root 访问权限。

    但是,您至少有两种解决方法可以在保留所有权的同时避免 root 访问:

    1. 使用--fake-superrsync 选项。从手册页:

    启用此选项后,rsync 通过附加到每个文件的特殊扩展属性(根据需要)保存/恢复特权属性来模拟超级用户活动

    这意味着所有权不是直接保存在经典的 Unix 风格中,而是所有权信息存储在一个特殊的扩展属性中(即:一种附加到文件的“标签”)。还原时,rsync可以使用此 EA/tag 正确重建原始文件所有者。

    1. 不要让 rsync 保留所有权信息,而是使用getfacl实用程序保留它们。例如,发出getfacl -R MNTPOINT > acls.txt您有效地将所有权(和 ACL)信息保存在文本文件中,以后可以使用该setfacl --restore命令恢复此类信息。
    • 16
  2. Florin Asăvoaie
    2016-02-13T01:52:23+08:002016-02-13T01:52:23+08:00

    如果我是你,我会将备份放在 Docker 容器中的卷上。这样,您可以对其进行良好的限制并避免安全风险,但仍以 root 身份运行它,以便它完成它需要做的事情。

    • 2
  3. TomOnTime
    2016-02-13T05:45:34+08:002016-02-13T05:45:34+08:00

    与其像 rsync 那样一个接一个地复制所有文件,您应该考虑将文件放在某种“容器”中,这样​​您就可以打包所有文件,传输它们,并且永远不会丢失任何元数据。

    你考虑过“焦油”吗?我知道 tar 是 rsync 的对立面:它不是增量的,它不会在任何地方传输数据,等等。

    然而,它非常擅长保留所有权、权限、ACL、修改时间等。您可以制作一个 tar 文件,将其复制到甚至不了解 Unix 执行文件权限的方式(即 Windows、TOPS-20、VAX/VMS)的机器上,然后将其复制回 Unix 主机,解压缩它,并且您获得了它最初拥有的所有权限等。

    有一个 FUSE 文件系统可以挂载(只读)tar 文件。

    当然,您会失去使 rsync 成为如此出色工具的增量副本和其他功能。然而,在 rsync 发明之前,Unix 世界使用 tar 已有 20 多年了,它在某些情况下工作得非常好。

    • 1
  4. Anon Coward
    2021-05-14T19:13:57+08:002021-05-14T19:13:57+08:00

    我假设当您说“没有在目标上以 root 身份运行 rsync”时,您确实遇到了无法以 root 身份建立与目标的连接的问题 - 对吗?换句话说-您的字面意思不是“不以root身份在目标上运行rsync”-而是您真正的意思是“不以root身份与目标建立(自动)连接”-众所周知,这既困难又危险要做的事。

    假设是这种情况(可能是),一种解决方案是使用管道。

    这个想法是在目标机器上创建一个管道,该管道由将在备份中发送的非 root 登录拥有,并将备份流写入该管道。

    然后,在同一台机器上,您对其进行设置,使其运行一个根进程,该进程从管道中读取数据并恢复备份。

    例如(例如使用 tar)- 在机器上提取备份:-

    mknod /tmp/pipe p
    cd /folder-to-restore-into
    sudo tar xfz /tmp/pipe 
    

    在机器上发送备份:

    cd /folder-to-backup
    sudo tar cfz - . | ssh [email protected] 'cat > /tmp/pipe'
    

    您也可以以其他方式执行此操作(将管道放在另一台机器上),如果您希望备份服务器启动备份过程,这可能会很方便(因为要备份的机器将阻塞,直到另一台服务器从管道中读取)。

    • 1
  5. mgutt
    2021-11-10T10:21:00+08:002021-11-10T10:21:00+08:00

    一种解决方案可能是在远程位置创建磁盘映像并将其安装在本地:

    # we assume that /mnt/backup is a mounted SHFS, SMB, etc share
    truncate -s 100GiB /mnt/backup/rsync.img # create image file
    mkfs.ext3 -F /mnt/backup/rsync.img # create filesystem
    echo -e "o\nn\np\n1\n\n\nw" | fdisk /mnt/backup/rsync.img # create partition
    mkdir /mnt/rsync 
    mount -t auto -o loop /mnt/backup/rsync.img /mnt/rsync
    

    现在我们可以在本地机器上以 root 身份运行 rsync:

    args=(
      --recursive
      --links # copy symlinks as symlinks
      --perms # preserve permissions
      --times # preserve modification times
      --group # preserve group
      --owner # preserve owner
      --devices # preserve device files
      --specials # preserve special files
      --acls # preserve ACLs, optional check if really needed: getfacl --recursive --skip-base / 2>/dev/null | grep "file:" | cut -d" " -f3 | awk '{print "/"$1}'
      --xattrs # preserve extended attributes
      --sparse # handle sparse files efficiently
      --delete # delete extraneous files from dest dirs
      --compress # compress file data during the transfer
      --stats # give some file-transfer stats
      # --bwlimit=625 # limit transfer speed in KByte/s, 625 KB = 0.5 Mbit https://www.google.com/search?q=1+mbit+in+kbyte
      --verbose # increase verbosity
      --exclude="/dev"
      --exclude="/lost+found"
      --exclude="/media" # external mounts
      --exclude="/mnt" # external mounts
      --exclude="/proc"
      --exclude="/run"
      --exclude="/sys"
      --exclude="/tmp"
      --exclude="/var/lib/dhcp/proc" # mount to proc
      --exclude="/var/lib/named/proc" # mount to proc
      /
      /mnt/rsync
    )
    rsync "${args[@]}"
    
    • 0
  6. Nikolaidis Fotis
    2016-02-13T05:56:54+08:002016-02-13T05:56:54+08:00

    显然,要从目的地获取“根”文件,您需要根访问权限。但是,有很多方法可以破坏您的系统。

    1)您可以允许 rsync 使用 sudo 没有密码 2)您可以使用 setuid 来 rsync 以便它可以访问根文件,而备份编排器是普通用户而不是根用户。3)使用rssh来限制以上所有的安全风险

    • -1

相关问题

  • 总大小(磁盘)与总大小(媒体)

  • 社区对备份解决方案的意见

  • 无法读取不同 LTO-3 驱动器上的 LTO-3 磁带

  • 使用 TSM 备份时跳过硬链接

  • 使用 rsync 维护名称更改的目录的副本

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve