5188 字
26 分钟

Linux故障排查命令和技巧

2026-02-05
浏览量 加载中...

Linux故障排查命令和技巧#

故障排查概述#

故障排查是系统管理的重要组成部分,它可以帮助系统管理员快速识别和解决系统问题,减少系统 downtime,提高系统的可靠性和可用性。Linux系统提供了丰富的故障排查工具和命令,本文将介绍Linux系统中常用的故障排查命令和技巧,帮助系统管理员更高效地排查和解决系统故障。

故障排查步骤#

1. 收集信息#

在开始故障排查之前,首先需要收集足够的信息,了解故障的症状和上下文。

  • 故障现象:系统表现出的异常行为,如服务无法启动、网络连接失败等
  • 故障时间:故障发生的时间点
  • 系统状态:系统的当前状态,如CPU、内存、磁盘使用情况
  • 系统日志:系统和应用程序的日志信息
  • 配置变更:最近的系统配置变更
  • 相关事件:与故障相关的其他事件

2. 分析问题#

根据收集到的信息,分析问题的可能原因。

  • 确定故障范围:故障影响的范围,是单个服务还是整个系统
  • 识别可能原因:根据故障现象和系统状态,识别可能的原因
  • 验证假设:通过测试和检查,验证可能的原因

3. 解决问题#

根据分析结果,采取适当的措施解决问题。

  • 制定解决方案:根据故障原因,制定解决方案
  • 实施解决方案:执行解决方案,解决故障
  • 验证解决方案:验证解决方案是否有效
  • 记录解决方案:记录故障原因和解决方案,便于未来参考

系统启动故障排查#

启动过程#

Linux系统的启动过程包括以下几个阶段:

  1. BIOS/UEFI初始化:硬件自检和引导设备选择
  2. 引导加载程序:加载内核和初始化RAM磁盘
  3. 内核初始化:初始化硬件和挂载根文件系统
  4. init系统:启动系统服务和用户空间进程
  5. 登录界面:显示登录提示符

启动故障排查命令#

dmesg命令#

dmesg命令用于显示内核启动信息,可用于排查启动过程中的问题。

Terminal window
# 查看内核启动信息
dmesg
# 查看内核启动信息(最新的100行)
dmesg | tail -n 100
# 查看包含错误信息的内核启动信息
dmesg | grep "error"
dmesg | grep "fail"
# 查看特定硬件的内核启动信息
dmesg | grep "eth0" # 网络接口
dmesg | grep "sda" # 磁盘
# 以人类可读格式显示时间戳
dmesg -T
# 清除内核环形缓冲区
dmesg -c

journalctl命令#

journalctl命令用于查看systemd日志,可用于排查启动过程中的问题。

Terminal window
# 查看启动日志
journalctl -b
# 查看上一次启动的日志
journalctl -b -1
# 查看启动过程中的错误
journalctl -b -p err..emerg
# 查看特定服务的启动日志
journalctl -b -u sshd
# 实时查看日志
journalctl -b -f
# 查看启动时间
journalctl -b --since "2026-02-05 00:00:00" --until "2026-02-05 00:10:00"

grub命令#

grub命令用于管理GRUB引导加载程序,可用于排查引导问题。

Terminal window
# 安装GRUB
grub-install /dev/sda
# 更新GRUB配置
update-grub # Debian/Ubuntu
grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS
# 进入GRUB命令行
# 在GRUB菜单中按"c"
# GRUB命令行常用命令
# ls: 列出设备和分区
# ls (hd0,1)/: 查看分区内容
# set root=(hd0,1): 设置根分区
# linux /vmlinuz root=/dev/sda1: 设置内核和根分区
# initrd /initrd.img: 设置初始化RAM磁盘
# boot: 启动系统

fsck命令#

fsck命令用于检查和修复文件系统,可用于排查文件系统损坏问题。

Terminal window
# 检查文件系统(未挂载)
sudo fsck /dev/sda1
# 自动修复文件系统问题
sudo fsck -y /dev/sda1
# 强制检查文件系统
sudo fsck -f /dev/sda1
# 检查文件系统并显示详细信息
sudo fsck -v /dev/sda1
# 检查所有文件系统
sudo fsck -A

