LINUX内核编译步骤详细介绍

LINUX内核编译步骤详细介绍

 

到www.kernel.org 下载 Linux-2.6.18.2.tar.bz2


tar –jxvf  Linux-2.6.18.2.tar.bz2 -C /usr/src/kernel

 

make mrproper 把原来编译产生的垃圾删除

配置内核可以根据需要与爱好使用下面命令中的一个:

#make config (基于文本的最为传统的配置界面)

#make menuconfig (基于文本选单的配置界面)

#make xconfig (基于图形窗口模式的配置界面)

#make oldconfig (如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)



进行配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。例如,如果需要内核支持DOS分区的文件系统,则要在文件系统部分选择FAT或DOS系统支持;系统如果配有网卡、PCMCIA卡等,需要在网络配置中选择相应卡的类型。

选择相应的配置时,有三种选择,它们分别代表的含义如下:

“Y”- 将该功能编译进内核

“N”- 不将该功能编译进内核                 

“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


现在重启机器,即可测试最新的内核。


 

linux 2.6.15.6内核配置(unfinished)

注意: 不同的内核版本配置选项(或组织)可能不同, 但原理都是一样的!
另外, 关于compile in, compile as module的选择: 根文件系统, 根文件系统所处的设备, PS/2鼠标驱动不能编译为模块!

Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers  (y)
; 选择尚未完全测试的代码(alpha-test态),事实上它是安全的,建议选择.
[*] Select only drivers expected to compile cleanly  (y)
; 隐藏可能存在问题的驱动,建议选择,如果没找到对应设备的驱动,将它取消试试.

General setup --->
()  Local version - append to kernel release (enter,输入字符窜)
; 从2.6.8的版本起,可以在内核版本号后面添加个性化字符窜.
[ ] Automatically append version information to the version string (NEW)  (n)
; 这个没看懂,先不选上.
[*] Support for paging of anonymous memory (swap)  (y)
; 如果使用了swap分区提供虚拟内存,一定要选上它.
[*] System V IPC (y)
; System V 的进程间通信, 选上.
[*] POSIX Message Queues (y)
; POSIX消息队列, 选上.
[*] BSD Process Accounting (y)
; 如果选上,user process可以通过系统调用使内核在它退出时将相关信息写入某个文件(如进程创建时间,拥有者,命令,内存使用量...)
   选上它,可以在应用程序中利用这些信息.
[*] BSD Process Accounting version 3 file format (y)
; 将前面所述的进程信息记录到v3格式的文件中, 选上它
[*] Sysctl support (y)
; 提供动态更改内核参数与变量的接口, 而不需要重新启动系统. 打开这个选项将会增加内核的体积至少8KB。
     如果你的内核仅用制作安装与恢复系统系统盘那么可以不选, 以减少对内存的占用.
[ ] Auditing support  (n)
; 允许其他内核子系统的内核审查,不知道什么鸟意思,不选上.
[*] Kernel Userspace Events  (y)
; 开启内核-用户空间事件层,它是比socket简单的kernel-user通信机制. 这样应用程序就可以通过监听不用轮询系统设备或文件
[ ] Kernel .config support  (n)
; 将.config文件编译到内核中, 以显示运行中的内核使用哪个选项.不要选择.
()  Initramfs source file(s)  (n)
; 好像是RAM FS初始化的吧,不知道什么鸟东西,不选!
[ ] Optimize for size (Look out for broken compilers!)  (n)
; 用gcc编译内核时,优化选项是 -O2,选择它将改为-Os, 生成比较小的内核.(老版本的gcc可能因此产生错误代码)
[ ] Configure standard kernel features (for small systems)  ---> (n)
; 针对小系统 (embedded)裁减内核, 桌面系统不用选择.

Loadable module support  --->     
[*] Enable loadable module support   (y)
; 使内核支持模块,当然要选择! (使用modprobe, lsmod, modinfo, insmod, rmmod工具...)
[*] Module unloading (y)
; 卸载模块,选择!(有些模块一旦加载就不能卸载, 不管是否选择了这个选项)
[*] Forced module unloading  (y)
; 强制卸载内核, 即便内核认为该行为不安全的时候.( rmmod -f 强制卸载,不等停止使用模块)
[ ]  Module versioning support (EXPERIMENTAL)  (n)
; 一般地,我们编译的模块是用于当前运行的内核, 选择该选项可以针对其他的内核编译模块. 先不选择.
[ ] Source checksum for all modules (n)  
; 查看模块中是哪些代码的,不选
[*]  Automatic kernel module loading   (y)
; 内核在任务中要使用一些被编译为模块的驱动或特性时, 先使用modprobe命令来加载它
  该选项自动调用modprobe加载需要的模块.当然选择!

Block layer  --->     
[ ] Support for Large Block Devices (n)
; 如果有超过2T的块设备,则选择它以支持大容量块设备
[ ] IO Schedulers  --->
<*> Anticipatory I/O scheduler   (y)
<*> Deadline I/O scheduler        (y)
<*> CFQ I/O scheduler                (y)
 Default I/O scheduler (Anticipatory)  --->   
 (X) Anticipatory
上述3中调度方式都选择,默认的调度方式选为anticipatory (按空格选择)

