背景:想深入了解内核经典管理,但是又不想在开发板上花钱,于是想到借助虚拟机,在虚拟机上编译,安装学习内核,运行起来之后通过log的形式了解一些经典的用法。在环境搭建时的简单步骤,简单记下来,方便后续遇到问题后查找。

VMware,ubuntu18.04,运行内核版本:linux-5.4.0.tar.gz 升级内核版本:linux-5.15.7.tar.xz
环境准备:编译依赖

sudo apt-get install libncurses5-dev openssl libssl-dev
sudo apt-get install build-essential
sudo apt-get install pkg-config
sudo apt-get install libc6-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libelf-dev
sudo apt-get install libidn11-dev libidn11
sudo apt-get install zlibc minizip

1.下载和配置内核:https://www.kernel.org/

linux-5.15.7.tar.xz
解压:tar -xvf linux-5.15.7.tar.xz
cd linux-5.15.7
cp /boot/config-5.4.0-104-generic .config
yes "" | make oldconfig
使用yes ""命令来回答它使用默认选项

2.编译内核

(1)make zImage x86平台<512KB
(2)make bzImage
获取详细编译信息方法:
(1)make zImage V=1
(2)make bzImage V=1
编译好的内核位于arch/<cpu>/boot/目录下

3.编译内核模块

(1)make modules
(2)make modules_install
编译好的内核模块散落在内核源代码目录下,使用make modules_install将其从源代码目录复制到/lib/modules下,为打包做准备

4.制作ramdisk

方法:mkinitramfs -ko initrd.img-$version $version
例: mkinitramfs -ko initrd.img-5.15.7 5.15.7
注:直接在/home目录执行上述命令即可;
$version可以通过查询/lib/modules下的目录得到

5.安装内核和配置启动菜单

(1)cp arch/x86/boot/bzImage /boot/vmlinuz-$version
(2)cp initrd.img-$version /boot/
(3)cp System.map /boot/System.map-$version
(3)修改/boot/grub/grub.cfg
复制一份原来的启动配置菜单,按照新的内核配置:

注:直接update-grub更新启动菜单貌似不行,反正我没有成功, 手动修改后成功了。

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-xxxx' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  xxxx
    else
      search --no-floppy --fs-uuid --set=root xxxx
    fi
    linux   /boot/vmlinuz-5.15.7 root=/dev/sda1 ro  quiet splash $vt_handoff
    echo    'Loading initial ramdisk ...'
    initrd  /boot/initramfs-5.15.7

}
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-e48d6045-34bd-49ec-85e2-48fb704da297' {
menuentry 'Ubuntu, with Linux 5.15.7' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.7-xxxx' {
        recordfail
        load_video
        gfxmode $linux_gfx_mode
        insmod gzio
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  xxxx
        else
          search --no-floppy --fs-uuid --set=root xxxx
        fi
        echo    'Loading Linux 5.15.7 ...'
        linux   /boot/vmlinuz-5.15.7 root=/dev/sda1 ro  quiet splash $vt_handoff
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initramfs-5.15.7

}
menuentry 'Ubuntu, with Linux 5.15.7 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.7-recovery-xxxx' {
        recordfail
        load_video
        insmod gzio
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  xxxx
        else
          search --no-floppy --fs-uuid --set=root xxxx
        fi
        echo    'Loading Linux 5.15.7 ...'
        linux   /boot/vmlinuz-5.15.7 root=/dev/sda1 ro recovery nomodeset dis_ucode_ldr
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initramfs-5.15.7

}

6.重启:

reboot

7.查看是否更新成功:

uname -r

注:使用VirtualBox安装的虚拟机没有换成功。卡在Loading initial ramdisk。

附:在编译内核模块时遇到如下错误:

make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'.  Stop.
make[1]: *** Waiting for unfinished jobs....
  CC      certs/system_keyring.o
  CC      arch/x86/xen/trace.o
  CC      kernel/sched/wait_bit.o
Makefile:1868: recipe for target 'certs' failed
make: *** [certs] Error 2
make: *** Waiting for unfinished jobs....

解决方法:

编辑 .config 配置文件。

将:

CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem" 

改为 CONFIG_SYSTEM_TRUSTED_KEYS=""

CONFIG_SYSTEM_REVOCATION_KEYS="debian/canonical-revoked-certs.pem"

改为 CONFIG_SYSTEM_REVOCATION_KEYS=""

Logo

更多推荐