启动故障常见问题#

GRUB引导失败#

症状:系统无法启动,显示GRUB错误信息。

解决方案

  • 使用Live CD启动系统
  • 挂载根分区
  • 重新安装GRUB
  • 更新GRUB配置

文件系统损坏#

症状:系统启动时显示文件系统错误。

解决方案

  • 使用Live CD启动系统
  • 卸载损坏的文件系统
  • 使用fsck检查和修复文件系统

内核崩溃#

症状:系统启动时显示内核崩溃信息。

解决方案

  • 检查硬件是否故障
  • 检查内核参数是否正确
  • 尝试使用旧内核启动
  • 更新内核

系统运行故障排查#

系统资源故障排查#

CPU故障排查#

Terminal window
# 查看CPU使用情况
top
mpstat -P ALL 1
# 查看进程CPU使用情况
ps aux --sort=-%cpu | head -10
# 查看CPU温度
sensors # 需要安装lm-sensors
# 查看CPU信息
lscpu
cat /proc/cpuinfo

内存故障排查#

Terminal window
# 查看内存使用情况
free -h
vmstat 1
# 查看进程内存使用情况
ps aux --sort=-%mem | head -10
# 查看内存映射
pmap -x PID
# 检查内存是否有错误
sudo memtester 1G 1 # 需要安装memtester
# 查看内存信息
dmidecode -t memory
cat /proc/meminfo

磁盘故障排查#

Terminal window
# 查看磁盘使用情况
df -h
# 查看磁盘I/O统计信息
iostat -x 1
iotop # 需要安装iotop
# 查看磁盘健康状态
sudo smartctl -a /dev/sda # 需要安装smartmontools
# 检查磁盘坏道
sudo badblocks -v /dev/sda
# 查看磁盘分区
sudo fdisk -l
sudo parted -l
# 查看文件系统状态
tune2fs -l /dev/sda1 # ext2/3/4文件系统

网络故障排查#

Terminal window
# 检查网络接口状态
ifconfig
ip addr
# 检查网络连接
ping -c 5 localhost
ping -c 5 127.0.0.1
ping -c 5 192.168.1.1 # 网关
ping -c 5 8.8.8.8 # 外部DNS
# 检查路由表
route -n
ip route
# 检查DNS配置
cat /etc/resolv.conf
# 检查网络连接状态
netstat -tuln
ss -tuln
# 检查防火墙规则
sudo iptables -L
sudo firewall-cmd --list-all # firewalld
# 检查网络服务状态
sudo systemctl status network
sudo systemctl status NetworkManager

服务故障排查#

服务状态检查#

Terminal window
# 查看服务状态
systemctl status service_name
# 查看服务日志
journalctl -u service_name
# 查看服务启动失败原因
systemctl status service_name | grep "Failed"
# 查看服务依赖关系
systemctl list-dependencies service_name
# 查看服务启动顺序
systemctl list-dependencies --reverse service_name

服务启动故障排查#

症状:服务无法启动,显示错误信息。

解决方案

  • 检查服务配置文件
  • 检查服务依赖项
  • 检查服务日志
  • 检查端口是否被占用
  • 检查文件权限
Terminal window
# 检查服务配置文件语法
sudo nginx -t # Nginx
sudo apache2ctl configtest # Apache
sudo mysql --help # MySQL
# 检查端口是否被占用
ss -tulnp | grep "port_number"
# 检查文件权限
ls -la /path/to/service/config
# 检查服务用户权限
sudo -u service_user command

进程故障排查#

进程状态检查#

Terminal window
# 查看所有进程
ps aux
# 查看特定进程
ps aux | grep "process_name"
ps -p PID
# 查看进程树
pstree
pstree -p PID
# 查看进程状态
ps -eo pid,comm,state | grep "D" # 不可中断睡眠状态
# 查看进程打开的文件
lsof -p PID
# 查看进程网络连接
lsof -i -p PID
netstat -p | grep "PID"
ss -p | grep "PID"
# 查看进程内存映射
pmap -x PID
# 查看进程环境变量
cat /proc/PID/environ | tr '\0' '\n'
# 查看进程命令行参数
cat /proc/PID/cmdline | tr '\0' '\n'
# 查看进程限制
cat /proc/PID/limits

