记录一次Linux内核源码编译实验
文章目录
0. 实验环境
- Ubuntu-16.04
- 内核源码-4.15.0
本次试验我使用的是之前安装后大半年没开机的Ubuntu-16.04
,很多软件需要更新、软件源也要更新。这个过程中也遇到不少问题,比较重要的一个是更新mysql
时dpkg
报错,这个问题似乎是有一个通用的解决办法,记录在文末供后续参考。
- 对硬盘容量的要求
编译较新版本的内核源码会消耗大量的硬盘空间,以我编译linux-source-4.15.0
为例,第一次编译时虚拟机硬盘配置是40G,结果编译快要结束时出现硬盘空间不足的错误。后来把虚拟硬盘扩容到80G编译成功。这其中固然有我先前占用一部分空间的原因,但是为确保一次成功,请保证至少50-60G
的硬盘空间,而且编译越新版本的源码应该对硬盘容量要求越高。
1. 选择、下载内核源码
- 使用命令
uname -a
查看本机内核版本 - 使用命令
apt-cache search linux-source
查询当前软件源可供下载的Linux源码版本 - 本次试验我选择的是
linux-source-4.15.0
,下载(默认到/usr/src
目录下):
sudo apt-get install linux-source-4.15.0
2. 安装必要的依赖软件以及性能要求
- 依赖软件
老师所提供的依赖软件如下,依次安装即可。中间可能会碰到dpkg
的问题,可移步文末查看解决方法。
实验过程中我是把老师给的依赖软件包以及别人编译内核时所用的依赖包全部安装了一遍,肯定有很多冗余。
sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install pkg-config
sudo apt-get install libc6-dev bison flex
sudo apt-get install libelf-dev zlibc minizip libidn11-dev libidn11
sudo apt-get install cpp cvs fakeroot g++ gcc
sudo apt-get install gettext gnome-user-guide
sudo apt-get install intltool-debian kernel-package libgcc1
sudo apt-get install patch po-debconf xz-utils
也有安装这些依赖包编译成功的:
sudo apt-get install flex bison libncurses-dev libelf-dev libssl-dev
- 性能要求 – 请依照实验环境部分所述情况,自行为虚拟机配置足够大的虚拟硬盘。
3. 解压、配置和编译内核源码
3.1 准备工作
- 进入
/usr/src
目录下解压对应的Linux源码压缩包。
这里请注意通过terminal
下载的Linux源码压缩包结构似乎和官网下载到的不太一样。第一次解压后发现解压出的目录下还有一个源码压缩包,将其解压后才是真正的源码目录。
sudo tar -xavf linux-source-4.15.0.tar.bz2
如图这是源码目录的上一级目录:
这里才是真正的源码目录:
- 删除以前编译的中间文件
sudo make mrproper
这个命令以及sudo make clean
是用来清除前几次编译所产生的中间文件,如果编译出错后你认为需要重新进行整个编译过程,可以使用这两个命令。
- 拷贝内核配置
这里参考用户木又啊的文章Ubuntu下编译内核所述方法 – 将本机内核配置复制到要编译的新内核。具体操作为:
sudo cp /boot/config-4.15.0-70-generic ./.config
这个config-[version]-generic
文件就是本机内核配置文件,注意这里version当然应该是当前内核版本而不是要编译的内核版本,即:使用命令uname -a
查看到的内核版本。
- 使用菜单界面配置内核选项
sudo make menuconfig
执行此命令后会弹出图形化配置菜单。有众多配置选项,实验内容是在内核版本信息中加入自己姓名。编辑完成后选择exit
会提示保存。
如果依赖软件没有装全,执行sudo make menuconfig
命令时可能会报错提示缺少依赖,我实验过程中并没有出现这个错误。
3.2 编译
编译过程:
sudo make [-jn]
这是编译过程中最耗时、耗内存的过程,可以通过参数-jn
设置进行编译的CPU内核数量来提高编译速度。但是要和宿主机所支持的数量一致,可以在vmware 的虚拟机设置界面根据提示正确配置。
例如我编译时设置n
为8:
sudo make -j8
这个过程中有可能出现gcc: internal compile error
,可能是因为编译过程中内存不足,可能需要给虚拟机配置更大的内存。
3.3 安装模块
如果编译顺利完成,使用命令sudo make modules_install
完成模块安装。
这部分操作完成后,在源码目录下的/lib/modules
下会生成一个带有新内核版本号的文件。
4. 配置引导
在内核源码目录下输出引导所需文件到/boot
目录:(下面所有命令中的[version]
都表示编译好的内核源码版本)
sudo mkinitramfs /lib/modules/[version] -o /boot/initrd.img-[version]-generic
拷贝两个文件到/boot
目录:
sudo cp arch/x86/boot/bzImage /boot/vmlinuz-[version]-generic
sudo cp System.map /boot/System.map-[version]
然后进入/boot/grub/
目录下执行sudo update-grub2
,完成后即可重启引导新内核启动。
5. 问题记录
实验一开始选择的是linux-source-4.19.123
版本,编译过程总是报错如下,但没有提示任何解决方法。最后切换Linux-source-4.15.0
编译成功。
6. 记录一些其他问题的解决方法以及一些工具的使用
6.1 软件更新或安装时dpkg
报错
dpkg: error processing mysql-server (--configure):
dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error
from a previous failure.Errors were encountered while processing:
mysql-server-5.7
mysql-server
解决方法:重新生成/var/lib/dpkg
目录下的info
:
cd /var/lib/dpkg
sudo mv info info.bak
sudo mkdir info
sudo apt-get upgrade
6.2 ssh中scp的使用
以在宿主机(win10下)操作为例(当然win10下必须已经安装好ssh,并配置好环境变量)。方括号中表示参数。
- 复制文件:
宿主机 --> 虚拟机:`scp [fpath/filename] [user]@[ip]:[destpath]`
虚拟机 --> 宿主机:`scp [user]@[ip]:[fpath/filename] [destpath]`
- 使用
-r
参数可递归复制整个文件夹:
宿主机 --> 虚拟机:`scp -r [fpath/filename] [user]@[ip]:[destpath]`
虚拟机 --> 宿主机:`scp -r [user]@[ip]:[fpath/filename] [destpath]`