Boot Loader: Grub簡單來說,系統啟動的經過可以匯整成底下的流程的:
- 加載 BIOS 的硬件資訊與進行自我測試,并依據配置取得第一個可啟動的裝置;
- 讀取并運行第一個啟動裝置內 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序);
- 依據 boot loader 的配置加載 Kernel ,Kernel 會開始偵測硬件與加載驅動程序;
- 在硬件驅動成功后,Kernel 會主動呼叫 init 程序,而 init 會取得 run-level 資訊;
- init 運行 /etc/rc.d/rc.sysinit 文件來準備軟件運行的作業環境 (如網絡、時區等);
- init 運行 run-level 的各個服務之啟動 (script 方式);
- init 運行 /etc/rc.d/rc.local 文件;
- init 運行終端機模擬程序 mingetty 來啟動 login 程序,最后就等待使用者登陸啦;
詳見 鳥哥的 linux 私房菜 -- 基礎學習篇目錄 啟動流程、模塊管理與 loader
忘記 root 口令的解決之道現階段 Linux 里頭最主流的 boot loader就是grub。
boot loader 的兩個 stage在 BIOS 讀完資訊后,接下來就是會到第一個啟動裝置的 MBR 去讀取 boot loader 了。這個 boot loader 可以具有菜單功能、直接加載核心文件以及控制權移交的功能等, 系統必須要有 loader 才有辦法加載該操作系統的核心就是了。但是我們都知道, MBR 是整個硬盤的第一個 sector 內的一個區塊,充其量整個大小也才 446 bytes 而已。 我們的 loader 功能這么強,光是程序碼與配置數據不可能只占不到 446 bytes 的容量吧?那如何安裝?
為了解決這個問題,所以 Linux 將 boot loader 的程序碼運行與配置值加載分成兩個階段 (stage) 來運行:
- Stage 1:運行 boot loader 主程序: 第一階段為運行 boot loader 的主程序,這個主程序必須要被安裝在啟動區,亦即是 MBR 或者是 boot sector 。但如前所述,因為 MBR 實在太小了,所以,MBR 或 boot sector 通常僅安裝 boot loader 的最小主程序, 并沒有安裝 loader 的相關配置檔;
- Stage 2:主程序加載配置檔: 第二階段為透過 boot loader 加載所有配置檔與相關的環境參數文件 (包括文件系統定義與主要配置檔 menu.lst), 一般來說,配置檔都在 /boot 底下。
那么這些配置檔是放在哪里啊?這些與 grub 有關的文件都放置到 /boot/grub 中。
[root@www ~]# ls -l /boot/grub-rw-r--r-- device.map <==grub 的裝置對應檔(底下會談到)-rw-r--r-- e2fs_stage1_5 <==ext2/ext3 文件系統之定義檔-rw-r--r-- fat_stage1_5 <==FAT 文件系統之定義檔-rw-r--r-- ffs_stage1_5 <==FFS 文件系統之定義檔-rw------- grub.conf <==grub 在 Red Hat 的配置檔-rw-r--r-- iso9660_stage1_5 <==光驅文件系統定義檔-rw-r--r-- jfs_stage1_5 <==jfs 文件系統定義檔lrwxrwxrwx menu.lst -> ./grub.conf <==其實 menu.lst 才是配置檔!-rw-r--r-- minix_stage1_5 <==minix 文件系統定義檔-rw-r--r-- reiserfs_stage1_5 <==reiserfs 文件系統定義檔-rw-r--r-- splash.xpm.gz <==啟動時在 grub 底下的背景圖示-rw-r--r-- stage1 <==stage 1 的相關說明-rw-r--r-- stage2 <==stage 2 的相關說明-rw-r--r-- ufs2_stage1_5 <==UFS 的文件系統定義檔-rw-r--r-- vstafs_stage1_5 <==vstafs 文件系統定義檔-rw-r--r-- xfs_stage1_5 <==xfs 文件系統定義檔從上面的說明你可以知道 /boot/grub/ 目錄下最重要的就是配置檔 (menu.lst) 以及各種文件系統的定義! 我們的 loader 讀取了這種文件系統定義數據后,就能夠認識文件系統并讀取在該文件系統內的核心文件羅。 至於 grub 的配置檔檔名,其實應該是 menu.lst 的,只是在 Red Hat 里面被定義成為 /boot/grub.conf 而已。
- /boot/grub/menu.lst 配置檔:
[root@localhost ~]# cat /boot/grub/menu.lst # grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE: You have a /boot partition. This means that# all kernel and initrd paths are relative to /boot/, eg.# root (hd0,0)# kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root# initrd /initrd-[generic-]version.img#boot=/dev/sdadefault=0timeout=5splashimage=(hd0,0)/grub/splash.xpm.gzhiddenmenutitle CentOS (2.6.32-279.el6.i686) root (hd0,0) kernel /vmlinuz-2.6.32-279.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS..........(省略) initrd /initramfs-2.6.32-279.el6.i686.img在 title 以前的四行,都是屬於 grub 的整體配置,包括默認的等待時間與默認的啟動項目, 還有顯示的畫面特性等等。至於 title 后面才是指定啟動的核心文件或者是 boot loader 控制權。 在整體配置方面的項目主要常見的有:
- default=0 這個必須要與 title 作為對照,在配置檔里面有幾個 title ,啟動的時候就會有幾個菜單可以選擇。 由於 grub 啟始號碼為 0 號,因此 default=0 代表使用『第一個 title 項目』來啟動的意思。 default 的意思是,如果在讀秒時間結束前都沒有動到鍵盤, grub 默認使用此 title 項目 (在此為 0 號) 來啟動。
- timeout=5 啟動時會進行讀秒,如果在 5 秒鐘內沒有按下任何按鍵,就會使用上面提到的 default 后面接的那個 title 項目來啟動的意思。如果你覺得 5 秒太短,那可以將這個數值調大 (例如 30 秒) 即可。此外,如果 timeout=0 代表直接使用 default 值進行啟動而不讀秒,timeout=-1 則代表直接進入菜單不讀秒了!
- splashimage=(hd0,0)/grub/splash.xpm.gz 有沒有發現你的 CentOS 在啟動的時候背景不是黑白而是有色彩變化的呢?那就是這個文件提供的背景圖示啦(注3)!不過這個文件的實際路徑寫法怎么會是這樣啊?很簡單啊~上述的意思是:在 (hd0,0) 這個分割槽內的最頂層目錄中,底下的 grub/splash.xpm.gz 那個文件的意思。 由於鳥哥將 /boot 這個目錄獨立成為 /dev/hda1 ,因此這邊就會寫成『在 /dev/hda1 里面的 grub/splash.xpm.gz 』的意思啦!想一想,如果你的 /boot 目錄并沒有獨立成為一個分割槽, 這里會寫成如何?
- hiddenmenu 這個說的是,啟動時是否要顯示菜單?目前 CentOS 默認是不要顯示菜單, 如果您想要顯示菜單,那就將這個配置值注解掉!
整體配置的地方大概是這樣,而底下那個 title 則是顯示啟動的配置項目。
- root :代表的是『核心文件放置的那個 partition 而不是根目錄』喔!不要搞錯了! /boot 一般都是獨立為 /dev/hda1 , 所以磁碟代號就會成為 (hd0,0) 羅。
- kernel :至於 kernel 后面接的則是核心的檔名,而在檔名后面接的則是核心的參數。 由於啟動過程中需要掛載根目錄,因此 kernel 后面接的那個root=/dev/mapper/VolGroup-lv_root 指的是『Linux 的根目錄在哪個 partition 』的意思。
- initrd :就是 initrd 制作出 RAM Disk 的文件檔名啦!
如果連 root 的口令都忘記了,怎么辦? 其實在 Linux 環境中 root 口令忘記時還是可以救回來的!只要能夠進入并且掛載 / , 然后重新配置一下 root 的口令,就救回來啦!這是因為啟動流程中,若強制核心進入 runlevel 1 時, 默認是不需要口令即可取得一個 root 的 shell 來救援的。整個動作有點像這樣:
- 重新啟動!一定要重新啟動!怎么重開都沒關系;
- 在啟動進入 grub 菜單后, (1)在你要進入的菜單上面點 'e' 進入詳細配置; (2)將光棒移動到 kernel 上方并點 'e' 進入編輯畫面; (3)然后出現如下畫面來處理:
grub edit> kernel /vmlinuz-2.6.32-279.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS..........(省略)single重點就是添加那個特殊字體single啦!按下 [enter] 再按下 b 就能夠啟動進入單人維護模式了。
- 進入單人維護模式后,系統會以 root 的權限直接給你一個 shell ,此時你就能夠運行『 passwd 』這個命令來重建 root 的口令啦!
|
新聞熱點
疑難解答