进程崩溃排查#

症状:进程突然崩溃,没有明显原因。

解决方案

  • 检查系统日志
  • 检查应用程序日志
  • 检查核心转储文件
  • 检查内存使用情况
  • 检查文件系统空间
Terminal window
# 检查核心转储文件
ls -la /var/crash/ # Debian/Ubuntu
ls -la /var/lib/systemd/coredump/ # systemd
# 分析核心转储文件
gdb /path/to/executable /path/to/core
# 查看系统日志
journalctl -p err..emerg
# 查看应用程序日志
cat /var/log/application.log

网络故障排查#

网络连接故障排查#

基本网络检查#

Terminal window
# 检查网络接口状态
ifconfig
ip addr
# 检查网络连接
ping -c 5 localhost
ping -c 5 127.0.0.1
ping -c 5 192.168.1.1 # 网关
ping -c 5 8.8.8.8 # 外部DNS
# 检查DNS解析
host example.com
dig example.com
nslookup example.com
# 检查路由表
route -n
ip route
# 检查网络连接状态
netstat -tuln
ss -tuln
# 检查防火墙规则
sudo iptables -L
sudo firewall-cmd --list-all # firewalld

高级网络检查#

Terminal window
# 追踪网络数据包的路由路径
traceroute example.com
tracepath example.com
# 检查网络连接质量
mtr example.com # 需要安装mtr
# 检查网络服务端口
nc -zv example.com 80 # HTTP
nc -zv example.com 443 # HTTPS
nc -zv example.com 22 # SSH
# 检查网络吞吐量
iperf3 -s # 服务器端
iperf3 -c server_ip # 客户端
# 检查网络数据包
sudo tcpdump -i eth0 port 80
sudo tcpdump -i eth0 host 192.168.1.100
sudo wireshark # 图形界面

网络服务故障排查#

Web服务器故障排查#

Terminal window
# 检查Web服务器状态
systemctl status nginx
systemctl status apache2
# 检查Web服务器日志
cat /var/log/nginx/error.log
cat /var/log/apache2/error.log
# 检查Web服务器配置
nginx -t
apache2ctl configtest
# 检查Web服务器端口
ss -tuln | grep "80"
ss -tuln | grep "443"
# 测试Web服务器响应
curl -I http://localhost
curl -I https://localhost

SSH服务器故障排查#

Terminal window
# 检查SSH服务器状态
systemctl status ssh
systemctl status sshd
# 检查SSH服务器日志
journalctl -u ssh
journalctl -u sshd
# 检查SSH服务器配置
cat /etc/ssh/sshd_config
# 检查SSH服务器端口
ss -tuln | grep "22"
# 测试SSH连接
ssh -v localhost
ssh -v user@server_ip

数据库服务器故障排查#

Terminal window
# 检查数据库服务器状态
systemctl status mysql
systemctl status postgresql
# 检查数据库服务器日志
cat /var/log/mysql/error.log
cat /var/log/postgresql/postgresql-13-main.log
# 检查数据库服务器端口
ss -tuln | grep "3306" # MySQL
ss -tuln | grep "5432" # PostgreSQL
# 测试数据库连接
mysql -u root -p
psql -U postgres

应用程序故障排查#

应用程序启动故障排查#

Terminal window
# 检查应用程序配置文件
cat /path/to/application/config
# 检查应用程序依赖项
ldd /path/to/application/executable
# 检查应用程序权限
ls -la /path/to/application/
# 检查应用程序日志
cat /path/to/application/log
# 检查应用程序端口
ss -tuln | grep "port_number"
# 以调试模式运行应用程序
/path/to/application/executable --debug

应用程序运行故障排查#

