在Linux系統技巧前一篇介紹MBR、GPT與UEFI的文章中,有稍微提到GRUB開機管理程式,本文將特別針對GRUB這個開機管理程式,做一詳細介紹。
另外,GRUB預設可能沒有載入GPT分割表模組,因此若要辨識GPT分割表,使用「insmod part_gpt」指令載入GPT分割表模組,便可辨識出GPT分割,例如圖21中的(hd1,gpt1)便是GPT分割表,在未載入part_gpt這個GPT分割表模組之前,只有顯示(hd1)磁碟機資訊。
|
▲圖21 利用「insmod part_gpt」指令載入GPT分割表模組以辨識GPT分割表。 |
除了Linux相關檔案系統之外,GRUB也可辨識Windows系列相關的檔案系統,如圖22所示,能夠辨識出(hd1,msdos1)與(hd1,msdos1)均為ntfs型態,也可輕易列出NTFS檔案系統中的檔案與目錄資訊,這都是因為載入了ntfs模組,如圖23所示。
|
▲圖22 GRUB可辨識Windows系列相關的檔案系統。 |
|
▲圖圖23 GRUB使用最底下的ntfs模組來辨識NTFS檔案系統。 |
也可以使用cat指令列出系統中相關設定檔的內容,特別一提的是,在輸入指令時,可以像在bash一樣透過按下〔Tab〕鍵讓系統帶出可能的檔名建議或列表,如圖24所示。
|
▲圖24 透過〔Tab〕鍵讓系統顯示可能的檔名建議或列表。 |
此外,透過cat指令列出(hd0,msdos1)/grub2/grub2.cfg這個GRUB選單設定檔內容的時候,因為檔案內容比較長,GRUB也會幫忙進行分頁,如圖25所示。
|
▲圖25 使用「cat」指令印出grub2/grub.cfg這個GRUB選單設定檔內容。 |
透過以上介紹的指令,找到相關Linux系統核心磁碟與檔案相關位置後,藉由執行指令的方式逕自進行開機。在CentOS 7的環境下,執行的指令如圖26所示,其中「set root=(hd0,1)」是設定GRUB所安裝的設備名稱與分割編號,(hd0,1)表示第一個硬碟的第一個分割,而linux指令是為了要載入Linux核心的位置,initrd則是指定一個要載入到記憶體中的小型初始系統ramdisk映像檔位置,這個小型系統會載入一些開機必須的驅動程式以供開機使用。
|
▲ 圖26 設定Linux系統核心磁碟與檔案相關資訊後,直接以「boot」指令開機。 |
最後一個指令boot,則是要求GRUB以此設定開機。執行「boot」指令之後,應該就可以正常進入CentOS系統中。
認識GRUB設定檔
GRUB有幾個設定檔,以下將分別說明,首先是
「/boot/grub/grub.cfg」檔案,這是最後GRUB產生的選單設定檔案,一般不會直接更改這個檔案,而是更改相關設定檔後,執行「grub-mkconfig -o /boot/grub/grub.cfg」指令來更新grub.cfg。
如圖27所示,執行指令後,GRUB會讀取且執行相關設定檔來偵測位於「/boot」目錄下相關Linux系統核心檔案,之後將這些檔案設定加入到「/boot/grub/grub.cfg」檔案裡面,產生最後在開機看到的GRUB開機管理程式選單。
|
▲圖27 執行「grub-mkconfig -o /boot/grub/grub.cfg」指令來更新grub.cfg。 |
第二個是「/etc/default/grub」檔案,檔案有一些設定,相關內容說明如下:
·GRUB_DEFAULT:這是設定預設選單選項,如果是寫成「GRUB_DEFAULT=0」則預設開機選項會是第一項,若設為「GRUB_DEFAULT=1」則是第二項,以此類推。而如果寫成「GRUB_DEFAULT=saved」,則表示預設開機選項可以由grub2-set-default或是grub2-reboot這兩個指令來設定,在這兩個指令後面空格再直接指定是第幾項即可。
·GRUB_SAVEDEFAULT:若設為「GRUB_SAVEDEFAULT=true」,GRUB會將上次選擇的開機選項設為預設選項,不過「/boot」目錄如果位於LVM或RAID上,則做這個設定會沒有效用。
·GRUB_HIDDEN_TIMEOUT:設定GRUB選單隱藏的時間,單位是整數秒,當只有單一作業系統時,GRUB會直接由那個作業系統開機,而不顯示選單,若要顯示選單,可以按〔Shift〕鍵,若是多個作業系統,則GRUB預設為不隱藏選單,會一直顯示選單。
·GRUB_HIDDEN_TIMEOUT_QUIET:設定是否顯示倒數計時的數字,設定為「true」,表示不顯示。
·GRUB_TIMEOUT:設定在多少秒之後自動以預設的作業系統開機,值若設定為「-1」時,開機選單會持續顯示,直到使用者選擇選項。
第三個是「/etc/grub.d/」目錄下有一些設定檔案,都是以Shell程式的方式寫成,在這裡的設定檔都是設定為有執行權限的執行檔後才生效,grub-mkconfig才會去執行它們並產生設定檔內容,其中幾個重要共通的設定檔分別說明如下:
·00_header:這是設定初始顯示項目的設定檔,包含圖形模式、預設選項、時間限制等設定,這些設定基本上都是由剛剛說明過的「/etc/default/grub」中的設定轉入,因此這個設定檔一般不直接更改,而是透過修改「/etc/default/grub」檔案的設定來更新00_header內的設定。
·10_linux:此檔案是負責去搜尋root設備底下「
/boot」目錄裡Linux系統核心相關檔案,在圖27中看到grub-mkconfig去搜尋Linux系統核心相關檔案的動作,便是由10_linux這個檔案來進行,因此一般也不會直接更改10_linux檔案,如果要拿掉一些Linux系統核心選項,使用者將「/boot」底下相關的Linux系統核心檔案刪除即可。