Linux内核编译

来源:互联网 发布:sai绘画软件安卓版 编辑:程序博客网 时间:2024/05/21 06:24

Linux内核编译2.6.18

先把linux-2.6.18.2.tar.bz2 复制到/usr/src/ 的下面
tar –jxvf  linux-2.6.18.2.tar.bz2
需要

#ln -s linux-2.6.18.2 linux

#cd linux

然后执行:
#make mrproper 把原来编译产生的垃圾删除(如果第一次编译可以不需要执行)
 
配置内核可以根据需要与爱好使用下面命令中的一个:
#make config (基于文本的最为传统的配置界面)
#make menuconfig (基于文本选单的配置界面)
#make xconfig (基于图形窗口模式的配置界面)
#make oldconfig (如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)
 
进行配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。例如,如果需要内核支持DOS分区的文件系统,则要在文件系统部分选择FAT或DOS系统支持;系统如果配有网卡、PCMCIA卡等,需要在网络配置中选择相应卡的类型。
                          
选择相应的配置时,有三种选择,它们分别代表的含义如下:
                          
 “Y”- 将该功能编译进内核
 “N”- 不将该功能编译进内核
 “M”- 将该功能编译成可以在需要时动态插入到内核中的模块。
   //***方框里的选项只有Y和N,如果是尖括号里面有Y|N|M的选项,M代表可以不在内核中直接加载,需要的时候再手工加载。

                       
    将与核心其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响。许多功能都可以这样处理,例如像上面提到的网卡的支持、对FAT等文件系统的支持。
                          
其实现在编译内核最关键的地方就是配置内核。我一般用make menuconfig配置内核。
配置2.6.0内核时如果你的主板是Intel芯片的话,你用默认配制也许就可以得到一个满意的内核哦。做法是make  menuconfig后离开时选择保存。
这里的难点是pci,如果你硬盘是IDE的那一定要选择好你主板上南桥芯片。SCSI的话就是要选择上你的SCSI卡型号。
还有就是网卡,声卡芯片的型号了,他们的型号你都可以用lspci 查找到比如我的是。
 
[root@leo boot]# lspci
00:00.0 Host bridge: Intel Corp. 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)
00:01.0 PCI bridge: Intel Corp. 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)
00:07.0 ISA bridge: Intel Corp. 82371AB/EB/MB PIIX4 ISA (rev 08)
00:07.1 IDE interface: Intel Corp. 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.2 USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB
00:07.3 Bridge: Intel Corp. 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:0f.0 VGA compatible controller: VMware Inc [VMware SVGA II] PCI Display Adapter
00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
00:11.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)
00:12.0 Multimedia audio controller: Ensoniq ES1371 [AudioPCI-97] (rev 02)
 
编译配置
在这一部分涉及几个重要模块的配置请,特别注意.一般用"make menuconfig"命令来配置内核.
输入以上命令后出现一个菜单界面,用户可以对需要的模块.下面着重讲几个重要的配置
1)文件系统
请务必要选中ext3文件系统,
  File systems--->
  [*] Ext3 journalling file system support
  [*] Ext3 Security Labels
  [*] JBD (ext3) debugging support
  以上三项一定要选上,而且要内建(即标*). 这个非常重要,在配置完后一定要检查一下.config文件有没有"CONFIG_EXT3_FS=y"这一项. 如果不是"CONFIG_EXT3_FS=y"而是"CONFIG_EXT3_FS=m",你在运行内核时就会遇上以下错误: pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed
  
2)网卡驱动
  请务必把自己网卡对应的驱动编译进内核,比较普遍的网卡是realtek 8139,以下就是这种网卡的配置,以供参考
  Device Drivers--->
  Networking support--->
  Ethernet (10 or 100Mbit) --->
  <*> RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support (EXPERIMENTAL)
  <*> RealTek RTL-8139 PCI Fast Ethernet Adapter support

3)声卡驱动
  也要选择自己声卡对应的驱动编译进内核,比较普遍的声卡是i810_audio,以下就是这种声卡的配置,以供参考
  Device Drivers --->
  Sound --->
  <*> Sound card support
  Advanced Linux Sound Architecture --->
  <*> Advanced Linux Sound Architecture
  <*> Sequencer support
  < > Sequencer dummy client
  <*> OSS Mixer API
  <*> OSS PCM (digital audio) API[*] OSS Sequencer API
  <*> RTC Timer support
  PCI devices --->
  <*> Intel i8x0/MX440, SiS 7012; Ali 5455; NForce Audio; AMD768/8111
  Open Sound System --->
  < > Open Sound System (DEPRECATED)

