您当前的位置:首页 > 计算机 > 系统应用 > Linux

编译 linux kernel

时间:12-14来源:作者:点击数:
城东书院 www.cdsy.xyz

1、从 kernel.org( kernel 组织网/) 下载内核源码

在 kernel.org 上你能看到几种类型的内核存在:

mainline
最新版本的 linux 内核,发布新版本后会打开一个合并窗口,接受下一版本要做出的该病,合并窗口关闭后,就会发布新的 rc(即 release candidate,发布候选)版内核
stable
这是一个主要针对过去发布的内核进行 bug 修复的树,它更加的稳定
linux-next
为发布将来的版本而累积新代码并进行测试的源码树
longterm
Long Term Support,长期维护的意思
curl -L https://git.kernel.org/torvalds/t/linux-4.17-rc3.tar.gz -o linux-4.17-rc3.tar.gz

如果下载的是 stable 或 longterm 内核,还有对应的 sign 文件进行校验

gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org
xz -cd $代码文件 | gpg2 --verify $sign文件 -

2、安装必要的软件

sudo yum install -y gcc elfutils-libelf-devel ncurses-devel bc openssl-devel flex bison

3、解压源代码

tar -zxvf linux-4.17-rc3.tar.gz

4、将当前 kernel 的配置信息应用到新 kernel

cp /boot/config-$(uname -r) linux-4.17-rc3/.config

.config 中保存的就是内核编译的相关设置。它的内容大致是这样的:

tail linux-4.17-rc3/.config
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_SG_POOL=y
CONFIG_ARCH_HAS_SG_CHAIN=y
CONFIG_ARCH_HAS_PMEM_API=y
CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y
CONFIG_SBITMAP=y
CONFIG_PARMAN=m
# CONFIG_STRING_SELFTEST is not set

其中,以 # 开头的行就是注视行,这些 CONFIG_* 就是设置项,这些设置项与 linux 内核的各功能相对应,它的值有三种分别表示编译时的三种操作:

CONFIG_*=y
表示该项目所对应的功能会被静态地添加到内核中
CONFIG_*=m
表示该项目对应的功能会被编译成模块,在内核需要时再加载入内核
# CONFIG_* is not set
表示不编译该项目对应的功能

注意: 由于内核间功能的相互依赖十分复杂,因此不要尝试手工编辑 .config 文件,否则可能出现编译失败,或者编译后内核无法执行的情况。

5、配置 kernel

cd linux-4.17-rc3
make menuconfig
linux_kernel_menuconfig.png

启用/禁用好模块后,选择 Exit 退出

6、编译kernel

make

这一步的耗时非常长,而且会占用很多空间,比如我编译完之后,大约占据了11G的空间。

7、将内核安装到系统中

编译完成后,就可以将生成的内核安装到系统中了,安装时需要 root 权限,安装过程分为两个阶段进行。第一个阶段是模块的安装:

sudo make modules_install

这会把编译后的模块安装到 /lib/modules 下

ls /lib/modules
3.10.0-693.17.1.el7.x86_64  4.17.0-rc3

这里 4.17.0-rc3 就是新安装的模块,第二阶段是安装内核二进制映像文件,并生成 boot 初始化文件系统映像

sudo make install

这会在 /boot 下生成新的内核映射文件。

ls -l /boot/*4.17*
-rw-------. 1 root root 38754397 May  5 06:59 /boot/initramfs-4.17.0-rc3.img
-rw-r--r--. 1 root root  3512799 May  5 06:21 /boot/System.map-4.17.0-rc3
-rw-r--r--. 1 root root  7238272 May  5 06:21 /boot/vmlinuz-4.17.0-rc3

其中

  • initramfs-内核版本 / initrd.img-内核版本 为 boot 初始化文件系统映像
  • System.map-内核版本 为地址信息文件
  • vmlinuz-内核版本 为内核映像文件

若在 Debian 及其衍生版本中编译内核,你会发现不会自动生成 initramfs-内核版本 文件,则需要执行下面命令手工生成

sudo update-initramfs -c -k 内核版本

8、设置 GRUB,从当前安装的内核启动

sudo grub2-set-default linux-4.17-rc3

重启后就能看到新内核了

screenshot-54.png
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