我平时用的最多的一套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 目录而不是默认只压目录本身,问题就没了。
其实还应该考虑一个因素:压缩会不会损数据。日常这些算法都是无损的,但如果你在用qcow2镜像这类虚拟磁盘文件时,就要注意“压缩”和“稀疏文件”这两个概念的区别,这会直接影响你的磁盘空间和性能。
1.3 qcow2镜像压缩和更多“压缩”话题
qcow2是QEMU/KVM虚拟机常用的磁盘镜像格式。它天然支持稀疏文件,也就是说镜像文件里空洞的部分不会真的占用宿主机磁盘空间,这是qcow2区别于raw格式的一大优势。但问题在于,随着虚拟机内部删除文件、重装软件,qcow2镜像文件并不会自动“收缩”,它只是把那些块标记为未使用,文件体积依然很大。这时候就需要手动压缩回收空间。
先看当前镜像使用情况:
bash复制qemu-img info vm-disk.qcow2
如果确认虚拟机关机、内部已经清理过(比如在虚拟机里执行了fstrim或dd if=/dev/zero of=/tmp/zero bs=1M后再删除),就可以做转换压缩:
bash复制qemu-img convert -p -O qcow2 -c vm-disk.qcow2 vm-disk-compact.qcow2
-p显示进度,-O指定输出格式,-c表示对输出镜像进行压缩。转换完成后注意校验新镜像能正常启动,再改虚拟机配置指向新文件,最后删旧镜像。整个过程最好在宿主机磁盘空间充裕的情况下做,因为要同时保留新旧两个文件。
另外,压缩相关的话题不止于命令行。Windows上“win11关闭内存压缩”这个热词我最近也看到很多人在问。Win11的内置内存压缩本质是把部分内存中的页面压缩后存回内存里,用少量CPU换更多可用内存,属于系统行为,正常用户不建议关闭。Linux上其实也有类似机制,比如zram、zswap,在内存紧张的ARM开发板上很常用。理解这个思路,比单纯记“关掉某个开关”更有价值。
还有纹理压缩,这是图形学里的概念,把贴图数据用特定算法压缩后在GPU里直接访问,减少显存占用和带宽压力。它和命令行里的压缩完全是两回事,但核心思想是一样的:用解码开销换存储和传输开销。搞明白这些,再回头看tar、qcow2、zram,本质上都是在“空间和时间”之间做权衡。
还有一类场景也常被人问起:用C#读取压缩包里的文件数量。其实思路很简单,用ZipFile类打开压缩包,遍历Entries列表统计就行。这类编程问题在网络上一搜一大把,但很多人卡住的原因是没有理解“读取压缩包目录”和“解压整个压缩包”是两种操作,不要一上来就把包全解了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 网络传输:把数据稳妥地搬到目的地
2.1 scp、rsync、sftp:远程拷贝怎么选
日常传文件,最直接的是scp。它的用法和cp非常接近,只是目标变成了远程主机:
bash复制scp backup.tar.gz user@192.168.1.10:/data/
# 从远程拉文件
scp user@192.168.1.10:/data/backup.tar.gz ./
# 指定端口
scp -P 2222 backup.tar.gz user@192.168.1.10:/data/
scp适合一次性、少量文件传输。但如果你要同步的是整个目录,而且目录里文件数量多、有大量没变化的内容,scp就会把整个目录重新传一遍,太浪费了。这种情况我一般直接用rsync,它最大的价值是增量同步:只传输变化的文件块。我同步一个几GB的项目目录,第一次全量很久,后面每次都是秒级完成。
bash复制# 常用同步参数
rsync -avz --progress /data/project/ user@192.168.1.10:/data/project/
# 删除目标端多余文件(保持两边完全一致)
rsync -avz --delete /data/project/ user@192.168.1.10:/data/project/
# 断点续传,适合大文件传一半断线的情况
rsync -avz --partial /data/bigfile.iso user@192.168.1.10:/data/
-a是归档模式,保留权限、属主、时间戳等元信息;-v是显示过程;-z是传输时压缩,对文本类文件收益明显,但如果是已经压缩过的文件(比如mp4、jpg、zip),-z反而会白白消耗CPU,因为再压也压不动。这里有个细节:rsync可以用--checksum去校验两边文件完全相同,但它的开销较大,除非对一致性要求很高,否则默认的“大小+时间戳”判断已经够用。
sftp我用的相对少,它适合那种需要交互式浏览远端目录、执行简单文件管理操作的场景。交互式登录后可以ls、cd、get、put,基本等价于一个加密的文件浏览器,不熟scp参数的情况下用sftp也不会出错。
还有一点,以上三者的传输都基于SSH,也就是说只要目标机器的sshd服务正常,用户有账号权限,就能直接传。这也意味着密钥配置好了,脚本里就可以免密执行传输,很自动化。我在做定时备份脚本时,通常就是生成密钥对、把公钥放到备份服务器,然后cron里跑rsync。
2.2 wget和curl:下载与接口调试的两板斧
wget和curl是Linux下两个最常用的网络工具,很多人以为它们功能重叠,其实各有侧重。wget偏下载,curl偏接口调试,但两者都能干下载这件事。
wget最常用的几个参数:
bash复制# 官网下载软件包
wget https://example.com/package.tar.gz
# 断点续传(下载到一半断了,接着下)
wget -c https://example.com/package.tar.gz
# 限速下载,避免占满带宽
wget --limit-rate=2m https://example.com/package.tar.gz
# 递归下载整站(慎用)
wget -r -l 2 https://example.com/docs/
-c这个断点续传参数我特别推荐记住。下载大文件,网络抖一下断了,如果没有-c,得从头开始,浪费一次完整下载时间;加了它之后,重跑一遍命令就能接着传。在服务器上下载几个GB的模型文件时,这个参数至少帮我省过一晚上的时间。
curl这边,常用的是下载和接口请求:
bash复制# 下载文件并保持原名
curl -O https://example.com/package.tar.gz
# 跟随重定向,比如很多下载链接是302跳转
curl -L -O https://example.com/package.tar.gz
# 带请求头访问接口
curl -H "Content-Type: application/json" -X POST -d '{"name":"test"}' https://api.example.com/data
# 只看响应头
curl -I https://example.com
我经常用curl来验证一个服务有没有正常起来。比如部署完一个Web服务,先curl -I http://localhost:8080看返回的状态码,200说明起来了,5xx说明业务层有问题,连接拒绝说明进程可能没起来。这个习惯帮我快速定位过好几次“服务好像挂了”的报警,不用一上来就翻日志。
2.3 国内镜像与源加速:下载不再龟速
这一点可能是Linux新人最关心的痛点之一:明明网速很快,为什么我在服务器上下个软件包就是几十KB/s?原因通常不在本身网速,而在于源站距离远、链路拥塞。解决办法就是换到离你更近的镜像源。
Debian/Ubuntu换源,编辑/etc/apt/sources.list,把官方源地址替换成国内镜像站地址,然后apt update。RHEL/CentOS/Rocky则是修改/etc/yum.repos.d/下的repo文件,把mirrorlist=和baseurl=换成对应镜像。
Python的pip同样有国内镜像。我通常在项目里创建一个pip.conf,内容大概是:
ini复制[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
这样每次pip install都会走推荐镜像,速度快很多。还有npm,设置镜像只需要一行命令:
bash复制npm config set registry https://registry.npmmirror.com
最近做AI相关项目,还涉及到ollama模型下载。ollama默认从官方源拉模型,在国内网络环境下经常很慢或者直接超时。除了设置环境变量指定本机模型存放路径(OLLAMA_MODELS=/data/models)之外,还可以考虑把模型下载源配置成国内可访问的镜像地址。具体做法是把启动服务的环境变量里加一行OLLAMA_MIRROR=https://镜像地址这类配置,或者直接拉取国内已同步好的模型文件放本地。不同版本配置方式略有差异,建议以官方文档为准,但核心思路永远是一致的:把远端慢的源,换成近处快的源。
2.4 网络质量测试:网卡和带宽别靠猜
ping命令大家都会用,但它只是最基础的连通性测试。真正要判断带宽、延迟、丢包,还需要更专业的工具。
两台机器之间测实际带宽,用iperf3。假设A是192.168.1.10,B是192.168.1.20,先在A上启动服务端:
bash复制iperf3 -s
然后在B上跑客户端,测向A的带宽:
bash复制iperf3 -c 192.168.1.10
iperf3默认测TCP,测出来的数值就是两台机器之间的实际吞吐量。如果这个值远低于网卡标称速率,就要排查网卡协商速率、网线、交换机端口、防火墙限速这些环节。我第一次发现服务器之间拷贝文件只有20MB/s时,就是用iperf3查到瓶颈在链路层而并非磁盘。
无线网卡的信号和连接质量,可以用iw命令看。查到无线网卡接口名后:
bash复制# 查看连接信息
iw dev wlan0 link
# 扫描周边无线网络
iw dev wlan0 scan | grep -E "SSID|signal"
signal字段里负值越接近0,信号越强。一般-50dBm以内信号很好,-70dBm以下就会明显影响速度了。Linux下测无线网卡,还可以用nmcli dev wifi list列热点,这个更直观。
另外,speedtest-cli可以直接在命令行测本机的上下行带宽。如果你在服务器上跑它,注意测出来的数值受本机到测试节点之间的链路影响,不代表服务器网卡的最高性能。结论永远要结合场景来解读,不能拿着一个数值就下判断。
3. 系统工具:日常运维和应急修复都靠它们
3.1 用户与权限:新建用户和sudo的正确姿势
刚接触Linux的人,习惯直接用root干活。我理解这种省事的心理,但生产环境里千万不要养成这种习惯。root操作一个误删,后果是没有后悔药的。正确做法是建一个普通用户,需要管理员权限时通过sudo提权。
新建用户的标准流程:
bash复制# 创建用户并指定家目录、shell
useradd -m -s /bin/bash zhangsan
# 设置/修改密码
passwd zhangsan
# 把用户加入sudo组(Debian/Ubuntu)
usermod -aG sudo zhangsan
# RHEL/CentOS系是wheel组
usermod -aG wheel zhangsan
-m是自动创建家目录,-s指定登录shell,如果不指定,默认可能是/bin/sh,使用体验会差很多。用户创建好之后,还要确认sudo配置没问题。sudo的配置文件是/etc/sudoers,强烈建议不要直接编辑,而是用visudo命令打开,它会在保存时做语法检查,避免把sudo配坏。
%sudo ALL=(ALL:ALL) ALL这一行意思就是sudo组的成员可以在所有主机上以所有用户身份执行所有命令。如果想只允许某个用户执行特定命令,可以单独加一行:
code复制zhangsan ALL=(ALL) /usr/bin/systemctl restart nginx
这样zhangsan用sudo只能重启nginx,其他命令都会被拒绝。权限最小化原则,在用户管理上同样适用。
网上经常把“提权”这个词说得神乎其神,其实在正常运维里,提权就是两件事:一是普通用户通过sudo获得临时管理员权限,二是临时切换root后马上退出。不推荐用su -切root,因为切换过程中会暴露root密码,而且一旦忘了退出,后续操作都在root权限下,风险不可控。至于删除文件夹这种高危操作,rm -rf慎用,尤其不要在root身份下用通配符乱删。删除目录用rm -r 目录名,知道自己在删什么再动手。
3.2 系统信息与硬件排查:别等出故障才想起来
系统工具的价值在平时看不出来,但一旦出问题,它们就是你排查的第一梯队。先列几个我常用的命令:
bash复制# 查看内核版本和系统架构
uname -a
# 查看CPU信息
lscpu
# 查看内存总量和剩余量
free -h
# 查看磁盘分区与使用率
df -h
# 查看内核环形缓冲区的实时消息(硬件/驱动报错)
dmesg | tail -50
dmesg是个容易被忽略但特别好用的命令。网卡掉线、磁盘报I/O错误、USB设备异常,内核都会往这里写消息。我曾经遇到一台机器网卡间歇性断流,ip a看地址还在,但是ping不通,dmesg里清清楚楚写着网卡驱动报错和链路down/up的记录,顺藤摸瓜找到了驱动和固件的兼容问题。
CPU缓存信息也是排查性能问题时的参考之一,用lscpu | grep -i cache能直接看到L1、L2、L3缓存大小。如果你在对比不同架构的机器,这个信息能解释为什么某些CPU主频看着不高,跑某些工作负载却更快。之前有人问我“linux查看cache版本”,其实多半问的就是这个。
多GPU测试也是一个常见需求。机器上插了三块GPU,想确认它们是否都被系统识别、是否都能正常计算,用:
bash复制# NVIDIA显卡列出所有GPU
nvidia-smi
# 同时看三张卡的状态
nvidia-smi -L
# 指定显卡跑一个测试程序
python -c "import torch; print(torch.cuda.device_count(), torch.cuda.get_device_name(0))"
如果你怀疑某块卡有问题,可以在nvidia-smi的输出里看它的温度、显存占用、功耗和风扇转速。显存一直占用不释放,大概率是进程没退出或者显存泄漏;功耗明显低于其他卡,可能卡处于低负载状态或者硬件有问题。这些判断听起来很基础,但实际排查时非常管用。
系统层面还有一个值得养成的习惯:把关键信息记录下来。比如部署完一台新服务器,立刻把uname -a、lscpu、free -h、df -h的输出存到一个文件里,后面做性能对比、排查故障时就有基准数据。别笑,我见过太多人排查问题时连机器是什么配置都说不清楚。
3.3 国产系统与应急维护:麒麟的PE和LiveCD
现在麒麟系统等国产操作系统在政企项目里越来越常见,很多运维一开始不太习惯,其实它的底层就是Linux,很多命令和Debian系是相通的。
麒麟系统同样有自己的应急维护工具。举个例子,运维中经常遇到“系统进不去,但里面有重要数据”的情况。这时候LiveCD或PE工具就派上用场了。LiveCD的思路是:用一个U盘启动到一个完整的Linux系统(这个系统在内存里运行,不依赖硬盘上的系统),然后挂载硬盘上的分区,把数据拷贝出来,或者chroot进去重置密码、修复引导。
用LiveCD修复的大致流程是:
- 制作一个U盘启动盘,里面放好Live系统镜像。
- BIOS/UEFI里设置U盘优先启动。
- 进入Live系统后,先用
lsblk或fdisk -l找到硬盘分区。 - 挂载根分区,比如
mount /dev/nvme0n1p2 /mnt。 - 如果系统是UEFI引导,还需要挂载EFI分区:
mount /dev/nvme0n1p1 /mnt/boot/efi。 - 需要联网或解析域名时,再
mount --bind /dev /mnt/dev等,然后chroot /mnt进去执行修复命令。
可能很多人一听chroot就头皮发麻,其实它就是把当前环境切换到硬盘上那个系统里,让你像在原来系统里一样执行命令。重置root密码就是进入chroot后直接passwd root,修复grub引导就是执行grub-install、update-grub。整个过程不复杂,但一定要胆大心细,每一步操作都确认一下挂载点和分区对不对。
国产系统厂商一般会配套提供PE工具或专门的维护工具盘,目的也是干这个。平时可以提前把对应版本的维护镜像下载好放进U盘,真出事的时候不用干着急。
