ubuntu修改預設啟動核心

水上雲天發表於2021-03-28

一、序言

新換的筆記本由於太新的主機板晶片,驅動還沒有完善。每次升級系統核心都要小心謹慎。經常發生部分硬體驅動失敗的事情。
系統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特此感謝。

相關文章