经典故障案例

命令行-bash-4.2$故障:

用户家目录的~/.bashrc被误删,重新拷一份即可

permission denied故障分析

1.文件权限 2.目录权限

僵尸进程排查/处理

僵尸进程如何检查?如何结束僵尸进程?

top命令查看几个zobmie
ps aux | grep Z 得到僵尸进程pid号,先尝试kill -9 pid
pstree -p | grep (pid) 找到僵尸进程父进程,将其父进程结束

系统负载故障案例

系统负载高如何排查?
0.(公有云)看监控界面简单查看,是cpu/内存/io哪个负载高
1. 查看整体负载
uptime/w # 显示平均负载(1/5/15分钟)
top # 实时监控进程和资源占用(按 P 按CPU排序,按 M 按内存排序)

2. 检查CPU瓶颈
htop # 更直观的进程监控(需安装:sudo dnf install htop)
pidstat 1 # 每秒统计进程的CPU使用(需安装:sudo dnf install sysstat)
3. 检查内存/交换分区
free -h # 查看内存和 Swap 使用情况
vmstat 1 # 监控内存、Swap、I/O 和 CPU 状态
4. 检查磁盘I/O
iotop# 实时显示磁盘I/O占用进程(需安装:sudo dnf install iotop)
显示结果:DISK READ读DISK WRITE写
iotop -o只看正在写的进程

iostat -xz 1 # 查看磁盘I/O和利用率(需安装 sysstat)

5. 检查网络
nload # 实时监控网络带宽(需安装:sudo dnf install nload)
ss -tunap # 查看活动网络连接和进程
6. 快速定位异常进程
ps aux –sort=-%cpu | head # 列出CPU占用最高的前10进程
ps aux –sort=-%mem | head # 列出内存占用最高的前10进程

7.分析高负载的服务日志,找出原因/var/log/messages

8. 内核日志
dmesg | tail -20 # 检查近期内核日志是否有硬件/驱动错误

故障复现:

 stress 压力测试命令:yum install -y stress
stress –cpu 4 / –vm 2 –timeout 10(s可以不加)
— io 2 -hdd 3 (磁盘) io也会导致cpu占用

root密码忘记找回(rhel9)

1.系统自带救援模式

按e进⼊图2页面,原配置如图所示。

修改原配置为红色框选部分,如图⼆所示

然后按ctrl+x,执行以下命令

# mount -o remount,rw /sysroot
# chroot /sysroot # echo redhat | passwd –stdin root
# touch /.autorelabel
# sync
# exit
# exit

2.光盘/u盘救援模式

1.插入光盘
2.重启并在弹服务器logo时按esc进入boot菜单
3.选择光盘启动

4.选troubleshooting→rescue的那行(install system)


5.coutinue→1 进入rescue mount后输入chroot/mnt/sysimage即可进入光盘目录,

(这一步的目的主动切换根目录,原系统的根是/mnt/sysimage)
1.chroot /mnt/sysimage
2.vim /etc/passwd或者echo mima | passwd –stdin root

2.U盘:可以用ventory做可启动u盘,里面支持大量镜像,主要给物理服务器用

其它系统自带救援模式(centos7/ubuntu)

centos7:

GRUB菜单按e,找到linux16的行,ro(read only)改为rw,这行最后添加init=/bin/bash(以命令解释器进入系统),ctrl+x进入救援模式,不用输入root密码,vim /etc/passwd 把root行的x删除,即可清空root密码,ctrl+d退出后进入系统修改root密码

debian/ubt系:
默认不弹grub菜单,重启迅速按一下esc,出现boot menu界面在按一下esc,进入救援模式页面操作同上

定时任务故障案例

如运行脚本的时候某几个命令报错(仔细检查脚本格式和环境变量问题)

Linux运行级别

runlevel:Linux系统的不同状态

1.关机
2.重启
3.命令行 –ssh进入执行命令
4.图形化界面/桌面模式
ll /usr/lib/systemd/system/runlevel*.target

0-6有7个运行级别–234是一样的
0–关机
1–单用户模式/救援模式(系统自带),默认关闭网络
2,3,4–多用户模式,命令行模式,文本模式,multi-user
5–图形化界面,X11,vnc连接或本地连接,graphical
6–重启 reboot

查看/修改默认运行级别

查看:systemcytl get-default

修改:systemctl set-default graphical.target 实质是改了软连接

补充:init命令(在生产环境中使用shut down命令,而不是poweroff或init)

init 0–关机
init 6–重启

poweroff/reboot/init/shutdown命令区别

命令/操作功能定时任务用户通知兼容性底层逻辑
poweroff立即关机并断电❌ 不支持❌ 不支持所有主流系统直接调用内核关机
reboot立即重启系统❌ 不支持❌ 不支持所有主流系统直接调用内核重启
shutdown灵活关机/重启,支持定时✔️ 支持✔️ 支持所有主流系统安全终止进程,支持计划任务
init 0 / init 6按运行级别关机/重启❌ 不支持❌ 不支持主要兼容旧系统执行运行级别脚本后关机/重启

