侧边栏壁纸
  • 累计撰写 17 篇文章
  • 累计创建 2 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Linux 系统基本常见故障排查手册(持续更新)

Linux 系统基本常见故障排查手册(持续更新)

前言

Linux 故障排查是什么?

想象一下:你开的汽车突然打不着火了。你需要:

  • 先看仪表盘有没有报错灯(查看系统日志)
  • 检查油够不够(检查资源)
  • 看看发动机有没有问题(检查服务)
  • 一步步试,找到问题出在哪里

Linux 故障排查就是给电脑"看病"的过程! 它让你一步步找到问题,然后解决它。

Linux 是服务器的主力操作系统,学会排查故障是运维工程师的基本功。不用怕!只要按步骤来,90% 的问题都能解决。

本文档会告诉你:

  • 系统启动故障怎么排查
  • 网络连不上怎么办
  • 磁盘满了怎么处理
  • CPU/内存爆满怎么优化
  • 服务挂了怎么重启

目录

  1. 核心概念速查
  2. 系统启动故障排查
  3. 网络故障排查
  4. 磁盘空间故障排查
  5. 内存和 CPU 故障排查
  6. 服务进程故障排查
  7. 最佳实践
  8. 总结

核心概念速查

概念 通俗解释 类比
日志(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 里的分区不存在,系统就会卡着

解决方案

  1. 方案一:清理磁盘空间(推荐)
# 清理日志文件
journalctl --vacuum-time=1d  # 只保留最近1天的日志
rm -rf /var/log/*-*.log      # 删除旧日志

# 清理包缓存
apt-get clean  # Debian/Ubuntu
yum clean all  # CentOS/RHEL
  1. 方案二:修复 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

解决方案

  1. 方案一:启动服务
systemctl start sshd  # 启动 SSH
systemctl enable sshd  # 开机自启
  1. 方案二:开放防火墙端口
# 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次

解决方案

  1. 方案一:杀掉占用 CPU 的进程(临时)
kill 1234  # 温和地杀
kill -9 1234  # 强制杀(慎用!)
  1. 方案二:找出问题程序并优化
# 看程序的日志
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

解决方案

  1. 方案一:增加 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
  1. 方案二:优化程序配置
# 比如 MySQL,减少 buffer 大小
vi /etc/mysql/my.cnf
# 修改 innodb_buffer_pool_size 等参数
  1. 方案三:加内存(治本)
# 云服务器在控制台升级配置

服务进程故障排查

问题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

最佳实践

排查思路总结

遇到问题按这个顺序来:

  1. 看现象 - 具体是什么报错?
  2. 看日志 - 日志里有答案!
  3. 查资源 - CPU、内存、磁盘、网络够不够?
  4. 查配置 - 配置文件有没有错?
  5. 试重启 - 重启能解决 80% 的问题!
  6. 查文档 - 官方文档比谷歌靠谱。

常用命令速查表

功能 命令
看日志 journalctl -u xxxtail -f /var/log/xxx.log
看进程 ps auxtophtop
看网络 netstat -tlnpss -tlnpip addr
看磁盘 df -hdu -sh
看内存 free -h
管理服务 systemctl start/stop/restart/status xxx

事前预防

💡 预防胜于治疗!

  1. 监控要做好 - 用 Prometheus + Grafana 监控资源
  2. 日志要轮转 - 配置 logrotate,防止日志占满磁盘
  3. 备份要定期 - 重要数据定时备份
  4. 变更要记录 - 改配置前先备份,改后记录
  5. 告警要及时 - 资源快满了提前收到通知

总结

核心要点

问题类型 关键命令
启动问题 fsckdf -hcat /etc/fstab
网络问题 ip addrpingss -tlnp
磁盘问题 df -hdf -idu -sh
CPU/内存 tophtopfree -h
服务问题 systemctl statusjournalctl -u

黄金法则

  1. 先看日志 - 日志是最好的老师
  2. 由简入繁 - 先试简单的方法(重启),再试复杂的
  3. 备份再改 - 改配置前先备份
  4. 记录过程 - 把排查步骤记下来,下次就快了
  5. 不要慌 - Linux 不会无缘无故挂,肯定有原因

持续更新中… 如有问题或建议,欢迎交流讨论!

0

评论区