做这件事情大致需要以下步骤(后面附有详细解释):
1.编译内核
$make menuconfig
$make
2.安装modules
#make modules_install
#make install
3.制作 initrd (可省略)
#make-kpkg --initrd kernel_image
#cd debian
#find linux-image-x.x.x | cpio -o > initrd.img-x.x.x
#gzip initrd.img-x.x.x
#mv initrd.img-x.x.x.gz /boot/initrd.img-x.x.x
4.添加使用新内核的启动项
#emacs /boot/grub/grub.cfg
5.重启,在grub启动时选择使用新内核的项启动系统
#init 6
详细解释:
1.编译内核时,分几种选择配置内核项的方式:命令行回答问题(make config),命令行图形(make menuconfig),X窗体(make xconfig)等。无论哪种方式效果都是一样的,为了同一个目的,那就是配置内核项。
其中,命令行回答问题(make config)兼容性最好,但缺点是必须依次回答完所有的问题(选择和填空)。
命令行图形(make menuconfig)是在终端中用各种字符组成图形菜单,用方向键在菜单中选择配置。这种方式需要用到ncurses库,初学者要先研究把这个库的安装搞好。
X窗体(make xconfig)方式需要在X图形环境中使用,运行命令后会有窗体弹出,可用鼠标操作。
建议使用(make menuconfig)
在配置完成后即可执行make了。
在这里注意一个make选项:CONFIG_DEBUG_SECTION_MISMATCH(不知该选项是何时引入的,2.6.32和3.2都有),这个选项可以报告出内核配置中的MISMATCH具体位置,一般在首次配置内核后使用这个选项编译内核。如果你没有使用这个选项,并且你的配置发生某项不匹配,则最终make脚本一样会提示你一共有多少个不匹配,但是没有具体不匹配的细节,之后推荐你使用这个选项来make,看看具体的不匹配细节。
使用方法如下:
$make CONFIG_DEBUG_SECTION_MISMATCH=y
待你维护的内核代码树配置趋于稳定时,即可不使用这个选项。更改这个选项后会导致内核完全编译。
2.如果你选择内核支持动态加载内核模块的机制,那make modules_install是必要的,他把作为modules的选项生成的ko放置于合适的位置/lib/modules/x.x.x,当系统运行起来后,内核需要加载某个模块时,会到这个目录中寻找。
make install 把vmlinuz,Symtem.map,config这3个文件放于/boot中。新内核的启动要靠他们。
3.initrd是内核在挂载磁盘为根文件系统之前的根文件系统,是一个ramdisk,当然也就要求内核的ramfs支持。对于本地磁盘已经有跟文件系统的情况下(如:已经安装好某个发行版Linux后,本地磁盘当然就已经有正确的跟文件系统了,而在此基础上更换自己编译的新内核的情况即为该情况),内核的initrd是可以没有的,也就是说不必使内核挂载initrd为跟文件系统,而直接挂载本地磁盘为跟文件系统。如果打算使用原有的跟文件系统,此步骤可以不做,如果打算脱离原有跟文件系统,此步骤才有意义。
为了使内核可以挂载本地磁盘为跟文件系统,需要满足下面几个条件:
1. 引导程序需理解跟文件系统的格式,即:跟文件系统为ext4的话,grub或lilo要理解ext4的格式才可以把里面的/vmlinuz内核镜像文件读出并加载。对于grub2,在grub.cfg里配置启动项目时加一项load ext4模块即可。
2. 确定自己存有跟文件系统的本地磁盘类型和磁盘控制器类型,在内核配置时选择正确的控制器驱动。
3. 确定自己跟文件系统的文件系统类型,在内核配置时选择该文件系统类型,如ext2,ext3,ext4等。
处理好以上几点,基本上就碰不到内核加载后挂载不上跟文件系统的问题了。
制作initrd时对于2.6内核的debian,有工具 make-kpkg 制作initrd,在写这篇文章时,make-kpkg制作3.x的内核时会说找不到Documentation/lguest,的确,这个目录在3.x内核中是没有的,因此这个工具还不能用于3.x内核。我一直没有搞明白这个工具生成的initrd中/bin,/etc等的内容都是从哪里来的。所以为了搞清楚这些,尝试手动制作initrd。
待续
阅读(7308) | 评论(0) | 转发(0) |