我不确定发生了什么...我不知道 tar 会这样做。但是当我在根文件系统上提取 tar ( /
) 时,所有权限都已关闭...例如:
root@system:~# tar --no-same-owner --no-same-permissions --no-overwrite-dir -C / -xzvf test.tar.gz
./
./lib/
./lib/test
...
这会导致(我认为)一切毁于一旦/usr/bin
……诊断出有史以来最令人不安的错误:
root@system:~# ls
-bash: /usr/bin/ls: No such file or directory
此时整个操作系统几乎都是 FUBR...我不明白发生了什么。
答案1
许多较新的 Linux 发行版(如Fedora很长一段时间或Debian最近,/usr
一些基础目录已改为使用符号链接。这种转变的原因是那里解释。
被符号链接替换的目录包括:
/
├── bin -> usr/bin
├── lib -> usr/lib
├── lib32 -> usr/lib32
├── lib64 -> usr/lib64
├── libx32 -> usr/libx32
├── sbin -> usr/sbin
正在归档柏油由不遵守相同约定的构建系统或安装暂存区创建的存档,不仅包含文件,还包含包含该文件的目录,将删除与目录--no-overwrite-dir
同名的符号链接(没有看到目录而是符号链接),并用其稀缺内容写入新目录。
因此,创建目录的存档和创建目录内容的存档是有区别的:
tar -cf test.tar.gz lib
和:
tar -cf test.tar.gz lib/*
后者在档案中没有目录,因此在提取时不会删除原始符号链接。
如果前者在实时系统中提取,默认库路径可能将无法再在预期位置找到库。
在当前仍可使用 root shell 的系统上,对此问题的修复方法如下(本例中为 amd64 / x86_64 arch):
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 --library-path /usr/lib/x86_64-linux-gnu /usr/bin/mv /lib /lib_moved
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 --library-path /usr/lib/x86_64-linux-gnu /usr/bin/ln -s usr/lib /lib
如果需要,可以对其他已删除的符号链接进行类似的修复。