Linux kernel编译指南

最近帮一个项目编译内核,特别学习了一下,记下了过程。如果问题,可以及时联系我

编译命令

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的路径就再编译一次就行了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。