ubuntu下编译内核

声明:本文是个人参考网上有关资料,编译2.6.25内核的总结,如按本文步骤编译内核造成的责任和本文作者无关。
本文放在本人的blog上面:http://hi.baidu.com/ffbp89/
本文还有姊妹篇《老笔记本编译2.6.20内核指导》
如果有修改,也在blog上。
欢迎转载本文,但是请不要取消本声明。
写这篇东西主要是教学目的,学生可以结合编译内核复习shell的有关命令。


一、下载源代码和编译软件的准备
下载内核源代码:http://www.kernel.org/
注意,点击2.6.25内核的F版,即完整版。
如果你懒得去网站点联接,运行下列命令:

代码:
$cd ~
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.10.tar.bz2

安装有关编译程序。安装make ,gcc, make-kpkg,运行menuconfig等等和编译内核相关的工具。
安装不了,请检查/etc/apt/sources.list 文件。
有关命令:
代码:
$sudo  apt-get install build-essential kernel-package   libncurses5-dev


二、解压源代码
注意,网上很多教程上说应该解压到 /usr/src,纯属以讹传讹,linux掌门人linus说解压到任何目录上都可以。当然,linus的说法是正确的。我放在自己的主目录下的src目录。
如果你下载源代码是放到自己的主目录下或者运行上面的wget下载的,那么运行下列命令:
代码:
$ cd ~
$ mkdir src && tar jfx linux-2.6.25.10.tar.bz2 -C src/


现在,源代码就在 ~/src/linux-2.6.25.10
进入源代码的目录,准备下一步的工作。后面都在这个目录里面进行。
代码:
$ cd ~/src/linux-2.6.25.10


三、开始编译前的准备工作。
首先,清理以前编译时留下的临时文件。如果是刚刚解开的包,不需要执行这步。如果是第二次或者是第n次编译,那么一定要执行。
相关命令如下:
代码:
$ sudo make mrproper

网上很多教程上说把现在使用的内核的config拷贝过来参考,据实验,是不需要的,ubuntu还有
debian会自动做这步。不过这条命令倒是可以学习一下。当然你可以将以前的配置拷贝过来。
命令:
代码:
cp /boot/config-`uname -r` ./.config


四、开始配置内核选项。
相关命令:
代码:
$sudo make menuconfig


配置用到的键只有几个,esc退出菜单;空格改变选项状态;光标键上下左右移动,回车选定。
选项意义:M是编译成可以随时加入的模块,*是编译进入内核,空就是不要。
配置选项非常多,具体配置可以参考金步国先生翻译的资料:Linux 2.6.19.x 内核编译配置选项。
参考网址:http://lamp.linux.gov.cn/Linux/kernel_options.html
为了一次成功,请大家遵循一个原则,如果你自己使用的内核已经选用了某个选项,如果你没用充分的理由,不要随便改动。这样虽然内核不那么精简,但是不容易出现问题。
我们可以精简的部分是硬件模块部分,对于自己没有的硬件要毫不犹豫的清除。
如果你很执着,或者你有洁癖,你也可以一项项对过去,按照金步国先生的资料描述去选择基本上没有问题。

五、必须强调的几个选项:
1、在“General setup”里面的“Prompt for development and/or incomplete code/drivers”金步国认为是不需要。但是如果你的硬件比较新,那几乎是必须选的,这样,我们才可以找到4965无线网卡,alsa声音驱动等等。
Kernel log buffer size 我选15,双核。如果你用ia64,要选16。
Control Group support 集群支持?可以不要
Choose SLAB allocator (SLUB (Unqueued Allocator)) 内存管理模式slab和slub选择slub。

2、在“Block layer”里,假如没有2TB的硬盘,就去掉:Support for Large Block Devices 。Support for Large Single Files 也不需要,谁有2TB的文件?

3、Processor type and features中是关于cpu的,要认真选。
Symmetric multi-processing support是打开多核的开关,我的cpu是双核的,选中。
Processor family (Core 2/newer Xeon) 我的是Core 2/newer Xeon。找到自己的cpu后,把Generic x86 support选项取消。
Subarchitecture Type 选(PC-compatible)
Maximum number of CPUs 输入自己的核心数目,我输入2。
SMT (Hyperthreading) scheduler support说的是超线程技术,P4有支持的,我的t8100不支持,目前大部分市场上的家用cpu都不支持。
High Memory Support (4GB) 1G以下选1G;我是3G,选4G;4G以上的选16G
在“ Timer frequency ”里,默认是250Hz,较新的cpu都可以选择了1000Hz,性能更好。

4、Power management options中把APM (Advanced Power Management) BIOS support关闭。现在的电脑都用acpi了。
CPU Frequency scaling 是笔记本cpu节电技术
Default CPUFreq governor (conservative) cpu节电模式有四个,笔记本默认选conservative比较好。
ACPI Processor P-States driver 必须选,不然CPU Frequency就不能用。
后面的可选自己硬件相关的,我选的是Intel Enhanced SpeedStep和 Intel Speedstep on ICH-M chipsets,其他的统统消灭。

5、Bus options的选择:
Bus options (PCI, PCMCIA, EISA, MCA, ISA)
PCI support
PCI Express support 现在新买的机器基本上都是PCI Express了
ISA support 较新的新机器没有ISA设备,可以去掉
MCA support 去掉
NatSemi SCx200 support 去掉
PCI Hotplug Support
Support for PCI Hotplug (EXPERIMENTAL) 如果没有PCI热插拔设备,去掉
这里的选项可以考虑全部编译进内核,而不是以模块形式存在。

6、Device Drivers是重点,由于linux不但面向个人工作站,更多的是面向服务器的应用,所以可以把自己机器上没有的硬件全部去掉,而不用面面俱到。但是通用型的选项要慎重。

