Linux启动故障修复

上篇文章介绍了Linux系统启动,本文主要介绍常见的启动故障即修复思路

一、Linux Rescue环境

Linux Rescue(救援)模式事实上就是一个带有shell的独立的Linux环境,当系统由于软件故障而无法启动时,我们可以进入该环境对系统进行修复

我们只需要为系统提供grub配置以及内核,Linux即可启动,在发行版的光盘中有isolinux目录,提供了这些文件

[root@localhost scripts]# mount /dev/cdrom /media/cdrom/
mount: /dev/sr0 is write-protected, mounting read-only
[root@localhost scripts]# ls /media/cdrom/isolinux/
boot.cat  grub.conf   isolinux.bin  memtest     TRANS.TBL    vesamenu.c32
boot.msg  initrd.img  isolinux.cfg  splash.png  upgrade.img  vmlinuz

1. 进入Rescue模式

同时,我们可以通过发行版光盘或ISO文件进入Rescue模式,如下图

  • CentOS 7
    CentOS_7_Rescue_1
    CentOS_7_Rescue_2
    依次选择TroubleshootingRescue a CentOS system

  • Centos 6
    CentOS_6_Rescue
    选择Rescue installed system

按下当前选中条目中的反色字母对应的按键,亦可进入相应模式

此外,也可以在键盘敲Tab后,在启动参数后加rescue参数,而后Enter启动即可

Rescue基础操作

进入Rescue模式后,系统将检测已安装的Linux,则将其挂载至/mnt/sysimage(即原系统/的访问路径)

Rescue
上图为CentOS 7的Rescue模式,CentOS 6在此之前可能需要选择语言、键盘、是否启动网络等

此处选择继续,将原系统的根文件系统挂载至/mnt/sysimage

Rescue_1

若探测到已安装的Linux,此处将提示已挂载,并且用户可使用chroot将根切换至原系统的根,对于CentOS 7,确定后即可进入Shell环境:

Rescue_7_shell

对于CentOS 6,选择shell后确定即看,如下:

Rescue_6_shell


二、Trouble Shooting

1. 解决问题的一般思路

我们结局Linux系统问题的一般思路为

  • 1、确定问题的故障特征
  • 2、重现故障
  • 3、使用工具收集进一步信息, 确定问题根源
  • 4、排除不可能的原因
  • 5、定位故障:
    • 从最简单的问题入手
    • 一次只尝试一种方式

另外,在处理之前,一定记得要备份原文件,并且应尽可能借助于工具,毕竟手动操作的出错概率要大于代码(除了脸黑这种情况下的工具都有bug)

2. 常见故障即修复

在列举常见故障之前,此处再次回顾一下Linux启动流程:

对于完全支持UEFI引导:
UEFI
Boot Loader
Kernel
INIT
对于BIOS引导:
BIOS
Boot Loader
Grub
Kernel
INIT

详细介绍请至Linux系统启动查看,以下相关内容若非特别说明,在该文中都有介绍

另外,解决一个问题的方式又很多,这里只介绍最易实现目的的,如重置管理员密码,可以进入单用户模式修改,可以将init程序直接指定一个一个shell,或进入Rescue模式修改,甚至此时可以修改/etc/shadow文件第一行(该行为root账户密码信息)1

管理员密码丢失

这其实不算是一个故障,但是依然会影响使用,此问题我们只需要进入单用户模式,将root用户的密码修改即可

  • 对于CentOS 6,在Grub菜单显示后敲E,而后选择“kernel”行再次敲E,在行尾添加init 1single

reset_passwd_1
reset_passwd_2

完成后Enter,而后敲B启动系统,进入到单用户模式,而后可直接使用passwd命令来修改管理员密码

  • 对于CentOS 7而言,我们可以在Grub 2中使用rd.break,来在根文件系统挂载之前,中断系统引导过程,步骤如下

在Grub 2主菜单中选择需要的启动项后,敲E编辑之,找到linux16,在行末添加rd.break

reset_passwd_3

需要说明的是,若是在虚拟机环境,有时需要再添加参数console=tty0,完成后敲Ctrl+X引导系统