以上三项配置关系到新内核能否正常运行,请备加注意.其他的配置如果不是很了解,大可以按默认的选择.
 
#make dep (确保关键文件在正确的位置) 2.5.*-2.6.0都不需要了。其实2.4.*某些内核也不需要了。
                          
#make clean (确保所有有关文件都处于最新版本状态)
                          
#make zImage (编译压缩形式的内核)
                          
在需要内核支持较多的外设和功能时,内核可能变得很大,此时可以编译大内核:
                          
#make bzImage

//***当编译的内核文件比较大时使用此命令。
                          
编译的时间与机器的硬件条件及内核的配置等因素有关,所获得的内核的位置在/usr/src/linux/arch/i386/boot目录下,当然这里假设用户的CPU是x86型的。
                          
如果选择了可加载模块,编译完内核后,要对选择的模块进行编译:
                          
#make modules (编译选择的模块)
                          
#make module_install (将编译后的模块转移到系统标准位置)
 
# make install
 
上面的命令"make install"将:
 (1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接; 
 (2)修改bootloader的配置文件;
 (3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置文件增加如下类似的配置行:
 
      title Red Hat Linux (2.***)
      root(hd0, 1)
      kernel /boot/vmlinuz-2.*** ro root=LABEL=/
      initrd /boot/initrd-2.***.img
                          
模块在系统中的标准目录位于/lib/modules/x.y.z,后面的x.y.z是版本号,为安全起见,在运行#make  modules_install之前最好对/lib/modules进行备份。模块通常是带有扩展名.o的文件,使用命令#lsmod可以对当前内核的模块进行列表。
                          
我一般是make bzImage;make modules;make module_install; make install
                          
运行新内核之前,请检查一下/boot/grub/grub.conf的内容,下面的配置可作参考
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.18.2)
        root (hd0,0)
        kernel /vmlinuz-2.6.18.2 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
        initrd /initrd-2.6.18.2.img
title Fedora Core (2.6.18-1.2798.fc6)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
        initrd /initrd-2.6.18-1.2798.fc6.img
 
现在重启机器,即可测试最新的内核。

~~~~~~~~~~~~~~~~~~~~~~

 Linux2.6 内核编译实践0-liumei12377

一,为什么要编译内核? 
    Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。 
  通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。 
  为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑: 
  (1)自己定制编译的内核运行更快(具有更少的代码) 
  (2)系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中) 
  (3)不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞 
  (4) 将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些 
二,内核编译模式 
   要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中(build-in),也可以把该部分编译成模块(module),动态调用。如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块。 
三、新版LINUX内核的获取与更新 
  linux内核的获取,可以通过购买光盘,从朋友那里拷贝,当然最直接方便的方式是到linux内核官方的网址:http://www.kernel.org上获取最新的版本,另一种就是补丁文件了,即patch文件。他们都是以tar.gz或者tar.bz2形式打包。注意编译内核的时候要求是root权限。以下的编译更新工作就是以root用户实现的。 
  
四、内核配置 
  我从linux官方网上下载的内核包是:linux-2.6.26.2.tar.bz2,并将其拷贝到我的fc6(内核为2.6.18)下的/usr/src/kernels/目录下。本身我运行的系统的内核源码就在这个目录下名字为(2.6.18.1.2798.fc6-i686)。并把新内核包解压,用如下命令 
#cp linux-2.6.26.2.tar.bz2 /usr/src/kernels/ 
#cd /usr/src/kernels/ 
#tar jvxf linux-2.6.26.2.tar.bz2 
# tar cvzf 2.6.18.1.2798.fc6-i686 /*可以把旧的版本备份,可选,以防不测*/ 
说到这里还要将几个重要的文件,以防万一还是备份一下比较好。(可选) 
1.备份内核启动文件/boot 
#cd /boot 
#tar cvzf boot.tar.gz boot 
2.备份系统的头文件 
#cd /usr/include 
#tar cvzf linux.tar.gz linux 
3.备份模块中的库文件 
#cd /lib/modules 
#tar cvzf 2.6.18.1.2798.fc6.tar.gz  2.6.18.1.2798.fc6 
4.备份重要的配置目录 
#cd / 
#tar cvzf etc.tar.gz etc 
接下来便是实际的工作啦。 
#cd /usr/src/kernels/linux-2.6.26.2 
#make mrproper 
   该命令确保源代码目录下没有不正确的.o文件以及文件的互相依赖。由于我们使用刚下载的完整的源程序包进行编译,所以本步可以省略。而如果你多次使用了这些源程序编译内核,那么最好要先运行一下这个命令。 
   接下来就是内核编译前的配置了,这一步要细心。配置的恰当与否与你日后linux的使用有很大的关系。但是绝大多数是只要用默认的配置就可以啦,除非你想要特殊的应用。配置内核一些常用的重要的选项的详解请参考:http://lamp.linux.gov.cn/Linux/kernel_options.html。 
  
