日志文章

2007年05月28日 13:12:02

编译内核(转)

一、新版本内核的获取和更新
  linux内核版本发布的官方网站是http://www.kernel.org。新版本的内核分两种,一种是 full source版本,另外一种是patch文件,即补丁。完整的内核版本比较大,一般是 tar.gz或者是.bz2文件,二者分别是使用gzip或者bzip2进行压缩的文件,使用时需要解压缩。patch文件则比较小,一般只有几十k到几百k,但是patch文件是针对于特定的版本的,你需要找到自己对应的版本才能使用。
  编译内核需要root权限,以下操作都假定你是root用户。请把你需要升级的内核拷贝到/usr/src/下(下文中以2.4.18的内核的linux-2.4.18.tar.gz为例),命令为

#cp linux-2.4.18.tar.gz /usr/src

  让我们先来查看一下当前/usr/src的内容,注意到有一个linux-2.4的符号链接,指向一个linux-2.4.7-10(以redhat7.2为例)的目录。这就是你所装linux的kernel源代码,删除这个链接。

  现在解压我们下载的源程序文件。如果所下载的是.tar.gz(.tgz)文件,请使用下面的命令:

#tar -zxvf linux-2.4.18.tar.gz.tar.gz

  如果你所下载的是.bz2文件,例如linux-2.4.0test8.tar.bz2,请使用下面的命令

#bzip2 -d linux-2.4.18.tar.bz2
#tar -xvf linux-2.4.18.tar

  文件将解压到/usr/src/linux目录中,我们把它稍作修改:

#mv linux linux-2.4.18
#ln -s linux-2.4.18 linux

  如果下载的是patch文件,就可以进行patch操作(下面假设patch-2.4.18已经位于 /usr/src目录下了,否则你需要先把该文件拷贝到/usr/src下):

#patch -p0 < patch-2.4.18

  
二、内核编译
  通常要运行的第一个命令是:

#cd /usr/src/linux
#make mrproper

  该命令确保源代码目录下没有不正确的.o文件以及文件的互相依赖。由于我们使用刚下载的完整的源程序包进行编译,所以本步可以省略。而如果你多次使用了这些源程序编译内核,那么最好要先运行一下这个命令。
  确保/usr/include/目录下的asm、linux和scsi等链接是指向要升级的内核源代码的。它们分别链向源代码目录下的真正的、该计算机体系结构(对于pc机来说,使用的体系结构是i386)所需要的真正的include子目录。如:asm指向 /usr/src/linux/include/asm-i386 等。若没有这些链接,就需要手工创建,按照下面的步骤进行:

# cd /usr/include/
# rm -r asm linux scsi
# ln -s /usr/src/linux/include/asm-i386 asm
# ln -s /usr/src/linux/include/linux linux
# ln -s /usr/src/linux/include/scsi scsi

  这是配置非常重要的一部分。删除掉/usr/include下的asm、linux和scsi链接后,再创建新的链接指向新内核源代码目录下的同名的目录。这些头文件目录包含着保证内核在系统上正确编译所需要的重要的头文件。现在你应该明白为什么我们上面又在/usr/src下 "多余"地创建了个名为linux的链接了吧?

  接下来的内核配置过程比较烦琐,但是配置的适当与否与日后linux的运行直接相关,有必要了解一下一些主要的且经常用到的选项的设置。
  
配置内核可以根据需要与爱好使用下面命令中的一个:

#make config(基于文本的最为传统的配置界面,不推荐使用)
#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)
#make xconfig(基于图形窗口模式的配置界面,xwindow下推荐使用)
#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)

  这三个命令中,make xconfig的界面最为友好,如果你可以使用xwindow,那么就推荐你使用这个命令,界面如下:

  如果你不能使用xwindow,那么就使用make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了,下图为make menuconfig的界面:


  选择相应的配置时,有三种选择,它们分别代表的含义如下:
  y--将该功能编译进内核
  n--不将该功能编译进内核
  m--将该功能编译成可以在需要时动态插入到内核中的模块
  如果使用的是make xconfig,使用鼠标就可以选择对应的选项。如果使用的是 make menuconfig,则需要使用空格键进行选取。你会发现在每一个选项前都有个括号, 但有的是中括号有的是尖括号,还有一种圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"m"。这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。
  在编译内核的过程中,最烦杂的事情就是这步配置工作了,很多新手都不清楚到底该如何选取这些选项。实际上在配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。

至于选项,因为比较复杂,只是简单做一介绍,编译时应视具体情况,参考帮助的内容再加以选择。

1. code maturity level options
  代码成熟等级。此处只有一项:prompt for development and/or incomplete code/drivers,如果你要试验现在仍处于实验阶段的功能,比如khttpd、ipv6等,就必须把该项选择为y了;否则可以把它选择为n。

2. loadable module support
  对模块的支持。这里面有三项:

  enable loadable module support:除非你准备把所有需要的内容都编译到内核里面,否则该项应该是必选的。
  set version information on all module symbols:可以不选它。
  kernel module loader:让内核在启动时有自己装入必需模块的能力,建议选上。

