对于嵌入式爱好者来说,裁剪编译内核是一门必修课,作为初学者,尝试编译kernel4.2.3 并添加到启动项,今日记之以为它日作为。
step 1
准备:(1). 所需的内核源码,www.kernel.org 可下载;
step2:
- 切换到源码所在的目录,make distclean 命令:删除生产的.o 和 .config 文件
- 编译内核之前需要一份配置文件,并在此基础上修改,故借用本地/boot/config-3.13.0-24-generic 配置文件,命令: cp /boot/config-3.13.0-24-generic /home/yangqi/code/linux/linux-4.2.3/.config
- 该配置文件.config 即是对内核裁剪的配置,不用直接打开修改,系统提供menu界面修改,命令:make menuconfig (如果此命令报错,说明需要装ncurses库,安装命令:sudo apt-get install libncurses5-dev) (menu目录如下:)
- 配置完,保存即可。
- 接下来,根据配置文件,编译内核: make bzImage V=1 (V=1 会显示编译的过程),编译时间大概1个小时
- 编译完内核,得到的bzImage会存放在linux-4.2.3/arch/x86_64 内,(x86_64为你选择的系统架构,配置的时候,你选择什么架构,编译好的内核文件就存放在对应的以架构命名的文件夹下)(下图为:以架构命名的文件夹)
- 接下来,编译模块: make modules 大约需要2个小时
- 将编译后的模块文件注入到系统的/lib/modules 下,命令: make modules_install (成功如图: ,存放在4.2.3文件夹下)
- 接下来,制作init ramdisk文件 : RedHat 下使用mkinitrd init-4.2.3 4.2.3 + cp init4.2.3 /boot/init4.2.3 (init-4.2.3为自拟,后一个参数4.2.3 必须与/lib/modules下的文件4.2.3一致,这是内核的版本号);ubutun下使用mkinitramfs 4.2.3 -o /boot/init-4.2.3
- 然后,还需要将第6步编译好的bzImage (linux-4.2.3/arch/x86_64/boot/下)拷贝到/boot/下:cp /home/yangqi/code/linux/linux-4.2.3/arch/x86_64/boot /root/vmlinux-4.2.3 (保证bzImage 和 initrd-4.2.3 都放在/boot/下)
- 最后,修改系统启动配置文件:(RedHat下修改/etc/grub.conf或者/etc/lilo.conf)
ubuntu下修改/boot/grub/grub.cfg 文件,命令:sudo gedit /boot/grub/grub.cfg (如下图修改: menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-cfd7566c-18ef-47bf-9b04-b285d20564ee' {
gfxmode $linux_gfx_mode
insmod gzio
insmod ntfs
set root='hd1,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1 FA5CCE605CCE1773
else
search --no-floppy --fs-uuid --set=root FA5CCE605CCE1773
fi
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz-3.13.0-24-generic root=UUID=FA5CCE605CCE1773 loop=/ubuntu/disks/root.disk rw rootflags=sync quiet splash $vt_handoff
initrd /boot/initrd.img-3.13.0-24-generic
}
menuentry 'Ubuntu My Linux-4.2.3' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-cfd7566c-18ef-47bf-9b04-b285d20564ee' {
gfxmode $linux_gfx_mode
insmod gzio
insmod ntfs
set root='hd1,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1 FA5CCE605CCE1773
else
search --no-floppy --fs-uuid --set=root FA5CCE605CCE1773
fi
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinux-4.2.3 root=UUID=FA5CCE605CCE1773 loop=/ubuntu/disks/root.disk rw rootflags=sync quiet splash $vt_handoff
initrd /boot/initrd-4.2.3
}
修改说明:蓝色为一开始就存在的代码,红色是复制蓝色的部分,并在此基础之上加以修改的,修改的地方为绿色部分。(注:menuentry命令为在开机启动时候,通过enter键键入那一刻,触发的命令)
12. 最后,还需要将该文件set default="0"(旧)修改 set default="1"(新),应该表示的是系统数目。
13. 保存完毕,重启电脑就可以看到新添加的选项。 进入系统后,使用 uname -r 即可查看到新的内核4.2.3
文章至此结束。未尽详细,但求有迹可循。