归档、压缩与文件系统能力
跳转到“归档、压缩与文件系统能力”归档把多份文件及其路径、类型等信息组织在一个文件里;压缩减少数据体积。tar 可以归档目录,也可以配合 gzip、bzip2 等压缩算法。一个 .tar 文件能记录符号链接,但解包目录所在的文件系统仍须允许创建这种对象。
原 Linux 清单只有工具名;另一条误放在 C++ 分类下的记录把“tar 解压软链接错误”直接归因于 VFAT,并建议格式化为 ext4。原记录没有给出错误原文、目标路径和挂载信息,因此不能确认那次故障的根因。文件系统能力确实值得检查,但不应跳过诊断就格式化数据盘。
按用途理解原来的 17 个工具
跳转到“按用途理解原来的 17 个工具”| 工具 | 主要用途与边界 |
|---|---|
tar | 打包和解包文件树;是否压缩由所选选项和格式决定 |
ar | 创建、列出和提取成员归档,常见于静态库;不是通用目录备份格式 |
cpio | 另一类归档格式及工具,常见于文件清单和部分系统镜像流程 |
gzip、gunzip | gzip 压缩及解压;gzip 本身不负责把整个目录树变成一份归档 |
gzexe | 把可执行文件制作为解压后运行的包装形式;与普通源码归档用途不同 |
bzip2、bunzip2、bzip2recover | bzip2 压缩、解压和从受损流中尝试恢复可读块;恢复工具不保证完整恢复原文件 |
compress | 传统 Unix .Z 压缩工具;是否安装和兼容性需检查目标系统 |
zip、unzip、zipinfo | ZIP 创建、解压及成员信息查看;权限和链接的保留能力取决于工具与选项 |
lha、unarj | LHA/LZH、ARJ 等历史格式相关工具;旧清单不代表现代系统默认安装 |
dump、restore | 特定文件系统的备份与恢复工具组合,适用文件系统和版本要另外核实 |
日常源码目录可先按项目要求选择归档格式;接收已有文件时先辨认实际格式,再选工具。GNU ar 的用途见 Binutils ar,gzip 与目录归档的关系见 GNU gzip 手册,bzip2 的恢复范围见 bzip2 手册。
GNU tar 的符号链接往返实验
跳转到“GNU tar 的符号链接往返实验”下列命令在 Linux shell 中运行。它们创建一个新的临时目录,只处理示例自己创建的文本文件和相对符号链接。tar 命令使用 GNU tar;不同实现的选项应查各自手册。
set -euarchive_demo=$(mktemp -d)cd "$archive_demo"mkdir source restoredprintf '%s\n' 'archive demo' > source/data.txtln -s data.txt source/currenttar -cf sample.tar -C source .tar -tvf sample.tartar -xf sample.tar -C restoredtest -L restored/currenttest "$(readlink restored/current)" = 'data.txt'cmp source/data.txt restored/data.txtcmp restored/current restored/data.txtprintf 'passed: %s\n' "$archive_demo"列表中 current 应显示为指向 data.txt 的符号链接;提取后 test -L 验证对象类型,readlink 验证保存的链接文本,cmp 验证内容。相对链接以链接自身所在目录为解析基准,所以放回同一层级后仍能找到 data.txt。
归档保存链接时,不要求目标始终存在。悬空链接也可以作为链接记录保存;它与“无法创建符号链接”是不同问题。解包结束后只检查文件名而不检查类型和指向,会遗漏这种差别。
先定位错误,再选择解包位置
跳转到“先定位错误,再选择解包位置”先保留实际错误行,确认出错的是解压数据、创建文件、设置权限还是创建链接。对你准备使用的目标目录,进入后查看:
pwdfindmnt -T "$PWD" -o TARGET,FSTYPE,OPTIONSstat -f -c '%T' .idls -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 currentmkdir followedtar -xf followed.tar -C followedtest -f followed/currenttest ! -L followed/currentcmp source/data.txt followed/current这里 followed/current 成为普通文件。若真实包依赖链接关系,不能把这种转换当作等价修复;也不要在含未知链接目标的源目录里随意使用跟随选项。
本页在 Ubuntu WSL 的 Linux 临时目录验证了默认保留链接与创建时跟随链接的区别。它证明示例命令和检查过程,不代表重现了原 VFAT 故障,也没有实测上表列出的全部工具。