Linux内核编译

本文详细介绍了Linux内核编译与更新的全过程。包括安装前的准备,如备份文件、查看硬件型号、下载内核文件等;接着阐述了编译内核的步骤,如清除遗留文件、配置内核等;然后说明了以新换旧的操作,更新内核文件和链接;最后介绍了为启动做准备,包括LILO和GRUB的配置。

================第一部分:安装前的准备工作================

一、备份重要文件
备份以下这些文件可以在系统发生错误或崩溃时,能较快速的恢复系统原来的状态。

1、备份内核和启动文件
# cd  /
# tar cvzf  boot.tar.gz  boot
2、备份系统函数头文件
# cd  /usr/include
# tar cvzf  linux.tar.gz  linux 
3、备份模块中的库文件
# cd /lib/modules
# tar cvzf  2.4.7-10.tar.gz  2.4.7-10
# tar cvzf  2.4.7-10debug.tar.gz  2.4.7-10debug
4、备份linux源码
# cd  /usr/src
# tar cvzf  linux-2.4.7-10.tar.gz  linux-2.4.7-10
# tar cvzf  linux-2.4.7-10debug.tar.gz  linux-2.4.7-10debug
5、备份重要配置目录
# cd  /
# tar cvzf  etc.tar.gz  etc

二、查看硬件型号
在编译开始前,建议先在windows下用相关软件对硬件做一个详细统计,包括硬件类型,厂家,芯片版本等等,特别是笔记本和品牌机,因为二者很多部件都是OEM其它厂家的,建议把它记录下来以供配置内核时使用。

这里的难点是pci,如果你硬盘是IDE的那一定要选择好你主板上南桥芯片。SCSI的话就是要选择上你的SCSI卡型号。还有就是网卡,声卡芯片的型号了,他们的型号你都可以用lspci 查找到比如我的是。

# /sbin/lspci
00:00.0 Host bridge: ServerWorks CNB20LE Host Bridge (rev 05)
00:00.1 Host bridge: ServerWorks CNB20LE Host Bridge (rev 05)
00:02.0 PCI bridge: Intel Corp. 80960RP [i960 RP Microprocessor/Bridge] (rev 01)
00:02.1 I2O: Intel Corp. 80960RP [i960RP Microprocessor] (rev 01)
00:04.0 Ethernet controller: 3Com Corporation 3c985 1000BaseSX (SX/TX) (rev 01)
00:08.0 PCI bridge: Digital Equipment Corporation DECchip 21152 (rev 03)
00:0e.0 VGA compatible controller: ATI Technologies Inc 3D Rage IIC (rev 7a)
00:0f.0 ISA bridge: ServerWorks OSB4 South Bridge (rev 4f)
00:0f.1 IDE interface: ServerWorks OSB4 IDE Controller
02:04.0 Ethernet controller: Intel Corp. 82557/8/9 [Ethernet Pro 100] (rev 05)
02:05.0 Ethernet controller: Intel Corp. 82557/8/9 [Ethernet Pro 100] (rev 05)
03:02.0 PCI bridge: Intel Corp. 80960RM [i960RM Bridge] (rev 01)
03:08.0 Ethernet controller: Intel Corp. 82557/8/9 [Ethernet Pro 100] (rev 08)


三、下载内核文件和版本检查
先到www.kernel.org下载个内核文件,我下载的版本是2.4.27

1.下载内核文件
将内核源码包linux-2.4.27.tar.bz2 copy至/usr/src目录下:
#cp linux-2.4.27.tar.bz2 /usr/src
#cd /usr/src

2.检查编译器版本
如果你下载预编译的版本高于现在系统的版本,那么请检查你的各种编译器的版本,看他们是否能够正确编译新版本的内核。
???????????????如何知道编译新内核所需的版本??????????????

