Linux 系统基本常见故障排查手册(持续更新)
前言
Linux 故障排查是什么?
想象一下:你开的汽车突然打不着火了。你需要:
- 先看仪表盘有没有报错灯(查看系统日志)
- 检查油够不够(检查资源)
- 看看发动机有没有问题(检查服务)
- 一步步试,找到问题出在哪里
Linux 故障排查就是给电脑"看病"的过程! 它让你一步步找到问题,然后解决它。
Linux 是服务器的主力操作系统,学会排查故障是运维工程师的基本功。不用怕!只要按步骤来,90% 的问题都能解决。
本文档会告诉你:
- 系统启动故障怎么排查
- 网络连不上怎么办
- 磁盘满了怎么处理
- CPU/内存爆满怎么优化
- 服务挂了怎么重启
目录
核心概念速查
| 概念 | 通俗解释 | 类比 |
|---|---|---|
| 日志(Log) | 系统的"流水账",记录发生的所有事 | 飞机的黑匣子 |
| 进程(Process) | 正在运行的程序 | 工厂里正在干活的工人 |
| 服务(Service) | 后台一直运行的程序 | 24小时营业的便利店 |
| 端口(Port) | 程序的"门牌号",网络通过端口找程序 | 酒店的房间号 |
| 挂载(Mount) | 把硬盘"连"到系统上 | 把U盘插到电脑上 |
| PID | 进程的"身份证号",唯一标识 | 人的身份证号 |
系统启动故障排查
问题1:系统开不了机,卡在启动界面
现象:开机后一直停在 Logo 或 Loading 界面,进不去系统。
通俗解释:就像汽车打火打不着,可能是电池没电了,也可能是发动机坏了。
排查步骤:
# 🔍 步骤1:重启进入单用户模式或救援模式
# 如果是 GRUB 引导,在启动菜单按 e 编辑,在 kernel 行末尾加 init=/bin/bash
# 然后按 Ctrl+X 启动
# 👀 步骤2:检查文件系统
fsck /dev/sda1 # 检查根分区
# 是什么:fsck 是文件系统检查工具
# 为什么:非正常关机可能导致文件系统损坏
# 结果:如果有错误,fsck 会问你是否修复,输入 y
# 👀 步骤3:检查磁盘空间
df -h
# 输出示例:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 50G 49G 100M 99% /
# 解读:如果 Use% 到 100%,磁盘满了系统就启动不了!
# 👀 步骤4:检查 fstab 配置
cat /etc/fstab
# 是什么:fstab 是开机自动挂载硬盘的配置文件
# 为什么:如果 fstab 里的分区不存在,系统就会卡着
解决方案:
- 方案一:清理磁盘空间(推荐)
# 清理日志文件
journalctl --vacuum-time=1d # 只保留最近1天的日志
rm -rf /var/log/*-*.log # 删除旧日志
# 清理包缓存
apt-get clean # Debian/Ubuntu
yum clean all # CentOS/RHEL
- 方案二:修复 fstab
# 注释掉有问题的挂载行
vi /etc/fstab
# 在有问题的行前面加 # 号
问题2:开机提示 “GRUB Rescue”
现象:开机显示 “error: unknown filesystem”,进入 grub rescue> 提示符。
通俗解释:就像你找不到家门钥匙了,进不去屋。
排查步骤:
# 🔍 步骤1:查看有哪些分区
ls
# 输出示例:(hd0,msdos1) (hd0,msdos2)
# 🔍 步骤2:挨个试分区,找系统在哪
ls (hd0,msdos1)/
# 如果看到 boot/ 等目录,就是这个分区!
解决方案:
# ⚙️ 设置启动分区
set root=(hd0,msdos1)
set prefix=(hd0,msdos1)/boot/grub
insmod normal
normal
# 🚀 进入系统后,重新安装 GRUB
grub-install /dev/sda
update-grub # Debian/Ubuntu
grub2-mkconfig -o /boot/grub2/grub.cfg # CentOS/RHEL
网络故障排查
问题1:ping 不通外网
现象:ping 8.8.8.8 不通,或者 ping 百度域名不通。
通俗解释:就像你打电话给朋友,要么拨错号了,要么线路断了。
排查步骤:
# 👀 步骤1:检查网卡状态
ip addr
# 输出示例:
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc...
# inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
# 解读:
# - <UP> 表示网卡开着
# - inet 后面是 IP 地址,有这个说明网卡配置好了
# 👀 步骤2:检查网关
ip route
# 输出示例:
# default via 192.168.1.1 dev eth0
# 解读:default 后面的就是网关地址
# 👀 步骤3:ping 网关
ping -c 3 192.168.1.1
# -c 3 表示只 ping 3 次,不会一直 ping
# 结果:通的话说明内网没问题
# 👀 步骤4:ping 外网 IP
ping -c 3 8.8.8.8
# 通的话说明能上网,只是 DNS 有问题
# 👀 步骤5:检查 DNS 配置
cat /etc/resolv.conf
# 输出示例:
# nameserver 8.8.8.8
# nameserver 114.114.114.114
# 👀 步骤6:测试 DNS 解析
nslookup www.baidu.com
# 或者
dig www.baidu.com
解决方案:
| 问题 | 解决方法 |
|---|---|
| 网卡没 IP | 重启网卡:systemctl restart networking |
| 网关不通 | 检查路由器/交换机 |
| DNS 有问题 | 修改 /etc/resolv.conf,加 nameserver 8.8.8.8 |
问题2:端口连不上
现象:程序提示 “Connection refused” 或 “Connection timed out”。
通俗解释:就像你去酒店找朋友,要么朋友不在(服务没开),要么房间号错了(端口错了)。
排查步骤:
# 👀 步骤1:检查端口是否在监听
netstat -tlnp
# 或者(推荐)
ss -tlnp
# 输出示例:
# State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
# LISTEN 0 128 *:22 *:* users:(("sshd",pid=1234,fd=3))
# 解读:
# - Local Address:Port 是监听的端口
# - 22 端口在监听,说明 SSH 服务开着
# 👀 步骤2:检查防火墙
iptables -L -n
# 或者
firewall-cmd --list-all # CentOS/RHEL
ufw status # Ubuntu
# 👀 步骤3:从本地测试端口
telnet localhost 22
# 或者
curl -v telnet://localhost:22
# 通的话会显示 Connected to localhost
# 👀 步骤4:从其他机器测试
telnet 192.168.1.100 22
解决方案:
- 方案一:启动服务
systemctl start sshd # 启动 SSH
systemctl enable sshd # 开机自启
- 方案二:开放防火墙端口
# CentOS/RHEL
firewall-cmd --add-port=22/tcp --permanent
firewall-cmd --reload
# Ubuntu
ufw allow 22/tcp
ufw reload
磁盘空间故障排查
问题1:磁盘满了,提示 “No space left on device”
现象:无法创建文件,服务报错说空间不够。
通俗解释:就像衣柜塞满了,放不下新衣服了。
排查步骤:
# 👀 步骤1:查看整体磁盘使用
df -h
# 输出示例:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 50G 48G 2.0G 96% /
# 解读:/ 分区用了 96%,快满了
# 👀 步骤2:查看哪个目录占空间最大
du -sh /* | sort -h
# 输出示例:
# 0 /proc
# 12K /tmp
# 1.2G /usr
# 40G /var
# 解读:/var 目录占了 40G,问题可能在这
# 👀 步骤3:深入 /var 继续看
du -sh /var/* | sort -h
# 输出示例:
# 50M /var/lib
# 39G /var/log
# 解读:/var/log 占了 39G!日志太多了
# 👀 步骤4:找最大的文件
find / -type f -size +100M -exec ls -lh {} \;
# 找大于 100M 的文件
解决方案:
# 🗑️ 方案一:清理日志(推荐)
# 清理 systemd 日志
journalctl --vacuum-time=3d # 只保留最近3天
journalctl --vacuum-size=500M # 只保留500M
# 清理旧日志文件
rm -f /var/log/*-*.log
rm -f /var/log/*.gz
# 🗑️ 方案二:清理包缓存
apt-get clean # Debian/Ubuntu
yum clean all # CentOS/RHEL
# 🗑️ 方案三:删除大文件
# 找到大文件后确认没用再删!
rm -f /path/to/large/file
# 💡 方案四:扩展磁盘(如果是云服务器)
# 先在控制台扩容磁盘,然后
growpart /dev/sda 1 # 扩展分区
resize2fs /dev/sda1 # 扩展文件系统
问题2:inode 满了,但磁盘还有空间
现象:df -h 显示空间还有,但创建文件提示 “No space left on device”。
通俗解释:就像停车场有车位,但是停车卡发完了,还是停不了车。inode 就是"停车卡"。
排查步骤:
# 👀 步骤1:查看 inode 使用情况
df -i
# 输出示例:
# Filesystem Inodes IUsed IFree IUse% Mounted on
# /dev/sda1 3200000 3199900 100 100% /
# 解读:IUse% 100%,inode 满了!
# 👀 步骤2:找哪个目录小文件最多
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n | tail -10
# 输出示例:
# 3000000 /var/spool/postfix/maildrop
# 解读:这里有 300 万个小文件!
解决方案:
# 🗑️ 删除大量小文件
# 进入目录后
cd /var/spool/postfix/maildrop
ls | xargs rm -f
# 或者(更快)
find . -type f -delete
内存和 CPU 故障排查
问题1:系统特别慢,CPU 使用率 100%
现象:操作卡得要死,敲命令半天没反应。
通俗解释:就像马路堵车了,所有车都动不了。
排查步骤:
# 👀 步骤1:看整体 CPU 使用
top
# 或者(更友好)
htop
# 输出示例:
# top - 10:00:00 up 10 days, 1:00, 1 user, load average: 10.0, 9.0, 8.0
# Tasks: 200 total, 5 running, 195 sleeping, 0 stopped, 0 zombie
# %Cpu(s): 99.0 us, 0.5 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.5 si, 0.0 st
# PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
# 1234 root 20 0 100000 50000 1000 R 99.0 1.0 0:10.00 bad_program
# 解读:
# - load average:平均负载,3个数字分别是1分钟、5分钟、15分钟的平均值
# - %Cpu(s):us 是用户程序占用,sy 是系统占用,id 是空闲
# - 按 P 排序:按 CPU 使用率排序
# - 按 M 排序:按内存使用率排序
# 👀 步骤2:看进程的线程
top -H -p 1234
# -H 显示线程
# 👀 步骤3:查看进程在做什么
strace -p 1234
# 追踪系统调用
# 👀 步骤4:记录历史数据
sar -u 1 10
# 每1秒采样一次,共10次
解决方案:
- 方案一:杀掉占用 CPU 的进程(临时)
kill 1234 # 温和地杀
kill -9 1234 # 强制杀(慎用!)
- 方案二:找出问题程序并优化
# 看程序的日志
tail -f /var/log/bad_program.log
问题2:内存满了,OOM Killer 杀进程
现象:服务突然挂了,日志里有 “Out of memory: Kill process”。
通俗解释:就像饭堂人太多坐不下,保安把后来的人赶出去了。OOM Killer 就是那个"保安"。
排查步骤:
# 👀 步骤1:看内存使用
free -h
# 输出示例:
# total used free shared buff/cache available
# Mem: 7.7Gi 7.0Gi 100Mi 1.0Gi 600Mi 200Mi
# Swap: 2.0Gi 1.9Gi 100Mi
# 解读:
# - used:已用内存
# - available:真正可用的内存
# - Swap:交换分区,相当于"虚拟内存",用满了会很慢
# 👀 步骤2:看哪个进程吃内存
top # 按 M 排序
# 或者
ps aux --sort=-%mem | head -10
# 👀 步骤3:看 OOM 日志
dmesg | grep -i oom
# 或者
grep -i oom /var/log/syslog
grep -i oom /var/log/messages
解决方案:
- 方案一:增加 Swap(临时救急)
# 创建 2G Swap 文件
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 永久生效,加一行到 /etc/fstab
echo '/swapfile none swap sw 0 0' >> /etc/fstab
- 方案二:优化程序配置
# 比如 MySQL,减少 buffer 大小
vi /etc/mysql/my.cnf
# 修改 innodb_buffer_pool_size 等参数
- 方案三:加内存(治本)
# 云服务器在控制台升级配置
服务进程故障排查
问题1:服务启动失败
现象:systemctl start xxx 失败,提示 “Job failed”。
通俗解释:就像开店门,钥匙断了,或者里面有东西挡着门。
排查步骤:
# 👀 步骤1:看服务状态
systemctl status sshd
# 输出示例:
# ● sshd.service - OpenSSH server daemon
# Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
# Active: failed (Result: exit-code) since ...
# 解读:Active 是 failed,说明启动失败
# 👀 步骤2:看详细日志
journalctl -u sshd -n 50 --no-pager
# -u 指定服务
# -n 50 看最近50行
# --no-pager 不分页显示
# 👀 步骤3:手动运行程序看报错
/usr/sbin/sshd -t # 测试配置
/usr/sbin/sshd -d # 调试模式运行
# 👀 步骤4:检查配置文件语法
sshd -t # SSH 特有
nginx -t # Nginx 特有
apachectl configtest # Apache 特有
解决方案:
# ⚙️ 修复配置文件后重启
vi /etc/ssh/sshd_config
# 修复错误...
# 🚀 重启服务
systemctl restart sshd
systemctl status sshd # 确认状态
问题2:进程变成僵尸(Zombie)
现象:top 里看到 Z 状态的进程。
通俗解释:就像员工已经离职了,但公司花名册上还没删掉。
排查步骤:
# 👀 步骤1:找僵尸进程
ps aux | awk '$8 ~ /Z/'
# 输出示例:
# root 1234 0.0 0.0 0 0 ? Z 10:00 0:00 [defunct]
# 👀 步骤2:找它的父进程
ps -ef | grep 1234
# 输出示例:
# root 1000 1 0 10:00 ? 00:00:00 parent_process
# root 1234 1000 0 10:00 ? 00:00:00 [defunct] <defunct>
# 解读:父进程 PID 是 1000
解决方案:
# 🗑️ 杀掉父进程
kill 1000
# 如果不行,强制杀
kill -9 1000
最佳实践
排查思路总结
遇到问题按这个顺序来:
- 看现象 - 具体是什么报错?
- 看日志 - 日志里有答案!
- 查资源 - CPU、内存、磁盘、网络够不够?
- 查配置 - 配置文件有没有错?
- 试重启 - 重启能解决 80% 的问题!
- 查文档 - 官方文档比谷歌靠谱。
常用命令速查表
| 功能 | 命令 |
|---|---|
| 看日志 | journalctl -u xxx、tail -f /var/log/xxx.log |
| 看进程 | ps aux、top、htop |
| 看网络 | netstat -tlnp、ss -tlnp、ip addr |
| 看磁盘 | df -h、du -sh |
| 看内存 | free -h |
| 管理服务 | systemctl start/stop/restart/status xxx |
事前预防
💡 预防胜于治疗!
- 监控要做好 - 用 Prometheus + Grafana 监控资源
- 日志要轮转 - 配置 logrotate,防止日志占满磁盘
- 备份要定期 - 重要数据定时备份
- 变更要记录 - 改配置前先备份,改后记录
- 告警要及时 - 资源快满了提前收到通知
总结
核心要点
| 问题类型 | 关键命令 |
|---|---|
| 启动问题 | fsck、df -h、cat /etc/fstab |
| 网络问题 | ip addr、ping、ss -tlnp |
| 磁盘问题 | df -h、df -i、du -sh |
| CPU/内存 | top、htop、free -h |
| 服务问题 | systemctl status、journalctl -u |
黄金法则
- 先看日志 - 日志是最好的老师
- 由简入繁 - 先试简单的方法(重启),再试复杂的
- 备份再改 - 改配置前先备份
- 记录过程 - 把排查步骤记下来,下次就快了
- 不要慌 - Linux 不会无缘无故挂,肯定有原因
持续更新中… 如有问题或建议,欢迎交流讨论!
评论区