如何将Ubuntu编译内核过程成?

摘要:前言 使用的是ubuntu 22.04 本来的kernel:5.19.0-38-generic 编译kernel 5.19 使用虚拟机要注意存储空间的变化,避免内存爆掉。 环境配置 需要先安装配置环境 sudo apt-get instal
前言 使用的是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 查看版本是否切换成功