ubuntu修改默認啓動內核

一、序言

新換的筆記本由於太新的主板芯片,驅動還沒有完善。每次升級系統內核都要小心謹慎。經常發生部分硬件驅動失敗的事情。
系統Ubuntu 20.04.2 LTS x86_64 ,我現在使用的兩個版本的內核5.4.0和5.8.0。默認從高版本內核5.8.0啓動。目前5.4.0內核已經趨於穩定,且硬件驅動完善。雖然系統也有更新的內核,但是做爲工作機需要穩定使用系統,所以要修改默認啓動內核爲5.4.0版本。



二、調查

看了幾篇文章關於修改默認的啓動內核,方法都是根據grub.cfg(/boot/grub/grub.cfg)提取選項,來修改grub(/etc/default/grub)文件的GRUB_DEFAULT。
需要了解一下grub.cfg的內容。
主要關注兩點:
<1> 主菜單:

menuentry 'Ubuntu' $menuentry_id_option '' { }
submenu 'Ubuntu 的高級選項' $menuentry_id_option '' { }


<2> 高級選項子菜單:
“submenu 'Ubuntu 的高級選項'”中的menuentry(menu entry),完整的一個選項從menuentry '' {}直到大括號結束。



三、開工

前提知識補充完畢,開始修改默認啓動內核。

<1> 先通過修改默認啓動內核選項索引號,來達到修改默認啓動內核的目的。
首先找到本機所有的Linux內核啓動項。直接查找submenu下的menuentry,或者

➜  ~ grep gnu-linux /boot/grub/grub.cfg
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-75e3f56f-b03c-4c45-8e57-3669bd07666e' {
        menuentry 'Ubuntu,Linux 5.8.0-48-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.8.0-48-generic-advanced-75e3f56f-b03c-4c45-8e57-3669bd07666e' {
        menuentry 'Ubuntu, with Linux 5.8.0-48-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.8.0-48-generic-recovery-75e3f56f-b03c-4c45-8e57-3669bd07666e' {
        menuentry 'Ubuntu,Linux 5.4.0-67-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-67-generic-advanced-75e3f56f-b03c-4c45-8e57-3669bd07666e' {
        menuentry 'Ubuntu, with Linux 5.4.0-67-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-67-generic-recovery-75e3f56f-b03c-4c45-8e57-3669bd07666e' {

所以本機有2個內核4個相關的啓動模式。和上一節開機拍照的啓動選項相吻合。

Ubuntu,Linux 5.8.0-48-generic
Ubuntu, with Linux 5.8.0-48-generic (recovery mode)
Ubuntu,Linux 5.4.0-67-generic
Ubuntu, with Linux 5.4.0-67-generic (recovery mode)

對應默認的Ubuntu,Linux 5.8.0-48-generic爲索引0,明顯我想要的啓動內核是Ubuntu,Linux 5.4.0-67-generic,即索引2。
於是修改grub

➜  ~ sudo vim /etc/default/grub                                                    
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

# GRUB_DEFAULT=0
GRUB_DEFAULT="1> 2"
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

將  GRUB_DEFAULT=0  修改爲  GRUB_DEFAULT="1> 2" 
意思是在grub主菜單中選擇第2個選項(索引1),在其子菜單中選擇第3個選項(索引2),即"1> 2",注意>和2之間有一個空格。
修改完後保存,然後更新grub.cfg

➜  ~ sudo update-grub          
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
正在生成 grub 配置文件 ...
找到 Linux 鏡像:/boot/vmlinuz-5.8.0-48-generic
找到 initrd 鏡像:/boot/initrd.img-5.8.0-48-generic
找到 Linux 鏡像:/boot/vmlinuz-5.4.0-67-generic
找到 initrd 鏡像:/boot/initrd.img-5.4.0-67-generic
找到 Windows Boot Manager 位於 /dev/nvme0n1p1@/EFI/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings
完成

重啓計算機就會默認選擇5.4.0的內核做爲默認啓動內核。

 

<2> 上一條通過修改索引號,我擔心,更新內核或安裝卸載內核,引起索引號變化,導致失效。
於是接着看grub.cfg中的定義,從submenu子菜單開始

submenu 'Ubuntu 的高級選項' $menuentry_id_option 'gnulinux-advanced-75e3f56f-b03c-4c45-8e57-3669bd07666e'

子菜單後面單引號內容,分別對應名稱和id,於是來實驗使用名稱或者id來設置GRUB_DEFAULT。
子菜單4個選項從menuentry開始,也有對應的名稱和id。

menuentry 'Ubuntu,Linux 5.8.0-48-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.8.0-48-generic-advanced-75e3f56f-b03c-4c45-8e57-3669bd07666e'
menuentry 'Ubuntu, with Linux 5.8.0-48-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.8.0-48-generic-recovery-75e3f56f-b03c-4c45-8e57-3669bd07666e'
menuentry 'Ubuntu,Linux 5.4.0-67-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-67-generic-advanced-75e3f56f-b03c-4c45-8e57-3669bd07666e'
menuentry 'Ubuntu, with Linux 5.4.0-67-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-67-generic-recovery-75e3f56f-b03c-4c45-8e57-3669bd07666e'


於是GRUB_DEFAULT有另外兩種設置方法:

GRUB_DEFAULT="Ubuntu 的高級選項>Ubuntu,Linux 5.4.0-67-generic"

或者

GRUB_DEFAULT="gnulinux-advanced-75e3f56f-b03c-4c45-8e57-3669bd07666e>gnulinux-5.4.0-67-generic-advanced-75e3f56f-b03c-4c45-8e57-3669bd07666e"

替換掉之前的

GRUB_DEFAULT="1> 2"

同樣需要更新grub.cfg

sudo update-grub

重啓計算機,同樣修改生效了。

 

四、後記
<1> 用戶不要直接修改grub.cfg。當修改了grub文件,執行 sudo update-grub 系統會自動更新grub.cfg文件。
<2> grub.cfg子菜單中內核選項,有個奇怪的現象

Ubuntu,Linux 5.8.0-48-generic
Ubuntu, with Linux 5.8.0-48-generic (recovery mode)
Ubuntu,Linux 5.4.0-67-generic
Ubuntu, with Linux 5.4.0-67-generic (recovery mode)

普通模式的逗號,是全角的逗號。recovery mode模式的逗號,是半角的逗號。本文第一個圖也很明顯看得出來。

最後,文章參考https://blog.csdn.net/kingroc/article/details/105998517特此感謝。

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