Ubuntu16.04下载编译Linux内核源码

下载内核源码

搜索可下载的源码包

1
apt-cache search linux-source

查看系统当前的内核版本

1
2
3
szh@ubuntu-node3:~$ uname -r
4.4.0-87-generic

一开始我采用下面的命令下载的源码,但是在执行make modules_install时报错,而且这个错误竟然都Google不到

1
sudo apt-get install linux-source-4.4.0

因此改为去官网下载对应版本的最新源码包,系统原来的内核版本是4.4.0-87-generic,因此我下载的是4.4.154的源码包,在/usr/src目录下解压

1
sudo tar -Jxf linux-3.12.tar.xz

编译和安装

安装相关依赖

1
2
3
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install libssl-dev
sudo apt-get install bc

拷贝配置文件

进入源码目录

1
cd /usr/src/linux-4.4.154/

把系统原有的配置文件拷贝到当前源码目录下

1
cp /boot/config-4.4.0-87-generic .config

加载配置文件

1
make menuconfig

先load,再save,然后exit

编译内核

1
make -j4

-j4表示启动4个编译线程,理论上来说,启动的线程数等于CPU核(core)数是最佳情况,每个线程独立运行在一个CPU核上. 而根据网上的资料,因为编译过程需要大量的I/O操作,当某个编译线程在等待数据时,任务调度器将会先调度其他job运行,所以可以将线程数指定为稍多于CPU核数(比如1.5倍). 我的虚拟机有4个vCPU,经过实验,发现make -j4速度比make -j6快,暂时不清楚是为什么.

安装模块

1
make modules_install

安装内核

1
sudo make install

无报错即可.

更新grub引导

1
2
3
szh@ubuntu-node3:~$ cd /boot/grub/
szh@ubuntu-node3:/boot/grub$ sudo update-grub2

重启系统

1
sudo reboot

一开始发现竟然不能正常开机了,根据报错信息

1
End kernel panic not syncing out of memory and no killable processes

找到了解决方案,罪魁祸首是/boot目录下的initrd.img-4.4.154文件太大了,是原先initrd.img-4.4.0-87-generic文件的十倍.

initrd 的含义是initialized ram disk. ram disk是用一部分内存模拟成磁盘,让操作系统访问,initrd.img文件就是个ram disk的映像文件,在系统启动时需要用到.

既然文件太大了,我们就要想办法去减小它的体积,这里有两种方法.

  • 方法一

适用于我现在这种情况,已经编译完内核了. 首先,我们先选择原来的内核进入系统(通过开机界面的Advanced options for Ubuntu). 执行以下命令:

1
2
3
cd /lib/modules/<version>
sudo find . -name *.ko -exec strip --strip-unneeded {} +
sudo update-initramfs -c -k <version>

我这里的version即为4.4.154,然后重启系统就可以了.

  • 方法二

在编译安装阶段就便避免这种情况发生:

将安装模块命令

1
make modules_install

改为

1
make INSTALL_MOD_STRIP=1 modules_install

版权声明

作者:萝卜姓胡
许可协议:Creative Commons Attribution-ShareAlike 4.0 International License
本文永久链接:http://hw2007.com/2018/09/07/Ubuntu16-04下载编译Linux内核源码/