Terminal window
# 查看应用程序进程
ps aux | grep "application_name"
# 查看应用程序内存使用情况
pmap -x PID
# 查看应用程序打开的文件
lsof -p PID
# 查看应用程序网络连接
lsof -i -p PID
# 查看应用程序CPU使用情况
top -p PID
# 查看应用程序系统调用
strace -p PID # 需要安装strace
# 查看应用程序性能
perf top -p PID # 需要安装linux-tools
# 生成应用程序核心转储
gdb --batch --eval-command="generate-core-file" --pid=PID

安全故障排查#

安全事件排查#

Terminal window
# 检查登录记录
last
lastb
# 检查认证日志
cat /var/log/auth.log # Debian/Ubuntu
cat /var/log/secure # RHEL/CentOS
journalctl SYSLOG_FACILITY=10
# 检查sudo使用情况
cat /var/log/auth.log | grep "sudo"
# 检查文件权限变更
auditctl -l # 需要安装auditd
auditd -k perm_mod # 查看权限变更日志
# 检查网络连接
netstat -tulnp
ss -tulnp
# 检查系统调用
ausyscall --dump # 查看系统调用列表

入侵检测#

Terminal window
# 检查异常进程
ps aux | grep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" # 可疑IP地址
ps aux | grep "\./" # 当前目录执行的程序
# 检查异常文件
find / -name "*.sh" -mtime -1 -type f # 最近1天修改的shell脚本
find / -perm -4000 -type f # 具有SUID权限的文件
# 检查异常网络连接
netstat -tulnp | grep "ESTABLISHED"
ss -tulnp | grep "ESTABLISHED"
# 检查系统日志中的可疑活动
grep "Failed password" /var/log/auth.log
grep "Invalid user" /var/log/auth.log
# 使用安全扫描工具
nmap -sV localhost # 端口扫描
openvas # 漏洞扫描

日志分析故障排查#

日志文件位置#

常见的日志文件位置:

  • /var/log/syslog:Debian/Ubuntu系统的主要系统日志
  • /var/log/messages:RHEL/CentOS系统的主要系统日志
  • /var/log/auth.log:Debian/Ubuntu系统的认证日志
  • /var/log/secure:RHEL/CentOS系统的认证日志
  • /var/log/kern.log:内核日志
  • /var/log/boot.log:系统启动日志
  • /var/log/apache2/:Apache Web服务器日志
  • /var/log/nginx/:Nginx Web服务器日志
  • /var/log/mysql/:MySQL数据库日志

日志分析命令#

Terminal window
# 查看日志文件
cat /var/log/syslog
less /var/log/syslog
# 查看日志文件的最后几行
tail -n 100 /var/log/syslog
tail -f /var/log/syslog # 实时查看
# 搜索日志文件中的关键词
grep "error" /var/log/syslog
grep "fail" /var/log/syslog
grep "warn" /var/log/syslog
# 搜索日志文件中的关键词(忽略大小写)
grep -i "error" /var/log/syslog
# 搜索日志文件中的多个关键词
grep -E "error|fail|warn" /var/log/syslog
# 搜索特定时间段的日志
grep "Feb 5" /var/log/syslog # 特定日期
grep "10:00:00" /var/log/syslog # 特定时间
# 统计日志文件中关键词的出现次数
grep -c "error" /var/log/syslog
# 查看日志文件中的唯一值
grep "error" /var/log/syslog | sort | uniq

日志分析工具#

logwatch#

logwatch命令用于分析系统日志并生成报告。

Terminal window
# 安装logwatch
sudo apt install -y logwatch # Debian/Ubuntu
sudo yum install -y logwatch # RHEL/CentOS
# 生成日志报告
logwatch
# 生成特定服务的日志报告
logwatch --service sshd
logwatch --service http
# 生成特定时间段的日志报告
logwatch --range today
logwatch --range yesterday
logwatch --range "last 7 days"
# 生成详细的日志报告
logwatch --detail high

journalctl#

journalctl命令用于查看和管理systemd日志。

Terminal window
# 查看所有日志
journalctl
# 查看最近的日志
journalctl -n 100
# 实时查看日志
journalctl -f
# 查看特定服务的日志
journalctl -u sshd
journalctl -u nginx
# 查看特定优先级的日志
journalctl -p err..emerg
# 查看特定时间段的日志
journalctl --since "2026-02-05 00:00:00" --until "2026-02-05 23:59:59"
# 导出日志到文件
journalctl -o json > logs.json
journalctl -o short > logs.txt

故障排查工具#

系统工具#

strace命令#

strace命令用于跟踪进程的系统调用,可用于排查应用程序问题。

Terminal window
# 安装strace
sudo apt install -y strace # Debian/Ubuntu
sudo yum install -y strace # RHEL/CentOS
# 跟踪进程的系统调用
strace -p PID
# 跟踪命令的系统调用
strace ls -la
# 跟踪特定系统调用
strace -e open,read,write ls -la
# 统计系统调用
strace -c ls -la
# 将输出保存到文件
strace -o strace.log ls -la

ltrace命令#

ltrace命令用于跟踪进程的库调用,可用于排查应用程序问题。

Terminal window
# 安装ltrace
sudo apt install -y ltrace # Debian/Ubuntu
sudo yum install -y ltrace # RHEL/CentOS
# 跟踪进程的库调用
ltrace -p PID
# 跟踪命令的库调用
ltrace ls -la
# 统计库调用
ltrace -c ls -la
# 将输出保存到文件
ltrace -o ltrace.log ls -la

gdb命令#

gdb命令用于调试程序,可用于排查应用程序崩溃问题。

Terminal window
# 安装gdb
sudo apt install -y gdb # Debian/Ubuntu
sudo yum install -y gdb # RHEL/CentOS
# 调试程序
gdb /path/to/executable
# 调试正在运行的进程
gdb -p PID
# 分析核心转储文件
gdb /path/to/executable /path/to/core
# gdb常用命令
# run: 运行程序
# break: 设置断点
# continue: 继续运行
# step: 单步执行
# print: 打印变量值
# backtrace: 显示调用栈
# quit: 退出gdb

perf命令#

perf命令用于分析系统性能,可用于排查性能问题。

Terminal window
# 安装perf
sudo apt install -y linux-tools-common # Debian/Ubuntu
sudo yum install -y perf # RHEL/CentOS
# 查看系统性能
top
# 查看进程性能
perf top -p PID
# 分析程序性能
perf record -g ls -la
perf report
# 分析系统调用
perf trace ls -la

网络工具#

tcpdump命令#

tcpdump命令用于捕获和分析网络数据包,可用于排查网络问题。

Terminal window
# 安装tcpdump
sudo apt install -y tcpdump # Debian/Ubuntu
sudo yum install -y tcpdump # RHEL/CentOS
# 捕获网络数据包
sudo tcpdump -i eth0
# 捕获特定端口的网络数据包
sudo tcpdump -i eth0 port 80
# 捕获特定IP的网络数据包
sudo tcpdump -i eth0 host 192.168.1.100
# 捕获特定协议的网络数据包
sudo tcpdump -i eth0 tcp
# 将输出保存到文件
sudo tcpdump -i eth0 -w capture.pcap
# 读取捕获文件
sudo tcpdump -r capture.pcap

netcat命令#

netcat命令用于测试网络连接,可用于排查网络服务问题。

Terminal window
# 安装netcat
sudo apt install -y netcat # Debian/Ubuntu
sudo yum install -y nc # RHEL/CentOS
# 测试TCP连接
nc -zv example.com 80
# 测试UDP连接
nc -zvu example.com 53
# 作为服务器监听端口
nc -l 8080
# 作为客户端连接服务器
nc server_ip 8080
# 传输文件
# 服务器端: nc -l 8080 > file.txt
# 客户端: nc server_ip 8080 < file.txt

mtr命令#

mtr命令用于测试网络连接质量,是pingtraceroute的结合。

