本篇文章系个人实践总结,基于网上的资料进行实践整理。
背景:
在Ubuntu Linux 环境下,我们编译Linux内核时,通常要经历的步骤:配置内核--config的配置;编译内核和模块--“make”、“make modules”、“make modules_install”、“make install”,如果前面的配置没有问题,需要等待一段时间就可以编译好模块和内核了;生成initramfs并配置Grub--经过第二个步骤的“make install”,kbuild系统会把生成的内核镜像拷贝到INSTALL_PATH路径下(默认这个路径是/boot),但这时并不能使用,我们必须配置手动Grub才可以。另外,还要会使用initramfs来做引导之用,我们还需要为我们的新内核手动生成initramfs镜像。
从上面步骤来看,稍显繁琐。在实际工作中,我碰到这样一个情况,做的产品跟Ubuntu10.04 64bit的内核因为某些原因存在冲突。需要先把Linux系统的内核重新配置好,再编译,才可以完整安装开发的产品,而目前产品交付给客户的时候,是需要客户根据指导书进行内核的重新编译后,再安装开发的产品,这样带来很多的不方便。
解决方法:
1、我们可以使用make-kpkg简化这个流程,而且还能带来其他额外的好处
2、make-kpkg可以使内核deb化安装,在交付客户产品的时候,可以直接给予deb进行dpkg安装就可以进行内核的替换安装,从而带来极大的便捷。
3、下面用一个例子,来简单讲解如何制作内核deb包,事先要装好kernel-package、build-essential包。
4、准备一个内核源码包,解压出来
- root@huang-VirtualBox:/usr/src# ls
- linux-3.4.6 linux-headers-3.0.0-22
- linux-3.4.6.tar.bz2 linux-headers-3.0.0-22-generic
5、进入源码目录,将配置文件配置好。这里为了示例,我用原来系统的config配置文件,将/boot下的config文件拷贝到当前目录,然后用make-kpkg进行出包。
-
- root@huang-VirtualBox:/usr/src/linux-3.4.6# cp /boot/config-3.0.0-22-generic ./.config
- root@huang-VirtualBox:/usr/src/linux-3.4.6#make-kpkg --initrd kernel-image
- ###编译的过程,挺久的
- ###make-kpkg命令的简单使用介绍
- ###通常我们会看到这样的命令
- ###make-kpkg --initrd --revision huang.001 --append-to-version -20110107 kernel_image
- ###--initrd选项会让make-kpkg自动帮我们生成initramfs;
- ###--revision会给生成的deb文件加上一个版本信息。这个参数只是影响到文件名,如果不指定,默认会是“10.00.Custom”;
- ###--append-to-version也是一种版本信息,它不仅出现在deb安装包的文件名里,也会影响到kernel的名称,比如本例中,内核更新完成之后,用“uname -r”察看会得到“3.4.6-20110107”,不指定的话,默认内核版本号;
- ###kernel_image表示生成内核和默认模块的安装包,另外您也可以加上kernel_headers,这样make-kpkg会再生成一个内核头文件的安装包。
- ###本例中make-kpkg --initrd kernel-image
- ###产生的deb包为linux-image-3.4.6_3.4.6-10.00.Custom_i386.deb
- root@huang-VirtualBox:/usr/src# ls
- linux-3.4.6 linux-headers-3.0.0-22 linux-image-3.4.6_3.4.6-10.00.Custom_i386.deb
- linux-3.4.6.tar.bz2 linux-headers-3.0.0-22-generic
- ###是不是就这样直接安装deb就好了,完成内核的安装替换了呢
- ###这里我碰到了一个问题,/boot目录下没有生成initrd.image文件,只有vmlinuz文件,怎么回事呢,有问题就得解决么,继续谷歌,百度么
- ###google了一把,找到资料说ubuntu10.04开始,用上面命令生成deb包,安装后不会生成initrd,说kernel-package作者是故意这样做的,现在是要通过hook来完成initrd的生成,没办法我刚好是ubuntu10.04之后,继续解决
- ###需要copy一个initramfs脚本到你要安装的rootfs的/etc/kernel/postinst.d/ 目录里,然后在安装kernel的时候post-install脚本会通过hook来完成initrd 的生成
- root@huang-VirtualBox:/usr/src#cp /usr/share/kernel-package/examples/etc/kernel/postinst.d/initramfs /etc/kernel/postinst.d/
- ###拷贝过来,保持此目录下只有此脚本,下面对deb进行安装
- ###直接dpkg -i linux-image-3.4.6_3.4.6-10.00.Custom_i386.deb
- ###安装完去看一下?
- root@huang-VirtualBox:/boot# ls
- initrd.img-3.4.6 System.map-3.4.6 vmlinuz-3.4.6 config-3.4.6
- ###看到没!!!!!!这里省略了其他信息,再看看grub信息??
- root@huang-VirtualBox:/boot#cat grub/grub.cfg
- menuentry 'Ubuntu, with Linux 3.4.6' --class ubuntu --class gnu-linux --class gnu-
- -class os {
- recordfail
- set gfxpayload=$linux_gfx_mode
- insmod gzio
- insmod part_msdos
- insmod ext2
- set root='(hd0,msdos1)'
- search --no-floppy --fs-uuid --set=root be22009d-e2b0-40c5-b179-7f19a900c758
- linux /boot/vmlinuz-3.4.6 root=UUID=be22009d-e2b0-40c5-b179-7f19a900c758 ro quiet splash vt.handoff=7
- initrd /boot/initrd.img-3.4.6
- }
- menuentry 'Ubuntu, with Linux 3.4.6 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
- recordfail
- insmod gzio
- insmod part_msdos
- insmod ext2
- set root='(hd0,msdos1)'
- search --no-floppy --fs-uuid --set=root be22009d-e2b0-40c5-b179-7f19a900c758
- echo 'Loading Linux 3.4.6 ...'
- linux /boot/vmlinuz-3.4.6 root=UUID=be22009d-e2b0-40c5-b179-7f19a900c758 ro recovery nomodeset
- echo 'Loading initial ramdisk ...'
- initrd /boot/initrd.img-3.4.6
- }
- ###有木有!!!!成功了,有木有,呵呵,省略了其他信息
阅读(7874) | 评论(0) | 转发(0) |