uname -r
查看自己目前的ubuntu内核版本。下述编译过程中使用的内核源码版本是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
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
sudo shutdown -r now
11.打开终端,输入以下命令,可以看到有新编译的内核版本。
uname -a
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.cfg
,grub rescue>
,一部分(一般情况下)写在uefi
引导盘上,另一部分写在了某个分区的/boot/grub
目录(如果 /boot单独分区,则直接写在对应分区的/grub目录)里面。由于上述操作,致使grub2的mbr里面的那一部分找不到/grub目录里面的那一部分了(或者那一部分已经删除了)。
ls
,会罗列所有的磁盘分区信息,比如引用:(hd0,1),(hd0,5),(hd0,3),(hd0,2)。ls (hd0,X)/boot/grub
,如果/boot单独分区,则用命令ls (hd0,X)/grub
。正常情况下,会列出来几百个文件,很多文件的扩展名是.mod和.lst和.img,还有一个文件是grub.cfg。假设找到(hd0,5)时,显示了文件夹中的文件,则表示Linux安装在这个分区。grub rescue>normal
,就可以显示出丢失的grub菜单了。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