比如在网卡的部分,除了我的千兆网卡 Broadcom Tigon3 support和4965无线网卡Intel Wireless WiFi 4965AGN,其余的硬件支持统统去掉。

再比如声卡部分,我的是hd声卡,我只是在PCI devices中,选intel hd 声卡,再选Build IDT/Sigmatel HD-audio codec support,除此之外的硬件支持全部去掉。
声卡还有一个细节,在ubuntu7.10里面, 需要在/etc/modprobe.d/alsa-base后面添加options snd-hda-intel probe_mask=1 model=3stack,这样我的笔记本喇叭才可以发声,不然只有外接耳机或者音箱。这次编译以后,这个动作就不必了,但是两个耳机插口只有一个可以用了。

再比如我的电脑中没有agp,就可以直接把agp相关的选项全部取消。

要注意的:
ATA/ATAPI/MFM/RLL support
Include IDE/ATA-2 DISK support 如果你的/boot是放在IDE硬盘上,那么这里一定要选*,选M都不行。否则启动时会出现“waiting for root file system”的提示而停滞不前。
SCSI emulation support 要用刻录机,必须选。

SCSI device support 现在都是SATA硬盘,一定要选*
SCSI disk support 如果你的/boot放在SATA硬盘上,一定要选*。
SCSI CDROM support 虽然康宝刻录机是ide接口的,但是必须把它当成scsi接口的,这是老问题了。用刻录机,必须选。

Graphics support
Support for frame buffer devices 选中,进入选择
VESA VGA graphics support 选上,不然字符界面启动会有问题,
后面的显卡选择:由于我的显卡是nvidia 8400gs,要自己安装nvidia公司的驱动,所以一个都没有选。这样导致ubuntu开机动画会出问题,我索性在grub中的splash字符全部删除,把开机动画关闭。字符界面很正常。

Console display driver support 有人开机后字符控制台错误,就是这部分选项没有选,出问题了。
Framebuffer Console support 需要打开。
Bootup logo 开机图标,会在自检的画面上加上个性图标。需要在grub上添加“vga=”的选项,可以参考http://dotimes.com/articles /t23-slackware-framebuffer.html

7、File systems
Filesystem in Userspace support 简称fuse。是必选的,如果你要用windows分区。

CD-ROM/DVD Filesystems
ISO 9660 CDROM file system support 一般选*
DOS/FAT/NT Filesystems
VFAT (Windows-95) fs support 有FAT32分区就选*吧
NTFS file system support 有NTFS分区就选*吧
NTFS write support 如果想对 NTFS分区进行写操作,选*

必须将启动盘的文件系统编译进内核,默认是编译成模块,这样无法启动系统。ubuntu采用的文件系统是ext3,请把ext2,ext3相关的必要选项都编译进入内核。

8、Virtualization这个大类是我多花几百元买t8100的主要原因,因为t8100支持intel vt技术
使linux上的虚拟机的性能大幅度提高。这里的选项我除了amd的,其他都编译成模块。

9、全部设置完成,最后一项是保存设置。
按照我的习惯,先在上一层目录保存一个备份,文件名类似 ../config20080630
然后再保存到当起目录,文件名 .config
退出设置程序。

六、开始编译内核。
ubuntu的工具是make-kpkg,和其他的发行版相比,步骤相对简单。
相关命令:
代码:
$sudo make-kpkg clean   这条命令好像不要超级权限,很多资料上说要,不过这不是原则问题。
$ sudo make-kpkg -initrd --initrd --append-to-version=dell1400 kernel_image kernel-headers


上述命令中的dell1400可以用自己喜欢的字符代替,最后的字符一定是数字.
输完上述命令回车之前,建议大家把浏览器还有别的运用程序都关掉,机器开始的工作比较艰苦。我的机器大概十几分钟。

七、安装内核
编译完成就是安装工作。编译好的内核在上一层目录。包括linux-headers-...-_i386.deb和linux-image-...-i386.deb两个文件,如果你不搞开发的话,只要安装内核就可以,头文件以后要用的时候再说。
安装相关命令:
代码:
$ cd ..
$ sudo dpkg -i   linux-image-(按tab键)


文件名很长,如果不用tab自动补足是不可能的,tab键万岁。
安装完成后和老内核比较一下大小
代码:
$ ls -l /boot/


八、重新启动验证新内核。
代码:
$ sudo reboot


九、显卡驱动
如果你的显卡和我一样是nvidia显卡,启动之后往往无法正常进入x-window。即使能看到gdm登录界面,效果也是很差的。
那么就要安装nvidia驱动。
用ctrl+alt+f1 进入字符命令行,输入用户名,密码登录。
命令:
代码:
下载驱动
$ wget http://us.download.nvidia.com/XFree86/Linux-x86/173.14.12/NVIDIA-Linux-x86-173.14.12-pkg1.run

$sudo -s
输入密码取得超级权限。
#ps ax
看看和gdm相关的进程,把这些进程全部关闭;用sudo /etc/init.d/gdm stop有可能有一个进程没有关闭:
#kill 进程号
然后安装nvidia显卡驱动,当然驱动要先下好,到nvidia驱动所在的目录里,运行:
# sh ./NVIDIA-Linux-x86-173.14.12-pkg1.run

重新启动以后就ok。要用nvidia的驱动,每次升级内核都要这么做。

十、无线网卡
相关的内核选项是
Networking --->
Wireless --->
Generic IEEE 802.11 Networking Stack (mac80211)
还有4965的驱动。

4965无线网卡驱动虽然已经编入内核,但没有firmware无法使用。需要把原来内核的firmware拷贝到新内核对应的目录,名字和内核一致,我的内核是linux-image-2.6.25.10dell1400,那建的目录名就是2.6.25.10dell1400。

