ubuntu更改默認啓動項順序
因爲經常需要在ubuntu下調試openstack代碼,在windows下用虛擬機又會嚴重影響使用性能,所以乾脆將筆記本裝了windows+ubuntu雙系統,曾多次半懂地設置了啓動順序,但當重裝系統後再次設置時總是忘記如何設置,所以決定花點時間,簡單研究了下grub
的配置。
GNU GRUB(簡稱“GRUB”)是一個來自GNU項目的啓動引導程序。GRUB是多啓動規範的實現,它允許用戶可以在計算機內同時擁有多個操作系統,並在計算機啓動時選擇希望運行的操作系統。GRUB可用於選擇操作系統分區上的不同內核,也可用於向這些內核傳遞啓動參數。 ——百度百科
Grub 2 是新一代的Grub,功能比Grub功能更加強大,由三部分組成:
* /etc/default/grub 文件
* /etc/grub.d 文件夾
* /boot/grub/grub.cfg 文件
其中ubuntu系統啓動用的是 grub.cfg 文件。
相互關係
我覺得可以這樣認爲,在我們執行update-grub(更新啓動菜單)命令後系統就會根據 /etc/default/grub文件 和 /etc/grub.d文件夾 的內容生成 /boot/grub/grub.cfg文件,所以當 /etc/default/grub文件 和 /etc/grub.d文件夾 被修改後,再執行 update-grub
, grub.cfg文件內容被更改,或者說是被更新吧。
所以網上常見的通過直接修改 /boot/grub/grub.cfg 來設置grub
的啓動順序並不是最好的一種方法,因爲每個更新內核或才手動執行 “update-grub” 命令後,這樣的設置就失效了。
以ubuntu 15.10進行說明:
/boot/grub/grub.cfg ----系統啓動引導讀取的文件
/etc/default/grub文件 ----存有開機默認啓動項、倒記時時間的內容等grub的相關配置
/etc/grub.d文件夾 -------存有各個具體啓動項,如下
wangchao@ubuntu:/etc/grub.d$ ls
00_header 10_linux 20_memtest86+ 30_uefi-firmware 41_custom
05_debian_theme 20_linux_xen 30_os-prober 40_custom README
解讀/etc/grub.d
00_header
配置grub程序,變量從/etc/default/grub
中導入05_debian_theme
設置GRUB 2
的背景圖片、字體顏色和主題等10_linux
搜索識別當前系統的內核,並建立啓動菜單,隨着Ubuntu的內核升級,可能有多個內核。20_memtest86+
搜索 /boot/memtest86+.bin 並添加內存測試啓動項。如果用不上,去掉該文件的可執行權限即可。sudo chmod -x /etc/grub.d/20_memtest86+ sudo update-grub
20_linux_xen
以 Xen hypervisor 啓動linux系統。30_os-prober
查找存在的其他操作系統並建立啓動菜單項,依次爲windows,linux,macos和Hurd。40_custom
根據模板添加自定義啓動項。
說明:在/etc/grub.d
目錄下的啓動項,只要變動文件的x屬性(執行權限),即可決定這個選項要不要出現在grub的啓動選單中。
解讀/etc/default/grub
配置grub
我們一般也只需要修改 /etc/default/grub
這個文件就行,如果改壞了,沒有關係,重新 從/usr/share/grub/default/grub
拷貝一份就可以了。
GRUB_DEFAULT
設置默認的grub
啓動項,可以是序號,完整的條目名或者是“saved”,默認爲 0,表示爲grub
啓動菜單的每一個啓動項。自Grub 1.99
引入了子啓動項的結構,常見於 高級啓動項。對於這樣的grub
菜單,在設置時就分爲主菜單項和子菜單項了。默認啓動項爲主菜單項
在主菜單項的第一個啓動項序號爲 0,第二條爲 1,並以此類推。另外你也可以直接用完整的啓動名作爲值,所以可以這樣配置。
GRUB_DEFAULT=0 GRUB_DEFAULT=1 GRUB_DEFAULT="Ubuntu, with Linux 3.2.0-23-generic"
默認啓動項爲子菜單項
對於
GRUB_DEFAULT
配置子菜單的值由3個部分組成,依次爲:一級菜單(即主菜單項)的序號或者條目名,”>” 符號(前後不能有空格)和 二級菜單的序號或者條目名。直接上圖進行說明:
GRUB_DEFAULT="Previous Linux versions>Ubuntu, with Linux 3.2.0-18-generic-pae" GRUB_DEFAULT="Previous Linux versions>0" GRUB_DEFAULT="2>0" GRUB_DEFAULT="2>Ubuntu, with Linux 3.2.0-18-generic-pae"
當值爲saved 時(對grub 1.98及後續版本有效),設置默認啓動項時就需要通過 “grub-reboot” 和 “grub-set-default” 兩個命令去設置了,其中“grub-reboot”僅設置下次啓動的默認啓動項,“grub-set-default”設置每次啓動的默認項。
儘管上面講的都是設置默認啓動項,在開機過程中,也可以手動選擇啓動項啓動操作系統。
GRUB_SAVEDEFAULT
如果設置了
true
,則下次的默認啓動項就上次選擇的,個人覺得這個比較好用,我就是選用這種方式設置默認啓動項的。當然,要使用這種設置,還需要滿足下面的條件:- 產生必須要設置 GRUB_DEFAULT=saved
- 系統的
/boot
目錄所在分區不能是LVM分區或者是RAID
GRUB_HIDDEN_TIMEOUT
設置等待用戶按shift鍵的時間,在此期間不會顯示
grub
界面,直到用戶按下shift按鍵,纔會進入grub
菜單,如果沒有按下shift鍵,等過了這個時間,直接進行默認的操作系統,特別是在單操作系統下,這也是默認行爲。經過我測試,其實就算是設置值爲0,及時按shift鍵還是可以進入grub
。
經過測試,發現上述僅是針對單系統,如果有多系統,那個這個參數會覆蓋下面的GRUB_TIMEOUT
參數,表現出GRUB_TIMEOUT
的行爲,即代表顯示grub
的等待時間。GRUB_HIDDEN_TIMEOUT_QUIET
值爲
true
或false
,設置在GRUB_HIDDEN_TIMEOUT
期間要不要顯示倒計時。GRUB_TIMEOUT
設置在自動啓動操作系統時
grub
的顯示時間,期間可以手動選擇相關啓動項,並也中止倒計時,期間如果沒有任何操作,則過了這個時間,自動進入默認的操作系統。
與系統啓動順序配置相關的也就這幾個主要參數了,其他配置就不作過多的介紹了,具體參見官方說明
GRUB_TIMEOUT & GRUB_HIDDEN_TIMEOUT
總的來說,只要GRUB_HIDDEN_TIMEOUT
設置了值,那GRUB_TIMEOUT
就不會生效,在update-grub
時,系統會提示“Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.”的警告信息。
但在不同的情況下,GRUB_HIDDEN_TIMEOUT
又表現出不同的行爲。在單系統下,表示隱藏grub
等待用戶通過按shift鍵進行了grub
的時間;而在多系統下,則表示顯示grub
等待用戶選擇啓動項的時間,此時與GRUB_TIMEOUT
類似,但會覆蓋GRUB_TIMEOUT
的值(如果也同時設置了GRUB_TIMEOUT
)。
最佳實踐
弄懂上面的原理後,那就可以隨心所欲地根據自己的需求配置了grub
了。由於我同時安裝了win8.1和ubuntu 15.10,並且平常使用win8.1更多,所以需要將win8.1的啓動項調到第一個,其次關於ubuntu測試的啓動項也用不到,所以需要禁用,命令如下:
cd /etc/grub.d
sudo mv 30_os-prober 06__os-prober
sudo chmod -x 20_memtest86+
最後,還配置了默認啓動上次啓動的操作系統,並設置grub
超時時間爲 3s,最終修改如下:
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
# GRUB_HIDDEN_TIMEOUT=5
# GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=3
參考文獻
Grub2/Submenus - Community Help Wiki
Grub2/Setup - Community Help Wiki