从 tar 重新创建 uid/gid unix 权限

从 tar 重新创建 uid/gid unix 权限

我正在根据 system-rescue-cd 的 tar 备份恢复根分区。一切正常,只是 system-rescue-cd 磁盘上的 uid/gid 映射与我正在恢复的 debian 系统上的映射不匹配。这破坏了许多软件包和 setuid/setgid 权限。例如,spool 中的 atjobs 由 bin 而不是 daemon 拥有,手册页不由 man uid 拥有。

如何检测并重新创建来自 tarball 的权限,而无需重新启动恢复过程?

我发现我可以通过“(cd /; tar jdpf /my/backup.tar.bz2)”检测 uid/gid 差异,但现在我必须过滤掉“Uid 不同”和“Gid 不同”输出,并且它不包括输出中的目录,只包括文件。

如果磁盘空间不是问题,如果我将其解压到另一个磁盘,rsync 也许可以做到这一点?

我不想再次提取文件,因为系统上的内容已发生变化。我只想调整权限。

答案1

您可以获取要发出的所有命令的列表,chown如下所示:

tar --numeric-owner -tvjf backup.tar.bz2 | 
perl -e 'while (<STDIN>) { s|/|:|;  @t = split(" ");  print "chown $t[1] \x27$t[5]\x27\n";  }' |
tee /tmp/chown_cmds

输出将会像这样:

chown 0:119 './var/cache/jockey/driverdb-OpenPrintingDriverDB.cache'
chown 0:119 './var/cache/jockey/check'
chown 0:7 './var/cache/cups/'
chown 7:7 './var/cache/cups/ppds.dat'
...

查看/tmp/chown_cmds,确保它看起来不错,然后运行它以从备份中恢复所有 uid/gid:

$ cd / ; sudo bash /tmp/chown_cmds

您可以过滤掉 root 拥有的文件以缩短列表。

相关内容