13.1 The RHEL Boot Process
13.1.1 The RHCE 7 boot process
電腦開機從 BIOS 開始
進行 POST 檢查
stage-1:載入 Boot Loader 並開始執行
stage-2:讀取
/boot/grub2/grub.cfg
並執行grub.cfg
解壓縮initramfs-xxxx
(很小的 gzip + cpio 的 Linux,若要額外加上 HW driver 就要包到這裡),並載入記憶體中grub.cfg
執行vmlinuz-xxx
(可執行的 Linux kernel 映像檔),將記憶體的內容掛載到/
執行
/init
(已經變成 soft link) 指向其他地方init
會mount -o ro [HD root partition] /sysroot
chroot /sysroot
執行
/lib/systemd/systemd
boot load 解壓縮 initramfs-xxx 到記憶體中
第 8 個步驟 -o ro
的原因是開機時會作 fsck,因為無法 unmount 根目錄,因此只能用 read only 的方式
13.1.3 Selecting a systemd target
systemd target 是由一組 systemd unit 所組成,可以讓 user 進入到某一個特定狀態(例如:圖形介面),比較常用的包含了:
graphical.target:圖形 & 文字介面
multi-user.target:文字介面
rescue.target:初始化完成,會提示輸入 root 密碼
emergency.target:initramfs 掛載 / 完成,只有 read only 權限,且會提示輸入 root 密碼
1 | # 啟動 graphic.target 需要由那些 systemd target unit 所組成 |
也可以在開機時,修改開機設定,在
linux16
那一行最後面,加上systemd.unit=graphical.target
,也可以進入圖形模式
13.2 Repairing Common Boot Issues
13.2.1 Recovering the root password
透過修改開機設定,加上
rd.break
進入可救援的模式來修改 root 密碼,但這樣會破壞 SELinux security context
修改 linux16 開頭的設定,從最後面移除設定直到
ro
前,並在該行最後加上rd.break
,按下Ctrl+x
使用此設定開機 (開機完成後會位於 initramfs 的 /**,並包含了 **real-only 的 /sysroot)重新掛載 /sysroot 目錄為可讀寫:
mount -o remount,rw /sysroot
切換根目錄到 /sysroot 上:
chroot /sysroot
修改 root 密碼:
passwd root
產生
/.autorelabel
檔案,讓開機過程可以重新 relabel:touch /.autorelabel
連續輸入兩次
exit
,回到開機程序
/.autorelabel
:此檔案用途會讓 SELinux 進行 relabel 的動作,將 security context 恢復到正確的狀態
Using journalctl
預設 log 儲存在記憶體中,只要 sudo mkdir -p -m2775 /var/log/journal
就可以將 systemd journal 放到硬碟中
顯示上一次開機的過程中,Level ERROR 的 log:sudo journalctl -b -1 -p err
Diagnose and repair systemd boot issues
sudo systemctl enable debug-shell.service
:重開機後可以透過 Ctrl + Alt + F9 得到一個 root shell
開機流程中,得到 shell 的順序是:
rd.break
emergency.target
rescue.target
所以其實使用 rd.break 就可以解決所有開機的相關問題
systemctl list-job
:可用來觀察開機時的 stuck job
13.3 Repairing File System Issues at Boot
每次開機 fsck 都會嘗試自動修復,若無法自動處理則會進入 emergency shell
設備不存在,systemd 會等一段時間,若依然沒有就會進入 emergency shell 給管理者除錯
mount point 不存在,systemd 會嘗試自動建立,否則就進入 emergency shell
/etc/fstab 錯誤,直接進入 emergency shell
13.4 Repairing Boot Loader Issues
GRUB2 同時支援 BIOS & UEFI
主要設定檔位於
/boot/grub2/grub.cfg
;但若是要設定 UEFI 時,grub.conf 就要到/boot/efi
找在 linux16 那一行,再最後加上
net.ifnames=0
後,網卡就會以傳統的方式命名(eth0, eth1 … etc)set root
是描述開機相關的檔案(vmlinuz-xxx / initramfs-xxx … etc)存在於哪個 partitionlinux16 設定中,
root=UUID=xxxx
則是用來指定 root partition