编译环境如下:ubuntu-18.04.4-desktop-amd64 当前内核 5.3.0-28

准备安装的内核版本 5.11.13

1.内核下载

  • 下载后的内核文件如下图

2.上传内核程序

可以使用WinSCP或者Xftp进行文件的上传,这里选择使用xshell 使用Linux中的lrzsz包进行上传。

参考这篇文章 xhell上传文件(opens new window)

  • 备份/boot/grub/grub.cfg文件这个文件他负责启动你的Ubuntu系统,你编译好内核之后是要把新内核信息加入到这个文件里面,这样你才能在启动Ubuntu的时候运用你的新内核。这个文件也是极其重要的。如果你在编译内核过程中操作不当,将里面的信息破坏了,那么你的系统将无法启动,这样你只能通过恢复这个文件来解决。

3.解压内核文件

  • 进入文件上传后的目录

    • 解压上传上的文件,下图以 linux-5.11.13.tar.xz 为例,若无权限,前面加 sudo 即可。

    tar -xavf linux-5.11.13.tar.xz
    
    • 如下图所示,即解压完成。

4.下载相关包

  • 安装一系列软件。

     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 zlibc minizip
     sudo apt-get install libidn11-dev libidn11
    #

5.清理内核文件

  • 进入解压后的目录,使用命令

    make mrproper
    
  • 这个命令会删除所有的编译生成文件、内核配置文件(.config文件)和各种备份文件,所以几乎只在第一次执行内核编译前才用这条命令。

6.添加内核配置

  • 将boot目录下的当前系统内核的config配置信息复制一份到当前目录下的.config文件中。

    • 进入内核文件目录 输入 cd linux-5.11.13

    • 查看当前目录地址,输入 pwd

    • 复制当前使用的内核配置,我这里当前内核配置是config-5.3.0-28-generic,到当前目录

    cp /boot/config-5.3.0-28-generic ./.config
  • 如下图所示:

  • 输入make menuconfig命令,会打开一个图形界面(此步骤需要在虚拟内部的终端中进行)。

  • 移动键盘光标,到{Load}上,再回车,可以看到确认是当前目录下的.config文件

  • 选择OK后,再移动到Save上,保存并关闭,最后选择退出Exit

注意

在后面编译过程中如果出现这个错,应该配置中少了下面图片中的选项

#7.开始编译内核

  • 输入下面的命令,开始编译,编译过程需要很长时间 (我这里是从19.30到22.00)

    sudo make 
    

    此命令后可加 -jn来使用多个进程进行编译,例如sudo make j4,但是第一次编译时使用了该命令编译速度很快不到10分钟,但是当前目录很明显大小并没有增加。以至于内核编译失败

  • 编译过程中可以新建一个终端查看该目录下内存大小是否在不断增加du -sh

  • 编译完成后,输入命令du -sh查看编译后的目录大小,如下图所示,可以看到我这里最终当前目录有21G,编译前只有1.3G。

#8.安装内核

  • 输入下面的命令,安装内核模块

    make modules_install
    
    • 安装开始:

      image-20210414220740476

    • 安装结束:

  • 输入下面的命令,安装内核

    sudo make install
    

#9. 配置启动内核

  • 依次输入下列命令(后面的版本号根据自己的修改,可以使用{Tab}键自动补全)

    sudo mkinitramfs -o /boot/initrd.img-5.11.13
    sudo update-initramfs -c -k 5.11.13
    update-grub2
    
  • 如下面部分命令行内容所示

    xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ sudo mkinitramfs -o /boot/initrd.img-5.
    initrd.img-5.11.13           initrd.img-5.3.0-28-generic
    xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ sudo mkinitramfs -o /boot/initrd.img-5.11.13 
    xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ sudo update-initramfs -c -k 5.
    5.11.13           5.3.0-28-generic  
    xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ sudo update-initramfs -c -k 5.11.13 
    update-initramfs: Generating /boot/initrd.img-5.11.13
    xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ sudo update-grub2
    Sourcing file `/etc/default/grub'
    Generating grub configuration file ...
    Found linux image: /boot/vmlinuz-5.11.13
    Found initrd image: /boot/initrd.img-5.11.13
    Found linux image: /boot/vmlinuz-5.3.0-28-generic
    Found initrd image: /boot/initrd.img-5.3.0-28-generic
    Found memtest86+ image: /boot/memtest86+.elf
    Found memtest86+ image: /boot/memtest86+.bin
    done
    xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ 
    
    
  • 输入下面的命令查看当前电脑版本号

    uname -a
    

  • 可以看到此虚拟机本来内核版本是 5.3.0

#10.重启电脑,查看是否安装成功

  • 输入命令sudo reboot重启计算机,再次检查内核版本,输入uname -a

  • 可以看到我的内核版本以及换成5.11.13

#11.失败经历

  • 添加内核配置时,将.config文件误以为是文件夹,最终导致编译过程中,出现很多配置的选项。最终直接将.config文件,放入内核目录下,得以解决。

  • 第一次编译时,采用 下面的方式进行,

    #编译内核
    make bzImage -j4
    #编译模块
    make modules -j4
    #安装模块
    make modules_install
    

    补充:经过后期再次实验下面的方法可行,在配置启动项时需要使用到如下代码

 sudo mkinitramfs /lib/modules/5.11.14 -o /boot/initrd.img-5.11.14-generic
sudo cp ~/kernel/linux-5.11.14/arch/x86/boot/bzImage /boot/vmlinuz-5.11.14-generic
 sudo cp  ~/kernel/linux-5.11.14/System.map /boot/System.map-stem.map-5.11.14
 sudo apt-get upgrade

最终导致启动时出现下图错误

  • 出现此错误后,将虚拟机强行关闭后进入下图页面(若没用自动进入,在启动后按住{Esc}或者{shift}

  • 选择之前的内核进行启动,即可再次进入系统。

最后注意:

当编译失败后不要悲伤不要心急,输入make clean命令,此命令用于删除大多数的编译生成文件,但是会保留内核的配置文件.config,还有足够的编译支持来建立扩展模块。所以你若只想删除前一次编译过程的残留数据,只需执行make clean命令,在重新进行编译。

make clean