配置内核可以根据需要与爱好使用下面命令中的一个: 
#make config(基于文本的最为传统的配置界面,不推荐使用) 
#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用) 
#make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用) 
#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦) 
这三个命令中,我使用的是#make menuconfig命令,我想这个虽然是文本字符终端的操作,但是作为每个LINUX学习者,要习惯和享受在命令行下的操作。在选择相应的配置时,有必要对三种符号的含义做些解释: 
   Y--将该功能编译进内核 
  N--不将该功能编译进内核 
  M--将该功能编译成可以在需要时动态插入到内核中的模块 
  如果使用的是make menuconfig,则需要使用空格键进行选取。你会发现在每一个选项前都有个括号, 但有的是中括号有的是尖括号,还有一种圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"M"这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。
  正如上面说的,实际上在配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。 
  
五、内核与内核模块编译 
1.进入新内核源代码目录 
#cd /usr/src/kernels/linux-2.6.26.2 
2.读取配置过程中生成配置文件,创建对应于配置的依赖关系树,从而决定哪些需要编译与哪些不需要编译 
#make dep 
3.完全删除上步留下来的文件,避免发生错误。(如果是新下载内核没有编译过,可以跳过) 
#make clean 
4.编译内核 
#make bzImage 
在上面的命令成功编译以后会在/usr/src/kernels/linux-2.6.26.2/arch/x86/boot/ 
目录下产生新内核的映像bzImage 
5.编译可加载内核模块 
#make modules 
6.把生成的模块拷贝到需要的目录下 
#make modules_install 
7.生成模块间的依赖关系,这样在启动新内核以后,使用modprobe命令加载模块时候能够正确定模块。 
#depmod -a 
注意第5-7步,只有在进行内核配置时候选上了Enable loadable module support (CONFIG_MODULES)才是必要的。
   经过以上的步骤终于生成了新的内核和模块,为了能够使用上新版内核,还要做以下工作。 
   #cp /usr/src/kernels/linux-2.6.26.2/System.map /boot 
   #cp /usr/src/kernels/linux-2.6.26.2/arch/x86/boot/bzImage /boot 
   #cd /boot 
   #mv bzImage vmlinuz-2.6.26 
  注意上面的前面两条命令我没有像网上其他很多是帖子一样覆盖了原来内核的映像和内核符号隐射表。我把新的直接放在/boot下面,这样能在新内核启动不了的情况下,可以启动新内核。(我对这点深有感触,其实我一开始很顺利地编译成功了并且生成了bzImage,可是我把他拷贝错了,拷贝了同目录下的vmlinux,结果启动不起来啦,linux系统就进不了,后来我进了grub的命令行找到了旧内核映像启动,我们可以发现内核是更新啦,文件系统方面好像是没有什么更新。不知道有没有说错?) 
 
8、生成initrd.img文件

/usr/src/linux-2.6.36#cd/lib/modules/2.6.36

/lib/modules/2.6.36#update-initramfs–c –k 2.6.36 

9、自动查找新内核,并添加至grub引导:

#update-grub

10、清除多余的创建文件(可以不用理)

#cd /usr/src/linux-2.6-36

#make clean

12、重启系统

#reboot 或者shutdown –r now

 

 

重启后,进入终端使用uname –a命令可以看到内核编译的结果
六、修改并重启管理器 
    我用的grub引导内核的,至于lilo没有用过,不过网上有很多这样的帖子可以参考。下面是我的文件/boot/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=1
timeout=5
splashimage=(hd0,7)/boot/grub/splash.xpm.gz
hiddenmenu 
  
 title Fedora Core (2.6.26.2.fc6)
 root (hd0,7)
 kernel /boot/vmlinuz-2.6.26 ro root=LABEL=/ rhgb quiet
 initrd /boot/initrd-2.6.18-1.2798.fc6.img


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

 title Windows XP
 rootnoverify (hd0,0)
 chainloader +1 
  
   以上的黑体部分是后加入的,加入后保存该文件。原来的内核启动没有改变,这样在新内核启动失败以后,就可以成功启动旧内核!保留旧内核的启动项,这点很重要哦。接下来再重启电脑期待新内核的启动成功! 
  
   Linux内核编译过程在具体实践的时候可能出现很多的问题,只要针对问题各个击破,坚持到底,是一定会有惊喜的!^_^

原创粉丝点击