![]()
在生产环境中,你是不是也遇到过这种尴尬:系统疯狂报“磁盘空间不足”,可老板就是不舍得批预算买新硬盘。
但是,压缩可不是随便敲个命令那么简单。压缩的本质,是用 CPU 的计算时间去换取宝贵的磁盘空间。如果你在业务高峰期,对着一个几十G的无用日志无脑来一个高强度压缩,瞬间把系统 CPU 跑满、导致线上服务卡死——恭喜你,直接喜提“故障单”一张,年终奖泡汤!
今天,咱们就来深扒一下 Linux 下最常用的四大压缩神器,对比它们的“压缩比”与“性能损耗”,并分享几个老手才知道的“黑科技”打包套路。
一、 压缩的底层原理:为什么有些文件“压不动”?
在讲工具之前,先普及一个高频面试题:为什么同样的压缩工具,压缩不同的文件,效果天差地别?
压缩算法最基本的思路,就是用更短的字符代替重复出现的字符串。 举个最通俗的例子:如果你的代码或日志里,“Sec-Core-Data”这个 13 字节的词出现了 1 万次,压缩引擎就会在后台做一个映射,把“Sec-Core-Data”替换成一个单字节字符“M”。 这样一来,原本需要占用 13万字节的空间,压缩后只占 1万字节,空间直接省了 13/1!
- 适合压缩的文件:文本文件、源代码(.html、.txt、.log),因为里面有大量重复的字符和空格,压缩比能达到 10:1 甚至更夸张。
- 不适合压缩的文件:.mp4 视频、.jpg 图片、以及加密后的数据。因为这些文件本身已经是高度压缩过的格式,你再怎么压,也是白白浪费 CPU。
在 Linux 里,有四种主流的命令行压缩工具。我们找来了一个 11MB 的数据文件 test_data.bin,让它们当场PK一下。
1. 骨灰级选手:compress(后缀 .Z)
这个工具非常古老,现在很多系统默认都不装了(需要用 yum install ncompress 或 apt install ncompress 补装)。 它的压缩算法比较落后,压缩比也差。
- 实操演示:
[root@security-core ~]# compress -c test_data.bin > test_data.bin.Z[root@security-core ~]# ls -lh test_data.bin*-rw-r--r--. 1 root root 11M Oct 25 10:00 test_data.bin-rw-r--r--. 1 root root 2.7M Oct 25 10:01 test_data.bin.Z- 结论:11M 压到了 2.7M,表现一般,现代运维基本不推荐使用。
gzip 是目前互联网最通用的压缩格式。你看 Nginx 官方源码包、各种开源软件,几乎全是 .tar.gz 格式。
- 核心技巧:gzip 压缩默认会抹去源文件。如果你想保留源文件,必须加 -k 参数;或者使用 -9 参数榨干它的压缩极限(1-9档,9最高)。
- 实操演示:
[root@security-core ~]# gzip -k -9 test_data.bin[root@security-core ~]# ls -lh test_data.bin*-rw-r--r--. 1 root root 11M Oct 25 10:00 test_data.bin-rw-r--r--. 1 root root 2.0M Oct 25 10:02 test_data.bin.gz- 老手玩法(管道流): gzip 支持标准输入输出,我们可以配合备份命令直接压缩落盘。比如备份数据库:
mysqldump -u root -p mydb | gzip > /backup/mydb_$(date +%F).sql.gz这样数据在流经管道时就被压缩了,完全不占宿主机的临时磁盘空间,极度优雅!
3. 强力中生代:bzip2(后缀 .bz2)
bzip2 的压缩比比 gzip 更好,但压缩和解压的速度要慢不少。它也不是所有系统的标配,属于“选装配置”。
- 实操演示:
[root@security-core ~]# bzip2 -k -9 test_data.bin[root@security-core ~]# ls -lh test_data.bin*-rw-r--r--. 1 root root 11M Oct 25 10:00 test_data.bin-rw-r--r--. 1 root root 1.7M Oct 25 10:03 test_data.bin.bz2- 结论:压到了 1.7M,比 gzip 更小,但如果遇到大文件,你会明显感到命令行卡顿。
xz 采用了类似于 Windows 7-Zip 的压缩算法。它的压缩比高得惊人,Linux 内核官方(kernel.org)现在发布的源码包全改用 .tar.xz 了。
- 实操演示:
[root@security-core ~]# xz -k -9 test_data.bin[root@security-core ~]# ls -lh test_data.bin*-rw-r--r--. 1 root root 11M Oct 25 10:00 test_data.bin-rw-r--r--. 1 root root 1.4M Oct 25 10:04 test_data.bin.xz- 结论:惊艳!直接干到了 1.4M!但是,代价非常残酷——它的压缩时间最长,极其消耗 CPU
工具
后缀
压缩后大小
速度
资源消耗
通用性
compress
.Z
2.7M
极快
极低
差(濒临淘汰)
gzip
.gz
2.0M
较低
极强(运维标配)
bzip2
.bz2
1.7M
较慢
中等
一般
xz
.xz
1.4M(最强)
极慢
极高(吃CPU)
较强(新标配)
三、 避坑:不要直接用它们压目录!
新手常犯的一个错误是:直接运行 gzip /etc,以为能把整个目录压成一个包。 结果运行完一看,傻眼了:目录没变,只是目录下成百上千个小文件被分别压成了 .gz。
这是因为:gzip、bzip2、xz只能针对单个文件进行压缩,无法实现多文件归档。
为了解决这个问题,我们需要引入两个绝佳的打包组合。
1. 跨平台神器:zip 与 unzip
如果你的压缩包要经常在 Windows 和 Linux 之间传来传去,首选 zip。
- 压缩文件夹:(一定要加 -r 递归)
[root@security-core ~]# zip -r etc_backup.zip /etc- 解压到指定目录:
[root@security-core ~]# unzip etc_backup.zip -d /opt/2. 终极一统江湖:tar 打包压缩tar 命令本身的职责是“打包”(把多个文件捆成一个大文件),它不负责压缩。但它能调用gzip、bzip2、xz。
我们不需要记复杂的选项,熟练掌握以下 3 组“黄金搭档”即可:
压包套路:
# 1. 打包并调用 gzip (最常用,速度快)tar -zcvf etc_backup.tar.gz /etc# 2. 打包并调用 bzip2tar -jcvf etc_backup.tar.bz2 /etc# 3. 打包并调用 xz (空间省到极致,适合离线归档)tar -Jcvf etc_backup.tar.xz /etc解包黑科技:很多新手在解包时,还在痛苦地分辨到底是该用 tar -zxvf 还是 tar -jxvf。 其实,现代的 tar 命令非常聪明,它会自动识别压缩格式!
不论后缀是 .tar.gz、.tar.bz2 还是 .tar.xz,一律使用这行命令,盲解无压力:
# 自动识别,直接解包[root@security-core ~]# tar -xvf etc_backup.tar.xz -C /tmp/(注:-C 参数用来指定解压到的目标目录)
四、 高级黑科技:大文件切片传输法 (split + cat)
在做安全应急响应或者日志分析时,有些敏感服务器的防火墙非常严格,限制了附件上传的最大尺寸(比如最大只能传 1MB 的文件)。
而我们的日志压缩包有 7MB,根本传不出去,怎么办?
1. 切割大文件(拆成1M的小碎块)
[root@security-core ~]# split -b 1M -d test_data.bin test_data_part_[root@security-core ~]# ls -lh test_data_part_*-rw-r--r--. 1 root 1.0M Oct 25 10:15 test_data_part_00-rw-r--r--. 1 root 1.0M Oct 25 10:15 test_data_part_01-rw-r--r--. 1 root 1.0M Oct 25 10:15 test_data_part_02...- -b 1M:按 1MB 大小进行切割。
- -d:后缀使用数字(00, 01)而不是字母,方便辨认。
把这些 1MB 的小碎片安全上传后,使用 cat 命令配合重定向,一秒还原成完整大文件:
[root@security-core ~]# cat test_data_part_* > test_data_restore.bin校验一下两个文件的 MD5 散列值,一模一样!完美绕过传输限制!
写在最后:在实际生产中,没有最好的工具,只有最适合场景的策略。
- 追求兼容与开发通用脚本,选tar.gz
- 追求极限备份空间、不计CPU成本(比如深夜离线备份),选tar.xz
- 跨平台对接小白,选zip
你学废了吗?赶紧去检查一下你的服务器,看看是不是又有几个G的日志可以“缩骨”了吧!
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.