关键区别详解

  1. 功能范围
    • poweroff/reboot:直接触发硬件操作,简单粗暴。
    • shutdown:支持定时、通知、取消任务,适合生产环境。
    • init:通过切换运行级别实现关机/重启,依赖初始化脚本的流程。
  2. 底层逻辑
    • shutdown 和 init 会按顺序终止进程和服务(更安全),而 poweroff/reboot 可能跳过部分清理步骤(除非强制使用 -f)。
    • 在 systemd 系统中,poweroff/reboot/init 最终会调用 systemctl 的对应操作。
  3. 使用场景
    • 快速关机/重启poweroff 或 reboot
    • 计划任务或通知用户shutdown
    • 兼容旧脚本或 SysVinit 系统init 0 或 init 6

示例场景

  1. 生产服务器维护
     
    sudo shutdown -r 02:00 "系统将在凌晨2点重启,请保存工作!"
    • 使用 shutdown 提前通知用户,避免数据丢失。
  2. 强制快速重启(跳过服务终止)
     
    sudo reboot -f
    • 强制重启(慎用!可能导致数据损坏)。
  3. 传统 SysVinit 系统关机
     
    sudo init 0
    • 按运行级别脚本顺序关机。

Linux启动流程:开机–登陆界面

1.开机自检(服务器图标或vmvare的页面,检查硬件是否有问题)(BIOS/UEFI)
2.加载引导程序MBR/GPT–引导系统启动磁盘
3.GRUB菜单:选择启动的内核(多系统)/救援模式
4.加载内核 /boot/内核 加载到内存中运行
5.内核初始化启动第一个进程 systemd(rhel)/init(老系统)
6.读取运行级别 桌面/命令行模式
7.系统初始化进程 配置文件中的网络/自动挂载/主机名等等系统层面的服务
8.根据运行级别,并行启动服务
/usr/lib/systemd/system
/etc/systemd/system服务
(网络服务,ssh,crond)

无法连接公有云服务器故障排查

1.故障现象:无法连接云服务器 connection failed
2.故障排查步骤
①ping ip(公网)通了→
②telnet(检查端口是否开启,是否被防火墙/安全组拦截)telnet ip 22
去服务器本地连接检查是否开启22端口
ss -lntup | grep 22
ss -lntup | grep sshd
没有端口检查进程 ps -ef | grep sshd
systemctl status sshd
检查是否启动,有无报错信息
报错先查看配置文件,可以用vimdiff和之前的备份对比,确定没问题看journalctl -xe详细报错记录
发现问题

磁盘空间不足故障案例

(no space left on device)

1.block剩余数量(磁盘分区)不足,一般是一些较大文件导致,df -h查看整体,du -sh排查

故障复现:
原理:du  -sh查看文件夹大小一层层查看
1.cd /var/log
2.for n in {1..30}
do
dd if=/dev/zero of=lg-$n bs=1M count=1024
done
不能存太多,存98%左右,太满影响命令执行
3.du -sh /* | sort -rh(此处的h是以GB,MB,KB排序,人类可读排序)
4.结果显示/下的var最大,继续排查
du -sh /var/* | sort -rh | head
5.发现/var/log最大,进去找到没用的文件删除即可

2.inode剩余数量不足,df -i查看

文件足够大,优先占block,一般inode不会满,所以大部分情况都是block不足
故障复现:创建一个小的磁盘分区。挂载使用
dd命令来做这个空间用于测试
1.dd if=/dev/zero of=/tmp/30mb bs=1M count=30
2.file /tmp/30mb
3.mkfs.xfs /tmp/30mb
4.mkdir -p /inode
5.mount /tmp/30mb /inode
df -h查看,此时/tmp/30mb名字叫做/dev/loop0
(文件作为分区导致)
6.df -i查看inode剩余
7.cd /inode && touch {1..200000}(这里的数字范围大概在inode上限)
8.此时发现占用已达100%
df -h查看block足够表示inode用完
df -i查看inode,发现某个目录占用inode多
找到系统中占用inode多的文件夹:
find / -type -d -size +1M 找到文件目录中文件名大于1M的文件夹
#ll -h看的是目录中文件名的空间大小
ls /test/inode | head 查看刚才find找到的文件夹
ls | xargs rm
#xargs 把前一个命令的结果转化为后面命令的参数

文件删除原理

想彻底删除一个文件a.txt,必须满足两个条件:
1.rm命令删除使得这个文件硬链接数为0
2.删除的时候没有被进程/服务/命令所占用
#如日志文件一直写入,脚本或人工执行删除后没有彻底被删除

3.block被占用 文件未彻底删除导致

故障复现:
窗口1: dd if=/dev/zero of=/var/log/big bs=1M count=5000
tail -f /var/log/big 持续占用此文件
窗口2:rm -rf /var/log/big 尝试删除
排查:df -h查看根占用大小,再次rm删除,看视否有变化
du -sh / 看根占用大小,显示比df -h里面显示的文件大小要小很多
原因:du -sh 按照文件名查看大小,文件名被rm删除后,无法统计未被彻底删除但是没有文件名的文件—用lsof找这类文件

yum install -y lsof
lsof | grep delete查看未被彻底删除的文件
重启或结束对应进程释放文件
kill 占用文件的pid再删除文件即可

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部