转自html
yuzibo博客
linux
http://yuzibo.github.io/DebianBuildKernel.htmlgit
以前又一次编译了好屡次。惋惜没有一次成功的,说实话。借助Debian强大的dpkg软件包管理,使得又一次编译内核只像安装软件同样简单,我都认为这不是正宗的编译内核,好了。废话很少说,当即进入主题。github
我没有使用最新的内核源码。用的 3.2.64,咱们可以在http://www.lkml.org下载,注意这里咱们下载的是.xz文件,需要解压两次。至于源码放在哪里,全然取决于你本身,你想放在哪里就放在哪里,我直接放在在用户主文件夹都可以啊。app
xz -d linux-xx (xx就是你下载的内核源码的版本号),这时生成.tar文件,而后ide
tar -xvf linux-xxui
sudo apt-get install kernel-package libncurses5-dev fakeroot build-essential bces5
这个怎么说呢,在你没有对内核配置选项有个清醒的认识以前。个人建议是使用你本机的默认配置吧,我以前配置失败就是想弄清楚配置选项的每一个,结果备受挫折,先看看编译内核是什么样的,之后咱们再说这些也不错啊。code
cd linux-XXhtm
先进入文件夹。咱们如使用默认配置的话,
"cp /boot/config-uname -r
.config",假设咱们本身必定要配置,我建议使用make menuconfig
make-kpkg clean,略微等一会,咱们接着使用fakeroot make-kpkg --append-to-version=.141111 linux-image命令
咱们有必要讲讲make-kpkg与fakeroot这两个软件包,前者是可以本身主动替换make dep;make clean;make bzImage;make modules命令序列的脚本,而--append-to-version就是让咱们来指定一个额外的内核版本号。这个版本号是成为内核名的一部分,咱们可以使用数字,“+”,“,”,但是不能使用“_”,在这里的使用方法我借鉴网上同窗的样例,使用当天日期来解决不一样的版本号号问题。内核模块位于/lib/modules子文件夹下。每一个内核都有它本身的子文件夹,因此每次咱们建立新内核时使用新的内核名字,这个包安装程序就会在/lib/modules文件夹下建立一个新的子文件夹来保存它本身的模块。
注意。--resion仅仅会影响Debian软件包自己的名字而不是内核的名字,Debian kernel-image文件的名字格式例如如下:
kernel-image-(kernel-version)(--append-to-version)(--version)(architecture).deb.至于什么是fakeroot这一点我也不是很是清楚。好像是模拟root环境来建立一个kernel-image软件包。
通过漫长的等待后。咱们在代码文件夹的上一层文件夹就获得一个linux-image-3.2.64.141111_3.2.64.141111-10.00.Custom_i386.deb的软件包。别急,咱们另外一步工做需要无缺。如下是废话,可以忽略。
咱们有一个问题是boot过程当中mount根文件系统的“先有鸡仍是先有蛋的问题”,通常来讲。根文件在形形色色的存储设备上。不一样的设备又要不一样的硬件厂商的驱动,比方intel的ide/sata驱动,VIA的南桥需要VIA的ide/sata驱动,根文件系统也不一样的文件系统的可能,假如把所有的驱动/模块都编译进内核。那天然没问题。可现实(内核的精神或本质)是咱们把驱动/模块都驻留在根文件系统自己/lib/modules/xxx,那么“鸡蛋”问题就就来了。要mount根文件系统却需要根文件系统上的文件系统,怎么办?因而,就想出了如下的ramdisk,内核老是能安装ramdisk的(因为ramdisk暂时文件和内核同样,也是由bootloader经过低级读写命令(uboot用nand read。而不用经过系统层提供的高级读写接口)载入进内存,所以内核可以挂载ramdisk文件系统),而后把所有要使用到的驱动/模块都放在ramdisk上,首先,让内核将ramdisk看成根文件来安装,而后再利用这个根文件系统上的驱动来真正安装根文件系统,就将这个问详细攻克了。
补充。有时间你可以到/boot文件文件夹下看看。会有一个initrd.img的文件,initrd大致上就是 包括根文件系统的ramdisk。说了这么多,重点尚未解决,也就是咱们需要建立这么一个文件-initrd。将咱们新编译的内核在根文件系统挂载前能装进内存。那么,咱们该怎么样解决问题呢?首先,使用vi编辑/boot/config-3.2.64.141111文件。将代码CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"__这句话凝视掉(在句首用#),不然咱们就不会成功。
接下来运行
mkinitramfs -o /boot/initrd.img-3.2.64.141111 3.2.64.141111
直观上咱们可以理解生成目标文件initrd.img-3.2.64.141111,咱们作的所有工做你最后在/boot文件夹下会发现的。
grub-update
赶快从新启动吧,你就会发现在grub的引导菜单上有本身版本号的内核了。
首先感谢我女朋友春春的理解和支持,有她在背后,我感受很是幸福;这篇文章我重点參考了The blog