代码:
具体命令:
$ cd /lib/firmware/
$ sudo mkdir 2.6.25.10dell1400
把你的老内核中的4965的firmware拷贝过来。
$ sudo cp 2.6.24-16-generic/* 2.6.25.10dell1400/

上面的命令和下面的命令是等价的:
$ cd /lib/firmware/
$ sudo cp -R 2.6.24-16-generic/  2.6.25.10dell1400/


重新启动系统,无线网卡就正常了。

附编译使用的机器配置:dell vostro 1400,t8100,nvidia 8400cs显卡,内置SigmaTel STAC9228芯片的声卡,4965无线网卡,BCM5906M千兆网卡,3G内存,160G硬盘,combo刻录。
编译系统版本:ubuntu 8.04桌面版.



最后由 ffbp 编辑于 2008-08-02 15:27,总共编辑了 14 次

 

主要问题有两个

1.编译内核的时候,会在存放内核源码的目录,产生大量临时文件,所以请保证,当前目录的剩余空间起码有2,3个g吧

2.编译完内核,安装新内核时出现如下问题:
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/dkms
run-parts: executing /etc/kernel/postinst.d/nvidia-common
run-parts: /etc/kernel/postinst.d/nvidia-common exited with return code 20
Failed to process /etc/kernel/postinst.d at /var/lib/dpkg/info/linux-image-2.6.28dell1400.postinst line 1186.
dpkg:处理 linux-image-2.6.28dell1400 (--install)时出错:
子进程 post-installation script 返回了错误号 2

这个问题,在网上搜索了好久,发现只要把/etc/kernel/postinst.d/nvidia-common这个文件删掉就可以了
我这里建议的方法是把这个文件重命名,因为如果机器中有nvidia设备的话,这个文件还是很重要的
可以在安装完内核后,把这个文件恢复成原来的文件名

 

 

 

 

buntu下可以使用 apt-get source linux-source
sudo apt-get source linux-`uname -r`

fhc2007@fhc2007-desktop:~$ apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-2.6.24 - Linux kernel source for version 2.6.24 with Ubuntu patches
fhc2007@fhc2007-desktop:~$ cd /usr/src/
fhc2007@fhc2007-desktop:/usr/src$ sudo apt-get install linux-source-2.6.24
sudo apt-get install linux-source 会自动安装当前版本内核的源代码到 /usr/src

用 make-kpkg 来编译 vanilla Linux 内核
 
0.本文的目的在于分享我以往的一个发现,即不用 kernel-source deb 包,一样可以 make-kpkg,顺便

介绍一下 make-kpkg 的使用方法,以帮助对此不熟悉的朋友。先说一下通常在 Debian 中使用官方

kernel-source 编译内核的方法。已经知道的朋友就算小弟野人献曝了。

1.我们如果要自己编译内核的话就要:

代码:
-->#apt-get install kernel-source-2.6.8
# cd /usr/src; tar xjf kernel-source-2.6.8.tar.bz2 && cd kernel-source-2.6.8
# cp /boot/config-`uname -r` .config
# make-kpkg --revision tchai.0818 /
                      --append-to-version .kov /
                      --config menuconfig /
                      kernel_image modules_image-->

1.0.--config menuconfig 指示 make-kpkg 在开始编译之前,先让我们用 make menuconfig 的那个

curses 菜单,再最后修改和检视一下内核的配置。
--revision 和 --append-to-version 也是 make-kpkg 提供的选项。
1.1.前者使软件包(包含 kernel-image 和各 module-image) 的版本号后面的加上 tchai.0818 的字样,

以后添加或删除您的内核时就能很容易辨认出来那些是自己编译的内核了,设置 revision 而且还有个好

处,就是能避免和 Debian 官方内核的名字有冲突。
1.2.后者可以使你的内核有个独一无二的名字,以后在 uname -r 的时候就能看到 2.6.8.1.kov 了,内

核的名字不只是看看而已,该版本对应的内核驱动模块文件所处的目录也是由它命名的,

即/lib/modules/2.6.8.1-mm1.kov。
1.3.如果,您需要使用 initrd 放置驱动的话,还必须加入 --initrd 的选项。
1.4. 几柱香的时辰过后,施主就会在上层目录看到几个新鲜出炉的 deb 包,其中一个就是新的 kernel

-image 包,其余几个即驱动的 deb 包。

2.通常 Debian 官方 relase kernel-source 的 package 都要或多或少地晚于 kernel.org 的正式版本

Linux kernel 发布。其实,心急的朋友一样可以用 make-kpkg 来编译从 kernel.org 下载的 Linux 内

核,而不用等待维护者的 deb 包,尽管后者会有更多的测试和质保。现在以采取新的命名方式(w.x.y.z)

的 2.6.8.1 vanilla Linux 内核加上 mm1 patch 为例:

代码:
-->$ wget
http://kernel.org/pub/linux/kernel/v....6.8.1.tar.bz2
$ wget http://kernel.org/pub/linux/kernel/p....6.8.1-mm1.bz2
$ tar xjf linux-2.6.8.1.tar.bz2 && cd linux-2.6.8.1
$ bzcat ../2.6.8.1-mm1/2.6.8.1-mm1.bz2 | patch -p0
$ cp /boot/config-`uname -r` .config
$ make-kpkg --rootcmd fakeroot /
                      --revision tchai.0818 /
                      --append-to-version .kov /
                      --config menuconfig /
                      kernel_image modules_image-->
其中,下载和打 patch 完全是为了追求更新版考虑,并不是必要的步骤。其余的编译步骤和说明完全和

上面相同。

3.另外,提醒一下编译内核的新手,如果您对自己的硬件不了解,请使用官方的内核配置文件,并加上

--initrd 选项,再开始编译。编译完毕,需要使用 dpkg -i 安装内核和驱动,才能使用新的内核。并可

能需要修改 boot-loader (e.g. GRUB, LILO)的配置文件。

有时还是直接编译成binary-arch好,还可以生成kernel-headers,方便其它模块的编译,比如alsa

nvidia等。。。

对于2.4的,偶经常是
$make-kpkg --rootcmd fakeroot binary-arch
对于2.6的,
$make-kpkg --rootcmd fakeroot --initrd binary-arch

需要的时候直接dpkg -i安装上。

引用:
--> 最初由 faint 发表
有时还是直接编译成binary-arch好,还可以生成kernel-headers,方便其它模块的编译,比如alsa

nvidia等。。。

对于2.4的,偶经常是
$make-kpkg --rootcmd fakeroot binary-arch
对于2.6的,
$make-kpkg --rootcmd fakeroot --initrd binary-arch

需要的时候直接dpkg -i安装上。 --> 

 

嗯。不过一次全部编译好不更方便么?like:
$make-kpkg --rootcmd fakeroot kernel_image modules_image

唔,熟悉了当然可以当然可以一次过,但内核还是最重要的嘛:-)

对了,以前看过一个帖子。
http://www.hants.lug.org.uk/cgi-bin/...ernelCompiling

Using make-kpkg

感兴趣者可以自己看看。

激发了偶编译内核的兴趣,吼吼,从来都是用官方的,今天去试试看自己编译,计划把必须的模块编译进

去,多余的都不要,不以模块形式加载任何驱动,启动时不用hotplug和discover,,不知道会提升多少

性能,呵呵。


这里还有一个

http://211.93.98.22/bbs/showthread.p...426#post954426

知道官方的 kernel-image 是怎么做出来的么?
看看 apt-get source kernel-image-2.6.9-k7 就知道了.

我按上述输入命令但是得到找不到命令的错误
bash: make-kpkg: command not found

引用:
-->
作者: ls_gx


我按上述输入命令但是得到找不到命令的错误
bash: make-kpkg: command not found
--> 


Debian和Ubuntu下升级内核需要的工具make-kpkg和mkinitrd

为了能使用make-kpkg命令,你必须安装一个kernel-package包。安装过程如下:

#apt-get install kernel-package
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
将会安装下列额外的软件包:
  dpkg-dev
建议安装的软件包:
  debian-keyring linux-source libdb3-dev libncurses-dev docbook-utils
推荐安装的软件包:
  libc6-dev libc-dev
下列【新】软件包将被安装:
  dpkg-dev kernel-package
共升级了 0 个软件包,新安装了 2 个软件包,要卸载 0 个软件包,有 74 个软件未被升级。
需要下载 362kB/526kB 的软件包。
解压缩后会消耗掉 1888kB 的额外空间。
您希望继续执行吗?[Y/n]
获取:1
http://ubuntu.cn99.com dapper/main kernel-package 9.001ubuntu15 [362kB]
下载 362kB,耗时 2s (169kB/s)
选中了曾被取消选择的软件包 dpkg-dev。
(正在读取数据库 ... 系统当前总共安装有 94416 个文件和目录。)
正在解压缩 dpkg-dev (从 .../dpkg-dev_1.13.11ubuntu6_all.deb) ...
选中了曾被取消选择的软件包 kernel-package。
正在解压缩 kernel-package (从 .../kernel-package_9.001ubuntu15_all.deb) ...
正在设置 dpkg-dev (1.13.11ubuntu6) ...
正在设置 kernel-package (9.001ubuntu15) ...


安装完成后就可以看到make-kpkg命令了(在命令行输入make后连续按两次TAB键):

#make
make                         make_driver_db_cups          makeg                      
make-kpkg
makedepend                   make_driver_db_lpr           makekdewidgets             
make-memtest86+-boot-floppy


还有一个工具mkinitrd是必须的,为了能使用这个工具,你必须安装一个initrd-tools包,安装过程如下

关于:

/*********************************************************************
*filename: Debian和Ubuntu下升级内核需要的工具make-kpkg和mkinitrd
*purpose: 记录编译内核时的一个问题
*wrote by: zhoulifa(
zhoulifa@163.com ) 周立发( http://zhoulifa.bokee.com )
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2006-07-01 18:25:00
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*********************************************************************/