系统启动后,真正的根文件系统被挂在之/sysroot,此时需要先以读写方式重新挂载之(mount -o remount,rw /sysroot),而后使用chroot切换根:

reset_passwd_4

再使用passwd修改密码即可

另外,若系统启动了SELinux,则需要在根下创建文件.autorelabel,可使用touch /.autorelabel实现,系统开机会去找/.autorelabel文件,若发现有此文件则会重新写入SELinux 的相关配置, 因此系统在重新开机的流程中共会启动两次,原因为第一次会重新写入SELinux配置,第二次才是正常开机

同时,在CentOS 7中依然保留了类似init=/bin/bash的形式,但应该优先选择上一中方式

Grub相关故障

MBR损坏

MBR为引导设备的前446字节,其后64字节为FAT,在其后的2字节为Magic Number,正常情况下内容为0x55AA

[root@localhost ~]# hexdump -Cn 512 /dev/sda
00000000  eb 48 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.H..............|
00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 03 02  |.........|...t..|
00000040  80 00 00 80 fc 49 08 00  00 08 fa 90 90 f6 c2 80  |.....I..........|
00000050  75 02 b2 80 ea 59 7c 00  00 31 c0 8e d8 8e d0 bc  |u....Y|..1......|
00000060  00 20 fb a0 40 7c 3c ff  74 02 88 c2 52 f6 c2 80  |. ..@|<.t...R...|
00000070  74 54 b4 41 bb aa 55 cd  13 5a 52 72 49 81 fb 55  |tT.A..U..ZRrI..U|
00000080  aa 75 43 a0 41 7c 84 c0  75 05 83 e1 01 74 37 66  |.uC.A|..u....t7f|
00000090  8b 4c 10 be 05 7c c6 44  ff 01 66 8b 1e 44 7c c7  |.L...|.D..f..D|.|
000000a0  04 10 00 c7 44 02 01 00  66 89 5c 08 c7 44 06 00  |....D...f.\..D..|
000000b0  70 66 31 c0 89 44 04 66  89 44 0c b4 42 cd 13 72  |pf1..D.f.D..B..r|
000000c0  05 bb 00 70 eb 7d b4 08  cd 13 73 0a f6 c2 80 0f  |...p.}....s.....|
000000d0  84 f0 00 e9 8d 00 be 05  7c c6 44 ff 00 66 31 c0  |........|.D..f1.|
000000e0  88 f0 40 66 89 44 04 31  d2 88 ca c1 e2 02 88 e8  |[email protected]........|
000000f0  88 f4 40 89 44 08 31 c0  88 d0 c0 e8 02 66 89 04  |[email protected]..|
00000100  66 a1 44 7c 66 31 d2 66  f7 34 88 54 0a 66 31 d2  |f.D|f1.f.4.T.f1.|
00000110  66 f7 74 04 88 54 0b 89  44 0c 3b 44 08 7d 3c 8a  |f.t..T..D.;D.}<.|
00000120  54 0d c0 e2 06 8a 4c 0a  fe c1 08 d1 8a 6c 0c 5a  |T.....L......l.Z|
00000130  8a 74 0b bb 00 70 8e c3  31 db b8 01 02 cd 13 72  |.t...p..1......r|
00000140  2a 8c c3 8e 06 48 7c 60  1e b9 00 01 8e db 31 f6  |*....H|`......1.|
00000150  31 ff fc f3 a5 1f 61 ff  26 42 7c be 7f 7d e8 40  |1.....a.&B|..}.@|
00000160  00 eb 0e be 84 7d e8 38  00 eb 06 be 8e 7d e8 30  |.....}.8.....}.0|
00000170  00 be 93 7d e8 2a 00 eb  fe 47 52 55 42 20 00 47  |...}.*...GRUB .G|
00000180  65 6f 6d 00 48 61 72 64  20 44 69 73 6b 00 52 65  |eom.Hard Disk.Re|
00000190  61 64 00 20 45 72 72 6f  72 00 bb 01 00 b4 0e cd  |ad. Error.......|
000001a0  10 ac 3c 00 75 f4 c3 00  00 00 00 00 00 00 00 00  |..<.u...........|
000001b0  00 00 00 00 00 00 00 00  fe f2 07 00 00 00 80 20  |............... |
000001c0  21 00 83 dd 1e 3f 00 08  00 00 00 a0 0f 00 00 dd  |!....?..........|
000001d0  1f 3f 8e fe ff ff 00 a8  0f 00 00 58 f0 0e 00 00  |.?.........X....|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200

若MBR部分数据损坏,则计算机固件不认为该设备具有引导能力,此时将会按照CMOS中保存的引导顺序配置寻找下一引导设备,若没有找到可引导设备,则会提示未找到操作系统,如

BMR_damage

此时可进入Rescue模式,若此前已经备份过,则可在此还原,如dd if=/mnt/sysimage/root/backup/mbr of=/dev/sda bs=512 count=1

另外建议使用sync将修改同步至硬盘

若此前没有备份,可通过grub-install命令进行修复,该命令可重新安装grub,包括Stage 1、Stage 1_5、Stage 2,MBR仅仅是Stage 1

具体步骤为

  1. 进入Rescue模式
  2. 切换根文件系统:chroot /mnt/sysimage/
  3. 修复:grub-install DEVICE
  4. 同步修改:sync
  5. 退出shell:exit
  6. 重启系统

操作方式上文已有说明,此处不再演示

另外,若该故障发生后,用户依然在使用系统,也可通过grub命令,在其交互式模式下修复:

[root@localhost ~]# grub
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
quit

首选需要指定grub的根分区,这里指定为hd0,0,即第一个硬盘的第一个分区,也就是/boot/挂载的分区,grub的后续阶段所需文件将放置此处

而后将安装grub,指定安装的目标硬盘即可,因为第一阶段是全局的,不属于任何分区,故这里指定为hd0

此外,我们还可以看到,Stage 1_5使用了27个扇区

需要说明的是,通过grub的交互式界面修复时,依赖于/boot/grub下的相关文件,若这些文件损坏,则依然无法修复,故推荐使用grub-install

grub 2修复

grub 配置文件丢失

grub配置文件为/etc/grub.conf,该文件指向/boot/grub/grub.conf,若该文件丢失,系统启动后将显示grub>提示符,如下图:

Grub_conf_err

此时可通过Rescue模式启动,或在grub提示符下为grub指定启动参数,启动后还原已备份的配置文件,或手动编写即可

由于在Rescue模式下,可以看到更新系统信息,故建议在Rescue模式下进行修复

Grub_conf_rescue

注意,示例中已经执行过chroot /mnt/sysimage

若此前没有备份,可通过查看/etc/fstab等相关文件获取到启动所需信息后,手动编写grub配置即可,配置文件格式Linux系统启动一文有介绍

/boot/*全部丢失

/boot/目录下文件丢失后,由于MBR没有损坏,系统将依然通过此前设备启动,后续步骤无法进行:

/boot/*_loss

该错误可通过强制重新kernel与grub解决:通过Rescue模式,重新安装kernel与grub:

/boot_fix_1

而后为grub提供配置

/boot_fix_2

启动后即可方便地为grub提供配置文件

通过该方式,内核文件、initramfs文件等都可进行修复

grub 2配置文件错误

在修复方式上grub 2与grub 0.97稍有差异,此处举两例说明

/boot/grub2/*全部丢失

该错误可在Rescue模式下重新安装grub 2,而后使用命令生成配置文件:

grub2_fix_1

/etc/grub2/grub.cfg文件丢失

可直接在Rescue模式下通过grub2-mkconfig命令生成配置文件,或在grub提示符下指定启动参数,正常启动后生成亦可

其他错误

错误总是多种多样的,如将默认的运行级别设置为06,计算机总是无法开启,或循环重启;再如/etc/rc.d/init.d文件丢失、服务错误导致的无法启动、/etc/fstab文件内容错误等,都可通过Rescue模式进行修复


  1. 详见 https://blog.csdn.net/xiyangyang410/article/details/85090293#etcshadow_1207 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章