这是我关于如何构建和运行自定义内核的笔记。
获取来源
Linus Torvalds 的树是 [1]。
它在 [2] 上被标记为“主线”。
要克隆它,请使用 [1] 中的信息:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
现在转到linux/ dir 并在 master 分支上结帐(我们需要使用最新的
变化作为开发的起点):
$ cd linux
$ git checkout master
在实际开发之前不要忘记更新你的分支:
$ git pull --rebase
建筑
我机器上的内核版本:
$ uname -r
3.16.0-4-amd64
从我机器上运行的系统获取配置:
$ cp /boot/config-`uname -r` ./.config
为了更新我的配置(使用默认答案),我使用了下一个命令:
$ make olddefconfig
禁用(不构建)当前系统中未加载的模块:
$ make localmodconfig
要使用默认答案回答所有问题,我只需单击 Enter 直到完成
(实际上只有两次)。
接下来我做了:
$ make menuconfig
并选择下一个配置选项:
CONFIG_LOCALVERSION_AUTO=y
CONFIG_LOCALVERSION="-joe"
设置ccache和构建环境:
$ ccache -C
$ ccache -M 4G
$ export CC="ccache gcc"
构建内核(使用ccache):
$ reset
$ make -j4
$ make -j4 modules
构建的内核映像是:
arch/x86_64/boot/bzImage
安装
为您的内核安装模块:
$ sudo make modules_install
安装新内核:
$ sudo make install
安装的模块位于/lib/modules/*-joe/kernel/。
安装的内核文件位于/boot/*joe*:
- config-*joe*
- initrd.img-*joe*
- System.map-*joe*
- vmlinuz-*joe*
update-grub 作为make install 脚本的一部分运行,因此无需运行它
手动。
注意:modules_install 必须在之前 install 运行,因为使用模块填充initramfs 映像需要install 规则。
检查/boot/initrd.img-*joe* 文件的大小:它必须 >= 15 MiB
(如果它更小,可能模块不在那里)。
启动定制内核
通常您的自定义内核的版本应该比您的发行版内核大,
所以自定义内核应该默认运行。如果没有,请进一步阅读。
重启,进入 GRUB,选择下一个条目:
-> Advanced options for Debian GNU/Linux
-> Debian GNU/Linux, with Linux 4.0.0-rc7-joe-00061-g3259b12
让你的发行版内核默认加载
由于视频可能无法在您的自定义内核中运行(视频驱动程序必须
为此重建),您可能希望 GRUB 默认加载发行版内核。
为此,只需编辑/etc/default/grub 文件:
$ sudo vim /etc/default/grub
换行
GRUB_DEFAULT=0
到
GRUB_DEFAULT="1>3"
"1>3" 表示:
- 转到 GRUB 的第二行,输入
- 并使用第 4 行启动。
运行后:
$ sudo update-grub
注意:请勿编辑 /boot/grub/grub.cfg 文件,因为它是自动生成的,并且会
在每个update-grub 命令之后替换。
删除自定义内核
如果您不再需要自定义内核,您可能需要将其删除。
要删除已安装的内核,请执行下一步。
-
删除所有安装到 /boot 的文件:
$ sudo rm -f *joe*
-
删除所有已安装的模块:
$ sudo rm -rf /lib/modules/*joe*
-
更新 GRUB:
$ sudo update-grub
清理构建的内核
如果您不需要进行增量构建而想要进行干净构建
(例如,您结帐到另一个版本),您可能想要清理您的构建
文件优先:
$ make -j4 distclean
链接
[1]https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
[2]https://kernel.org/
[3]http://kernelnewbies.org/FAQ/KernelCompilation