我正在寻找一种实用的方法来备份服务器中的数据并保留所有 ACL 和权限。我查看了 tar,但根据 Google 的说法,tar 不会保留 ACL。我知道 rsync 可以保留 ACL 和权限,但前提是目标系统支持 POSIX ACL 并具有相同的用户。就我而言,我正在将备份执行到位于 AFS 上的目录,因此不支持 POSIX ACL。
目前,我已经通过编写一个脚本解决了这个问题,该脚本使用 find 递归遍历系统(我使用 find 是因为我想排除一些目录)并将权限和 ACL 保存到文本文件中。此解决方案有效,但速度非常慢。有没有更好的解决方案?
答案1
apt-get install star
man star
star -acl -whatever -other -options -you -need
Star 是支持扩展 POSIX 标头的 tar,也就是说,能够在 tar 文件中存储有关文件的一些额外数据。该-acl
选项获取 ACL;您需要它来创建和提取存档。
答案2
如果您不想安装其他程序,您可以单独备份 ACL:
getfacl -R somedir > acls.txt
这会将所有 ACL 转储到somedir
文件中acls.txt
。
要恢复,请使用:
setfacl -R --set-file=acls.txt somedir
答案3
除了星号之外,您还可以使用布斯达
答案4
在这里交叉发布我的答案:https://unix.stackexchange.com/a/725745/550161
当创建/提取档案时,你需要使用--acls
和 --xattrs
选项,当然也有适当的权限来读取/写入这些访问控制列表和属性。
例子:
1.创建档案:
ZSTD_CLEVEL=19 tar --acls --xattrs -caPf systemd-network-conf.tzst --directory=/etc systemd/network systemd/networkd.conf.d
上述操作将创建一个zstd
压缩tar
档案,使用压缩级别19
,同时保留 ACL 和扩展属性。
- 扩展
.tzst
意味着“柏油归档使用規模压缩”,tgz
就像压缩'ed 版本等 - 隐式压缩器使用的压缩级别由同一行开始时
zstd
提供的环境变量设置。ZSTD_CLEVEL
- 参见手册页:
tar(1)
和zstd(1)
。
2. 提取该档案:
sudo tar --acls --xattrs -xvf systemd-network-conf.tzst
上述操作将在您当前目录中创建一个名为的子目录,systemd
因为这是档案库内的公共根目录。
3. 比较原始文件和提取的文件属性。
{cd /etc; getfacl -R systemd/network systemd/networkd.conf.d} >original.acl; cd -
getfacl -R systemd/network systemd/networkd.conf.d >extracted.acl
diff -u original.acl extracted.acl
- 您应该看不到前两行的输出,因为它被重定向到文件。
(第一行除外,它将输出您当前的目录,因为最后一条cd -
命令是单独的,它仅恢复您当前的目录。) - 您也不应该看到 diff 行的输出,因为没有区别。