跳转到内容
新建笔记

Linux 归档与压缩:tar、符号链接与文件系统限制

归档、压缩与文件系统能力

跳转到“归档、压缩与文件系统能力”

归档把多份文件及其路径、类型等信息组织在一个文件里;压缩减少数据体积。tar 可以归档目录,也可以配合 gzip、bzip2 等压缩算法。一个 .tar 文件能记录符号链接,但解包目录所在的文件系统仍须允许创建这种对象。

原 Linux 清单只有工具名;另一条误放在 C++ 分类下的记录把“tar 解压软链接错误”直接归因于 VFAT,并建议格式化为 ext4。原记录没有给出错误原文、目标路径和挂载信息,因此不能确认那次故障的根因。文件系统能力确实值得检查,但不应跳过诊断就格式化数据盘。

按用途理解原来的 17 个工具

跳转到“按用途理解原来的 17 个工具”
工具主要用途与边界
tar打包和解包文件树;是否压缩由所选选项和格式决定
ar创建、列出和提取成员归档,常见于静态库;不是通用目录备份格式
cpio另一类归档格式及工具,常见于文件清单和部分系统镜像流程
gzip、gunzipgzip 压缩及解压;gzip 本身不负责把整个目录树变成一份归档
gzexe把可执行文件制作为解压后运行的包装形式;与普通源码归档用途不同
bzip2、bunzip2、bzip2recoverbzip2 压缩、解压和从受损流中尝试恢复可读块;恢复工具不保证完整恢复原文件
compress传统 Unix .Z 压缩工具;是否安装和兼容性需检查目标系统
zip、unzip、zipinfoZIP 创建、解压及成员信息查看;权限和链接的保留能力取决于工具与选项
lha、unarjLHA/LZH、ARJ 等历史格式相关工具;旧清单不代表现代系统默认安装
dump、restore特定文件系统的备份与恢复工具组合,适用文件系统和版本要另外核实

日常源码目录可先按项目要求选择归档格式;接收已有文件时先辨认实际格式,再选工具。GNU ar 的用途见 Binutils ar,gzip 与目录归档的关系见 GNU gzip 手册,bzip2 的恢复范围见 bzip2 手册。

GNU tar 的符号链接往返实验

跳转到“GNU tar 的符号链接往返实验”

下列命令在 Linux shell 中运行。它们创建一个新的临时目录,只处理示例自己创建的文本文件和相对符号链接。tar 命令使用 GNU tar;不同实现的选项应查各自手册。

终端窗口
set -eu
archive_demo=$(mktemp -d)
cd "$archive_demo"
mkdir source restored
printf '%s\n' 'archive demo' > source/data.txt
ln -s data.txt source/current
tar -cf sample.tar -C source .
tar -tvf sample.tar
tar -xf sample.tar -C restored
test -L restored/current
test "$(readlink restored/current)" = 'data.txt'
cmp source/data.txt restored/data.txt
cmp restored/current restored/data.txt
printf 'passed: %s\n' "$archive_demo"

列表中 current 应显示为指向 data.txt 的符号链接;提取后 test -L 验证对象类型,readlink 验证保存的链接文本,cmp 验证内容。相对链接以链接自身所在目录为解析基准,所以放回同一层级后仍能找到 data.txt。

归档保存链接时,不要求目标始终存在。悬空链接也可以作为链接记录保存;它与“无法创建符号链接”是不同问题。解包结束后只检查文件名而不检查类型和指向,会遗漏这种差别。

先定位错误,再选择解包位置

跳转到“先定位错误,再选择解包位置”

先保留实际错误行,确认出错的是解压数据、创建文件、设置权限还是创建链接。对你准备使用的目标目录,进入后查看:

终端窗口
pwd
findmnt -T "$PWD" -o TARGET,FSTYPE,OPTIONS
stat -f -c '%T' .
id
ls -ld .

findmnt 来自 util-linux,以上 stat 格式采用 GNU Coreutils。这些只读检查用于确认挂载点、文件系统、只读选项与目录权限;显示名称和实际能力还受驱动、挂载选项及容器/网络环境影响。

错误线索需要核对的条件
Operation not permitted 或不支持链接目标文件系统、驱动或策略是否允许符号链接;并不能仅凭这一行断定是 VFAT
Permission denied目标目录的写入和路径搜索权限、身份及相关访问控制
Read-only file system挂载是否只读,以及是否因文件系统错误被改为只读
File exists 或名称冲突解包位置是否已有同名文件/目录;先使用新的空目录判断,避免混入旧结果
解包后链接存在但访问目标失败链接文本、相对位置与目标是否一并归档;目标不存在时是悬空链接

Linux 的 symlink() 明确区分文件系统不支持、权限不足、只读与已有路径等错误,见 symlink(2)。普通 Linux VFAT 挂载不提供原生 Unix 符号链接语义;其属主、权限等行为也由挂载选项补充,不能把它等同于 ext4。核对挂载含义可参考 Linux VFAT 文档。

需要保留链接的 Linux 软件包,应选择一个已经可用且支持这些对象的目标目录,再复核解包结果。普通权限或同名路径错误应按对应原因处理。更换文件系统属于另一个涉及数据迁移的操作,本例不执行格式化、重新挂载或系统配置修改。

--dereference 改变归档内容

跳转到“--dereference 改变归档内容”

GNU tar 创建归档时默认保存符号链接本身。创建时使用 -h / --dereference,则跟随链接保存其指向对象;这可能把原来有共享关系的路径变成普通文件内容,改变包的语义。它不是解包时“强制让任何文件系统支持链接”的开关。GNU tar:符号链接与 dereference

仅对上节自己创建的示例,可以继续比较:

终端窗口
tar -chf followed.tar -C source current
mkdir followed
tar -xf followed.tar -C followed
test -f followed/current
test ! -L followed/current
cmp source/data.txt followed/current

这里 followed/current 成为普通文件。若真实包依赖链接关系,不能把这种转换当作等价修复;也不要在含未知链接目标的源目录里随意使用跟随选项。

本页在 Ubuntu WSL 的 Linux 临时目录验证了默认保留链接与创建时跟随链接的区别。它证明示例命令和检查过程,不代表重现了原 VFAT 故障,也没有实测上表列出的全部工具。