#apt-get install initrd-tools
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
将会安装下列额外的软件包:
  cramfsprogs dash
下列【新】软件包将被安装:
  cramfsprogs dash initrd-tools
共升级了 0 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 74 个软件未被升级。
需要下载 0B/139kB 的软件包。
解压缩后会消耗掉 487kB 的额外空间。
您希望继续执行吗?[Y/n]
正在预设定软件包 ...
选中了曾被取消选择的软件包 dash。
(正在读取数据库 ... 系统当前总共安装有 94595 个文件和目录。)
正在解压缩 dash (从 .../dash_0.5.3-1ubuntu1_i386.deb) ...
选中了曾被取消选择的软件包 cramfsprogs。
正在解压缩 cramfsprogs (从 .../cramfsprogs_1.1-6_i386.deb) ...
选中了曾被取消选择的软件包 initrd-tools。
正在解压缩 initrd-tools (从 .../initrd-tools_0.1.84ubuntu1_all.deb) ...
正在设置 dash (0.5.3-1ubuntu1) ...

正在设置 cramfsprogs (1.1-6) ...
正在设置 initrd-tools (0.1.84ubuntu1) ...
 

安装完成后就可以看到makeinitrd命令了(在命令行输入mki后连续按两次TAB键):

#mki
mkinitramfs  mkinitrd     mkisofs

 

 

 

 