* Gnu C至少应该是2.91.66或以上版本,可通过执行“gcc --version”命令检查。
* Gnu make至少应该是3.77或以上版本,可通过执行“ make --version”命令检查。
* binutils至少应该是2.9.1.0.25或以上版本,可通过执行“ ld -V”命令检查。
* util-linux 至少应该是2.10o或以上版本,可通过执行“ fdformat --version”命令检查。
* modutils至少应该是2.4.0或以上版本,可通过执行“insmod -V”命令检查。
* e2fsprogs至少应该是1.19或以上版本,可通过执行“tune2fs --version”命令检查。
* pcmcia-cs至少应该是3.1.21或以上版本,可通过执行“cardmgr -V”命令检查。
* PPP至少应该是.4.0或以上版本,可通过执行“pppd --version”命令检查。
* isdn4k-utils至少应该是3.1beta7或以上版本,可通过执行“isdnctrl 2>&1|grep version”命令检查。

若发现任何一个软件是低于要求的版本,就需要到http://www.freshmeat.net下载新版本进行安装,一般情况下若当前系统是2.2.x,则除了modutils以外都可以满足需求。

四、配置正确的文件和目录关系
1.删除旧文件
如果你原来linux系统的/usr/src/下存在linux的源码文件目录(一般是linux-2.4.20-8)和一个指向这个源文件目录的链接(一般是linux-2.4),如果这一切都存在的话,那么请先删除他们,如果你舍不得他们,你也可以备份后再删除他们。

删除链接和文件目录:
# rm -f /usr/src/linux-2.4
# rm -rf /usr/src/linux-2.4.20.8

备份文件可以查看"备份文件"部分

2.用以下命令解开压缩包
# bzip2 -d linux-2.4.27.tar.bz2
# tar -xvf linux-2.4.27.tar
当然可以在Xwindows下用GZIP等解压缩软件解开,用起来和winzip或winrar差不多的。这是dos没有学就直接学windows的悲哀。

3、删除/usr/include下的asm、linux、scsi目录(如果有的话)。
# cd /usr/include/
# rm -rf asm linux scsi

4.在/usr/include下建立指向真正的asm、linux、scsi目录。确保"/usr/include/asm"、"/usr/include/linux"和"/usr/include/scsi"等子目录是指向内核源代码的链接。子目录asm、linux和scsi都是链源代码目录下的真正的、该计算机体系结构所需要的真正的include子目录。如:asm指向"/usr/src/linux-2.4.27/include/asm-i386"等。若没有这些链接,就需要手工创建,按照下面的步骤进行

# ln -s /usr/src/linux/include-2.4.27/asm-i386 /usr/include/asm
# ln -s /usr/src/linux/include-2.4.27/linux /usr/include/linux
# ln -s /usr/src/linux/include-2.4.27/scsi /usr/include/scsi


5.进入到以后编译时用的工作目录下:
#cd /usr/src/linux-2.4.27

五、修改核心参数(PGC2000需要)
1、修改与共享内存相关的核心参数
# cd  /usr/include/linux
# vi  shm.h
把 #define SHMMAX  0X2000000   /*max shared seg size(bytes)*/
改为#define SHMMAX  0Xa0000000  /*max shared seg size(bytes)*/
2、修改与信号量相关的核心参数
# cd /usr/include/linux
# vi sem.h
把 #define SEMOPM  32 /*<=1 100 max num of ops per semop call*/
改为#define SEMOPM 900 /*<=1 100 max num of ops per semop call*/
3、修改与消息队列有关的核心参数
# cd /usr/include/linux
# vi  msg.h
找到以下三行(注释忽略):
#define  MSGMNI  16
#define  MSGMAX  8192
#define  MSGMNB  16384
将其修改为:
#define  MSGMNI  128
#define  MSGMAX  131072
#define  MSGMNB  20000000
4、按上面方法同样修改/usr/src/linux-2.4.27/include/linux下的shm.h、sem.h和msg.h文件。

===================第二部分 开始编译内核=================

一、清除遗留文件

#make mrproper
该命令保证源代码目录下没有不正确的.o文件(即object文件,编译c语言时生成的,目的是下一步编译成可执行码时link之用)以及文件的相互
倚赖关系.第一次编译刚下载的源码包不用此命令,但如果多次使用这些源码编译内核,那么一定要先运行本命令.


二、配置内核
Linux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。不合理的配置可能造成内核编译失败。

内核配置总共有四种方式:

