电脑必备
部署包用7z还是zip?我拿三种工具实测了权限保留和增量更新
92 0 13
最近在整理 CI 的制品打包脚本,遇到个挺具体的问题:部署包用 7z 还是 zip,在 Linux 上解压后权限保留到底差多少? 之前社区里聊解压速度的多,但权限这块没人细说,我干脆拿手头的日志包和部署包做了组对照。
测试环境
- 三台机器:Ubuntu 22.04(内核 5.15)、CentOS 7(3.10)、WSL2 Ubuntu(5.15)
- 工具版本:7-Zip 23.01、Win解压缩 5.2.1、Info-ZIP zip 3.0 / unzip 6.0
- 样本:一个 2.1G 的日志归档(含 1200 个文件,权限混杂 644/755/600),一个 800M 的部署包(含可执行脚本和配置文件)
核心结论
- zip 默认不保留 Unix 权限,解压出来全是 644,可执行脚本直接废了。必须加
-X参数并在打包时用zip -r -X保留 extra field,unzip 时才会还原权限。这一点在跨平台时特别坑,Windows 上打的 zip 到 Linux 解压基本全变 644。 - 7z 对权限的支持取决于格式。7z 格式本身不存 Unix 权限,但 tar 格式可以。所以如果是 Linux 部署包,用
7z a -ttar再套 gzip 最稳,权限原样保留。Win解压缩 5.2.1 我试了,图形界面解压 tar.gz 权限是对的,但命令行只支持基本解压,没法像 7z 那样指定-ttar参数做格式转换。 - 增量更新:zip 支持
zip -u只更新变化文件,7z 得用7z u但会重写整个归档。对频繁发版的部署包,zip 的增量优势明显。不过 7z 的固实压缩对日志包压缩率更高,2.1G 的日志包 7z 压到 380M,zip 是 520M,差 27%。
实测数据
| 工具/格式 | 解压 2.1G 耗时 | 权限保留 | 增量更新 |
|---|---|---|---|
| 7z (tar.gz) | 48s | 完整 | 不支持 |
| zip (-X) | 62s | 完整 | 支持 |
| Win解压缩 GUI | 41s | 完整(tar.gz) | 不支持 |
Win解压缩 解压速度确实最快,但命令行能力弱,适合普通用户日常用。我现在的做法是:部署包用 tar.gz + 7z 命令行打包,日志归档用 7z 固实压缩,需要增量更新的场景用 zip -X。
一个容易忽略的坑
在 CentOS 7 上,unzip 6.0 对 zip 的 extra field 解析有 bug,权限还原偶尔失败。我拿同一份 zip 在三台机器上解压,CentOS 7 有 3 次权限错乱,Ubuntu 两次都正常。后来查了是 unzip 版本问题,升级到 6.0-20 以上才稳定。
问一句:你们部署包里如果带可执行脚本,是用 tar.gz 还是 zip?有没有遇到过权限还原不一致的情况?
登录后可以为帖子点赞,但本帖内容对所有人开放阅读。
