基于Ubuntu 18.04编译Linux内核过程_解决方案汇总

一、编译前准备

  1. 要确保磁盘空间足够大,可以在ubuntu关机状态下查看分配的内存空间。最好不要晚饭后安装(实惨),编译内核不难,但有个过程要很久,程序员本来头发少就不熬了。
    基于Ubuntu 18.04编译Linux内核过程_解决方案汇总_第1张图片
  2. 在linux编译内核网站下载内核源码,点击图中箭头所指位置下载。
    基于Ubuntu 18.04编译Linux内核过程_解决方案汇总_第2张图片
  3. 将下载好的压缩包保存在主目录下。
  4. uname -r 查看自己目前的ubuntu内核版本。
    基于Ubuntu 18.04编译Linux内核过程_解决方案汇总_第3张图片

下述编译过程中使用的内核源码版本是linux-5.6.7,输入命令时如版本不一样,修改版本号为自己下载的。

二、编译

1.找到文件目录/boot/grub/grub.cfg,复制一份grub.cfg文件到其他位置,在后续出错时可用到。
2. 依次输入以下命令,安装必要依赖。

sudo apt-get install  libncurses5-dev   openssl libssl-dev
sudo apt-get install build-essential openssl
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

基于Ubuntu 18.04编译Linux内核过程_解决方案汇总_第4张图片
3. 将下载的内核源码压缩包解压;进入到文件目录下。

sudo tar -xavf linux-5.6.7.tar.xz  -C  /usr/src
cd /usr/src/linux-5.6.7

4.清除编译过程产生的中间文件,将内核代码还原为刚解压的状态,最好每次编译前执行一下。

sudo make mrproper

5.清除上次编译产生的中间文件。

sudo make clean

6.配置编译参数,编译的内核模块选择。

sudo cp /boot/config-`uname -r`  ./.config
sudo make menuconfig

出现.config文档后按 “下箭头” 到 Exit ,回车。

7.编译内核。2表示编译时用几个线程编译,最大不要超过CPU个数的两倍。也可直接使用sudo make编译。

sudo make -j2   

这个命令执行后需要很久很久很久,具体多久取决于电脑性能等。

8.安装内核模块,驱动等。

sudo make modules_install   
sudo make install

需要一点时间,但不会太久。

9.接着依次输入命令。

sudo mkinitramfs /lib/modules/5.6.7 –o /boot/initrd.img-5.6.7-generic
sudo update-initramfs -c -k 5.6.7
sudo update-grub2

基于Ubuntu 18.04编译Linux内核过程_解决方案汇总_第5张图片
10.手动重启,或输入以下命令重启。

sudo shutdown -r now

11.打开终端,输入以下命令,可以看到有新编译的内核版本。

uname -a

基于Ubuntu 18.04编译Linux内核过程_解决方案汇总_第6张图片
至此就编译完成了。下面为总结的一些可能出现的错误。

三、问题解决方案

1.编译过程中如果提示找不到依赖文件,只需要根据提示的错误信息安装对应的依赖文件即可。比如出现以下错误提示:

/bin/sh: 1: flex: not found
scripts/Makefile.lib:202: recipe for target 'scripts/kconfig/zconf.lex.c' failed
make[2]: *** [scripts/kconfig/zconf.lex.c] Error 127
Makefile:514: recipe for target 'silentoldconfig' failed

说明电脑缺少flex模块,执行以下命令安装。

sudo apt-get install flex

2.grub.cfg没有正确引导,需要手动引导。

grub> set root='hd0,gpt9'
grub>  linux	/boot/vmlinuz-4.15.0-88-generic root=UUID=5add8c5b-5807-439c-b049-d5170cc403f2 ro  quiet splash $vt_handoff
grub> initrd	/boot/initrd.img-4.15.0-88-generic
grub> boot 
sudo update-grub

3.没有找到grub.cfggrub rescue>,一部分(一般情况下)写在uefi引导盘上,另一部分写在了某个分区的/boot/grub目录(如果 /boot单独分区,则直接写在对应分区的/grub目录)里面。由于上述操作,致使grub2的mbr里面的那一部分找不到/grub目录里面的那一部分了(或者那一部分已经删除了)。

  • 先使用ls命令,找到Ubuntu的安装在哪个分区:在 grub rescue>下输入ls,会罗列所有的磁盘分区信息,比如引用:(hd0,1),(hd0,5),(hd0,3),(hd0,2)。
  • 然后依次调用如下命令: X表示各个分区号码,如果/boot没有单独分区,用命令ls (hd0,X)/boot/grub,如果/boot单独分区,则用命令ls (hd0,X)/grub。正常情况下,会列出来几百个文件,很多文件的扩展名是.mod和.lst和.img,还有一个文件是grub.cfg。假设找到(hd0,5)时,显示了文件夹中的文件,则表示Linux安装在这个分区。
  • 如果找到了正确的grub目录,则没办法临时性将grub的两部分关联起来。
    解决
    –以下是/boot没有单独分区的命令,引用:
    grub rescue>set root=(hd0,5)
    grub rescue>set prefix=(hd0,5)/boot/grub
    grub rescue>insmod normal
    –以下是/boot 单独分区的命令,引用:
    grub rescue>set root=(hd0,5)
    grub rescue>set prefix=(hd0,5)/grub
    grub rescue>insmod /grub/normal.mod
    –调用命令grub rescue>normal,就可以显示出丢失的grub菜单了。
    –重启,问题依旧存在,我们需要进入Linux中,对grub进行修复。启动起来,进入ubuntu之后,在终端执行下列命令。
    sudo update-grub
    sudo grub-install /dev/sda

4.内核或模块没做好,出现问题。

VFS: Unable to mount root fs on unknown-block (out of memroy)
Can’t find memory target

–硬盘驱动没有识别,快速启动没关(双系统),initrd.img 太大,减小安装模块的大小:

make INSTALL_MOD_STRIP=1 modules_install

–在编译内核是config配置文件没cp好。

5.内核或模块没做好
initramfs >
rootdelay=60
– 硬盘驱动没有,做内核时,配置文件没选好。模块没做好,重做模块,重新安装:

sudo make modules make modules_install

你可能感兴趣的:(安装教程,问题解决)