上篇文章介紹了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
依次選擇Troubleshooting,Rescue a CentOS system
- Centos 6
選擇Rescue installed system
按下當前選中條目中的反色字母對應的按鍵,亦可進入相應模式
此外,也可以在鍵盤敲Tab後,在啓動參數後加rescue
參數,而後Enter啓動即可
Rescue基礎操作
進入Rescue模式後,系統將檢測已安裝的Linux,則將其掛載至/mnt/sysimage
(即原系統/
的訪問路徑)
上圖爲CentOS 7的Rescue模式,CentOS 6在此之前可能需要選擇語言、鍵盤、是否啓動網絡等
此處選擇繼續,將原系統的根文件系統掛載至/mnt/sysimage
若探測到已安裝的Linux,此處將提示已掛載,並且用戶可使用chroot
將根切換至原系統的根,對於CentOS 7,確定後即可進入Shell環境:
對於CentOS 6,選擇shell後確定即看,如下:
二、Trouble Shooting
1. 解決問題的一般思路
我們結局Linux系統問題的一般思路爲
- 1、確定問題的故障特徵
- 2、重現故障
- 3、使用工具收集進一步信息, 確定問題根源
- 4、排除不可能的原因
- 5、定位故障:
- 從最簡單的問題入手
- 一次只嘗試一種方式
另外,在處理之前,一定記得要備份原文件,並且應儘可能藉助於工具,畢竟手動操作的出錯概率要大於代碼(除了臉黑這種情況下的工具都有bug)
2. 常見故障即修復
在列舉常見故障之前,此處再次回顧一下Linux啓動流程:
- 對於完全支持UEFI引導:
- 對於BIOS引導:
詳細介紹請至Linux系統啓動查看,以下相關內容若非特別說明,在該文中都有介紹
另外,解決一個問題的方式又很多,這裏只介紹最易實現目的的,如重置管理員密碼,可以進入單用戶模式修改,可以將init程序直接指定一個一個shell,或進入Rescue模式修改,甚至此時可以修改/etc/shadow
文件第一行(該行爲root賬戶密碼信息)1
管理員密碼丟失
這其實不算是一個故障,但是依然會影響使用,此問題我們只需要進入單用戶模式,將root用戶的密碼修改即可
- 對於CentOS 6,在Grub菜單顯示後敲E,而後選擇“kernel”行再次敲E,在行尾添加
init 1
或single
:
完成後Enter,而後敲B啓動系統,進入到單用戶模式,而後可直接使用passwd
命令來修改管理員密碼
- 對於CentOS 7而言,我們可以在Grub 2中使用
rd.break
,來在根文件系統掛載之前,中斷系統引導過程,步驟如下
在Grub 2主菜單中選擇需要的啓動項後,敲E編輯之,找到linux16,在行末添加rd.break
需要說明的是,若是在虛擬機環境,有時需要再添加參數console=tty0
,完成後敲Ctrl+X引導系統
系統啓動後,真正的根文件系統被掛在之/sysroot
,此時需要先以讀寫方式重新掛載之(mount -o remount,rw /sysroot
),而後使用chroot
切換根:
再使用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中保存的引導順序配置尋找下一引導設備,若沒有找到可引導設備,則會提示未找到操作系統,如
此時可進入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
具體步驟爲
- 進入Rescue模式
- 切換根文件系統:
chroot /mnt/sysimage/
- 修復:
grub-install DEVICE
- 同步修改:
sync
- 退出shell:
exit
- 重啓系統
操作方式上文已有說明,此處不再演示
另外,若該故障發生後,用戶依然在使用系統,也可通過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>
提示符,如下圖:
此時可通過Rescue模式啓動,或在grub提示符下爲grub指定啓動參數,啓動後還原已備份的配置文件,或手動編寫即可
由於在Rescue模式下,可以看到更新系統信息,故建議在Rescue模式下進行修復
注意,示例中已經執行過chroot /mnt/sysimage
若此前沒有備份,可通過查看/etc/fstab
等相關文件獲取到啓動所需信息後,手動編寫grub配置即可,配置文件格式Linux系統啓動一文有介紹
/boot/*全部丟失
/boot/
目錄下文件丟失後,由於MBR沒有損壞,系統將依然通過此前設備啓動,後續步驟無法進行:
該錯誤可通過強制重新kernel與grub解決:通過Rescue模式,重新安裝kernel與grub:
而後爲grub提供配置
啓動後即可方便地爲grub提供配置文件
通過該方式,內核文件、initramfs文件等都可進行修復
grub 2配置文件錯誤
在修復方式上grub 2與grub 0.97稍有差異,此處舉兩例說明
/boot/grub2/*全部丟失
該錯誤可在Rescue模式下重新安裝grub 2,而後使用命令生成配置文件:
/etc/grub2/grub.cfg文件丟失
可直接在Rescue模式下通過grub2-mkconfig
命令生成配置文件,或在grub提示符下指定啓動參數,正常啓動後生成亦可
其他錯誤
錯誤總是多種多樣的,如將默認的運行級別設置爲0
或6
,計算機總是無法開啓,或循環重啓;再如/etc/rc.d/init.d
文件丟失、服務錯誤導致的無法啓動、/etc/fstab
文件內容錯誤等,都可通過Rescue模式進行修復