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模式的逗號,是半形的逗號。本文第一個圖也很明顯看得出來。
最後,文章參考//blog.csdn.net/kingroc/article/details/105998517特此感謝。