在服务器运维中,操作系统(OS)故障排除是保障业务连续性的核心技能。以下是系统化的故障排除方法,结合常见故障场景和实战工具,帮助快速定位并解决问题。
/etc、/boot)或数据,防止误操作扩大损失。现象:开机黑屏、卡在GRUB界面、启动过程中死机。
可能原因:
排查步骤:
/mnt/sysimage)。chroot /mnt/sysimage && grub2-install /dev/sda(CentOS/RHEL)或update-grub && grub-install /dev/sda(Ubuntu)。/boot下内核文件(如vmlinuz-xxx)和initramfs(如initramfs-xxx.img)是否存在,缺失则重新生成:dracut -f /boot/initramfs-$(uname -r).img $(uname -r)(CentOS)或update-initramfs -u -k $(uname -r)(Ubuntu)。fdisk -l或lsblk确认分区表是否正常,若分区表损坏,尝试testdisk工具恢复。现象:SSH登录慢、命令执行延迟、系统负载(uptime显示load average)过高。
可能原因:CPU/内存/磁盘IO耗尽、僵尸进程、内核死锁。
排查步骤:
top/htop:实时查看CPU、内存、进程占用(按P按CPU排序,M按内存排序)。vmstat 1:观察r(运行队列)、b(阻塞进程)、si/so(交换分区读写)——若r长期>CPU核心数,说明CPU过载;si/so过高说明内存不足。iostat -x 1:查看磁盘IO(%util接近100%说明磁盘瓶颈;await>20ms说明IO延迟高)。ps -ef | grep <PID>确认进程身份,必要时kill -9 <PID>终止(注意:先确认进程是否可终止,避免杀掉系统关键进程如init/systemd)。top中Z状态),需找到父进程并重启父进程(僵尸进程无法被直接杀死)。free -h查看内存使用,若available内存极低且swap被大量使用,可能是内存泄漏。通过valgrind(应用级)或slabtop(内核级)定位泄漏点。现象:无法创建文件、提示“No space left on device”,但df -h显示磁盘未满。
可能原因:磁盘空间满、Inode(文件索引节点)耗尽、磁盘配额限制。
排查步骤:
df -h查看各分区使用率,找到满的分区(如/根分区)。du -sh /* | sort -rh:从根目录开始排查大目录(注意:需排除/proc、/sys等虚拟文件系统)。find / -type f -size +1G:查找大于1G的文件(可能需root权限)。/var/log下的旧日志(用logrotate管理)、/tmp临时文件、应用缓存(如Docker镜像、YUM缓存yum clean all)。df -i查看Inode使用率,若100%则Inode耗尽(通常是小文件过多,如日志、缓存文件)。
for i in /*; do echo $i; find $i -maxdepth 1 -type f | wc -l; done(逐层排查)。quota -u <用户名>确认是否触发用户/组配额限制。现象:SSH无法连接、外网ping不通、服务端口(如80/443)无法访问。
可能原因:网络配置错误、防火墙拦截、路由问题、网卡故障。
排查步骤:
ip addr/ifconfig确认网卡是否启动(UP状态)、IP/子网掩码是否正确。
ifup eth0(CentOS)或ip link set eth0 up(通用)。ip route确认默认网关(default via <网关IP>)是否存在,错误则添加:ip route add default via 192.168.1.1 dev eth0。cat /etc/resolv.conf确认DNS服务器(如nameserver 8.8.8.8),用nslookup baidu.com或dig baidu.com测试解析是否正常。firewalld(CentOS 7+):firewall-cmd --list-all查看开放端口,添加端口:firewall-cmd --add-port=80/tcp --permanent && firewall-cmd --reload。iptables(老系统):iptables -L -n查看规则,临时开放端口:iptables -I INPUT -p tcp --dport 80 -j ACCEPT。ping <同网段IP>确认链路通;arping <网关IP>检查ARP缓存。ping 8.8.8.8确认出口通;traceroute baidu.com跟踪路由节点(定位哪跳丢包)。ss -tulnp | grep <端口>(如ss -tulnp | grep 80)确认服务是否监听端口,若未监听则检查服务状态(如systemctl status nginx)。现象:systemctl start <服务名>失败,提示“Job failed”。
可能原因:配置文件错误、依赖服务未启动、权限不足、端口被占用。
排查步骤:
systemctl status <服务名>:看“Status”和“Logs”片段。journalctl -u <服务名> -f:实时查看服务日志(-f跟踪最新日志)。/var/log/nginx/error.log)。nginx -t(Nginx)、httpd -t(Apache)、sshd -t(SSH)。network服务,确认依赖是否启动:systemctl list-dependencies <服务名>。nginx用户)是否有配置/日志目录的读写权限(用ls -l查看)。ss -tulnp | grep <端口>,若端口被其他进程占用,终止占用进程或修改服务端口。现象:文件无法读写、提示“Read-only file system”、磁盘IO错误。
可能原因:非正常关机、磁盘坏道、文件系统元数据损坏。
排查步骤:
umount /dev/sda1,再执行fsck -y /dev/sda1(-y自动修复)。fsck -y /dev/sda1(需确保分区未挂载)。badblocks -v /dev/sda:扫描磁盘坏道(慎用-w写模式,会破坏数据),若大量坏道,需更换硬盘。mount -o remount,rw /(重新挂载根分区为读写)。现象:系统突然重启、屏幕显示“Kernel Panic”、日志中出现“Oops”错误。
可能原因:内核模块冲突、硬件兼容性问题、驱动bug、内存错误。
排查步骤:
dmesg | grep -i "error\|oops\|panic"或journalctl -k(内核日志),定位错误模块(如ext4模块、网卡驱动)。/etc/modprobe.d/下创建黑名单文件(如blacklist nouveau禁用NVIDIA开源驱动)。yum remove kernel-xxx(CentOS)。yum update kernel(CentOS)或apt upgrade linux-image(Ubuntu)。memtest86+工具(需制作启动盘)测试内存是否故障。现象:无法SSH登录、提示“Permission denied”、sudo命令失败。
可能原因:密码过期、SSH配置错误、sudoers配置错误、SELinux限制。
排查步骤:
systemctl status sshd,确认监听端口(默认22)。cat /etc/ssh/sshd_config,检查PermitRootLogin(是否允许root登录)、PasswordAuthentication(是否允许密码登录),修改后重启sshd。~/.ssh/authorized_keys权限为600,~/.ssh目录权限为700。passwd -S <用户名>:查看密码是否过期(Password expires)。chage -l <用户名>:查看账户过期时间,若过期则chage -E -1 <用户名>延长有效期。visudo(安全编辑/etc/sudoers),确认用户是否在sudo组(如%sudo ALL=(ALL:ALL) ALL),避免直接修改sudoers文件(易语法错误)。getenforce显示Enforcing),可能限制操作:
setenforce 0(Permissive模式),测试是否恢复;/etc/selinux/config,设SELINUX=disabled,重启生效。| 类型 | 工具/命令 | 用途 |
|---|---|---|
| 系统监控 | top/htop、vmstat、iostat、sar |
实时查看CPU、内存、IO、负载 |
| 日志分析 | journalctl、dmesg、tail -f /var/log/* |
查看系统/内核/服务日志 |
| 磁盘管理 | df、du、fsck、badblocks、lsblk |
检查磁盘空间、修复文件系统、扫描坏道 |
| 网络排查 | ip、ss、ping、traceroute、tcpdump |
配置网络、查看端口、连通性测试、抓包分析 |
| 进程管理 | ps、kill、pstree、lsof |
查看进程、终止进程、查看进程打开的文件/端口 |
| 救援工具 | 系统安装盘(救援模式)、testdisk、grub2-install |
修复引导、恢复分区表、救援系统 |
关键日志位置:
/var/log/messages(CentOS)、/var/log/syslog(Ubuntu)/var/log/dmesg或journalctl -k/var/log/<服务名>/(如Nginx、MySQL)/var/log/secure(CentOS)、/var/log/auth.log(Ubuntu)/etc)、重要数据、GRUB配置、磁盘分区表(sfdisk -d /dev/sda > sda.partition)。logrotate定期切割/压缩日志,避免日志占满磁盘。通过以上方法,可系统化定位OS故障,结合实战经验积累,能快速响应服务器异常。故障排除的核心是“有理有据”——用日志和工具说话,而非凭直觉操作。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。