我平时用的最多的一套Linux操作,翻来覆去就是三件事:把东西变小,把东西搬走,把系统伺候明白。压缩、网络传输、系统工具,这三个词看着普通,但真到了线上环境里,每一个都能延伸出一堆细节和坑。就拿压缩来说,日志归个档,有人用tar.gz,有人用xz,有人顺手就把zstd念出来了,可到了跨平台传文件、虚拟机镜像瘦身这些场景,同一个“压缩”俩字,背后的思路完全不一样。再说到传文件,scp、rsync、wget、curl各有各的舞台,换错工具轻则多等几个小时,重则把目录结构搞得一团乱。系统工具就更不用说了,平时你可能连df都懒得敲,真到了磁盘满、服务挂、系统进不去的时候,能救你的就是那几个平时不起眼的命令。这篇文章我会把这几年实际用下来的命令、场景选型、还有踩过的问题一次性整理出来,适合Linux入门的同学,也适合已经上手但想补全常用工具体系的运维朋友。
1. 压缩:Linux下的打包与解压,远不止tar
1.1 先把最常用的压缩命令练熟
先说实话,Linux下压缩这块,90%的日常需求用tar一个命令就能解决。tar本身是打包工具,不产生压缩,它把一堆文件合并成一个文件,然后配合gzip、bzip2、xz这类压缩算法把体积变小。最常用的几个组合:
bash复制# 打包并gzip压缩
tar -czvf archive.tar.gz /data/logs
# 解压
tar -xzvf archive.tar.gz -C /data/restore
# 打包并xz压缩
tar -cJvf archive.tar.xz /data/logs
# 只看压缩包内容不解压
tar -tzvf archive.tar.gz
参数这块很容易记混,我个人的记法是:c是create创建,x是extract解压,z对应gzip,j对应bzip2,J对应xz,v是verbose显示过程,f是file指定文件名。f必须放在最后,因为f后面跟的是文件名,这个顺序写错很容易导致“文件名不对”或者直接报错。我见过不止一个同事把tar -cvzf写成tar -czvf纠结半天,其实就是参数顺序的问题。
gzip、bzip2、xz三者的区别主要在压缩率和速度上。gzip压缩速度最快,但压缩率偏低;xz压缩率最高,但压缩的时候CPU占用大、耗时明显;bzip2正好卡在中间。我实际测试过一个约1GB的日志目录,gzip压完大概300MB,耗时十几秒;xz压完大概240MB,但耗时接近一分钟。如果只是临时传个文件,用gzip就够了,没必要为了省几十MB等那么久。
zip和7z在Linux下同样常见。zip的好处是跨平台兼容性最好,Windows/macOS/Linux三端都能直接打开,我在给客户传配置文件时习惯用zip,省得对方还要额外装解压工具。Linux下如果没有zip命令,先装上:
bash复制# Debian/Ubuntu
apt install zip unzip
# RHEL/CentOS
yum install zip unzip
7z的压缩率比zip好不少,但对方机器上得有7-Zip才能解,一般用于Linux到Linux的传输。格式选择这事,永远要考虑到“对面是谁”,这是我在生产环境里吃了好几次亏才总结出来的。
1.2 不同场景下怎么选压缩方案
压缩方案不能只看压缩率,还要看使用场景。我一般按下面这个思路来选:
日志归档,选xz或者zstd。日志的特点是文本重复度高、压缩收益大,但归档任务通常放在半夜跑,所以慢一点没太大关系。如果有zstd命令,它的压缩速度和压缩率平衡得更好,适合大目录归档。备份数据库导出文件、大文件归档,我优先用zstd,因为它的解压速度非常快,恢复数据时能省很多时间。
软件包分发,跟着发行版走就行。Debian系的deb包、Red Hat系的rpm包各自都有固定的打包规范,尽量不要自己改格式。自己写脚本分发的话,tar.xz是Linux社区最通用的组合。
跨平台传文件,无脑zip。我之前遇到过一个场景:要传一批包含中文文件名和很多小图片的目录给Windows那边的同事,用了tar.gz格式,结果双击解压一堆乱码。后来统一改成zip,并且注意用zip -r archive.zip 目录而不是默认只压目录本身,问题就没了。
其实还应该考虑一个因素:压缩会不会损数据。
