Linux切換內核版本
有些軟件會對Linux內核的版本有要求。爲此我們需要安裝並切換到指定的內核版本。本文以5.4.0-26-generic爲例。
參考:LayerStack Tutorials - LayerStack - How to change the default Boot Kernel on Linux Cloud Servers
- 下載指定版本
sudo apt-get install -y linux-image-${_target_kernel_}
sudo apt-get install -y linux-headers-${_target_kernel_}
- 然後查看可用的內核版本
cat /boot/grub/grub.cfg | grep -E 'menuentry.+class.+class.+menuentry_id_option'
結果:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-53b6e16f-1415-457e-85fe-9805a4c3e773' {
menuentry 'Ubuntu, with Linux 5.15.0-69-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-69-generic-advanced-53b6e16f-1415-457e-85fe-9805a4c3e773' {
menuentry 'Ubuntu, with Linux 5.15.0-69-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-69-generic-recovery-53b6e16f-1415-457e-85fe-9805a4c3e773' {
menuentry 'Ubuntu, with Linux 5.15.0-60-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-60-generic-advanced-53b6e16f-1415-457e-85fe-9805a4c3e773' {
menuentry 'Ubuntu, with Linux 5.15.0-60-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-60-generic-recovery-53b6e16f-1415-457e-85fe-9805a4c3e773' {
menuentry 'Ubuntu, with Linux 5.15.0-58-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-58-generic-advanced-53b6e16f-1415-457e-85fe-9805a4c3e773' {
menuentry 'Ubuntu, with Linux 5.15.0-58-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-58-generic-recovery-53b6e16f-1415-457e-85fe-9805a4c3e773' {
menuentry 'Ubuntu, with Linux 5.4.0-26-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-26-generic-advanced-53b6e16f-1415-457e-85fe-9805a4c3e773' {
menuentry 'Ubuntu, with Linux 5.4.0-26-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-26-generic-recovery-53b6e16f-1415-457e-85fe-9805a4c3e773' {
可以看到,裏面一共包含兩個帶5.4.0-26-generic的版本。其中一個是recovery mode。我們不要選擇recovery mode,選擇正常的那個。
- 然後修改系統的默認內核版本
sudo vi /etc/default/grub
可以看到其中的
GRUB_DEFAULT="1> 4"
我們把1> x
中的x改爲我們想要的版本。x就是在上面那個大表中你想要的版本是第幾個。這裏注意千萬不要弄錯!這裏我具體地列出每個版本對應的編號
0 Ubuntu, with Linux 5.15.0-69-generic
1 Ubuntu, with Linux 5.15.0-69-generic (recovery mode)
2 Ubuntu, with Linux 5.15.0-60-generic
3 Ubuntu, with Linux 5.15.0-60-generic (recovery mode)
4 Ubuntu, with Linux 5.15.0-58-generic
5 Ubuntu, with Linux 5.15.0-58-generic (recovery mode)
6 Ubuntu, with Linux 5.4.0-26-generic
7 Ubuntu, with Linux 5.4.0-26-generic (recovery mode)
既然我想要的版本是5.4.0,那麼這裏就應該改成
GRUB_DEFAULT="1> 6"
- 最後,更新配置並重啓
sudo update-grub
sudo reboot
如果配置錯了怎麼辦?
很不巧,我在配置默認內核版本的時候犯傻了。我把x改成了5,導致系統以一個recovery mode重啓了。
由於我使用的是遠程服務器,而recovery mode中並沒有ssh服務,導致重啓之後我就再也無法從遠程訪問服務器了。
於是沒辦法只能拜託師兄去機房手動重啓服務器。我不知道具體的過程,但應該與grub2 - How can I boot with an older kernel version? - Ask Ubuntu差不多。
大致就是重啓的時候,按住shift鍵,進入grub界面,在裏面手動選擇想要進入的內核版本即可。
但是手動啓動後,默認的內核版本還是錯的,此時仍然需要執行上面的流程,將默認版本改對,再次重啓。