最近帮一个项目编译内核,特别学习了一下,记下了过程。如果问题,可以及时联系我
编译命令
1.清理工作目标
make clean: 删除编译中间文件,但是保留配置
make mrproper:删除包括配置文件的所有构建文件
make distclean:执行mrproper所做的一切,并删除备份文件
2.配置内核
make menuconfig:文本图形方式配置内核
make oldconfig:基于当前的.config文件提示更新内核
make defconfig:生成默认的内核配置
make allmodconfig:所有的可选的选项构建成模块
make allyesconfig:生成全部选择是内核配置
make noconfig:生成全部选择否的内核配置
3.构建内核目标
make all:构建所有目标
make bzImage:构建内核映像
make modules:构建所有驱动
make dir/:构建指定目录
make dir/file.[s|o|i]:构建指定文件
make dir/file.ko:构建指定驱动
4.安装内核
make install:安装内核
make modules_install:安装驱动
5.打包工具
make rpm:生成内核的RMP包
make rpm-pkg:生成带源码的RPM包
make binrpm-pkg:生成包含内核和驱动的RMP包
make deb-pkg:生成包含内核和驱动的debian包
6.生成文档工具
make xmldocs:生成xml文档
make pdfdocs:生成pdf文档
maek htmldocs:生成html文档
获得内核源码
直接去www.kernel.org官网下载。如果在Ubuntu下,可以通过apt-get install linux-source下载,下载后的目录为/usr/src
解压文件
tar xvf linux-source-3.13.0.tar.bz2
清理环境
make mrproper
首次编译不需要这次操作
创建内核配置
make menuconfig
保存后会在当前目录下生成.config的隐藏文件
构建内核
一定要用root权限编译内核,不然会产生很多诡异问题。
make all -j 4
编译完成时间要看编译主机的配置,强大的机器大概20分钟就能编译完成。配置差可能需要数小时时间。编译完成后,主要生成了./arch/x86/boot/bzImage和initrd.image文件。
安装内核
make install
默认会把vmlinuz-3.16.0ydoing, initrd.img-3.16.0ydoing, System.map-3.16.0ydoing, config-3.16.0ydoing文件安装到路径是/boot。
修改启动项
我是在Ubuntu14.04的机器上操作的,引导的工具是grub2。这个是默认安装好的,注意不是grub1,所以要修改/boot/grub/grub.cfg。我之前以为是grub1,修改了menu.list,发现根本没用,郁闷了很久。grub.cfg默认是不可写的,所以修改之前要更改文件权限。
chmod +x grub.cfg
vim grub.cfg
模仿已有的menuentry 增加如下:
menuentry 'Ubuntu, with Linux 3.16.0ydoing' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0ydoing-advanced-e65c8b88-8698-45a3-8420-384d43b37119' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos6'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos6 --hint-efi=hd0,msdos6 --hint-baremetal=ahci0,msdos6 e65c8b88-8698-45a3-8420-384d43b37119
else
search --no-floppy --fs-uuid --set=root e65c8b88-8698-45a3-8420-384d43b37119
fi
echo 'Loading Linux 3.16.0ydoing ...'
linux /boot/vmlinuz-3.16.0ydoing root=UUID=e65c8b88-8698-45a3-8420-384d43b37119 ro quiet splash $vt_handoff
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-3.16.0ydoing
}
注意要修改有3个地方,一个是menuentry ‘Ubuntu, with Linux 3.16.0ydoing’ ,第二个是linux /boot/vmlinuz-3.16.0ydoing ,第三个是initrd /boot/initrd.img-3.16.0ydoing。
重新启动后就可以在grub的菜单中看到Ubuntu, with Linux 3.16.0ydoing的选项
可以将initrd.img编译进入bzImage
可以将initrd.img和bzImage合二为一,只要在make menuconfig
配置initramfs的路径就再编译一次就行了。