ubuntu更改默認啓動項順序

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 拷貝一份就可以了。

  1. 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”設置每次啓動的默認項。

    儘管上面講的都是設置默認啓動項,在開機過程中,也可以手動選擇啓動項啓動操作系統。

  2. GRUB_SAVEDEFAULT

    如果設置了true,則下次的默認啓動項就上次選擇的,個人覺得這個比較好用,我就是選用這種方式設置默認啓動項的。當然,要使用這種設置,還需要滿足下面的條件:

    • 產生必須要設置 GRUB_DEFAULT=saved
    • 系統的/boot目錄所在分區不能是LVM分區或者是RAID
  3. GRUB_HIDDEN_TIMEOUT

    設置等待用戶按shift鍵的時間,在此期間不會顯示grub界面,直到用戶按下shift按鍵,纔會進入grub菜單,如果沒有按下shift鍵,等過了這個時間,直接進行默認的操作系統,特別是在單操作系統下,這也是默認行爲。經過我測試,其實就算是設置值爲0,及時按shift鍵還是可以進入grub
    經過測試,發現上述僅是針對單系統,如果有多系統,那個這個參數會覆蓋下面的GRUB_TIMEOUT參數,表現出GRUB_TIMEOUT的行爲,即代表顯示grub的等待時間。

  4. GRUB_HIDDEN_TIMEOUT_QUIET

    值爲truefalse,設置在GRUB_HIDDEN_TIMEOUT期間要不要顯示倒計時。

  5. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章