使用Debian的kernel-package系统创建自己的内核

1.简介
我曾经手动编译内核,这必须按顺序进行一系列的步骤;kernel-package就是写来完成这些所必须的步骤的.(现在他已超出这个范畴,但是实际上, 那正是他所完成的).这对于新手来说是相当重要的:make-kpkg完成了编译一个内核所需的所有步骤,并且内核的安装是一个快照.--kpkg- package的作者Manoj Srivastava.
如果我们曾经编译过一个内核,我们就会惊异于他的简单.这个指南就是设计用来可以使得我们使用Debian的kernel-package系统,这可以极大的简化自定义内核的构建与安装.学习创建Debian的内核包与他们的模块,并且使用dpkg来管理产生的内核映像.
注意:如果我们不小心我们就会使得我们的系统不能启动.强烈建议至少要读一遍整个文档,并且按照他来编译我们的内核.
在这里我们要记住的就是,不可避免的,一些人会使用这个文档搞遭他们的系统.不要成为他们中的一员.如果我们不量解一些事,要动手之前要得到更为详细的信息.
2.准备
2.1.备份启动磁盘
在我们制作一个新的内核之前,我们要做的第一件事就是要为我们正在运行的内核制作一个启动磁盘.这样,如果一些事情使得我们的系统崩溃,我们可以启动我们的机器并且进行修复.取一个我们不介意擦除的软盘来做这样的事情(以root用户):
bash:~# mkboot path_to_kernel
使用合适的信息来代替path_to_kernel,例如"/boot/vmlinuz-2.4.18-bf2.4"(如果我们安装的是2.4内核的Woody).
2.2.安装什么
我们要使用Debian 3.0r1(Woody版本1);我们需要下面的软件包:
>   1.

>      gcc
>   2.

>      kernel-package
>   3.

>      kernel-source-2.4.18 (或者是我们要使用的任何内核源码)
>   4.

>      libc6-dev
>   5.

>      tk8.0 or tk8.1 or tk8.3
>   6.

>      libncurses5-dev
>   7.

>      fakeroot
>   8.

>      bin86 (为在PC机上安装2.2.x内核)
我们可以通过下面的命令来安装这些软件包(以root用户):
bash:~# apt-get install gcc kernel-package kernel-source-2.4.18 libc6-dev tk8.3 libncurses5-dev fakeroot

安装这些软件包会使得为了满足一些依赖关系而安装一些其他的软件包.

注意:如果我们是在PC结构上安装2.2系统的内核(使用AMD处理器的机器为PC机,但是Mac或Alpha不是),我们需要bin86软件包.
我们可以使用我们希望的任何内核:我选择2.4.18,因为这在Woody中是最新的.Debian的维护者做了十分出色的工作将内核源码打包到一个. deb文件中,推荐使用这些源码包而不是其他的源码包.我可以理解的使用其他源码包的唯一原因就是得到Debian中并支持的硬件支持.
3.设置源码树
源码树就是我们包含我们要编译的内核源码的目录.
3.1.加入src组
当安装了内核源码包,源码包放在/usr/src目录中.要在这个目录工作,我们必须是root用户或是src组的成员.为了避免任何时候以root用户工作,可以将我们自己加入src组.只有root用户可以添加用户到组,所以先要成为root用户,然后执行下面的命令:
bash:~# adduser my_username src
Adding user my_username to group src...
Done.
当然,我们要使用我们自己的用户名来代替"my_username".我们组的成员关系会在登陆时进行检测,所以我们需要注销然后再次登陆以被识别为src的成员.这有三种方法:
1.如果我们在X中一个终端窗口,注销X并从控制台退出.然后登陆到控制台并启动另一个X会话.
2.如果我们正在使用一个图形化登陆管理器,如xdm,gdm,kdm,退出X并再次登陆.
3.如果我们在控制台,退出后再次登入.
要保证我们真正的加入到src组中,可以执行下面的命令(在我们完成了退出/登入之后):
bash:~$ groups
my_username src
我们会在组列表中看到src(在默认情况下,我们也属于非用户组"my_username").
3.2.解压源码包
作为普通用户,进入/usr/src目录并列出他的内容;我们就会看到我们安装的bzip格式的tar包文件:
bash:~$ cd /usr/src
bash:/usr/src$ ls
kernel-source-2.4.18.tar.bz2
如果我们同时也看到一个名为linux符号链接,移除他:
bash:/usr/src$ rm linux
注意:如果我们有这个链接但却没有在解压我们新的源码包之前移除他,我们就会使得旧的与新的源码文件混合,这样就不会正确的编译.
Debian 的源码包解压到一个名为kernel-source-x.y.z的目录中.官方的内核源码直到2.4.18解压到一个名为linux目录中(我们建议将那个目录改名为linux-x.y.z).2.4.19的官方源码以及以后的将会解压到linux-x.y.z/.
要解压一个源码包,我们可以以常规用户执行下面的命令:
bash:/usr/src$ tar -jxf kernel-source-2.4.18.tar.bz2
这将会创建一个属于我们与src组的名为kernel-source-2.4.18/目录.
3.3.设置符号链接
现在没有指向任何源码树的符号链接,现在我们要创建一个:
bash:/usr/src$ ln -s kernel-source-2.4.18 linux
将这里的"kernel-source-2.4.18"源码目录替换为我们解压源码时创建的源码目录.
检测符号链接是一个好主意.如下面的样子:
bash:/usr/src$ ls -l
total 66908
-rw-r--r---    1 roott     roott     23833519 Mar 20 16:18 kernel-source-2.4.18.tar.bz2
drwxr-sr-xx   15 kjmckk   srcc          4096 Mar 20 16:30 kernel-source-2.4.18
lrwxrwxrwxx    1 kjmckk    srcc            20 Mar 20 16:36 linux -> kernel-source-2.4.18
3.4.检测当前的需要
进入linux目录我们就会发现另一个名为Documentaion的目录.进入这个目录查看Changes文件.用我们最喜欢的编辑器打开这个文件并且找到"Current Minimal Requirements"部分.下面的是一个例子:
Current Minimal Requirements
============================

