Linux内核编译更新实践简介

这里在实践角度上对日常内核编译更新过程进行讲述。

预备内容

下载内核

内核源代码能够在下面的 kernel.org FTP站点找到。有许多的站点分散在世界各地。

  • ftp.uk.kernel.org
  • ftp.us.kernel.org
  • ftp.de.kernel.org

你还可以在主站点 www.kernel.org 上面找到这些站点的更多的信息。

假设这里下载的内核是: linux-2.6.31.6.tar.bz2

编译内核

解压

$cp linux-2.6.31.6.tar.bz2 /home/quietheart/kernelSrc/
$cd $_
$tar -xjvf linux-2.6.31.6.tar.bz2

这样在 /home/quietheart/kernelSrc/ 下面会生成一个 linux-2.6.31.6/ 目录。目录里面的 README 最好看看。

配置内核

cp /boot/config-`uname -r` ./.config

这里,使用当前工作内核的配置文件做为新内核配置文件的基础。另外注意,使用 make xxx_config ,配置内核之前,应该先把 ./config 文件移走(备份)。

编译

具体按照后面的过程进行相应的编译,即可对当前使用系统内核及模块更新。

编译过程实践

在源代码里面运行配置命令(失败)

$make O=/home/quietheart/kernelSrc/build/ menuconfig

提示缺少 ncurses-devel :

'make menuconfig' requires the ncurses libraries.

安装缺失的库

$sudo apt-get install libncurses5-dev

ncurses 不仅仅封装了底层终端功能,而且提供了一个相当稳固的工作框架(Framework)可以在字符模式下产生美观的界面。

再次运行配置命令

$make O=/home/quietheart/kernelSrc/build/ menuconfig

这样生成的内容都在指定的目录 /home/quietheart/kernelSrc/build 中。

开始配置,配置的时候可以在选项上面按 ? 查看该选项的相关帮助信息,另外从 README 中知道需要注意的是:

  • 一些不需要的驱动会使内核变得更大,并且在一些时候会导致问题:例如寻找一个不存在的控制卡可能会让你的其他的控制卡产生问题。
  • 编译内核的时候 Processor type 被设置为比386更高,这会导致内核在386的处理器上面无法工作。
  • 一个内核如果在编译的时候具有math-emulation(和数学相关的特性),将会在coprocessor存在的时候仍然使用coprocessor:这时候math emulation将不会被使用到。
  • 这样内核会有一点大,但是将会工作在不同的机器上,这些机器可以有 math coprocessor 也可以没有。
  • kernel hacking 配置细节一般会导致内核更大更慢,甚至会导致内核不稳定,这些通过配置一些函数来主动地打断不好的代码来寻找内核的问题( kmalloc() )。

所以,对于一些 development, experimental, 或者 debugging 特性的问题,你应该回答 n.

编译内核

$make O=/home/quietheart/kernelSrc/build/

这里,我稍微计时了一下,从下午7:32到8:41.一个多小时。进入 build 目录查看,发现有一个 vmlinux 100多兆很大,上网查查看,原来内核镜像是 build 中的 arch/i386/boot/bzImage ,在我的机器上,这只是一个链接,指向位置是: ../../x86/boot/bzImage ,另外还有一个重要的文件就是 build 下的 System.map.

安装模块

我原来的机器的下面一个 /lib/modules/2.6.28-11-generic ,据说要把它备个份:

#cd /lib/modules/
#mkdir bak
#cd bak && tar -czvf 2.6.28-11-generic.tgz ../

这样在 bak 目录下面生成一个备份。文件100多兆,备份压缩的25M。

然后试试直接安装模块,如果采用的相同名字则应该先删掉 /lib/modules/2.6.28-11-generic ,不过先试试看,这一步比较危险:

#cd /home/quietheart/kernelSrc/linux-2.6.31.6
#make O=/home/quietheart/kernelSrc/build/ modules_install install

这一步在 /lib/modules/ 生成了 2.6.31.6myTestLocalVersion 目录(580多兆),原来的目录还存在;

另外在 /boot 生成了 System.map-2.6.31.6myTestLocalVersionvmlinuz-2.6.31.6myTestLocalVersionconfig-2.6.31.6myTestLocalVersion 三个文件。

这里前两个文件是编译的时候生成的,应该是 arch/i386/boot/bzImage/build/System.map (奇怪 bzImage 大小稍小), myTestLocalVersion 是配置的时候指定的一个后缀。

设置启动内核

=/boot/grub/menu.lst=增加如下行:

#myownKernel
title           Ubuntu 9.04, kernel 2.6.31-6-generic
#uuid           84511622-f2f2-4ca1-bacc-27addb2f1e39
kernel          /vmlinuz-2.6.31.6myTestLocalVersion root=UUID=79f02483-c01a-4752-9de9-6fb4b276e991 ro quiet splash 
initrd          /initrd.img-2.6.28-11-generic
quiet

这里发现一个小技巧:vim中在数字上面按 [Ctrl]a 可以增加数字值。这样文件系统不用改变,启动的时候选择这个选项就会自动自己编译的内核了。奇怪的是 initrd /initrd.img-2.6.28-11-generic 这里竟然能够成功。据说需要使用 /sbin/mkinitrd 相关命令的,可惜没有这个命令。

其他尝试

下面尝试将 arch/i386/boot/bzImage 替换 vmlinuz-2.6.31.6myTestLocalVersion

#cp build/arch/x86/boot/bzImage /boot/vmlinuz-2.6.31.6-generic

然后增加如下行:

title           Ubuntu 9.04, kernel 2.6.31-6-generic2
#uuid           84511622-f2f2-4ca1-bacc-27addb2f1e39
kernel          /vmlinuz-2.6.31.6-generic root=UUID=79f02483-c01a-4752-9de9-6fb4b276e991 ro quiet splash 
initrd          /initrd.img-2.6.28-11-generic
quiet

这样也能够启动内核。

其它

参考资料:
http://www.arm.linux.org.uk/docs/kerncomp.php
http://linux.chinaunix.net/docs/2006-11-21/3260.shtml

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容