前言 使用的是ubuntu 22.04 本來的kernel:5.19.0-38-generic 編譯kernel 5.19 使用虛擬機要註意存儲空間的變化,避免記憶體爆掉。 環境配置 需要先安裝配置環境 sudo apt-get install ncurses-dev sudo apt-get ins ...
前言
使用的是ubuntu 22.04 本來的kernel:5.19.0-38-generic 編譯kernel 5.19
使用虛擬機要註意存儲空間的變化,避免記憶體爆掉。
環境配置
需要先安裝配置環境
sudo apt-get install ncurses-dev
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install libelf-dev
sudo apt-get install libssl-dev
sudo apt install dwarves
sudo apt-get install zstd
編譯kernel
下載和kernel同版本的源碼。
http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/linux-5.19.tar.gz
將自帶的配置文件copy到解壓的源碼的頂層Makefile處。
cp -r /boot/config-5.19.0-38-generic .config
配置kernel
sudo make menuconfig
選擇save,選擇.config(之前copy過來的)
完成之後回到這個界面選擇退出。
make
出現問題
make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
make: *** [Makefile:1843: certs] Error 2
刪除.config文件中這兩行中的雙引號中的內容,雙引號保留。
CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
CONFIG_SYSTEM_REVOCATION_KEYS="debian/canonical-revoked-certs.pem"
清除編譯結果重新編譯。
清除編譯結果
make mrproper
安裝驅動
sudo make modules_install
完成後會生成一個版本號的文件夾。生成位置是/lib/modules/5.19.0
這個文件夾要創建需要許可權。
生成內核壓縮鏡像文件
make bzImage
./arch/x86/boot下會生成bzImage文件
安裝準備
5.19.0這個名字是/lib/modules下創建的文件夾的名字。
sudo cp -r arch/x86/boot/bzImage /boot/vmlinuz-5.19.0
sudo cp -r .config /boot/config-5.19.0
root@ok-VirtualBox:/home/ok/Downloads/linux-5.15.58# cd /lib/modules/5.15.58/
root@ok-VirtualBox:/lib/modules/5.15.58# ls
build modules.builtin.bin modules.softdep
kernel modules.builtin.modinfo modules.symbols
modules.alias modules.dep modules.symbols.bin
modules.alias.bin modules.dep.bin source
modules.builtin modules.devname
modules.builtin.alias.bin modules.order
切換kernel版本
查看kernel版本
這是可以選擇的kernel版本,每個版本都有正常的和recovery mode兩個 (不要選擇recovery mode)
root@ubuntu:/# 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-97fa777f-a9b2-4ce8-babc-03476266e1dd' {
menuentry 'Ubuntu, with Linux 5.19.0-41-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.19.0-41-generic-advanced-97fa777f-a9b2-4ce8-babc-03476266e1dd' {
menuentry 'Ubuntu, with Linux 5.19.0-41-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.19.0-41-generic-recovery-97fa777f-a9b2-4ce8-babc-03476266e1dd' {
menuentry 'Ubuntu, with Linux 5.19.0-38-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.19.0-38-generic-advanced-97fa777f-a9b2-4ce8-babc-03476266e1dd' {
menuentry 'Ubuntu, with Linux 5.19.0-38-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.19.0-38-generic-recovery-97fa777f-a9b2-4ce8-babc-03476266e1dd' {
menuentry 'Ubuntu, with Linux 5.19.0' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.19.0-advanced-97fa777f-a9b2-4ce8-babc-03476266e1dd' {
menuentry 'Ubuntu, with Linux 5.19.0 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.19.0-recovery-97fa777f-a9b2-4ce8-babc-03476266e1dd' {
root@ubuntu:/# vi /etc/default/grub
選擇版本
對照上面拿到的數據編上順序號碼
0 5.19.0-41-generic
1 5.19.0-41-generic (recovery mode)
2 Linux 5.19.0-38-generic
3 5.19.0-38-generic (recovery mode)
4 Linux 5.19.0
5 Linux 5.19.0 (recovery mode)
配置/etc/default/grub文件
GRUB_DEFAULT=0
這個0就是選擇的結果,對應的就是前面的版本,0表示的是預設的版本。不要選擇recovery mode
如果不小心真的進入了recovery mode 在開機時長按shift鍵,自己手動選擇。
為什麼是0,因為預設的時候會自己選擇第一個選項(正常開機就是預設選擇的第一個 *Ubuntu):
但是我們自己編譯的kernel想要使用就在第二個選項中,對應的操作碼是1
然後第二個選項的子菜單
第一個選項是0,以此類推。
如果是想要啟動Linux 5.19.0內核,就
GRUB_DEFAULT=1> 4
1表示的是一級菜單選擇的是1,4表示的是二級菜單選擇5.19.0 > 符號後面有一個空格
這個選項表也和之前查看的kernel版本對的上。
完成之後更新
sudo update-grub
重啟
uname -r 查看版本是否切換成功