Upgrade to at *least* these software revisions before thinking you've
encountered a bug!!  If you're unsure what version you're currently
running, the suggested command should tell you.

oo  Gnu CC                  2.95.33                  # gcc --version
oo  Gnu makee               3.777                    # make --version
oo  binutilss               2.9.1.0.255              # ld -v
oo  util-linuxx             2.10oo                   # fdformat --version
oo  modutilss               2.4.22                   # insmod -V
oo  e2fsprogss              1.255                    # tune2fs
oo  reiserfsprogss          3.x.0jj                  # reiserfsck 2&>1|grep reiserfsprogs
oo  pcmcia-css              3.1.211                  # cardmgr -V
oo  PPPP                    2.4.00                   # pppd --version
oo  isdn4k-utilss           3.1pre11                 # isdnctrl 2>&1|grep version
Changes文件在第一列列出了所需要的程序,所需的版本列在第二列,而检测版本的命令列在第三列.我们也许并不需要列出的所有的程序或是软件包.(例如,如果我们不使用PC卡,我们就不需要pcmcia-cs).
我们不必单独的检测每一个需要的程序,我们可以运行ver_linux脚本,这可以在内核树的scripts目录中找到.我们首先要使其可运行.在这里我们要注意的是这个脚本也许并不会检测Changes中列出的所有所需的程序,而会检测一些并没有列出的程序.
如下面的检测结果:
bash:/usr/src/linux/Documentation$ cd ../scripts
bash:/usr/src/linux/scripts$ chmod +x ver_linux
bash:/usr/src/linux/scripts$ ./ver_linux
If some fields are empty or look unusual you may have an old version.
Compare to the current minimal requirements in Documentation/Changes.
>
Linux sirius 2.4.18.030309 #1 Sun Mar 9 22:15:39 EST 2003 i586 unknown unknown GNU/Linux

>  Gnu CC                  2.95.4
>  Gnu makee               3.79.1
>  util-linuxx             2.11n
>  mountt                  2.11n
>  modutilss               2.4.15
>  e2fsprogss              1.27
>  pcmcia-css              3.1.33
>  Linux C Libraryy        2.3.1
>  Dynamic linker (ldd))   2.3.1
>  Procpss                 2.0.7
>  Net-toolss              1.60
>  Console-toolss          0.2.3
>  Sh-utilss               2.0.11
>  Modules Loadedd         ds i82365 3c589_cs pcmcia_core ext3 jbd rtc
如果在Debian系统上使用上面的方法并不能决定程序版本,试着使用dpkg.
如下面的使用dpkg来检测所需要的内容:
bash:/usr/src/linux/scripts$ dpkg -l make
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Namee           Versionn        Description
+++-==============-==============-============================================
iii  makee           3.79.1-144      The GNU version of the "make" utility.

如果我们使用kernel.org上的版本或是使用Description testing或是unstable的分支,我们需要更新一些工具来适应我们的需要.如果我们使用Debian的stable分支的源我们就不需要上面那样.现在我们就完成了配置内核源码树的设置.