3. processor type and features
  cpu类型。内容蛮多的,不一一介绍了,有关的几个如下:

  processor family:根据你自己的情况选择cpu类型。
  high memory support:大容量内存的支持。可以支持到4g、64g,一般可以不选。
  math emulation:协处理器仿真。协处理器是在386时代的宠儿,现在早已不用了。
  mttr support:mttr支持。可不选。
  symmetric multi-processing support:对称多处理支持。除非你富到有多个cpu,否则就不用选了。

4. general setup
  这里是对最普通的一些属性进行设置。这部分内容非常多,一般使用缺省设置就可以了。下面介绍一下经常使用的一些选项:

  networking support:网络支持。必须,没有网卡也建议你选上。
  pci support:pci支持。如果使用了pci的卡,当然必选。
  pci access mode:pci存取模式。可供选择的有bios、direct和any,选any吧。
  support for hot-pluggabel devices:热插拔设备支持。支持的不是太好,可不选。
  pcmcia/cardbus support:pcmcia/cardbus支持。有pcmcia就必选了。
  system v ipc
  bsd process accounting
  sysctl support:以上三项是有关进程处理/ipc调用的,主要就是system v和bsd两种风格。如果你不是使用bsd,就按照缺省吧。
  power management support:电源管理支持。
  advanced power management bios support:高级电源管理bios支持。

5. memory technology device(mtd)
  mtd设备支持。可不选。

6. parallel port support
  并口支持。如果不打算使用串口,就别选了。

7. plug and play configuration
  即插即用支持。虽然linux对即插即用目前支持的不如windows好,但是还是选上吧,这样你可以拔下鼠标之类的体验一下linux下即插即用的感觉。

8. block devices
  块设备支持。这个就得针对自己的情况来选了,简单说明一下吧:

  normal pc floppy disk support:普通pc软盘支持。这个应该必选。
  xt hard disk support:
  compaq smart2 support:
  mulex dac960/dac1100 pci raid controller support:raid镜像用的。
  loopback device support:
  network block device support:网络块设备支持。如果想访问网上邻居的东西,就选上。
  logical volume manager(lvm)support:逻辑卷管理支持。
  multiple devices driver support:多设备驱动支持。
  ram disk support:ram盘支持。

9. networking options
  网络选项。这里配置的是网络协议。内容太多了,不一一介绍了,自己看吧,如果你对网络协议有所了解的话,应该可以看懂的。如果懒得看,使用缺省选项(肯定要选中tcp/ip networking哦)就可以了。让我们看看,tcp/ip、atm、ipx、decnet、appletalk……支持的协议好多哦,ipv6也支持了,qos and/or fair queueing(服务质量公平调度)也支持了,还有khttpd,不过这些都还在实验阶段。

10. telephony support
  电话支持。linux下可以支持电话卡,这样你就可以在ip上使用普通的电话提供语音服务了。记住,电话卡可和modem没有任何关系哦。

11. ata/ide/mfm/rll support
  这个是有关各种接口的硬盘/光驱/磁带/软盘支持的,内容太多了,使用缺省的选项吧,如果你使用了比较特殊的设备,比如pcmcia等,就到里面自己找相应的选项吧。

12. scsi support
  scsi设备的支持。我没有scsi的设备,所以根本就不用选,如果你用了scsi的硬盘/光驱/磁带等设备,自己找好了。

13. fusion mpt device support
  需要fusion mpt兼容pci适配器,不用选。

14. i2o device support
  需要i2o接口适配器支持,在智能input/output(i2o)体系接口中使用。

15. network device support
  网络设备支持。上面选好协议了,现在该选设备了,可想而知,内容肯定多得很。还好还好,里面大概分类了,有arcnet设备、ethernet(10 or 100 mbit)、ethernet(1000mbit)、wireless lan(non-hamradio)、token ring device、wan interfaces、pcmcia network device support几大类。我用的是10/100m的以太网,看来只需要选则这个了。还是10/100m的以太网设备熟悉,内容虽然多,一眼就可以看到我所用的realteck rtl-8139 pci fast ethernet adapter support,为了免得麻烦,编译到内核里面好了,不选m了,选y。耐心点,一般说来你都能找到自己用的网卡。如果没有,你只好自己到厂商那里去要驱动了。

16. amateur radio support
  配置业余无线广播。

17. irda(infrared)support
  红外线支持。

18. isdn subsystem
  如果你使用isdn上网,这个就必不可少了。

19. old cd-rom drivers(not scsi、not ide)
  做的可真周到,原来那些非scsi/ide口的光驱谁还在用啊,自己选吧,用ide的cd-rom不用选。