1.在命令行下配置内核
# make config
make config是一个一个的回答问题,命令行方式,您如果回答错了一个,您就不能改正了

2.在X Window下编译内核
# make xconfig
make xconfig提供漂亮的基于X-Window的GUI界面来配置内核的各种选项,需要tk包的支持

3.在文本下配置内核
# make  menueconfig
make  menueconfig提供漂亮的基于文本的彩色菜单系统来配置内核,需要Ncurses库的支持(Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库.)

4.使用当前配置
# make oldconfig
make oldconfig是指用系统当前的设置(./.config)作为缺省值

假如在在文本模式下编译:
#make menuconfig

选择相应的配置时,有三种选择,它们分别代表的含义如下:
  Y--将该功能编译进内核
  N--不将该功能编译进内核
  M--将该功能编译成可以在需要时动态插入到内核中的模块
如果使用的是make xconfig,使用鼠标就可以选择对应的选项。如果使用的是make menuconfig,则需要使用空格键进行选取。你会发现在每一个选项前都有个括号, 但有的是中括号有的是尖括号,还有一种圆括号。 用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"M"这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。

当使用 "make menuconfig" 时,在左面出现一个 "< >" 的选项能被编译成为一个模块。当选项被选中,按下空格键来循环选择选项是被选中或未选中, ("<*>")表示将被编译成内核映像而(" ")表示将被编译成模块。

如果我们在配置选项时,无法知道内核的功能,那么就请利用内核内置的帮助功能。基本上每个选项都至少有一些描述,而且每个通常都有一行"如果您不知道这个选项的含义,输入 Y。(或者 N)"。这些提示在您不知道一个特定选项的含义时能帮助您。要使用帮助,选中您有疑问的选项然后按 "?" 键。

在此目录下查看内核配置文件:http://blog.youkuaiyun.com/loef/archive/2004/09/01/91602.aspx

这个步骤完成之后,系统会提醒您,next step you should run "make dep"

4.建立编译时所需的从属文件,生成依赖关系,确保关键文件在正确的位置
# make dep
读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要。
2.5.*-2.6.0都不需要了。其实2.4.*某些内核也不需要了。

5.确保所有有关文件都处于最新版本状态
# make clean
清除所有已存在的目标文件,如果忘记做这一步,生成的内核将会非常庞大,如果不删除,在以后的编译过程中也很容易出错。

6.真正的编译内核
# make  zImage 或者
# make bzImage
# make zdisk
# make zlilo
make zImage和make bzImage实现完全编译内核,二者生成的内核都是使用gzip压缩的,只要使用一个就够了,它们的区别在于使用make bzImage可以生成大一点的内核,比如在编译2.4.0版本的内核时如果使用make zImage命令,那么就会出现system too big的错误提示。建议使用make bzImage命令.如果要制作成启动盘就使用make zdisk,别忘记在a:中插一张软盘。make zlilo 把生成的内核加入LILO中,不过在最初几次编译内核时不要使用此项,以免系统因生成的内核有故障而不能启动。


????????????当内核大于1M,还是640K时使用bzImage?????????????????

如果你在配置内核时选择了"Loadable module support",那么你将需要下面的步骤:编译模块和部署模块。
内核模块是驻留在 /lib/modules 目录下,而且每个模块再其文件名结尾都有一个 ".o"。
使用命令#lsmod可以对当前内核的模块进行列表。使用insmod和modprobe将模块调入内核。

7.编译选择的模块
# make modules
编译好的模块保存在/usr/src/linux-2.4.20-8/目录下

8.部署模块
# make modules_install
将编译好的模块安装到/lib/modules/x.y.z下。

9.检查内核的symbol
# depmod –a
严格说来,此命令和编译过程并没有关系,他检查内核中有没有未解析的symbol,它是生成模块间的依赖关系,这样你启动新内核之后,使用modprobe命令加载模块时就能正确地定位模块.
假如输入这个命令后你看不到没有任何返回信息的话,那说明你在编译过程是已经成功了。


===================第三部分 以新换旧====================
一、更新bzImage
# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.4.3
拷贝新内核文件"/usr/src/linux/arch/i386/boot/bzImage"到启动目录,并改为合适的名字:


二、更新System.map
# cp /usr/src/linux/System.map /boot/System.map-2.4.3
拷贝"/usr/src/linux/System.map"到启动目录下,并设定合适的名字,它是当前正在运行的kernel的fuctions的说明

三、建立新链接
进入启动目录下,将目录下的链接文件vmlinuz及System.map指向新的内核:
# cd /boot
# ln -fs vmlinuz-kernel.version.number vmlinuz
# ln -fs System.map-kernel.2.4.3 Systemv.map

必须将链接文件vmlinuz及System.map指向新内核的相关文件,因为如果没有新的链接,LILO程序将缺省地自动使用老内核。


注意,如果你用的是SCSI硬盘并且采用的是ext3分区格式的话,请注意,您一定要制作initrd.img(因为SCSI卡的驱动包括在这个里边),如果你使用的是IDE硬盘,您可以跳过这一步,当然,您要是有耐心的话,这里学习一下也没什么坏处哦

mkinitrd可以制作initrd.img,一般是这么使用的,如果想具体了解的话,可以man mkinitrd,如果只想搞个initrd.img出来的话,那就mkinitrd /boot/initrd-custom.img 2.4.22就在/boot目录下创建了一个initrd-custom.img文件,也就是初始化镜像…(initialed ramdisk)…里边主要有一些驱动,因为放在内核中就显得过大,所以编译进initrd.img,在启动中释放…而这个2.4.22就表示/lib/modules下面的2.4.22目录了…

四、删除启动目录下无用过期的文件:
# rm -f module-info
# rm -f initrd-2.2.12-20.img

module-info链接指向系统的旧内核的模块目录。由于现在安装了新内核,我们就无需保持这个文件。文件/"initrd-2.2.12-2"包含在可以使用磁盘之前初始化系统所需的RAM盘映像。这个文件只有在系统有scsi设备的情况下才会在安装系统时生成。由于这里生成编译的是一个单块(非模块化)的新内核。所以即使系统有scsi设备,这里仍然可以安全的删除该文件。


五、生成新的启动目录:
在/boot下生成 initrd img文件:
# cd /boot
# mkinitrd initrd-2.4.22.img 2.4.22


==============第四部分 为启动做准备================
一、LILO的配置
要配置 LILO 来使用新的内核,您有两种选择。第一个是覆盖您现有的内核 -- 除非您手头上有一些紧急启动措施如还有此内核的引导盘,这很危险的方法。

更为安全的选择是配置 LILO 是得它能从新的或旧的内核引导。LILO 可配置成从新内核缺省启动,但仍提供一种方法让您遇上问题时能选择旧的内核来启动。这是推荐的作法,也是我们将随后介绍的方法。

编辑/etc/lilo.conf文件
prompt
timeout=50
default=linux
boot=/dev/sda
map=/boot/map
install=/boot/boot.b
message=/boot/message
linear
root=/dev/sda6
read-only

image=/boot/vmlinuz-2.4.18-3smp
label=linux
initrd=/boot/initrd-2.4.18-3smp.img

//以下为添加部分
image=/boot/vmlinuz-2.6.0-test2
label=linux-2.6.0-test2
initrd=/boot/initrd-2.6.0-test2.img

作完这些修改后,您将需要以 root 身份运行 "lilo"。
# lilo
这非常重要!如果您不执行此步,启动的过程无法继续。运行 "lilo" 将给 lilo 一个机会来更新它的启动映射。


二、GRUB的配置

配置grub.conf文件

default=0
timeout=10
splashimage=(hd0,6)/grub/splash.xpm.gz

title Red Hat Linux Adance sever 2.1 (2.4.9-e3)
root (hd0,6)
kernel /vmlinuz-2.4.9-e3 ro root=/dev/hda8
initrd /initrd-2.4.9-e3
title DOS
rootnoverify (hd0,0)

title Red Hat Linux Adance sever 2.1 (2.4.22)
root (hd0,6)
kernel /vmlinuz-2.4.22 ro root=/dev/hda8
initrd /initrd-2.4.22.img
chainloader +1

从2.6开始,多了make install命令,可以减少make dep,make clean等很多步骤。具体参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值