4.配置内核
4.1.注意
内核配置的一个重要原则就是TANSTAAFL(There Ain't No Such Thing As A Free Lunch).我们加入到内核中的任何特征都会增加内核的尺寸以及内核编译的时间,即使我们是选择作为模块来添加的。
为了使得内核可以在大多数的硬件上为大多数的人所使用,Linux发行版本通常包含了对于大多数硬件与功能的支持。Debian也是如此。预编译的内核包含了对于我们绝不会用到的硬件以及我们绝不会读到的语言的支持。我的内核配置的一般原则是:“如果有疑问就保持他“。如果我们测试我们的新内核但是发现一些硬件不能正常的工作,这样就可以很容易的切换另一个配置并且编译另一个内核。
为了避免越来越大的尺寸,最近内核镜像的另一个特征就是initrd 的使用。在我的电脑旁边的一个特殊的字典将initrd定义为“需要担心的一些事情“。我们可以通过将对于我们的启动硬件与根文件系统的支持直接编译入内核(而不是作为模块)来避免担心的必要。如果我们的启动硬盘是IDE,将IDE支持编译进入内核。如果我们的根文件系统是Reiserfs,一定要保证将 Reiserfs的支持编译入内核,而不是作为模块。
在这里我们要注意是一定要软盘的支持编译进入内核。如果我们将其编译为模块,那么就不可以从软盘来启动我们的新内核了。
不幸的是,内核选项的详细解释已经超出了这个文档的范围。要得到内核配置的更多信息,我们可以查看LDP,/usr/src/linux/Documentaion文件,以及硬件文档。
4.2 make xconfig
有许多的方法可以用来配置内核,我们在这里第一个接触到的就是xconfig。在我们进入/usr/src/linux目录后,我们可以输入命令:
bash:/usr/src/linux$ make xconfig
4.3 make menuconfig
也许我们并没有在使用X。也许我们在配置这一步会做得更好,而且我们相信键盘要比鼠标来得快。运行命令如下:
bash:/usr/src/linux$ make menuconfig
4.4 make config
内核0.01根本没有配置选项。内核1.0有49个不同的配置选项,所以一个配置机制是必须的。键入make config.
现在我们退出make config。我们并不希望一次回答1300多个不同的问题。更好的方法就是使用xconfig或是menuconfig。
5 编译内核镜像(kernel image)
如果我们的机器是一台低速处理器的老式机器,也许得需要花费几个的小时的时间来编译一个Debian kernel image。(我们也可以在一个快速的机器上来编译我们的内核而将其安装到一个低速的机器上,在这里我们并不讨论这个话题)。
5.1 make-kpkg
要编译内核,我们可以调用make-kpkg,这是一个可以自动替换"make dep;make clean;make bzImage;make modules"命令序列的脚本。我们有向要花费一些时间来阅读一下make-kpkg的手册页。
注:make-kpkg是kernel-package软件包的一部分。他的文档位于/usr/share/doc/kernel-package/.
make-kpkg命令是相当复杂的,而且初看起来有一些吓人。基本语法格式如下:
make-kpkg <options> <target>
而我们的target可以是kernel_image。下面我们来解释一下两个比较重要且常用的用法选项,"--append-to-version"与"--revision".
5.2 --append-to-version
第一个选项可以让我们来指定一个额外的内核版本,这个可以成为内核名的一问分。我们可以使用数字,"+",".",但是不要使用下划线"_".
下面的是我正在运行的内核:
bash:/usr/src/linux$ uname -a
bash:/usr/src/linux$ Linux sirius 2.4.18.030309 #1 Sun Mar 9 22:15:39 EST 2003 i586 unknown unknown GNU/Linux当我编译这个内核时使用的选项为"--append-to-version=.030309"(注意开头的".")。
注意:我们要避免设置--append-to-version为如"-686","-K7","-sparc"等值,因为这些值常为Debian的预编译内核所使用。
内核模块位于/lib/modules子目录下。每一个内核有他自己的子目录。每次当我们以一个新的名字来安装一个新的内核时,这个包安装程序就会在/lib/modules目录下创建一个新的子目录来保存他自己的模块。
这就意味着每一次我们使用--append-to-version的一个新的值来编译一个内核时,我们就可以保证这个内核有一个新的名字,而他的模块也不会与其他的内核模块相冲突。
注意:如果我们使用相同的名字来安装一个内核时,安装程序就会覆盖掉已安装的内核及其模块。
5.3 --revision
make -kpkg的另一个选项就是"--revision",他只会影响Debian软件包本身的名字而不是内核的名字。与--append-to- version相似,我们只可以使用数,"+",".",不要使用下划线"_"。如果我们并没有为--revision指定一个值,make-kpkg就会使用"10.00.Custom".
使用不同的--revision的值就可以避免相同名字的内核之间的冲突。
5.4 内核软件包字
Debian kernel-image文件的名字格式如下:
kernel-image-(kernel-version)(--append-to-version)_(--revision)_(architecture).deb
软件包的名字是第一个下划线之间的所有内容。如下面的是我的内核软件包的一个列表:
bash:/usr/src$ ls
kernel-image-2.4.18.030309_1.0_i386.deb
kernel-image-2.4.18.030320_1.0_i386.deb
kernel-image-2.4.18.030320_10.00.Custom_i386.deb
现在我们就会明白为什么不要在make-kpkg的选项中使用下划线的原因了,他用来分隔软件名字之间的元素。
5.5 fakeroot
当我们将自己添加到src组时,我们就可以以普通用户的权限来完成大多数的kernel-package的工作了。然而作为内核软件包一部分的文件(如内核与内核模块)却为root用户所有,而且要以root权限来运行。他们必须创建为root权限。
使用fakeroot我们可以普通用户的身份来运行make-kpkg,并且可以以普通的权限来完成大多数的工作。在接近工作的结尾时,fakeroot就会以模拟root环境来创建一个kernel-image软件包。
make-kpkg的手册页描述了使用fakeroot的方法,我们在这里使用将fakeroot放在make-kpkg命令的开头的最简单的方法:
fakeroot make-kpkg <options> <target>
5.4 制作kernel image
最后的时刻到了,我们已经准备好来制作kernel image了:
bash:/usr/src/linux$ fakeroot make-kpkg clean
然后执行下面的命令:
bash:/usr/src/linux$ fakeroot make-kpkg --append-to-version=.030320 kernel_image
现在我们所要作的就是等待计算机来完成这些工作。
6 安装kernel-image软件包
一旦构建了kernel image,我们就可以安装kernel-image软件包了,这个软件包包含内核与相应的模块。首先我们要进入/usr/src目录来检测以确保成功的进行了构建,并且列出其中的内容:
bash:/usr/src/linux$ cd ..
bash:/usr/src$ ls
kernel-source-2.4.18
kernel-source-2.4.18.tar.bz2
kernel-image-2.4.18.030320_10.00.Custom_i386.deb
linux
要安装内核及其所有的模块,我们要以root身份来运行:
bash:/usr/src# dpkg -i kernel-image-2.4.18.030320_10.00.Custom_i386.deb
要从磁盘上安装一个kernel-image软件包,我们需要指定完整的文件名。
post-install脚本会询问我们是否要创建一个启动盘,如果我们在以前已经创建了,在这里我们就可以加答no。
如果一切正常,我们就可以重新启动我们的机器并且用新的内核来引导了。
7 现在做什么?
7.1 保存内核
如果我们使用了--append-to-version,我们就不需要担心apt-get会试着更新我们的内核了。如果我们是偏狂的人,我们可用root运行下面的命令:
bash:~# echo "kernel-image-2.4.18.030320 hold" | dpkg --set-selections
当然在这里我们要用我们实际的内核名来代替。我们可以用下面的命令来进行查询:
bash:~# dpkg --get-selections | grep kernel-image
kernel-image-2.4.18.0303200     hold
7.2 移除符号链接
我们可以用下面的命令来操作:
bash:~# cd /usr/src
bash:/usr/src# rm linux
7.3 备份我们的内核
当然这并不是必须的,但是备份我们自己的内核确实是一个好主意。
7.4 创建一个新的启动盘
为我们刚安装的内核创建一个新的启动盘:
bash:/usr/src# cd /boot
bash:/boot# mkboot /boot/vmlinuz-2.4.18.030320
7.5 移除旧内核
现在我们已经看到编译安装一个新内核是一件多么简单的事情,过不了多久的时间我们的/boot目录就会变得拥挤。我们可以使用dpkg来清除我们不需要的内核:
bash:/boot# dpkg -P kernel-image-2.4.18.030309
如果我们得到"/lib/modules/2.4.18.030309 is not empty so wasn't removed"的信息,也许是因为我们在那里安装了第三方模块。我们可以用类似于下面的命令来进行删除:
bash:/boot# dpkg -P pcmcia-modules-2.4.18.030309
如果我们的模块子目录仍然非空,也许是我们并没有使用make-kpkg来编译这些模块。我们可以手动来进行删除。
7.6 编译我们下一个内核
如果我们因为新买了一个声卡而希望重新编译我们的内核,或者是我们希望使用一个新的特征,这时我们所要做的只是重新配置,执行"fakeroot make-kpkg clean",然后使用不同的--append-to-version值来重新进行编译。我们的会话看起来如下面的样子:
bash:~$ cd /usr/src
bash:/usr/src$ ln -s kernel-source-2.4.18 linux
bash:/usr/src$ cd linux
bash:/usr/src/linux$ make xconfig
>        (reconfigure your kernel)
bash:/usr/src/linux$ fakeroot make-kpkg clean
>        (lots of cleaning here)
bash:/usr/src/linux$ fakeroot make-kpkg --append-to-version=.030401 kernel_image
>        (screens and screens of stuff)
8 高级主题
8.1 第三方模块
在这里我所谓的第三方模块是在内核源码树以外以源码的形式使用的内核模块。一个很好的例子就是pcmcia-cs,这是许多的笔记本用户所需要的对于PCMCIA的支持。
要使用pcmcia-cs,可以使用apt-get来安装pcmcia-source软件包。这个源码包必须放在/usr/src目录下。以普通用户的身份将源码包解压到/usr/src/modules/pcmcia-cs目录下。如果我们并没有这个模块目录,我们可以手动创建一个。
当我们配置我们的内核时,需要禁止PCMCIA支持。(如果我们打开了PCMCIA的支持,pcmcia-cs不会编译驱动)。如果我们要使用无线LAN,我们可以在 NetWork decive support下打开这个支持,但是不要选择任何设备。
当我们要准备好编译我们的内核时,我们可以在我们的命令行中加入modules_image:
bash:/usr/src/linux$ fakeroot make-kpkg --append-to-version=.030401 kernel_image modules_image
当我们创建了kernel_image 的deb安装包,make-kpkg会进入/usr/src/modules目录为每一个子目录编译一个模块的deb安装包,这个安装包将会与我们的内核有着相同的version与--append-to-version.在我们安装了kernel_image的deb包以后我们就可以安装这些模块的 deb安装包了。
8.2 要已经存在的内核中加入第三方模块
当我们浏览Debian用户列表时,我们就会发现越来越多的人对alsa感兴趣。而我们发现我们的声卡的声音听起来并不是很好,我们想要亲自试一下alsa。我们可以很熟练的使用make menuconfig来进行配置,但是在Sound部分我们却并没有看到任何标为alsa的内容。怎么办?
安装alsa-source软件包。这时我们就会在/usr/src目录下有一个新的tar包。如下:
bash:/usr/src$ ls
alsa-driver.tar.bz2
kernel-image-2.4.18.030401_10.00.Custom_i386.deb
kernel-source-2.4.18
kernel-source-2.4.18.tar.bz2
modules
pcmcia-modules-2.4.18.030401_3.1.33-6+10.00.Custom_i386.deb
解压alsa-driver并且重新创建符号链接。这时我们要注意我们内核镜像的--append-to-version的值。我们需要将他作为make-kpkg的选项。
bash:/usr/src$ cd linux
bash:/usr/src/linux$ fakeroot make-kpkg --append-to-version=.030401
--added-modules=alsa-driver modules_image
注意:在这里我们并不需要kernel_image的target。除非是我们重新配置了我们的内核,否则我们没有必要重新进行编译。使用"--added-modules"选项可以使得我们只编译我们需要的模块,而不是所有的模块。
8.3 Debian内核补丁
Debian提供了各种各样的内核补丁。根据需要,在这里我们下载了kernel-patch-debianlogo.
要安装一人内核补丁并不需要执行补丁。这可以通过调用make-kpkg,使用"--added-patches"选项来实现:
bash:/usr/src/linux$ fakeroot make-kpkg --append-to-version=.030401
--added-patches=debianlogo kernel_image modules_image
如果我们有多个内核补丁,我们可以在"--added-patches="后用逗号分隔列出多个补丁。
在默认的情况下make-kpkg会运行"make oldconfig"来执行内核补丁。如果我们的补丁中包含新内核的选项,系统就会向我们询问相关的内容。如果我们要查看整个内核配置选项,我们可以使用另一个命令行选项,"--config=menuconfig".当我们保存我们的配置并退出后,make-kpkg将会继续执行。
在我们的内核镜像创建以后,make-kpkg会保留我们所执行的补丁,所以在每一个配置/编译循环中我们都会有一个未打过补丁的源码树。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mylxiaoyi/archive/2007/01/31/1499387.aspx

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值