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 ↩︎

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