Processor type and features  --->  
Subarchitecture Type (PC-compatible)  --->  
; 用的PC,选PC-compatible
Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon)  --->   
; 选择CPU类型, 可通过 cat /proc/cpuinfo查看
[ ] Generic x86 support   (n)
; 如果没有列出你所使用的CPU类型,而你的CPU又是X86的,选上它,否则不选.它增加了通用性却降低了特定CPU的性能.
[*] HPET Timer Support   (y)
; 这也是一个新的特性,HPET是intel制定的新的用以代替传统的8254(PIT)中断定时器与RTC的定时器,全称叫作高精度事件定时器。如果你有一台较新的机器就选它吧,一般它是一个安全的选项, 即使你的硬件不支持HPET也不会造成问题,因为它会自动用8254替换。
[ ] Symmetric multi-processing support  (n)
; 只有一个CPU,SMP不用选择
Preemption Model (Preemptible Kernel (Low-Latency Desktop))  --->  
(X) Preemptible Kernel (Low-Latency Desktop)  
; 2.6内核的特点:抢占式内核.选择可抢占式内核以提升桌面系统的交互性能或实时性.
[*] Preempt The Big Kernel Lock (NEW)  (y)
; 抢占大内核锁?不清楚,不过选择了可加强桌面系统性能.
[*] Local APIC support on uniprocessors  (y)
; 单CPU的本地APIC (advanced programmable interrupt controller)支持,它内嵌在cpu中支持cpu自身产生的中断.建议选择,就算cpu不支持APIC,也没有影响.
[*] IO-APIC support on uniprocessors  (y)
; 同上,支持I/O高级可编程中断控制器.
[*] Machine Check Exception  (y)
; 如果系统出现问题, 内核采取一定的措施,比如打印警告信息或挂起系统.
 cat /proc/cpuinfo | grep mce 若CPU flags中有mce,
 这个功能是需要硬件支持的。你可以查看/proc/cpuinfo看看是否有mce标志,则说明CPU支持该选项.
 启动时加nomce参数可关闭它.
< > Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4  (n)
; 启动一个5秒的定时器,跟踪非致命错误并更正,记录它.如果不是特定的CPU,不要选择.(我的本本是Pentium M,不选择)
[ ] check for P4 thermal throttling interrupt.
; P4的CPU温度过高时会在屏幕上显示出相关的信息,只适用于Pentium 4
< > Toshiba Laptop support  (n)
< > Dell laptop support     (n)
; 上述两项都针对东芝和戴尔IInspire 8000笔记本,不选.
< > Enable X86 board specific fixups for reboot (n)
; 修正主板/芯片组以正确重启或工作,目前只针对 GX1, CS5530A, TROM2.1
  lspci -v | grep CX1 ...若系统不支持,则不用选择. (?我说错了好像)
< > /dev/cpu/microcode - Intel IA32 CPU microcode support  (n)
; 更新intell IA32 cpu的微码(内核是不自带的,需要另外下载)
< > /dev/cpu/*/msr - Model-specific register support   (n)
; 让privileged进程访问X86的MSRs(model-specific registers),一般用于intel的Embedded cpu.
< > /dev/cpu/*/cpuid - CPU information support  (n)
; 在/dev/cpu中建立一系列的设备文件, 以使过程访问指定的CPU.

Firmware Drivers  --->    
< > BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL)  (n)
; 可以打开实模式下BIOS中的增强磁盘设备服务,以决定从哪个磁盘上启动.一般的BIOS不支持.
< > BIOS update support for DELL systems via sysfs  (n)
; 戴尔的BIOS更新系统,需要一些应用软件的支持.
< > Dell Systems Management Base Driver   (n)
; 为上述的DELL BIOS更新系统提供sysfs借口,先不设,以后再研究.我的本本是Dell D600.

High Memory Support (off)  --->
; 如果有大于4G的内存,可选择.我内存只有512M.  
Memory model (Flat Memory) --->  
; 选择内存模式, flat memory记忆被盗,查查资料了再说,先选上.
[ ] Math emulation   (n)
; 在你的CPU上如果没有数学协处理器的话,打开这个选项可以让内核模拟一个.以提升浮点计算能力,不过慢的可以.如果你使用的不是古董CPU的话(486SX以前的), 这一项你永远都不需要。
[*] MTRR (Memory Type Range Register) support   (y)
; 在Intel p6家族的处理器中(Ppro、 PII和更新的)有一个内存类型范围寄存器,可用来控制处理器访问的内存范围. 打开它一般可以提升显卡的显示性能(2.5倍).
[ ] Boot from EFI support (EXPERIMENTAL)   (n)
;  EFI规范基本上是一个让PC可以在开机前(preboot)进行扫毒及诊断的执行环境.英特尔已经利用EFI建立一个可以取代BIOS的开机前软件框架. 这个框架名为“EFI平台创新开发框架”,其工程代码为Tiano,这个框架让电脑厂商可以撰写开机前软件的模组,这种模组很像Windows的驱动程序。它需要ELILO bootloader, grub或lilo不支持EFI.
[ ] Use register arguments (EXPERIMENTAL)   (n)
; 使用寄存器参数,(编写系统调用的时候可能有用,参考,v2 5.3 它使用不同的ABI,将函数的前三个参数通过寄存器传递.(gcc-3.0或更新的才支持).先不设置,学习编写系统调用的时候再看.
[*] Enable seccomp to safely compute untrusted bytecode  (y)  
; 使用seccomp将计算程序孤立到它们各自的地址空间.如果不是用于嵌入式系统, 还是在这里选yes
Timer frequency (250 HZ)  --->  
; 时钟频率,选为250赫兹.
(0x100000) Physical address where the kernel is loaded
; 设定内核加载的物理地址.默认为0x100000.不要更改!
[ ] kexec system call (EXPERIMENTAL)  (n)
; kexec能够关闭当前内核,运行另外一个内核.

Power management options (ACPI, APM)   --->    
[*] Legacy Power Management API  (y)
; 为pm_regiter()提供支持.
[ ] Power Management Debug Support  (n)
; 支持电源管理的调试
[*] Software Suspend (EXPERIMENTAL)  (y)
; 支持系统suspend(休眠),打开这项功能后, 可用swsusp或者shutdown -z

你可能感兴趣的:(LINUX内核编译步骤详细介绍)