一, 处理 Linux 系统故障的思路
作为一名优秀的 Linux 运维工程师, 一定要有一套清晰, 明确的解决故障思路, 当问题出现时, 才能迅速定位, 解决问题, 在开始本文学习之前, 我根据多年工作和处理问题和故障的经验, 总结出了一套处理问题的一般思路, 供大家参考:
1, 重视报错提示信息: 每个错误的出现, 都是给出错误提示信息, 一般情况下这个提示基本定位了问题的所在, 因此一定要重视这个报错信息, 如果对这些错误信息视而不见, 问题永远得不到解决.
2, 查阅日志文件: 有时候报错信息只是给出了问题的表面现象, 要想更深入的了解问题, 必须查看相应的日志文件, 而日志文件又分为系统日志文件 (/var/log) 和应用的日志文件, 结合这两个日志文件, 一般就能定位问题所在.
3, 分析, 定位问题: 这个过程是比较复杂的, 根据报错信息, 结合日志文件, 同时还要考虑其它相关情况, 最终找到引起问题的原因.
4, 解决问题: 找到了问题出现的原因, 解决问题就是很简单的事情了.
从这个流程可以看出, 解决问题的过程就是分析, 查找问题的过程, 一旦确定问题产生的原因, 故障也就随之解决了. 看似简单明了的思路, 但是真正能重视这个思路的, 按照这个思路处理问题的却很少, 衷心的希望大家在处理故障的时候, 能静下心来, 先整理思路, 然后有目的的去处理问题.
二, 忘记 Linux root 密码或进入单用户方法
这个问题出现的几率是很高的, 也是 Linux 运维最基础的技能, 要解决这个问题, 在 Linux 下非常简单, 只需重启 Linux 系统, 然后引导进入 Linux 的单用户模式 (init 1) 就可以搞定了, 由于单用户模式是不需要输入登录密码的, 因此, 可以直接登录系统, 修改 root 密码即可解决问题.
目前企业线上环境, 最常用的 Linux 就是 centos6.x 和 7.x 版本, 那么这里首先以 RHEL/Centos6.x 版本为例, 介绍下如何进入单用户并重置 root 密码, 操作步骤如下:
1, 重启系统, 待 Linux 系统启动到 grub 引导菜单时, 按 esc 键, 找到当前系统引导选项, 如图所示: 如果有多个可用内核, 这里就有多个引导选项.
2, 通过方向键将光标放到需要使用的系统引导内核选项上, 然后按键盘字母 "e", 进入编辑状态, 如图所示:
3, 然后通过上下键, 选中带有 kernel 指令的一行, 继续按键盘字母 "e", 编辑该行, 在行末尾加个空格, 然后添加 single, 类似下图所示:
4, 修改完成, 按回车键, 返回到刚才的界面.
5, 最后按键盘 "b", 系统开始引导.
这样系统就启动到了单用户模式下, 这里的单用户与 Windows 下的安全模式类似, 在单用户模式下, 只是启动最基本的系统, 网络以及应用服务均不启动. 单用户模式启动完毕, 系统会自动进入到命令行状态下, 然后直接执行命令 "passwd", 接着敲回车, 系统会提示输入新的 root 密码两次, 最后会看到修改密码成功的提示, 这样就完成了 root 密码的修改. 如果需要正常启动系统, 现在只需输入 "init 3", 就进入了多用户模式. 用 root 用户重新登录系统, 看看设置的新密码是否生效.
在 RHEL/Centos7.x 版本之后, Linux 的机制发生了较大变化, 在系统引导方面, 使用了 grub2 代替了之前的 grub 引导, init 初始化程序也更换成了 systemd 初始化, 随之带来的 root 密码重置的方法也有所改变,, 下面就介绍一下在 Centos7.5 版本中, 忘记 root 密码的处理方法, 操作步骤如下:
1, 重启系统, 待 Linux 系统启动到 grub2 引导菜单时, 找到当前系统引导选项, 如果有多个可用内核, 这里就有多个引导选项, 按 e 键, 如下图所示:
2, 按 e 键后, 出现如下图所示界面, 通过方向键将光标放到 linux16 引导行所在行尾, 然后添加以下内容:
init=/bin/sh
3, 添加完成, 按键 Ctrl+x 启动 shell 引导, 最后进入单用户模式.
4, 挂载根分区为可读写模式, 执行如下命令:
mount -o remount,rw /
然后, 就可以执行 "passwd" 命令重置密码了, 这里有一点需要注意, 如果系统中开启有 selinux, 还需在根分区创建 autorelabel 文件, 否则系统无法正常启动, 操作命令如下:
touch /.autorelabel
5, 密码修改完成后, 直接执行 reboot 命令已经无效, 此时需要输入全路径命令, 操作如下:
exec /sbin/init
这样就完成了密码重置, 正常登录系统, 查看密码是否修改成功.
三, Linux 系统无法启动的解决办法
导致 Linux 无法启动的原因有很多, 常见的原因有如下几种:
1, 文件系统配置不当, 比如 / etc/inittab 文件,/etc/fstab 文件等配置错误或丢失, 导致系统错误, 无法启动.
2, 非法关机, 导致 root 文件系统破坏, 也就是 Linux 根分区破坏, 系统无法正常启动
3, Linux 内核崩溃, 从而无法启动
4, 系统引导程序出现问题, 比如 grub 丢失或者损坏, 导致系统无法引导启动.
5, 硬件故障, 比如主板, 电源, 硬盘等出现问题, 导致 Linux 无法启动.
从这些常见的故障可知, 导致系统无法启动的主要有两个问题, 硬件原因和操作系统原因, 对于硬件出现的问题, 只需通过更换硬件设备, 即可解决, 而对于操作系统出现的问题, 虽然出现的问题可能千差万别, 不过在多数情况下都可以用相对简单统一的一些方法来恢复系统, 下面我们就针对上面提出的几个问题, 结合 RHEL/CentOS Linux 系统环境, 给出一些常用的, 普遍的解决问题的方法.
3.1,/etc/fstab 文件丢失, 导致系统无法启动
/etc/fstab 文件存放了系统中文件系统的相关信息, 如果正确的配置了该文件, 那么在 Linux 启动时, 系统会读取此文件, 自动挂载 Linux 的各个分区, 如果此文件配置错误, 或者丢失, 就会导致系统无法启动, 具体的故障现象是在检测 mount partition 时出现:
starting system logger
此后系统启动就停止了.
针对这个问题, 我们的第一思路就是想办法恢复 / etc/fstab 这个文件的信息, 只要恢复了此文件, 系统就能自动挂载每个分区, 正常启动. 可能很多读者首先想到的是将系统切换到单用户模式下, 然后手动挂载分区, 最后结合系统信息, 重建 / etc/fstab 文件.
但是这种方法是行不通的, 因为 fatab 文件丢失导致 Linux 无法挂载任何一个分区, 即使 Linux 还能切换到单用户下, 那么此时的系统也只是一个 read-only 的文件系统, 无法向磁盘写入任何信息.
我们介绍另外一个方法, 就是利用 Linux rescue 修复模式登录系统, 进而获取分区和挂载点信息, 重构 / etc/fstab 文件.
这里以 Centos6.9 为例, 其它版本方法类似, 首先将系统第一章光盘放入光驱, 设置 BOIS 从光驱启动, 这样系统就从光驱引导, 如下图所示, 选择 "Rescue installed system" 一项, 然后回车, 系统开始引导进入 rescue 模式.
接着系统自动开始引导, 进入下图所示画面:
这里是选择模式使用的语言, 可以按照自己需要设定, 我们这里选择 "English", 然后按 tab 键, 选中 "ok", 回车进入下一步.
下面进入的是键盘选择界面, 如下图所示, 这里选择默认的 "us" 即可.
下面进入网络配置界面, 如下图所示:
这里是选择是否启用网络, 由于系统已经无法启动, 我们已经在 Linux 系统上进行操作了, 启用网络与否都无所谓. 这里选择不启用.
下面到了最关键的步骤了, 如下图所示, 修复模式会自动将系统的所有分区挂载到 / mnt/sysimage 目录下, 选择 "Continue", 则修复环境进入到 read-write 状态下, 可以对分区进行读写操作, 选择 "Read-Only", 修复环境进入到只读模式, 由于我们要重建 fstab 文件到 / etc 目录下, 因此选择 "Continue" 进入可读写模式下.
下面是一个友情提示界面, 如下图所示, 由于 fstab 文件丢失, 修复模式找不到任何可挂载的分区, 从这里可知, 修复模式在这里也读取 / etc/fstab 文件, 回车, 进入下一步.
下面是选择下一步要执行的动作, 如下图所示, 这里选择 "shell Start shell" 进入修复模式命令行.
最后, 就进入了修复环境下, 可以进行操作了. 如下图所示
上面详细演示了如何进入 Linux 的修复模式, 其实很多情况下, Linux 无法启动时, 都可以通过这个方式登录系统进行修复和更改操作.
下面是恢复 / etc/fstab 文件的详细过程, 首先查看一下系统分区情况, 如下所示:
- bash-4.1# fdisk -l
- Disk /dev/sda: 42.9 GB, 42949672960 bytes
- 255 heads, 63 sectors/track, 5221 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sda1 * 1 25 200781 83 Linux
- /dev/sda2 26 1300 10241437+ 83 Linux
- /dev/sda3 1301 1682 3068415 83 Linux
- /dev/sda4 1683 5221 28427017+ 5 Extended
- /dev/sda5 1683 1873 1534176 83 Linux
- /dev/sda6 1874 2064 1534176 83 Linux
- /dev/sda7 2065 2255 1534176 83 Linux
- /dev/sda8 2256 2382 1020096 83 Linux
- /dev/sda9 2383 2484 819283+ 82 Linux swap / Solaris
- /dev/sda10 2485 5221 21984921 83 Linux
因为分区并没有损坏, 通过 fdisk 命令可以查看到系统分区的完整信息, 但是每个分区对应的 label name 信息我们还不知道, 下面通过 tune2fs 命令查看每个分区对应的 label name:
- bash-4.1# tune2fs -l /dev/sda1 |grep mounted
- Last mounted on: /boot
- bash-4.1# tune2fs -l /dev/sda2 |grep mounted
- Last mounted on: /usr
- bash-4.1# tune2fs -l /dev/sda3 |grep mounted
- Last mounted on: /
- bash-4.1# tune2fs -l /dev/sda5 |grep mounted
- Last mounted on: /var
- bash-4.1# tune2fs -l /dev/sda6 |grep mounted
- Last mounted on: /tmp
- bash-4.1# tune2fs -l /dev/sda7 |grep mounted
- Last mounted on: /home
- bash-4.1# tune2fs -l /dev/sda8 |grep mounted
- Last mounted on: /opt
- bash-4.1# tune2fs -l /dev/sda10 |grep mounted
- Last mounted on: /data
这样, 就得到了所有分区的挂载点信息, 接下来就可以构造一个 fstab 文件了.
小技巧: 可以参考其它系统中 fstab 文件的格式, 结合本系统的分区和挂载点信息, 构造出自己的 fstab 文件来.
由于 fstab 文件是存放在系统根目录下的, 因此需要挂载原来系统的根分区, 从上面可知根分区对应的设备名为 / dev/sda3, 接着在修复模式创建的临时根分区下创建一个
挂载点, 然后挂载原来系统的根分区. 操作过程如下所示:
- bash-4.1# pwd
- /
- bash-4.1# mkdir temp
- bash-4.1# mount /dev/sda3 /temp
- bash-4.1# df
- Filesystem 1K-blocks Used Available Use% Mounted on
- /dev 515644 0 515644 0% /dev
- /tmp/loop0 79872 79872 0 100% /mnt/runtime
- /dev/sda3 2972268 259916 2558932 10% /temp
这样以来, 原有根分区的文件全部挂载到了 / temp 目录下, 接着就可以创建我们需要的 fstab 文件了.
重构好的 fstab 文件内容如下:
- bash-4.1# cat /temp/etc/fstab
- LABEL=/ / ext4 defaults 1 1
- LABEL=/boot /boot ext4 defaults 1 2
- devpts /dev/pts devpts gid=5,mode=620 0 0
- tmpfs /dev/shm tmpfs defaults 0 0
- LABEL=/home /home ext4 defaults 1 2
- LABEL=/opt /opt ext4 defaults 1 2
- proc /proc proc defaults 0 0
- sysfs /sys sysfs defaults 0 0
- LABEL=/data /data ext4 defaults 1 2
- LABEL=/usr /usr ext4 defaults 1 2
- LABEL=/var /var ext4 defaults 1 2
- LABEL=SWAP-sda9 swap swap defaults 0 0
配置完毕, 保存退出, 然后重启系统, 看系统是否能正常启动.
bash-4.1#reboot
3.2,CentOS 下误删除 / boot 目录修复方法
这个问题经常发生在新手, 研发身上, 误删除的原因很多, 但是并不重要, 作为专业背锅侠, 要的就是误删除后怎么回复, 一起来看下这个现象吧, 看下图:
出现这个情况, 可能的原因有: 系统引导出现问题,/boot 目录误删除, grub 配置错误.
不管是什么原因, 这里给个终极方法, 也就是一定能解决问题的方法, 保证大家屡试不爽.
要解决这个问题, 还是要用到一个 CentOS 的 U 盘镜像或者光盘镜像, 通过系统镜像进入 rescue 修复模式, 然后就可以大展拳脚了.
下面看看如何在 centos7.x 版本下, 进入 rescue 修复模式, 然后修复系统引导.
首先通过系统镜像盘进入系统引导模式, 如下图所示:
然后选择 Troubleshooting, 回车进入下图界面:
这里选择 "Rescue a Centos system", 回车, 进入如下界面:
这是进入 rescue 修复模式的几个选项, 跟 centos6.x 版本类似, 这里选择数字 1, 进入可读, 写模式.
等待片刻, 即可进入下图所示界面:
敲回车, 进入命令行模式, 然后执行 chroot 命令, 如下图所示:
这样, 就变更多了 root 目录下, 相当于进入到了真实系统环境下了.
接着, 将系统镜像挂载到任意一个目录下, 这里挂载到 / mnt 下, 挂载系统镜像的目的是将系统镜像作为 yum 源, 然后安装系统丢失的内核模块, 并安装 grub2 引导程序.
bash-4.2# mount /dev/cdrom /mnt
下面开始创建一个 yum 源仓库, 用于从本地系统镜像中读取 rpm 包, 进行内核模块的安装. 如下图所示:
重点来了, 第一步是重新安装内核, 这里使用 yum 的 reinstall 命令, 千万别用 install 来安装, 执行如下命令:
bash-4.2# yum reinstall kernel
这样, 内核模块安装完成了, 接下来, 还需要重新安装 grub2, 并重新生成 grub2 配置文件 grub.cfg, 执行如下图所示操作:
执行完成后, 两次执行 exit 命令退出后, 系统会自动重启, 完成 boot 引导的修复, 不出意外的话, 系统已经可以畅通无阻的启动了.
四, Linux 系统无响应 (死机) 问题分析
Linux 服务器在长期运行后, 难免出现无响应现象, 俗称 "死机". 在系统死机后, 屏幕一般会输出故障信息, 键盘失去响应, 这种情况的常见处理办法就是重启系统, 不过在重启前, 要重点关注下屏幕的输出信息, 因为其提示的可能是引起死机的主要原因, 对解决问题是有很大帮助的.
其实还有另一个方法, 就是通过串口直连线连接客户机和服务器, 将服务器的出错详细信息发送到客户机上.
引起服务器死机的原因有很多, 但主要有两个方面: 软件问题和硬件问题. 下面总结了造成 Linux 系统死机的常见原因和解决问题的思路:
1)系统硬件问题, 主要是有 SCSI 卡, 主板, RAID 卡, HBA 卡, 网卡, 硬盘等硬件设备导致的. 在这种情况下需要定位硬件故障细节, 通过更换硬件来解决问题.
2)外围硬件问题, 主要是网络问题导致的. 此时就需要检查网络设备, 网络参数等方面查找和解决问题.
3)软件问题, 主要是系统内核 bug, 应用软件 bug, 驱动程序 bug 等. 在这种情况下就需要从升级内核, 修复程序 bug, 更新驱动程序等方面来解决问题.
4)系统设置问题: 主要是系统参数设置不当导致, 可以通过恢复系统到默认状态, 关闭防火墙等方面来解决问题.
五, 其它故障的一般解决方案
如果是 Linux 的引导程序出现问题, 那么也可以通过光盘引导或 U 盘引导的方式进入 Linux rescue 模式, 然后修改对应的引导程序或者重新安装引导程序.
如果 Linux 内核崩溃或者丢失, 同样可以先进入 Linux rescue 模式下, 然后加载 root 分区, 最后重新编译内核.
如果出现了最坏的情况, 文件系统破坏严重, 同时内核也崩溃, 那么此时重新安装系统反而比较容易, 在这种情况下可以先将 Linux 上有用的数据和文件备份转移到其它设备, 然后对整个文件系统进行全新安装.
在这里我们不可能对每个出现的问题, 都给出详细的解决方案, 问题都是千差万别的, 每个问题的处理都不尽相同, 本专栏要传授给大家的是当 Linux 系统出现问题后, 解决问题的一般思路和通用策略, 熟练掌握了这些技巧, 处理任何 Linux 问题都能游刃有余.
来源: http://os.51cto.com/art/201909/602552.htm