这是此系列的第二篇文章,记录编译Linux内核的过程。
按说内核的编译本是很简单的过程,但本人第一次编译,还是遇到了一些小问题,记录下来希望可以帮到新手。
本文主要参考:
《如何编译一个内核 - Ubuntu方式》
《ubuntu环境下编译内核详解》
《Ubuntu下的 Linux 内核》
《Ubuntu 10.04 编译安装最新版本Linux-2.6.34内核》
编译环境是Ubuntu 10.04 64位,kernel: 2.6.32
目标内核版本:2.6.34.1
Ubuntu和Debian下有两种编译的方法,一种是传统的make,一种是debian提供的make-kpkg,我用的是后者。
过程:
1. 安装所需软件
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2
2. 下载内核
在kernel.org首页上下载最新的本版
cd /usr/src sudo wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.1.tar.bz2 sudo tar xvf linux-2.6.34.1.tar.bz2 sudo ln -s linux-2.6.34.1 linux #以后使用方便,可以省略 cd linux
3. 准备工作
据说是第一次可以省略,第二次之后需要执行,没有考证
sudo make mrproper
4. 配置内核
由于menuconfg配置复杂,再次使用系统当前的配置:
sudo cp /boot/config-`uname -r` ./.config sudo make menuconfig
选择Load an Alternate Configuration File一项,出现.config文件,这就是我刚才cp过来的,选择OK
5. 开始编译
sudo make-kpkg clean sudo make-kpkg -initrd --initrd --append-to-version=dell1400 kernel_image kernel-headers
对于第二天命令的说明:
1. 此处的dell1400是参考文章中使用的,我本想改成自己的,但不小心多复制了回车,所以就执行了,那就执行了吧,不是原则问题。
2. 此命令比较随意,所以有些文章讲的不太一样。你可以make-kpkg --help看以下,我试过很多中参数的组合,但都有问题,问题在最后安装的时候都没有生成initrd文件,然后grub.cfg里也就没有添加启动项,后面我会介绍如何解决。但此处我认为比较合理的命令应该是
sudo make-kpkg --initrd [--append-to-version] kernel_image [kernel-headers]
--initrd是针对initrd方式的,但我加和不加,或者向上面用的加两个-initrd --initrd,效果都是一样不能生成initrd文件。
--append-to-version可要可不要,custom是自定义的本版号,ubuntu里一般有generic,就是这个东西。
headers不要应该也行,就是不生成headers文件,我们不做开发的话不用装headers的。
6. 安装新内核
此时生成了两个deb文件(不加headers就只有一个)
cd .. sudo dpkg -i linux-image-2.6.34.1dell1400_2.6.34.1dell1400-10.00.Custom_amd64.deb
此时生成几个新的文件在 /boot/ 下。
前面提到,此时没有生成initrd文件,怎么办呢?我本认为是make-kpkg命令使用的问题,所以变化参数执行很多此,每次都要2个小时,很TMD Shit,还是不知道,如果有朋友知道的话告诉我一声。
我看到另外一种用make编译的方法,受到启发,在此时执行
cd linux sudo mkinitramfs -o /boot/initrd.img-2.6.34
结果真的生成了,然后在grub.cfg文件中手动添加启动项。
sudo chmod +w /boot/grub/grub.cfg sudo vim /boog/grub/grub.cfg
添加项:
menuentry "Ubuntu, Linux 2.6.34.1" { insmod ntfs set root='(hd0,3)' search --no-floppy --fs-uuid --set 9a8c81748c814ba7 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-2.6.34.1dell1400 root=/dev/sda3 loop=/ubuntu/disks/root.disk ro quiet splash initrd /boot/initrd.img-2.6.34 } menuentry "Ubuntu, Linux 2.6.32-23-generic" { insmod ntfs set root='(hd0,3)' search --no-floppy --fs-uuid --set 9a8c81748c814ba7 loopback loop0 /ubuntu/disks/root.disk set root=(loop0) linux /boot/vmlinuz-2.6.32-23-generic root=/dev/sda3 loop=/ubuntu/disks/root.disk ro quiet splash initrd /boot/initrd.img-2.6.32-23-generic }
上面一个所我添加的,下面一个是原来的,只是标题,vmlinuz,initrd文件不同。
7. 重启
进入系统之后在终端下执行
uname -r
查看内核版本号,输出:2.6.34.1dell1400
是新的内核了。
虽然可以启动,但启动新内核的时候会报出一些错误,说是找不到modules.dep文件,参考一篇文章的解决方法
sudo su cd /boot cp initrd.img-2.6.34 initrd-2.6.34.old (先做一个备份以防万一,哈哈) depmod -a update-initramfs -k 2.6.34 -c cd /tmp gzip -dc /boot/initrd.img-2.6.34| cpio -id cp lib/modules/2.6.32.23-generic lib/modules/2.6.34 -r find ./ | cpio -H newc -o > /boot/initrd.img-2.6.34.new gzip /boot/initrd.img-2.6.34.new cd /boot mv initrd.img-2.6.34.new.gz initrd.img-2.6.34
错误提示不见了。
进入系统之后发现貌似显卡驱动没弄好。拖动窗口会闪。
还有两个新的体验:
在终端里敲tab键,声音好听了一些;
重启的时候快了一些,没有提示说要重启了之类的。
其他地方是不是有变化,是不是快些,我还没测试。
就此结束。
本人新博客:tuoxie.me