我正在根据 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 拥有的文件以缩短列表。