20. character devices
  字符设备。这个内容又太多了,先使用缺省设置,需要的话自己就修改。把大类介绍一下吧:

  i2c support:i2c是philips极力推动的微控制应用中使用的低速串行总线协议。如果你要选择下面的video for linux,该项必选。
  mice:鼠标。现在可以支持总线、串口、ps/2、c&t 82c710 mouse port、pc110 digitizer pad,自己根据需要选择。
  joysticks:手柄。即使在linux下把手柄驱动起来意义也不是太大,游戏太少了。
  watchdog cards:虽然称为cards,这个可以用纯软件来实现,当然也有硬件的。如果你把这个选中,那么就会在你的/dev下创建一个名为watchdog的文件,它可以记录你的系统的运行情况,一直到系统重新启动的1分钟左右。有了这个文件,你就可以恢复系统到重启前的状态了。
  video for linux:支持有关的音频/视频卡。
  ftape, the floppy tape device driver:
  pcmcia character device support:

21. file systems
  文件系统。内容又太多了,老法子,在缺省选项的基础上进行修改。介绍以下几项:

  quota support:quota可以限制每个用户可以使用的硬盘空间的上限,在多用户共同使用一台主机的情况中十分有效。
  dos fat fs support:dos fat文件格式的支持,可以支持fat16、fat32。
  iso 9660 cd-rom file system support:光盘使用的就是iso 9660的文件格式。
  ntfs file system support:ntfs是nt使用的文件格式。
  /proc file system support:/proc文件系统是linux提供给用户和系统进行交互的通道,建议选上,否则有些功能没法正确执行。

  还有另外三个大类都归到这儿了:network file systems(网络文件系统)、partition types(分区类型)、native language support(本地语言支持)。值得一提的是network file systems里面的两种:nfs和smb分别是linux和windows相互以网络邻居的形式访问对方所使用的文件系统,根据需要加以选择。

22. console drivers
  控制台驱动。一般使用vga text console就可以了,标准的80*25的文本控制台。

23. sound
  声卡驱动。如果你能在列表中找到声卡驱动那自然最好,否则就试试oss了。

24. usb supprot
  usb支持。很多usb设备,比如鼠标、调制解调器、打印机、扫描仪等,在linux都可以得到支持,根据需要自行选择。

25. kernel hacking
  配置了这个,即使在系统崩溃时,你也可以进行一定的工作了。普通用户是用不着这个功能的。

  配置完后,存盘退出,当然你也可以把现在的配置文件保存起来,这样下次再配置的时候就省力气了。

接下来是编译,输入以下命令。

#make dep
#make clean
#make bzimage或make zimage
#make modules
#make modules_install
#depmod -a

  第一个命令make dep实际上读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要;第二命令make clean完成删除前面步骤留下的文件,以避免出现一些错误;make zimage和make bzimage则实现完全编译内核,二者生成的内核都是使用gzip压缩的,只要使用一个就够了,它们的区别在于使用make bzimage可以生成大一点的内核。建议大家使用make bzimage命令。
  后面三个命令只有在你进行配置的过程中,在回答 enable loadable module support (config_modules)时选了"yes"才是必要的,make modules和make modules_install分别生成相应的模块和把模块拷贝到需要的目录中。
  严格说来,depmod -a命令和编译过程并没有关系,它是生成模块间的依赖关系,这样你启动新内核之后,使用modprobe命令加载模块时就能正确地定位模块。

更新

  经过以上的步骤,我们终于得到了新版本的内核。为了能够使用新版本的内核,我们还需要做一些改动:

#cp /usr/src/linux/system.map /boot/system.map-2.4.18
#cp /usr/src/linux/arch/i386/boot/bzimage /boot/vmlinuz-2.4.18

  以上这两个文件是我们刚才编译时新生成的。下面修改/boot下的两个链接system.map和vmlinuz,使其指向新内核的文件:

#cd /boot;rm -f system.map vmlinuz
#ln -s vmlinuz-2.4.18 vmlinuz
#ln -s system.map-2.4.18 system.map

三、修改启动管理器

1. 用lilo:

  如果用lilo,修改/etc/lilo.conf,添加以下项:

image=/boot/vmlinuz-2.4.18
label=linux240
read-only
root=/dev/hda2

  其中root=/dev/hda2一行要根据需要自行加以修改。
  运行:

#/sbin/lilo -v

  确认对/etc/lilo.conf的编辑无误,现在重新启动系统:

#shutdown -r now

2. 是用grub启动管理器:

先創建一个img文件:

执行: cd /boot
执行: /sbin/mkinitrd initrd-2.6.12.3.img 2.6.12.3

修改/etc/grub.conf的文件如下:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
#   all kernel and initrd paths are relative to /, eg.
#   root (hd0,7)
#   kernel /boot/vmlinuz-version ro root=/dev/hda8
#   initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=5
#splashimage=(hd0,7)/boot/grub/splash.xpm.gz
#hiddenmenu

#以下是添加部分:

title Fedora Core (2.6.12.3)
root (hd0,7)
kernel /boot/vmlinuz-2.6.12.3 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.12.3.img

#添加结束

title Fedora Core (2.6.11-1.1369_FC4)
root (hd0,7)
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.11-1.1369_FC4.img
title WinXP
rootnoverify (hd0,0)
chainloader +1


重启以后就可以在启动列表中看到新内核了。

Tags: 编译   内核  

类别: 技术文章 |  评论(0) |  浏览(775) |  收藏
发表评论
看不清楚,换一张