linux如何编译开源软件,编译开源软件手写之2-Linux Kernel

编译开源软件手记之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 ] 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值