Linux故障排查命令和技巧
Linux故障排查命令和技巧
故障排查概述
故障排查是系统管理的重要组成部分,它可以帮助系统管理员快速识别和解决系统问题,减少系统 downtime,提高系统的可靠性和可用性。Linux系统提供了丰富的故障排查工具和命令,本文将介绍Linux系统中常用的故障排查命令和技巧,帮助系统管理员更高效地排查和解决系统故障。
故障排查步骤
1. 收集信息
在开始故障排查之前,首先需要收集足够的信息,了解故障的症状和上下文。
- 故障现象:系统表现出的异常行为,如服务无法启动、网络连接失败等
- 故障时间:故障发生的时间点
- 系统状态:系统的当前状态,如CPU、内存、磁盘使用情况
- 系统日志:系统和应用程序的日志信息
- 配置变更:最近的系统配置变更
- 相关事件:与故障相关的其他事件
2. 分析问题
根据收集到的信息,分析问题的可能原因。
- 确定故障范围:故障影响的范围,是单个服务还是整个系统
- 识别可能原因:根据故障现象和系统状态,识别可能的原因
- 验证假设:通过测试和检查,验证可能的原因
3. 解决问题
根据分析结果,采取适当的措施解决问题。
- 制定解决方案:根据故障原因,制定解决方案
- 实施解决方案:执行解决方案,解决故障
- 验证解决方案:验证解决方案是否有效
- 记录解决方案:记录故障原因和解决方案,便于未来参考
系统启动故障排查
启动过程
Linux系统的启动过程包括以下几个阶段:
- BIOS/UEFI初始化:硬件自检和引导设备选择
- 引导加载程序:加载内核和初始化RAM磁盘
- 内核初始化:初始化硬件和挂载根文件系统
- init系统:启动系统服务和用户空间进程
- 登录界面:显示登录提示符
启动故障排查命令
dmesg命令
dmesg命令用于显示内核启动信息,可用于排查启动过程中的问题。
# 查看内核启动信息dmesg
# 查看内核启动信息(最新的100行)dmesg | tail -n 100
# 查看包含错误信息的内核启动信息dmesg | grep "error"dmesg | grep "fail"
# 查看特定硬件的内核启动信息dmesg | grep "eth0" # 网络接口dmesg | grep "sda" # 磁盘
# 以人类可读格式显示时间戳dmesg -T
# 清除内核环形缓冲区dmesg -cjournalctl命令
journalctl命令用于查看systemd日志,可用于排查启动过程中的问题。
# 查看启动日志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引导加载程序,可用于排查引导问题。
# 安装GRUBgrub-install /dev/sda
# 更新GRUB配置update-grub # Debian/Ubuntugrub2-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命令用于检查和修复文件系统,可用于排查文件系统损坏问题。
# 检查文件系统(未挂载)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故障排查
# 查看CPU使用情况topmpstat -P ALL 1
# 查看进程CPU使用情况ps aux --sort=-%cpu | head -10
# 查看CPU温度sensors # 需要安装lm-sensors
# 查看CPU信息lscpucat /proc/cpuinfo内存故障排查
# 查看内存使用情况free -hvmstat 1
# 查看进程内存使用情况ps aux --sort=-%mem | head -10
# 查看内存映射pmap -x PID
# 检查内存是否有错误sudo memtester 1G 1 # 需要安装memtester
# 查看内存信息dmidecode -t memorycat /proc/meminfo磁盘故障排查
# 查看磁盘使用情况df -h
# 查看磁盘I/O统计信息iostat -x 1iotop # 需要安装iotop
# 查看磁盘健康状态sudo smartctl -a /dev/sda # 需要安装smartmontools
# 检查磁盘坏道sudo badblocks -v /dev/sda
# 查看磁盘分区sudo fdisk -lsudo parted -l
# 查看文件系统状态tune2fs -l /dev/sda1 # ext2/3/4文件系统网络故障排查
# 检查网络接口状态ifconfigip addr
# 检查网络连接ping -c 5 localhostping -c 5 127.0.0.1ping -c 5 192.168.1.1 # 网关ping -c 5 8.8.8.8 # 外部DNS
# 检查路由表route -nip route
# 检查DNS配置cat /etc/resolv.conf
# 检查网络连接状态netstat -tulnss -tuln
# 检查防火墙规则sudo iptables -Lsudo firewall-cmd --list-all # firewalld
# 检查网络服务状态sudo systemctl status networksudo systemctl status NetworkManager服务故障排查
服务状态检查
# 查看服务状态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服务启动故障排查
症状:服务无法启动,显示错误信息。
解决方案:
- 检查服务配置文件
- 检查服务依赖项
- 检查服务日志
- 检查端口是否被占用
- 检查文件权限
# 检查服务配置文件语法sudo nginx -t # Nginxsudo apache2ctl configtest # Apachesudo mysql --help # MySQL
# 检查端口是否被占用ss -tulnp | grep "port_number"
# 检查文件权限ls -la /path/to/service/config
# 检查服务用户权限sudo -u service_user command进程故障排查
进程状态检查
# 查看所有进程ps aux
# 查看特定进程ps aux | grep "process_name"ps -p PID
# 查看进程树pstreepstree -p PID
# 查看进程状态ps -eo pid,comm,state | grep "D" # 不可中断睡眠状态
# 查看进程打开的文件lsof -p PID
# 查看进程网络连接lsof -i -p PIDnetstat -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进程崩溃排查
症状:进程突然崩溃,没有明显原因。
解决方案:
- 检查系统日志
- 检查应用程序日志
- 检查核心转储文件
- 检查内存使用情况
- 检查文件系统空间
# 检查核心转储文件ls -la /var/crash/ # Debian/Ubuntuls -la /var/lib/systemd/coredump/ # systemd
# 分析核心转储文件gdb /path/to/executable /path/to/core
# 查看系统日志journalctl -p err..emerg
# 查看应用程序日志cat /var/log/application.log网络故障排查
网络连接故障排查
基本网络检查
# 检查网络接口状态ifconfigip addr
# 检查网络连接ping -c 5 localhostping -c 5 127.0.0.1ping -c 5 192.168.1.1 # 网关ping -c 5 8.8.8.8 # 外部DNS
# 检查DNS解析host example.comdig example.comnslookup example.com
# 检查路由表route -nip route
# 检查网络连接状态netstat -tulnss -tuln
# 检查防火墙规则sudo iptables -Lsudo firewall-cmd --list-all # firewalld高级网络检查
# 追踪网络数据包的路由路径traceroute example.comtracepath example.com
# 检查网络连接质量mtr example.com # 需要安装mtr
# 检查网络服务端口nc -zv example.com 80 # HTTPnc -zv example.com 443 # HTTPSnc -zv example.com 22 # SSH
# 检查网络吞吐量iperf3 -s # 服务器端iperf3 -c server_ip # 客户端
# 检查网络数据包sudo tcpdump -i eth0 port 80sudo tcpdump -i eth0 host 192.168.1.100sudo wireshark # 图形界面网络服务故障排查
Web服务器故障排查
# 检查Web服务器状态systemctl status nginxsystemctl status apache2
# 检查Web服务器日志cat /var/log/nginx/error.logcat /var/log/apache2/error.log
# 检查Web服务器配置nginx -tapache2ctl configtest
# 检查Web服务器端口ss -tuln | grep "80"ss -tuln | grep "443"
# 测试Web服务器响应curl -I http://localhostcurl -I https://localhostSSH服务器故障排查
# 检查SSH服务器状态systemctl status sshsystemctl status sshd
# 检查SSH服务器日志journalctl -u sshjournalctl -u sshd
# 检查SSH服务器配置cat /etc/ssh/sshd_config
# 检查SSH服务器端口ss -tuln | grep "22"
# 测试SSH连接ssh -v localhostssh -v user@server_ip数据库服务器故障排查
# 检查数据库服务器状态systemctl status mysqlsystemctl status postgresql
# 检查数据库服务器日志cat /var/log/mysql/error.logcat /var/log/postgresql/postgresql-13-main.log
# 检查数据库服务器端口ss -tuln | grep "3306" # MySQLss -tuln | grep "5432" # PostgreSQL
# 测试数据库连接mysql -u root -ppsql -U postgres应用程序故障排查
应用程序启动故障排查
# 检查应用程序配置文件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应用程序运行故障排查
# 查看应用程序进程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安全故障排查
安全事件排查
# 检查登录记录lastlastb
# 检查认证日志cat /var/log/auth.log # Debian/Ubuntucat /var/log/secure # RHEL/CentOSjournalctl SYSLOG_FACILITY=10
# 检查sudo使用情况cat /var/log/auth.log | grep "sudo"
# 检查文件权限变更auditctl -l # 需要安装auditdauditd -k perm_mod # 查看权限变更日志
# 检查网络连接netstat -tulnpss -tulnp
# 检查系统调用ausyscall --dump # 查看系统调用列表入侵检测
# 检查异常进程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.loggrep "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数据库日志
日志分析命令
# 查看日志文件cat /var/log/syslogless /var/log/syslog
# 查看日志文件的最后几行tail -n 100 /var/log/syslogtail -f /var/log/syslog # 实时查看
# 搜索日志文件中的关键词grep "error" /var/log/sysloggrep "fail" /var/log/sysloggrep "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命令用于分析系统日志并生成报告。
# 安装logwatchsudo apt install -y logwatch # Debian/Ubuntusudo yum install -y logwatch # RHEL/CentOS
# 生成日志报告logwatch
# 生成特定服务的日志报告logwatch --service sshdlogwatch --service http
# 生成特定时间段的日志报告logwatch --range todaylogwatch --range yesterdaylogwatch --range "last 7 days"
# 生成详细的日志报告logwatch --detail highjournalctl
journalctl命令用于查看和管理systemd日志。
# 查看所有日志journalctl
# 查看最近的日志journalctl -n 100
# 实时查看日志journalctl -f
# 查看特定服务的日志journalctl -u sshdjournalctl -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.jsonjournalctl -o short > logs.txt故障排查工具
系统工具
strace命令
strace命令用于跟踪进程的系统调用,可用于排查应用程序问题。
# 安装stracesudo apt install -y strace # Debian/Ubuntusudo 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 -laltrace命令
ltrace命令用于跟踪进程的库调用,可用于排查应用程序问题。
# 安装ltracesudo apt install -y ltrace # Debian/Ubuntusudo yum install -y ltrace # RHEL/CentOS
# 跟踪进程的库调用ltrace -p PID
# 跟踪命令的库调用ltrace ls -la
# 统计库调用ltrace -c ls -la
# 将输出保存到文件ltrace -o ltrace.log ls -lagdb命令
gdb命令用于调试程序,可用于排查应用程序崩溃问题。
# 安装gdbsudo apt install -y gdb # Debian/Ubuntusudo 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: 退出gdbperf命令
perf命令用于分析系统性能,可用于排查性能问题。
# 安装perfsudo apt install -y linux-tools-common # Debian/Ubuntusudo yum install -y perf # RHEL/CentOS
# 查看系统性能top
# 查看进程性能perf top -p PID
# 分析程序性能perf record -g ls -laperf report
# 分析系统调用perf trace ls -la网络工具
tcpdump命令
tcpdump命令用于捕获和分析网络数据包,可用于排查网络问题。
# 安装tcpdumpsudo apt install -y tcpdump # Debian/Ubuntusudo 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.pcapnetcat命令
netcat命令用于测试网络连接,可用于排查网络服务问题。
# 安装netcatsudo apt install -y netcat # Debian/Ubuntusudo 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.txtmtr命令
mtr命令用于测试网络连接质量,是ping和traceroute的结合。
# 安装mtrsudo apt install -y mtr # Debian/Ubuntusudo 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系统中常用的故障排查命令和技巧,包括系统启动故障排查、系统运行故障排查、网络故障排查、应用程序故障排查、安全故障排查和日志分析等方面的内容。通过掌握这些命令和技巧,系统管理员可以更高效地排查和解决系统故障,提高系统的可靠性和可用性。
故障排查是一项需要经验和技巧的工作,需要系统管理员不断学习和实践,积累经验。在故障排查过程中,系统管理员需要保持冷静,收集足够的信息,制定合理的计划,逐步排查,验证假设,最终解决问题。同时,系统管理员还需要总结经验教训,避免类似故障再次发生,提高系统的稳定性和可靠性。
练习
- 使用
dmesg命令查看内核启动信息,排查启动过程中的问题。 - 使用
top和mpstat命令监控系统CPU使用情况,排查CPU故障。 - 使用
free和vmstat命令监控系统内存使用情况,排查内存故障。 - 使用
df和iostat命令监控系统磁盘使用情况,排查磁盘故障。 - 使用
ping、traceroute和tcpdump命令排查网络故障。 - 使用
systemctl和journalctl命令排查服务故障。 - 使用
ps、top和strace命令排查进程故障。 - 使用
grep和logwatch命令分析系统日志,排查系统问题。 - 使用
strace和ltrace命令跟踪进程的系统调用和库调用,排查应用程序问题。 - 制定一个完整的故障排查计划,包括收集信息、分析问题、解决问题和验证解决方案等步骤。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!