Featured image of post Linux内核编译安装

Linux内核编译安装

在Ubuntu16中编译Linux内核的4.4.0-21版本、进行内核安装,并修改启动项,从编译安装的内核启动系统

获取Linux内核

不要在超级用户权限下配置或构建Linux内核:由于旧的内核构建过程存在Bug,在使用超级用户权限构建内核时,会在/dev目录下生成一些垃圾文件,并可能会造成一些问题。因此,下载解压内核源码、配置并构建内核等操作都应在普通用户权限下进行,只有在安装新内核时的两三条命令需要在超级用户权限下运行

查看当前Linux内核版本

使用以下命令查看Ubuntu系统当前所使用的内核版本,以及已经安装的全部内核版本

1
2
uname -r
sudo dpkg --get-selections | grep linux-image

使用以下命令查看当前的Ubuntu系统所支持的Linux内核版本

1
apt-cache  search linux | grep linux-image

获取Linux内核源码

本示例选择使用linux-image-4.4.0-21进行演示

可使用wget或curl工具进行Linux内核的下载

1
2
3
4
mkdir ~/linux-kernel
cd linux-kernel/
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.21.tar.gz
curl https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.21.tar.gz -o linux-4.4.21.tar.gz

解压获取的Linux内核源码压缩包

1
2
tar -zxvf linux-4.4.21.tar.gz
ls

创建内核配置

内核配置应被保存在内核源码树顶级目录下名为.config的文件中,需要在构建内核前进行创建:

  1. 使用命令cp /boot/config-$(uname -r) .config将当前内核的配置文件拷贝出来
  2. 使用make config的命令行方式从头开始配置
  3. 使用make deconfig命令创建默认的内核配置
  4. 使用menuconfig命令修改内核配置

内核配置选项通常具有四个选项:

  1. y:直接构建为内核的一部分
  2. n:完全不构建到内核中
  3. m:构建成模块,在需要时加载
  4. ?:打印简短的描述信息并继续显示提示符

相应的menuconfig使用方式如下:

  1. 通过键盘上的向上和向下按键选择要配置的菜单,“Enter"按键进入
  2. 选中后按下"Y"键就会将相应的代码编译进内核中
  3. 选中后按下"N"键就会取消编译相应的代码
  4. 选中后按下"M"键就会将相应的代码编译为模块
  5. 按两下"Esc"键退出,也就是返回到上一级
  6. 按下"?“键查看选中菜单的帮助信息
  7. 按下”/“键打开搜索框,可在搜索框输入要搜索的内容

本示例使用menuconfig进行内核配置

1
2
3
4
5
6
7
8
# 安装ncurses库
sudo apt install libncurses5-dev
# 启动menuconfig
cd linux-4.4.21/
make menuconfig
# 若menuconfig启动失败 需补充安装依赖程序
sudo apt install flex
sudo apt install bison

控制台配置界面启动后可直接“Save”,随后保存即可,根目录下将生成.config文件(该文件默认隐藏,需使用Vim查看)

编译构建内核

可通过-j选项利用多处理器计算机的全部计算能力,-j选项后需附加一个两倍于系统中处理器数量的数字。如果-j选项后不附加任何数值,内核编译程序将为每一个文件创建一个新线程,将导致计算机失去响应,因此建议-j选项后附加具体的数值

1
make -j4

故障处理

在遭遇错误故障后,安装所需依赖,并清理编译生成文件,并重新创建内核配置、编译构建

1
2
3
4
# 安装OpenSSL依赖
sudo apt install libssl-dev
# 清理所有编译生成文件、内核配置文件
make mrproper

部分构建内核

若需有选择性的构建内核,则需要在命令中指明所需构建的文件夹,其中的M参数将使得构建编译该文件下的全部所需文件并链接成最终模块映像

1
make M=net/ethernet

此时构建独立目录时没有重新链接最终的内核映像,因此对于子文件夹的任何更改并未会影响最终内核映像,所以需执行下列命令,使得构建系统检查所有修改过的目标文件,并最终完成内核映像的链接

1
make

安装内核

几乎所有的发行版都提供了installkernel脚本,使得开发者无需做任何额外的工作即可自动的将内核安装到正确的位置并修改bootloader

使用以下命令安装所有构建编译好的模块,并将其置于新内核能找到的合适位置(lib/modules/kernel_version)

1
sudo make modules_install

成功安装模块后,应当安装主内核映像

1
sudo make install

此时/lib/modules目录下已生成相应版本的目录

1
ls /lib/modules

设置引导bootloader

GRUB是目前发行版中使用最多的Linux内核bootloader,需要将新内核的条目添加入GRUB文件中

1
sudo update-grub

手动选择启动项

如果升级的版本比当前内核版本高的话,默认新安装的内核就是第一顺序启动的,只需重启系统就行了,否则在开机时的引导界面需要手动选择启动项

1
sudo vim /etc/default/grub

设置“GRUB_TIMEOUT”值,并注释掉“GRUB_HIDDEN_TIMEOUT”

1
sudo update-grub

自动选择启动项

如果手动选择比较麻烦,可以修改配置文件使得开机自动进入指定启动项

通过以下命令查看新内核的编号,该内核位于gnulinux-advanced-9fff41cc-2c66-4fa7-9e5b-798f5cba683e目录下,内核编号为gnulinux-4.4.21-advanced-9fff41cc-2c66-4fa7-9e5b-798f5cba683e

1
grep menuentry /boot/grub/grub.cfg

随后将该编号设置为默认启动的操作系统,并更新GRUB(/boot/grub/grub.cfg是GRUB真正的配置文件,它在每次update-grub后自动生成,默认只读的,用户应该通过修改/etc/default/grub来间接地更改)

GRUB_DEFAULT应填入“gnulinux-advanced-9fff41cc-2c66-4fa7-9e5b-798f5cba683e>gnulinux-4.4.21-advanced-9fff41cc-2c66-4fa7-9e5b-798f5cba683e”

1
2
sudo vim /etc/default/grub
sudo update-grub

验证安装

1
uname -r

Licensed under CC BY-NC-SA 4.0


使用 Hugo 构建
主题 StackJimmy 设计