我想从一台机器执行增量备份(针对整个文件系统)。rsync
这样做完全可以,但是我还想保留文件所有权 - 这意味着可以恢复它。
rsync
如果不以 root 身份在目标机器上运行(存储备份),可以做到这一点吗?
一些想法...
- 有没有办法以允许非 root 用户的方式挂载文件系统(FUSE?)
chown
?(我猜可能需要noexec
禁止提升。) - 是否有某种方法可以在元数据文件而不是文件系统本身中存储和恢复所有权?
tar
可以存储文件所有权,但要让它与 rsync 或增量备份一起工作会稍微复杂一些。如果能够像常规文件系统一样浏览备份就更好了。- 也许是某种假根环境?虚拟机可以工作,但最好避免相关的维护和性能开销。
答案1
正如其他答案所述,要直接保留所有权信息,您需要具有目标机器的 root 访问权限。
但是,您至少有两种解决方法可以在保留所有权的同时避免 root 访问权限:
- 使用
--fake-super
rsync 选项。从手册页中:
启用此选项后,rsync 将通过附加到每个文件的特殊扩展属性(根据需要)保存/恢复特权属性来模拟超级用户活动
这意味着所有权不是直接以经典 Unix 风格保存,而是将所有权信息存储在特殊的扩展属性(即附加在文件上的一种“标签”)中。恢复时,rsync
可以使用此 EA/标签正确重建原始文件所有者。
- 不要让 rsync 保留所有权信息,而是使用
getfacl
实用程序保留它们。例如,发出后,getfacl -R MNTPOINT > acls.txt
您便可以有效地将所有权(和 ACL)信息保存在文本文件中,稍后可以使用命令恢复此类信息setfacl --restore
。
答案2
如果我是你,我会将备份放在 Docker 容器中的卷上。这样,你可以对它施加良好的限制并避免安全风险,但仍以 root 身份运行它,以便它执行需要执行的操作。
答案3
您不应该像 rsync 那样逐个复制所有文件,而应该考虑将文件放入某种“容器”中,这样您就可以打包所有文件,进行传输,并且永远不会丢失任何元数据。
您考虑过“tar”吗?我知道 tar 是 rsync 的对立面:它不是增量的,它不会将数据传输到任何地方,等等。
但是它非常擅长保存所有权、权限、ACL、修改时间等。您可以创建一个 tar 文件,将其复制到一台甚至不理解 Unix 文件权限处理方式的机器(即 Windows、TOPS-20、VAX/VMS),然后将其复制回 Unix 主机,解压它,然后您就会获得它原来拥有的所有权限等。
有一个 FUSE 文件系统挂载(只读)tar 文件。
当然,你会失去增量复制和其他使 rsync 如此出色的功能。然而,在 rsync 发明之前,Unix 世界已经使用了 tar 20 多年,它在某些情况下确实很有效。
答案4
一种解决方案可能是在远程位置创建磁盘映像并在本地安装它:
# 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[@]}"