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