现在的位置: 首页 > 综合 > 正文

编译内核

2013年09月09日 ⁄ 综合 ⁄ 共 2907字 ⁄ 字号 评论关闭

最土的编译内核过程,搞成这样纯粹是为了保证成功,i386平台,2.6.18

下载当前的内核源码压缩包,解压缩到一个目录,拷贝/boot/.config到源码根目录,然后make menuconfig即可。然后退出。运行make bzImage或者make,然后make modules_install。拷贝arch/i386/boot/bzImage到/boot/,重命名为vmlinuz-2.6.18,然后运行mkinitramfs –o /boot/initrd.img-2.6.18 2.6.18,然后更改/boot/grub/menu.lst,添加以下行

title kernel 2.6.18
root (hd0, 0)
kernel /boot/vmlinuz-2.6.18 root=/dev/sda1 ro
initrd /boot/initrd.img-2.6.18

以下是命令过程:

$tar xjf linux-source-2.6.18.tar.bz2 .
$cd linux-source-2.6.18
$cp /boot/config-2.6.18-5-686 .config
$make menuconfig
$make        (or $make bzImage; make modules)
$sudo cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.18
$sudo make modules_install
$sudo mkinitramfs -o /boot/initrd.img-2.6.18 2.6.18
$sudo vim /boot/grub/menu.lst

将上面的行加到末尾即可。

自己配制来编译

### 如何验证下载的内核的签名
内核包都跟随有一个.sign文件,这个文件用来验证内核压缩文档的openPGP签名。
Linux内核包的公钥编号是0x517D0F0E,验证时首先从pgp服务器获取签名公钥,然后再进
行验证。命令如下:
$gpg --keyserver wwwkeys.pgp.net --recv-key 0x517D0F0E
$gpg --verify linux-xxx.tar.bz2.sign linux-xxx.tar.bz2

### 如何编译内核

### 如何制作initrd
拷贝一个已有的initrd,可以通过一下命令序列解压缩获得其中的文件内容
$mv initrd.img initrd.img.gz
$gunzip initrd.img.gz
$cpio -ivmd <initrd.img
修改,主要是不同内核版本的模块需要进行一下更新,更进一步的修改需要理解其中执行
的各个程序或者脚本的内容。
修改完毕,也就是准备好了initramfs目录,在这个目录下运行如下命令生成initrd.img
$find . | cpio -o -H newc > ../initrd.img
$gzip ../initrd.img
$mv ../initrd.img.gz ../initrd.img
注意:这里cpio的-H newc参数选项,在以前的大多数文档中使用的是-c选项,这个现在
不可用了,需要用新的-H newc选项才行

内核源码树下面提供了生成initrd的工具脚本
一个是scripts/gen_initramfs_list.sh用于生成准备好的rootfs下的文件列表
一个是usr/gen_init_cpio用于使用上面的文件列表生成cpio归档的initrd
最后将该initrd压缩即可,命令序列如下
$gen_initramfs_list.sh rootfs/ >filelist
$gen_init_cpio filelist >initrd.img
$gzip initrd.img
$mv initrd.img.gz initrd.img

### 关于initrd
initrd由bootloader加载到内存,内核启动时会在访问真正的根文件系统前访问内存中的
这个初始内存盘文件系统。这样Linux启动分为了两个阶段,第一阶段先执行initrd内指定
的程序,完成加载驱动模块等任务,第二阶段再执行真正的根文件系统中的/sbin/init程
序。第一阶段启动最主要的是要加载根文件系统存储介质的驱动模块。可能是IDE,SCSI或
USB等多种介质。

2.4内核时期的initd是文件系统镜像文件。
2.4过程:加载内核和/dev/initrd的内容到内存,/dev/initrd是由bootloader初始化的
设备;内核启动时解压缩/dev/initrd内容到/dev/ram0;读写方式挂载/dev/ram0;结束
(此为最终根文件系统)或者执行initrd中的linuxrc(脚本)文件,加载驱动并挂载真
正的根文件系统;如果真正根文件系统存在/initrd目录,将/dev/ram0挂载到/initrd,
否则卸载/dev/ram0,执行真正根文件系统上的/sbin/init,正常启动。
特点:在/linuxrc之后内核会继续执行初始化代码,这是2.4内核时代的特点。

2.6内核支持两种类型的initrd:(1)向前兼容的文件系统镜像;(2)cpio归档的压缩
文件,核心文件为/init;
2.6过程,bootloader加载内核和initrd到内存特定位置;内核判断initrd格式,如果是
cpio,解压缩并释放其内容到rootfs中;执行initrd中的/init,内核工作结束,init接管
2.6过程,如果判断是文件系统镜像,则内核将其内容保存到rootfs下的/initrd.image文
件,然后把它读入到/dev/ram0设备,后面的过程就与2.4的一样了。

文件系统镜像initrd制作过程,假设当前位于准备好的initrd文件系统根目录下
# dd if=/dev/zero of=../initrd.img bs=512k count=5
# mkfs.ext2 -F -m0 ../initrd.img
# mount -t ext2 -o loop ../initrd.img  /mnt
# cp -r  * /mnt
# umount /mnt
# gzip -9 ../initrd.img
cpio归档initrd制作过程,假设当前位于准备好的initrd文件系统根目录下

cpio归档initrd的优点:制作简单,启动时不需要挂载/卸载ramdisk,启动完/init,内核
任务就结束了,简洁不必担心后续衔接问题。

rootfs:一个基于内存的文件系统,linux初始化时加载的第一个文件系统
realfs:用户最终使用的文件系统

通过qemu来模拟,linux-0.2.img从http://www.nongnu.org/qemu/linux-0.2.img.bz2下载
$qemu -kernel bzImage -initrd initrd.img -hda ./linux-0.2.img -append "root=/dev/sda"

---------------------------------------
参考文件:
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/index.html

【上篇】
【下篇】

抱歉!评论已关闭.