`
tuoxie007
  • 浏览: 160290 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编译开源软件手记之2--Linux Kernel

阅读更多

这是此系列的第二篇文章,记录编译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 <custom>] 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

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics