我的 Tar 备份权限错误

我的 Tar 备份权限错误

我在 Debian Sid 上使用 GNU tar,我想备份系统目录

root@debian:/usr# ( cd /usr ; tar cf - ./share ) | ( cd /home ; tar xf - )

一些解压到的目录/home具有不同的权限,例如,

$ ls -ld /{home,usr}/share/{wallpapers,xindy}
drwx------ 4 root root 4096 Oct  1 00:22 /home/share/wallpapers/
drwxr-xr-x 9 root root 4096 May 16  2016 /home/share/xindy/
drwxr-xr-x 4 root root 4096 Sep 30 19:45 /usr/share/wallpapers/
drwxr-xr-x 9 root root 4096 May 16  2016 /usr/share/xindy/
$

我的错误是什么?

答案1

意外的权限和日期/home/share/wallpapers/是因为命令仍在运行。

Imaginetar被普通用户用来提取r-xr-xr-x具有权限的目录(由用户拥有)和其中的一些文件。如果tar在提取文件之前应用了这些权限,则无法继续处理这些文件。为了解决这个问题,该工具首先授予自己写访问权限 ( rwxr-xr-x),然后恢复文件,然后才将权限更改为应有的权限。

tar以 root 身份提取的过程略有不同。它创建的目录最初属于 ,root:root但不具有组或其他用户的任何访问权限。只有在处理完其中的所有文件后,它才会设置所有权和权限。这意味着所有权可能暂时不匹配。在您的情况下,原始目录归 拥有root:root,因此所有权恰好匹配。您仍然观察到临时用户专属权限。

同样,过早恢复时间戳也是没有意义的。目录内的更改会影响它们。

无论如何,关键是tar需要延迟恢复某些元数据,直到它“认为”已完成目录。

如何tar知道这一点?嗯,它无法确切知道。您的提取tar是从不可寻址的管道读取的,它绝对无法知道将来会得到什么路径。即使从可寻址文件读取tar也会按顺序读取。

实际情况是,该工具假设在遇到share/wallpapers/所有目录内容后,会立即出现。换句话说:在share/wallpapers/遇到零个或多个目录内容后文件路径以 开头share/wallpapers/。然后,不以 开头的路径share/wallpapers/表示我们已完成wallpapers,目录的元数据最终可以恢复。此方法适用于由单个tar处理单个起点创建的档案(如您的情况),因为创建过程tar确实按预期顺序处理文件。

由多个文件创建的档案tar(例如 think about --append)或以任意顺序指定多个文件时,可能包含不寻常顺序的成员。在这种情况下,提取时以下选项很有用:

--delay-directory-restore
延迟设置解压目录的修改时间和权限,直到解压结束。从具有不寻常成员排序的档案中提取时使用此选项。

因此,它会进一步延迟元数据的恢复。

如果您的提取使用了此选项,您会同时tar观察到 和 的意外权限。您没有使用该选项,并且显然是在提取假设完成后进行的观察,因此对于此目录,您观察到了正确的权限。但在观察时尚未完成。/home/share/xindy//home/share/wallpapers/tarxindytarwallpapers

等待命令完成。然后所有权限就应该正确了。

相关内容