Terminal window
# 安装mtr
sudo apt install -y mtr # Debian/Ubuntu
sudo yum install -y mtr # RHEL/CentOS
# 测试网络连接质量
mtr example.com
# 以报告模式运行
mtr -r example.com
# 设置数据包大小
mtr -s 1000 example.com
# 设置超时时间
mtr -T example.com

故障排查最佳实践#

1. 保持冷静#

故障发生时,保持冷静,不要惊慌。系统故障是常见的,大多数问题都可以解决。

2. 收集信息#

在开始故障排查之前,收集足够的信息,了解故障的症状和上下文。

3. 制定计划#

根据收集到的信息,制定故障排查计划,确定排查步骤和优先级。

4. 逐步排查#

按照计划逐步排查,每一步都要验证假设,避免盲目操作。

5. 记录过程#

记录故障排查过程,包括收集的信息、采取的措施和结果,便于未来参考。

6. 验证解决方案#

解决故障后,验证解决方案是否有效,确保系统恢复正常运行。

7. 分析原因#

分析故障原因,总结经验教训,避免类似故障再次发生。

8. 更新文档#

更新系统文档,记录故障原因和解决方案,便于团队成员参考。

常见故障及解决方案#

系统无法启动#

症状:系统无法启动,显示错误信息。

解决方案

  • 检查BIOS/UEFI设置
  • 检查引导加载程序
  • 检查文件系统
  • 检查内核参数

服务无法启动#

症状:系统服务无法启动,显示错误信息。

解决方案

  • 检查服务配置文件
  • 检查服务依赖项
  • 检查服务日志
  • 检查端口是否被占用

网络连接失败#

症状:系统无法连接到网络。

解决方案

  • 检查网络接口状态
  • 检查网络配置
  • 检查路由表
  • 检查防火墙规则

磁盘空间不足#

症状:系统显示磁盘空间不足。

解决方案

  • 清理临时文件
  • 删除不必要的文件
  • 扩展文件系统
  • 检查是否有大文件

内存使用过高#

症状:系统内存使用过高,导致性能下降。

解决方案

  • 检查内存使用情况
  • 杀死占用内存的进程
  • 增加系统内存
  • 优化应用程序

CPU使用过高#

症状:系统CPU使用过高,导致性能下降。

解决方案

  • 检查CPU使用情况
  • 杀死占用CPU的进程
  • 优化应用程序
  • 增加系统CPU

总结#

本文介绍了Linux系统中常用的故障排查命令和技巧,包括系统启动故障排查、系统运行故障排查、网络故障排查、应用程序故障排查、安全故障排查和日志分析等方面的内容。通过掌握这些命令和技巧,系统管理员可以更高效地排查和解决系统故障,提高系统的可靠性和可用性。

故障排查是一项需要经验和技巧的工作,需要系统管理员不断学习和实践,积累经验。在故障排查过程中,系统管理员需要保持冷静,收集足够的信息,制定合理的计划,逐步排查,验证假设,最终解决问题。同时,系统管理员还需要总结经验教训,避免类似故障再次发生,提高系统的稳定性和可靠性。

练习#

  1. 使用dmesg命令查看内核启动信息,排查启动过程中的问题。
  2. 使用topmpstat命令监控系统CPU使用情况,排查CPU故障。
  3. 使用freevmstat命令监控系统内存使用情况,排查内存故障。
  4. 使用dfiostat命令监控系统磁盘使用情况,排查磁盘故障。
  5. 使用pingtraceroutetcpdump命令排查网络故障。
  6. 使用systemctljournalctl命令排查服务故障。
  7. 使用pstopstrace命令排查进程故障。
  8. 使用greplogwatch命令分析系统日志,排查系统问题。
  9. 使用straceltrace命令跟踪进程的系统调用和库调用,排查应用程序问题。
  10. 制定一个完整的故障排查计划,包括收集信息、分析问题、解决问题和验证解决方案等步骤。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Linux故障排查命令和技巧
https://blog.vanilla.net.cn/posts/2026-02-05-linux-troubleshooting/
作者
鹁鸪
发布于
2026-02-05
许可协议
CC BY-NC-SA 4.0

评论区

目录