系统管理
一台 Linux 机器出问题时, 你的价值不在于"记得多少命令", 而在于能不能在两分钟内回答三个问题: 这台机器是什么配置、 现在谁在占资源、 刚才发生了什么。 系统管理章就是围绕这三个问题组织的—— 先看身份与硬件(系统信息), 再看正在运行什么(进程), 再看资源还剩多少(内存与磁盘), 然后持续观察(监控工具), 最后把重复的检查动作固化下来(配置管理)。 这条链走通了, "服务器变慢了"就不再是一句无从下手的抱怨, 而是一组可以逐项排除的假设。
本章工具以 GNU/procps 生态和 systemd 为主, 在 Debian/Ubuntu、 Arch、 RHEL/CentOS/Rocky 三系上大部分通用; 差异集中在日志入口、默认监控包、以及配置管理工具的安装方式,文中会逐处标注。
为什么系统管理是排障的第一现场
很多人排障的顺序是反的: 先重启、 再百度、 最后才想到看日志。 正确的顺序应该反过来—— 先取证, 再假设, 最后才动手。 系统管理章的每个工具, 本质都是在为"取证"服务:
ps/top回答"谁在跑"。 CPU 100% 时,top的按P排序能在一秒内揪出元凶进程;ps aux --sort=-%mem能列出内存占用前几名。 没有这一步, 任何"优化"都是盲目的。free/df/du回答"还剩多少"。No space left on device不等于磁盘真满了——df -h看分区、du -sh *找大目录、df -i查 inode 耗尽(大量小文件时常见), 三步定位。journalctl/dmesg回答"刚才发生了什么"。 进程为什么被 OOM killer 杀掉?dmesg | grep -i oom有答案。 服务为什么起不来?systemctl status+journalctl -u 服务名 -e有答案。- 把重复动作固化成配置管理。 当你要在 50 台机器上统一安装监控 agent、 统一改 sshd 配置, 手敲 50 遍必然出错, Ansible 这类工具就是把"命令"升级成"可审计的代码"。
鸟哥在教程里反复强调: 系统管理能力 = 观察能力 × 排查顺序。 命令本身是查表就能得到的, 观察顺序则需要刻意练习, 本章的五个子页就是按"观察 → 分析 → 固化"的顺序排列的。
示例输出来自真实 Ubuntu 26.04 环境,见文末参考资料。
学习目标
- 快速画像: 用
uname -a、hostnamectl、lscpu、lsblk、df -h在 30 秒内说清一台机器的内核、 发行版、 CPU、 磁盘与挂载情况。 - 进程可控: 熟练
ps(aux与-ef两种风格)、top/htop交互操作、kill/killall/pkill的信号选择(先TERM再KILL), 理解前台/后台与jobs/fg/bg。 - 内存判断: 读懂
free -h的total/used/available与 buff/cache, 知道available才是"真正可分配内存", 不把缓存误判为内存泄漏。 - 瓶颈定位: 会用
vmstat、iostat、mpstat、pidstat(sysstat 包)判断瓶颈在 CPU、 内存还是磁盘 I/O, 用sar回看历史数据。 - 配置自动化: 理解 Ansible 的"无代理 + SSH + YAML playbook"模型, 能写一个安装软件包并改配置文件的最小 playbook。
- 三系差异: 知道 journalctl、 systemctl 三系通用, 而
yumvsdnf、iptablesvsfirewalld、 默认日志文件位置需要按发行版切换。
子页导读
| 子页 | 一句话导读 |
|---|---|
| 系统信息查看 | 给机器验明正身:uname、hostnamectl、lscpu、lspci、lsusb、lsblk、df、uptime 等,回答"这是什么系统、什么硬件、磁盘怎么分的"。 |
| 进程管理 | 运行时的主角:ps 两种输出风格、top/htop 交互、pgrep 定位、kill 信号语义、nohup/&/jobs 前后台控制,以及僵尸进程与孤儿进程的成因。 |
| 内存管理 | 读懂内存账本:free 各列含义、vmstat/slabtop//proc/meminfo 深入、缓存与 buffer 的角色、OOM killer 触发条件与排查。 |
| 配置管理工具 | 从命令到代码:Ansible inventory/playbook/role 核心概念与实例,Puppet、Chef、SaltStack 的定位差异,以及"什么时候值得上配置管理"的判断标准。 |
| 系统监控工具 | 持续观察的眼睛:top/htop/atop 实时监控,vmstat/iostat/nload 性能分析,sar 历史回放,以及从监控指标到瓶颈结论的推理路径。 |
建议路线: system_info → process → memory → monitoring(观察三部曲), 最后读 configuration-management 学会把前面的手工动作固化。 读完后自检: 拿到一台陌生机器, 能在两分钟内报出"发行版、 内核、 CPU 核数、 内存总量、 磁盘使用率、 CPU 最高的三个进程", 本章即算过关。
三系差异速览
| 场景 | Debian/Ubuntu | Arch | RHEL/CentOS/Rocky |
|---|---|---|---|
| 服务管理 | systemctl(systemd) | systemctl(systemd) | systemctl(systemd) |
| 日志查询 | journalctl -u 服务名 | 同左 | 同左 |
| 文本日志位置 | /var/log/syslog、/var/log/auth.log | /var/log/messages(详志看 journal) | /var/log/messages、/var/log/secure |
| 包管理器 | apt/dpkg | pacman | dnf(CentOS 7 为 yum) |
| 默认进程查看 | ps(procps-ng) | ps(procps-ng) | ps(procps-ng) |
装 htop | sudo apt install htop | sudo pacman -S htop | sudo dnf install htop |
装 sysstat(iostat/sar) | sudo apt install sysstat(默认可能未启用采集) | sudo pacman -S sysstat | sudo dnf install sysstat(需手动 ENABLED=true) |
| 防火墙命令 | ufw(底层 iptables/nftables) | 自选 nftables/iptables | firewall-cmd(firewalld) |
| 内核日志 | dmesg(可能需 sudo) | dmesg | dmesg(RHEL 系默认限制非 root 读取) |
一个容易忽略的细节: Debian/Ubuntu 的 sysstat 装完默认不开始采集(/etc/default/sysstat 里 ENABLED=false), sar 查不到历史数据; Arch 和 RHEL 系一般默认启用。 要用 sar 做历史回看, 先确认采集开关。
常见坑
- 把 buff/cache 当成"内存被吃光"。
free -h里的used不含 cache, 而 Linux 会尽量把空闲内存拿来做缓存; 判断是否真缺内存要看available列(或free的-m输出)。 盲目加内存、 加vm.swappiness调优前, 先确认available确实长期偏低。 kill -9当成万能钥匙。SIGKILL(-9)无法被捕获, 进程没有机会释放锁、 写完日志、 清理临时文件, 可能导致数据损坏或资源泄漏。 正确姿势: 先kill 进程号(默认SIGTERM), 等几秒不退再kill -9。ps aux与ps -ef输出列含义不同。 两者都能列出进程, 但USER/PID/%CPU列的位置和顺序不一致, 写awk '{print $2}'取 PID 时必须先看清当前是哪种风格, 否则会取错列。top里看错指标。%us(用户态)高是应用问题,%sy(内核态)高可能是系统调用过频或驱动问题,%wa(I/O wait)高是磁盘瓶颈—— 三者都算"CPU 高", 但结论完全不同。- 非交互/脚本环境里用
top -b -n 1。 交互式top无法直接重定向输出做分析, 批量抓取要用批处理模式:top -b -n 1 | head -20。 dmesg无权限或被限流。 RHEL 系默认kernel.dmesg_restrict=1, 非 root 执行dmesg会报Operation not permitted, 用sudo dmesg或看/var/log/dmesg。- 配置管理工具"一上来就全套"。 Ansible 适合从 5–10 台机器起步, Puppet/Chef 的学习与维护成本更高。 先把手工流程跑顺、 写成脚本, 再考虑工具化; 否则会陷入"为了自动化而写自动化"。
- 忘了三系包管理器不同。 监控工具缺命令时: Debian/Ubuntu
sudo apt install 包名、 Archsudo pacman -S 包名、 RHEL/CentOS/Rockysudo dnf install 包名, 不要混用。
常见问题
Q:load average 超过 CPU 核数就一定有问题吗?
不一定。 Linux 的负载包含运行态 + 不可中断睡眠(D 状态,通常是等 I/O)两部分。 16 核机器 load 20,若同时伴随 iostat -x 里 %util 接近 100%, 瓶颈在磁盘而不是 CPU; 反过来 load 18 但 %us 打满、I/O 空闲, 才是 CPU 不够用。 判断顺序永远是: top/mpstat 看 CPU 分布 → iostat 看 I/O → pidstat/ps 定位进程, 不要只盯着 load 一个数字下结论。
Q:free -h 里 available 和 free 差那么多,内存到底够不够?
看 available。 Linux 会把暂时用不到的内存拿去做页缓存(buff/cache)加速磁盘读写, 这部分在进程真正申请时会立刻让出,所以不计入"空闲"却随时可用。 free 列只是"完全没被碰过"的内存, 现代系统上它长期偏低是正常现象。 只有 available 持续低于总内存的 5%~10%, 且 free -h 的 swap used 在不断增长, 才说明真的需要加内存或查内存泄漏。
Q:systemctl enable 和 start 有什么区别?
start/stop 管当前这一次是否立即运行; enable/disable 管下次开机是否自动拉起。 两者互不影响: enable 之后不 start,服务要等重启才生效; start 之后不 enable,服务重启机器就没了。 容器化/云镜像里常见的"改了配置没生效", 一半是忘了 systemctl daemon-reload(改了 unit 文件), 另一半是只 start 没 enable(或反之)。 is-active/is-enabled 可以分别验证两种状态。
Q:kill 默认发的信号是哪个?kill -9 为什么不能随便用?
默认是 SIGTERM(15), 进程可以捕获它,用来清理临时文件、关闭连接、释放锁。 kill -9 发的是 SIGKILL, 内核直接回收,进程没有任何善后机会—— 数据库可能留下未落盘的事务, 锁文件可能残留导致下次启动失败。 排障顺序应是: 先 kill(TERM)等几秒 → 无效再 kill -HUP 或按应用文档给的优雅退出信号 → 最后才 -9。 长期杀不掉的进程,真正要查的是它卡在哪个系统调用(strace -p),而不是反复补刀。
参考资料
man ps,man top,man free,man systemctl,man journalctl,man vmstat,man iostat- 鸟哥的私房菜 - 程序观察与作业管理 — linux.vbird.org
- Arch Wiki - Process management — wiki.archlinux.org
- Arch Wiki - systemd — wiki.archlinux.org
- Arch Wiki - Btop/Htop(监控工具) — wiki.archlinux.org
- procps-ng 项目页 — gitlab.com
- sysstat 手册(iostat/vmstat/sar) — sebastien.godard.pagesperso-orange.fr
- Red Hat 文档 - Monitoring and managing system status and performance — docs.redhat.com
- Ansible 官方文档 — docs.ansible.com