红联Linux门户
Linux帮助

Linux 核心编译与管理(摘自鸟哥私房菜)二

发布时间:2006-04-16 11:21:11来源:红联作者:zz123
引用:
3. 设定核心的编译设定 (Makefile)

  3.1 如何编辑核心的 Makefile

  3.2 核心的内容与模块设定:

    a. CPU 的类型选择: 双 CPU 的选择项目, 高内存支持

    b. 电源管理: CPU 自动降频功能选项

    c. PCI 总线与 PCI Express 支持:

    d. 核心的网络功能: IPv4, IPv6, 防火墙功能, 特殊网络功能

    e. 硬件驱动程序: 主机 IDE 芯片选择, SCSI 支持, SATA 支持, RAID 与 LVM 支持,

      网络卡支持, 拨接必须之 PPP, AGP 显示卡芯片组, 显示卡芯片组, USB 芯片组

    f. 档案系统(filesystem): EXT2/EXT3, Quota, MSDOS/NTFS, NFS/Samba...


设定核心的编译设定 (Makefile)

就如同我们在原始码与 tarball 的章节当中提到的, 由于各个主机硬件都不相同,所以当然需要针对我们的主机环境来选择可以编译的项目啦!那就是 Makefile 的编辑。但是核心的资料实在多到不行~所以,核心有提供不少的工具来让我们简单的进行参数的设定喔!

如何编辑核心的 Makefile

在这一章当中,鸟哥假设你是以 http://www.kernel.org 这个核心官方网站下载最新的核心版本来编译的, 鸟哥下载的是 2.6.14-2 版,下载的完整网址在:

http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.2.tar.bz2

如果你是以 FC4 系统预设的核心原始码来重新编译, 那么请自行安装 kernel-devel 这个套件,以及前往 /usr/src/kernels/ 目录下, 找到核心原始码;如果您之前已经以下载的核心档案编译过核心, 那么请依序下载各 patch 档案,然后请自行参考 patch 的用法以及找到相关的路径吧!反正,这一章当中,我假设您与我一样, 使用的是最新版的核心就是了。

假设你下载之后将整个档案放置到 /root 内,那么首先请解压缩吧!

[root@linux ~]# cd /usr/src

[root@linux src]# tar -jxvf /root/linux-2.6.14.2.tar.bz2

# 这个时候就会产生一个 /usr/src/linux-2.6.14.2 的目录,该目录就是 source code。

# 不过,这个目录下有个 README 的档案务必参考,此外,

# 还有个 Documentation 的目录,也可以仔细的看一看喔!

[root@linux src]# cd linux-2.6.14.2

[root@linux linux-2.6.14.2]# make mrproper

# 这个过程在删除一些以前留下来的 .o 档案。


特别留意一下,核心的原始码最好不要直接放置到 /usr/src/linux 这个目录, 这是因为该目录是很多的软件读取核心功能的目录,如果你将这个新核心放置到 /usr/src/linux 下时, 可能会让某些软件读到错误的核心档案。因此,您才可能看到目前的核心原始码都放到 /usr/src/kernels/ 目录下 (FC4 的预设放置目录)。 所以,我们新的核心主要建议您还是放置到 /usr/src/ 目录下, 但是目录名称保持 linux-2.6.14.2 即可,不必更名为 linux ?!这点重要!

另外,在进行核心的参数设定之前,务必要执行『 make mrproper 』这个项目, 还记得原始码的编译过程吧?编译过程会有 *.o 的目标档案对吧! 那这些 *.o 必须要先删除啊!否则可能会产生旧的资料啊!这个要注意。

另外,其实我们也知道,整个原始码的编译过程当中,那个 Makefile 占有举足轻重的地位的! 这是因为我们的 make 取用的参数资料都是记录在 Makefile 档案当中啊! 所以?,你必须要确定你的系统已经安装了 make, gcc 等等的编译套件, 否则是无法进行编译的。此外,核心的 Makefile 没有办法像一些软件一样, 简单的使用 ./configure 就能够自动的侦测主机。这是因为每个人对于核心的要求都不一样嘛! 好了,那么如何建立 Makefile 啊?难道要手动去编辑??当然不是啦! 我们可以透过核心提供的功能,就是那个 make menuconfig 来达成喔!

make menuconfig:

利用类似选单模式的方式来进行核心参数的挑选,好处是,他是纯文字模式的! 不需要激活 X Window ,还可以远程登入进行核心参数的挑选!真方便!

make xconfig:

利用 X Window 的功能来进行挑选,是图形接口的,很华丽~不过,当然就比较耗系统资源。 如果你的服务器没有安装 X Window ,那就别提了!

make gconfig:

利用 GDK 函式库的图形接口来选择,也是需要 X Window 的支持才行!

还有一些早期的编译流程,不过不好用,所以鸟哥就不介绍了。我这里推荐您使用 make menuconfig 来进行核心参数的挑选。这是因为很多的服务器本来就可能没有 X Window , 加上 make menuconfig 也可以作类似图形化接口的选单模式,可以随时作参数的选择, 方便又好用! ^_^。只要在 /usr/src/linux-2.6.14.2 目录下,输入『make menuconfig』 就可以出现如下的画面喔!



看到上面的图是之后,你会发现主要分为两大画面,一个是大框框内的反白光柱,另一个则是底下的小框框, 里面有 select, exit 与 help 三个选项的内容。这几个组件的用法如下:

最底下的 之后, 按下『 Enter 』就可以进入该项目去作更进一步的细部设定?;

在细部项目的设定当中,如果前面有 [ ] 或 < > 符号时,该项目才可以选择, 而选择可以使用『空格键』来选择;

若为 [*] <*> 则表示编译进核心;若为 则表示编译成模块! 尽量在不知道该项目为何时,且有模块可以选,那么就可以直接选择为模块?!

当在细项目选择 后,并按下 Enter ,那么就可以离开该细部项目?!

基本上建议只要『上下左右 空白 及 Enter 』这六个按键就好了!不要使用 Esc ,否则一不小心就有可能按错的!另外,关于整个核心的内容选择上面,建议您可以这样思考:

『肯定』核心一定要的功能,直接编译进核心内;

『可能在未来会用到』的功能,那么尽量编译成为模块;

『不知道那个东西要干嘛的,看 help 也看不懂』的话,那么就保留默认值,或者将他编译成为模块;

总之,尽量保持核心小而美,剩下的,就编译成为模块,尤其是『需要考虑到未来扩充性』, 像鸟哥之前认为螃蟹卡就够我用的了,结果,后来竟然网站流量大增,鸟哥只好改换 3Com 的网络卡。 不过,我的核心却没有相关的模块可以使用~因为.....鸟哥自己编译的核心忘记加入这个模块了。 最后,只好重新编译一次核心的模块,呵呵!真是惨痛的教训啊!

--------------------------------------------------------------------------------

核心的内容与模块设定



由上面的图标当中,我们知道核心的可以选择的项目有很多啊! 光是第一面,就有 17 个项目,每个项目内还有不同的细项!哇!真是很麻烦啊~ 而每个项目其实都可能有 的说明,所以,如果看到不懂的项目, 务必要使用 Help 查阅查阅!好了,底下我们就一个一个项目来看看如何选择吧!
--------------------------------------------------------------------------------



Code maturity level options(核心的 code 开发维护)

这个项目主要在设计您的核心是否要支持一些尚未测试的很完整功能。 一般来说,我们是一般用户,不是 kernel 的开发维护者,所以,当然不需要额外的功能啦! 所以,鸟哥这里的选择是比较保守的 (不使用额外功能),也因为如此, 所以底下的很多项目当中,可能不会出现一些较为特殊的选项喔!这个要注意! 鸟哥的选择如下:

[ ] Prompt for development and/or incomplete code/drivers

# 这个可选可不选~不过,鸟哥这里是不选择的啦!

-------------------------------------------------------------------------------

General setup

这个项目则是关于核心的一般设定,包括核心的附加版本信息等等,都可以在这里设定。

() Local version - append to kernel release

[ ] Automatically append version information to the version string (NEW)

# 上面这两个都与核心的附加版本有关。例如 FC4 的核心版本为

# 2.6.14-1.1637_FC4 ,后面那个 1.1637_FC4 就是那个附加版本啦!

[*] Support for paging of anonymous memory (swap)

# 这个与 swap 的使用有关!当然要选择啦

[*] System V IPC

# IPC 是 Inter Process Communication 的简写,这个与一个 programs

# 可以被多人同时启用有关,所以务必要选择才行!

[*] BSD Process Accounting

[ ] BSD Process Accounting version 3 file format

[*] Sysctl support

# 这个就是在产生 /proc/sys 的支持!务必选择!

[*] Auditing support

[*] Enable system-call auditing support

# 上面这两个是额外核心功能 (如 SELinux) 加载时所需要的设定!务必选择

--- Support for hot-pluggable devices

[*] Kernel Userspace Events

# 让核心能够监听使用者的动作。举例来说, USB 装置的联机与否等等的实时装置。

[ ] Kernel .config support

() Initramfs source file(s)

[ ] Configure standard kernel features (for small systems) --->

这里的项目主要都是针对核心与程序之间的相关性来设计的,基本上, 保留默认值即可!除非您想要编辑属于自己的附加版本,那么在上表的第一项按下 Enter 后, 就可以输入一些信息了。不要随便取消上面的任何一个项目, 可能会造成某些程序无法被同时执行的困境喔!

--------------------------------------------------------------------------------

Loadable module support

还记得我们上头曾经提过模块这个玩意儿吧!如果你要核心能够支持模块实时加载某些核心功能的话, 那么这里面的设定就显的很重要了!因为他涉及是否支持模块加载啊!

[*] Enable loadable module support

[*] Module unloading

[*] Source checksum for all modules

[*] Automatic kernel module loading

不用想太多,全部都选择吧!



--------------------------------------------------------------------------------
Processor type and features

这个就与您的 CPU 有关啦!我的主机装备的是 P-III 的 CPU ,所以就选择相关的即可。 你要依据你自己的主机来设计喔!不要胡乱选择啊!

Subarchitecture Type (PC-compatible) --->

(X) PC-compatible <==这里是次目录

( ) AMD Elan

( ) Voyager (NCR)

( ) NUMAQ (IBM/Sequent)

( ) SGI 320/540 (Visual Workstation)

# 这里在选择主机的硬件类型。我们使用 PC 兼容的主机啊!选这个就对了。



Processor family (Pentium-III/Celeron(Coppermine)/Pentium-III Xeon) --->

( ) 386 <==这里是次目录

( ) 486

( ) 586/K5/5x86/6x86/6x86MX

( ) Pentium-Classic

( ) Pentium-MMX

( ) Pentium-Pro

( ) Pentium-II/Celeron(pre-Coppermine)

(X) Pentium-III/Celeron(Coppermine)/Pentium-III Xeon

( ) Pentium M

( ) Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon

( ) K6/K6-II/K6-III

( ) Athlon/Duron/K7

( ) Opteron/Athlon64/Hammer/K8

( ) Crusoe

( ) Efficeon

( ) Winchip-C6

( ) Winchip-2

( ) Winchip-2A/Winchip-

( ) GeodeGX1

( ) CyrixIII/VIA-C3

( ) VIA C3-2 (Nehemiah)

# 这里则是 CPU 的等级,我使用的是 P-III ,您得要选择自己的啊!



[*] Generic x86 support

# 对 x86 的 CPU 架构支持较佳。

[*] HPET Timer Support

[ ] Symmetric multi-processing support

# 如果您使用两颗 CPU 以上的系统,这里『务必』要选择!否则不用选

Preemption Model (No Forced Preemption (Server)) --->

(X) No Forced Preemption (Server)

( ) Voluntary Kernel Preemption (Desktop)

( ) Preemptible Kernel (Low-Latency Desktop)

# 这里与 CPU 的效能有关。如果您想要作一个服务器的核心,选择第一个!

# 否则,为了稳定,最好选择第二项。



[*] Local APIC support on uniprocessors

[*] IO-APIC support on uniprocessors

# 单颗 CPU 的环境中,这个项目可以选择起来,让 CPU 具有

# Advanced Programmable Interrupt Controller 的功能啊!

[*] Machine Check Exception

# 让 Pentium 系列的 CPU 可以在侦测到 kernel 有问题时,立刻响应到终端接口

< > Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4

< > Toshiba Laptop support

< > Dell laptop support

# 上面这三个就得要看看你的系统是否支持啦!基本上,可以设定成 M 啦!

[ ] Enable X86 board specific fixups for reboot

/dev/cpu/microcode - Intel IA32 CPU microcode support

/dev/cpu/*/msr - Model-specific register support

/dev/cpu/*/cpuid - CPU information support

# 因为我的是 P-III CPU 啊,所以这里当然选择成模块即可!

Firmware Drivers --->

< > BIOS update support for DELL systems via sysfs (NEW)

< > Dell Systems Management Base Driver (NEW)

# 如果你的系统是 Dell 的,那么上面记得编成模块!鸟哥不需要~

High Memory Support (4GB) --->

( ) off

(X) 4GB

( ) 64GB

# 这个重要!一般来说,我们对于主机的要求是 RAM 越大越好(一般情况下);

# 但是,原本的核心支持仅到 1GB 的内存,所以,这里要加大!

# 一般的个人计算机主机,或者是 X86 主机,通常只要 4GB 就够了,

# 除非是特殊的工业用主机才可以额外插到 4GB 以上的内存!

# 如果这里选择成 off 的话,那么您的内存最大只能被捉到 1GB 。



[*] Allocate 3rd-level pagetables from highmem

# 这个与 High Memory Support 有关,如果你的内存支持到 4GB,这里可以加入

[ ] Math emulation

# 这个与 CPU 是否具有浮点运算单元有关。目前我们的 CPU (586 以上)

# 都已经内建了浮点运算单元了,所以这里可以不要选啦!

[*] MTRR (Memory Type Range Register) support

# 这玩意儿可以让 CPU 具有读取内存特殊区块的能力,尤其在高效能的 AGP

# 与相关的 PCI/AGP 总线进行数据传输时,可以增进不少效能。

# 选择这个项目后,会产生 /proc/mtrr ,我们的 X 会读取这个咚咚喔。

[ ] Boot from EFI support (EXPERIMENTAL)

[*] Enable seccomp to safely compute untrusted bytecode

# 这个项目通常要加,不过,如果是嵌入式系统的话,可以不加入!

Timer frequency (250 HZ)

# 这个项目则与核心针对某个事件立即响应的速度有关。一般来说,

# 如果是一般桌上计算机,那么反应时间可以调整的快速一点,因为不会有其它事件。

# 如果是主机,由于同一时间点可能有多人联机进来,启发的事件太多了,所以,

# 这个反应时间反而要调慢一点,会比较稳定,而且效能也不差。通常保留默认值

# 250 就很好了。

--------------------------------------------------------------------------------

Power management options (ACPI, APM)

这部分则是电源管理,主要的内容有底下这些:

[ ] Power Management Debug Support

[ ] Software Suspend

# 这个与将目前的环境暂存在 swap 当中有关。万一你想要将目前的资料暂存,

# 因为系统可能必须要关机一阵子,那么这个项目可以选择。不过,

# 由于可能会有一些问题,所以不建议您使用这个功能(主机也很少用到!)

ACPI (Advanced Configuration and Power Interface) Support --->

# 这个电源管理模块虽然可以管理你的电源,不过,却会增加核心约 70K ,所以

# 对嵌入式系统来说,可能需要考虑考虑。至于 desktop/server 当然就选择啊!

[*] ACPI Support

[*] Sleep States

[*] /proc/acpi/sleep (deprecated)

# 如果要激活 ACPI 的支持,那上面这几个几乎都是必要的!

AC Adapter

Battery

Button

Video

# 这几个则只要编译成为模块即可,因为桌上型与服务器用不到。

# 他主要大该都是针对笔记型计算机来设计的! ^_^

<*> Fan

<*> Processor

<*> Thermal Zone

# 每一部主机都有的 CPU/风扇 等,当然也可以编译进核心,也可以设定成模块。

ASUS/Medion Laptop Extras

IBM ThinkPad Laptop Extras

Toshiba Laptop Extras

(2001) Disable ACPI for systems before Jan 1st this year

[ ] Debug Statements

[*] Power Management Timer Support



APM (Advanced Power Management) BIOS Support --->

<*> APM (Advanced Power Management) BIOS support

[ ] Ignore USER SUSPEND

[ ] Enable PM at boot time

[*] Make CPU Idle calls when idle

[ ] Enable console blanking using APM

[*] RTC stores time in GMT

[ ] Allow interrupts during APM BIOS calls

[ ] Use real mode APM BIOS call to power off

# 由于鸟哥比较少使用电源管理,所以,我这里大多使用默认值而已。



CPU Frequency scaling --->

# 什么?可以经过核心修改 CPU 的运作频率?哈哈!没错!是这样!

# 不过,在说明档当中也提及,还需要激活底下的 dynamic cpufreq governor

# 才可以顺利的激活这个项目。当然,如果你不愿意的话,这里可以取消。

[*] CPU Frequency scaling

[*] Enable CPUfreq debugging

CPU frequency translation statistics

[*] CPU frequency translation statistics details

# 如果想要激活在休眠时, CPU 自动降频的功能,上面都给他设定好吧!

Default CPUFreq governor (userspace) --->

( ) performance

(X) userspace

# 休眠时 CPU 频率的考量,是以效能为主,还是您可以手动修改

# 既然要自动降频,当然不以效能为考量~所以选 userspace 吧!



<*> 'performance' governor

'powersave' governor

--- 'userspace' governor for userspace frequency scaling

'ondemand' cpufreq policy governor

'conservative' cpufreq governor

# 上面这几个则是在加载哪些调节器(governor) ~

--- CPUFreq processor drivers

ACPI Processor P-States driver

< > AMD Mobile K6-2/K6-3 PowerNow!

AMD Mobile Athlon/Duron PowerNow!

< > Cyrix MediaGX/NatSemi Geode Suspend Modulation

<*> Intel Enhanced SpeedStep

[*] Use ACPI tables to decode valid frequency/voltage pairs

[*] Built-in tables for Banias CPUs

<*> Intel Speedstep on ICH-M chipsets (ioport interface)

Intel Pentium 4 clock modulation

<*> Transmeta LongRun

< > VIA Cyrix III Longhaul

# 上面这几个就与 CPU 的型号有关啦!我用的是 P-III,

# 所以,不相关的数据我直接将他编成模块而已!

--- shared options

[ ] /proc/acpi/processor/../performance interface (deprecated)

[ ] Relaxed speedstep capability checks



# 其实,这个项目主要是在主机 Idle 的时候,透过 CPU 本身的功能,

# 然后让系统可以自动的降频的一个选项啦! ^_^


老实说,由于鸟哥的 Linux 机器主要都是站在 Server 的角度,所以我的机器都是全年无休的。 在这样的条件下,我老是选择不要使用电源管理的说~ @_@。不过,如果是站在桌上型计算机的角度, 呵呵~激活电源管理这可是很棒的选项,因为.....电费越来越贵了~ 能省则省啊! ^_^ 另外,绝大部分的选项都可以编译成为模块啊!只是会花去一些编译的时间就是了。


--------------------------------------------------------------------------------
Bus options (PCI, PCMCIA, EISA, MCA, ISA)

这个项目则与总线有关啦!分为最常见的 PCI,还有笔记型计算机常见的 PCMCIA 插卡啊!详细的资料有这些:

--- PCI support

PCI access mode (Any) --->

[ ] PCI Express support

# 这个重要!如果你的主机板有支持较新的 PCI-Express 显示卡的话,

# 这里请务必要勾选~鸟哥的主机板太旧了,用的是 AGP 显示卡,所以这里不选!

[ ] Message Signaled Interrupts (MSI and MSI-X)

[*] Legacy /proc/pci interface

[ ] PCI Debugging

[*] ISA support

[ ] EISA support

# 这个是比 PCI 还要更早的总线插槽,一般来说,

# 最好还是保留 ISA 插槽比较妥当点~

[ ] MCA support

< > NatSemi SCx200 support

PCCARD (PCMCIA/CardBus) support --->

< > PCCard (PCMCIA/CardBus) support

[ ] Enable PCCARD debugging

< > 16-bit PCMCIA support

[ ] PCMCIA control ioctl (obsolete)

--- 32-bit CardBus support

--- PC-card bridges

< > CardBus yenta-compatible bridge support

< > Cirrus PD6729 compatible bridge support

< > i82092 compatible bridge support

< > i82365 compatible bridge support

< > Databook TCIC host bridge support

# 这个是 PC 卡,一般来说,桌上型计算机不会有这种卡的存在,

# 所以,鸟哥通常是不选择~不过,如果你的主机是笔记型计算机,

# 这里可就得要选择了!否则很多插卡就不能被使用啊!切记切记!



PCI Hotplug Support --->

# 这个是进阶功能,可以不用理他!

PCI 插槽是重要的,因为几乎所有的适配卡都是插在 PCI 插槽上面的。 此外,这个设定项目里面有个比较有趣又重要的地方,那就是 PCI-E (PCI Express) 的设定项目了!如果你的主机板是最近买的,而且你的显示卡是 PCI-E 的话, 这个项目就务必要编入核心才行!否则显示卡会捉不到的!


--------------------------------------------------------------------------------


Executable file formats

这里必须要勾选才行喔!因为是给 Linux 核心运作执行文件之用的资料! 除了第一项必须要编成核心功能之外,其它两项是可以编译成为模块的啦!

[*] Kernel support for ELF binaries

Kernel support for a.out and ECOFF binaries

<*> Kernel support for MISC binaries

--------------------------------------------------------------------------------
Networking

这个项目是相当相当相当 * n 重要的选项,因为他还包含了防火墙相关的项目! 就是未来在服务器篇会谈到的防火墙 iptables 这个资料啊!所以,千万注意了!

--- Networking support

Networking options --->

# 就是这个光啊!里面的资料全部都是重要的防火墙项目!

# 在这里面的项目当中,如果可以编成模块,尽量将他编成模块!

<*> Packet socket

# 唯独这个项目务必要编进核心里面!因为他是防火墙啊!

[*] Packet socket: mmapped IO

<*> Unix domain sockets

<*> IPsec user configuration interface

PF_KEY sockets



# 底下是 TCP/IP 的设定,大多是 IPv4 ,只要保留默认值就很 OK 了!

[*] TCP/IP networking

[*] IP: multicasting

[*] IP: advanced router

Choose IP: FIB lookup algorithm (choose FIB_HASH if unsure)

[*] IP: policy routing

[*] IP: use netfilter MARK value as routing key

[*] IP: equal cost multipath

[ ] IP: equal cost multipath with caching support (EXPERIMENTAL)

[*] IP: verbose route monitoring

[ ] IP: kernel level autoconfiguration

IP: tunneling

IP: GRE tunnels over IP

[*] IP: broadcast GRE over IP

[*] IP: multicast routing

[*] IP: PIM-SM version 1 support

[*] IP: PIM-SM version 2 support

[*] IP: TCP syncookie support (disabled per default)

IP: AH transformation

IP: ESP transformation

IP: IPComp transformation

IP: tunnel transformation

<*> INET: socket monitoring interface

[ ] TCP: advanced congestion control



IP: Virtual Server Configuration --->

# 这个项目则主要与 cluster 有关~里面保留默认值即可!



# 这底下则与 IPv6 ,新一代的 IP 协议有关!同样做成模块!

The IPv6 protocol

[*] IPv6: Privacy Extensions (RFC 3041) support

IPv6: AH transformation

IPv6: ESP transformation

IPv6: IPComp transformation

--- IPv6: tunnel transformation

IPv6: IPv6-in-IPv6 tunnel



# 底下就重要啦!就是我们一直讲一直讲的防火墙啦! ^_^

[*] Network packet filtering (replaces ipchains) --->

--- Network packet filtering (replaces ipchains)

[ ] Network packet filtering debugging

[*] Bridged IP/ARP packets filtering

Netfilter netlink interface



IP: Netfilter Configuration --->

Connection tracking (required for masq/NAT)

[*] Connection tracking flow accounting

[*] Connection mark tracking support

[ ] Connection tracking events

Connection tracking netlink interface

FTP protocol support

IRC protocol support

TFTP protocol support

Amanda backup protocol support

PPTP protocol support

IP Userspace queueing via NETLINK (OBSOLETE)

IP tables support (required for filtering/masq/NAT)

limit match support

IP range match support

MAC address match support

Packet type match support

netfilter MARK match support

Multiple port match support

TOS match support

recent match support

ECN match support

DSCP match support

AH/ESP match support

LENGTH match support

TTL match support

tcpmss match support

Helper match support

Connection state match support

Connection tracking match support

Owner match support

Physdev match support

address type match support

realm match support

SCTP protocol match support

DCCP protocol match support

comment match support

Connection mark match support

Connection byte/packet counter match support

hashlimit match support

string match support

Packet filtering

REJECT target support

LOG target support

ULOG target support (OBSOLETE)

TCPMSS target support

NFQUEUE Target Support

Full NAT

MASQUERADE target support

REDIRECT target support

NETMAP target support

SAME target support

Packet mangling

TOS target support

ECN target support

DSCP target support

MARK target support

CLASSIFY target support

TTL target support

CONNMARK target support

raw table support (required for NOTRACK/TRACE)

NOTRACK target support

ARP tables support

ARP packet filtering

ARP payload mangling



Bridge: Netfilter Configuration --->

# 这个项目内容也一样,全部编成模块!



# 底下同样的,可能的话就编译成为模块啊!

802.1d Ethernet Bridging

802.1Q VLAN Support

< > DECnet Support

< > ANSI/IEEE 802.2 LLC type 2 Support

The IPX protocol

[ ] IPX: Full internal IPX network


[*] Appletalk interfaces support

Apple/Farallon LocalTalk PC support

COPS LocalTalk PC support

[*] Dayna firmware support

[*] Tangent firmware support

Appletalk-IP driver support

[*] IP to Appletalk-IP Encapsulation support

[*] Appletalk-IP to IP Decapsulation support

[*] QoS and/or fair queueing --->

Firewall based classifier

U32 classifier

[*] U32 classifier performance counters

[*] classify input device (slows things u32/fw)

[*] Use nfmark as a key in U32 classifier

Special RSVP classifier

Special RSVP classifier for IPv6

[*] Extended Matches

(32) Stack size

Simple packet data comparison

Multi byte comparison

U32 hashing key

Metadata

Textsearch

[*] Traffic policing (needed for in/egress)

Network testing --->

# 底下则是一些特殊的网络设备,例如红外线啊、蓝牙啊!

# 如果不清楚的话,就使用模块吧!除非你真的知道不要该项目!

[ ] Amateur Radio support --->

IrDA (infrared) subsystem support --->

Bluetooth subsystem support --->

Generic IEEE 802.11 Networking Stack

[ ] Enable full debugging output

IEEE 802.11 WEP encryption (802.1x)

IEEE 802.11i CCMP support

IEEE 802.11i TKIP encryption

在这个设定项目当中,很多东西其实我们在基础篇还没有讲到, 因为大部分的参数都与网络、防火墙有关!由于防火墙是在激活网络之后再设定即可, 所以绝大部分的内容都可以被编译成为模块,而且也建议您编成模块! 有用到才加载到核心即可啊!
--------------------------------------------------------------------------------
Device Drivers

这个是所有硬件装置的驱动程序库!哇!光是看到里面这么多内容,鸟哥头都昏了~ 不过,为了您自己的主机好,建议你还是得要一个项目一个项目的去挑选挑选才行~ 这里面的资料就与您主机的硬件有绝对的关系了!

Generic Driver Options --->

# 与韧体有关,保留默认值即可!



Connector - unified userspace <-> kernelspace linker --->

Memory Technology Devices (MTD) --->

# 上面这两个不知道会不会用到的数据,暂时可以编译成为模块即可!



Parallel port support --->

Parallel port support

PC-style hardware

Multi-IO cards (parallel and serial)

Support for PCMCIA management for PC-style ports

[*] IEEE 1284 transfer modes

# 平行串行端口,呵呵!与打印机相关性挺高的!编译成为模块即可!



Plug and Play support --->

[*] Plug and Play support

# 不?唆,这个当然要选择啊!



Block devices --->

# 这里面与储存装置有关,全部给他编成模块!当然,确定不需要的,

# 就不要编译咯!



ATA/ATAPI/MFM/RLL support --->

# 底下的设定你可以保留默认值,来让核心支持较为完整!

# 不过,既然我们已经知道主机的硬件与主机板的芯片,当然可以作一些选择?!

<*> ATA/ATAPI/MFM/RLL support

<*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support

--- Please see Documentation/ide.txt for help/info on IDE drives

[ ] Support for SATA (deprecated; conflicts with libata SATA driver)

# 这个不要选!因为 SATA 的新的驱动程序是包含在 SCSI 中的!

[ ] Use old disk-only driver on primary interface

<*> Include IDE/ATA-2 DISK support

[*] Use multi-mode by default

PCMCIA IDE support

<*> Include IDE/ATAPI CDROM support

<*> Include IDE/ATAPI FLOPPY support

# 上面这两个就必选!让核心主动支持 CDROM 与软盘!



SCSI emulation support

[ ] IDE Taskfile Access

--- IDE chipset support/bugfixes

<*> generic/default IDE chipset support

[*] CMD640 chipset bugfix/support

[*] CMD640 enhanced support

[*] PNP EIDE support

# 上面这几个也可以挑选起来,尤其会比较适合 Pentium 的主机!



# 底下这几个则主要与主机板的芯片组有关啊!

[*] PCI IDE chipset support

[*] Sharing PCI IDE interrupts support

[ ] Boot off-board chipsets first support

<*> Generic PCI IDE Chipset Support

<*> RZ1000 chipset bugfix/support

[*] Generic PCI bus-master DMA support

# 底下这几个请特别挑选一番!

[ ] Force enable legacy 2.0.X HOSTS to use DMA

[*] Use PCI DMA by default when available

[ ] Enable DMA only for disks

< > AEC62XX chipset support

< > ALI M15x3 chipset support

[ ] ALI M15x3 WDC support (DANGEROUS)

< > AMD and nVidia IDE support

< > ATI IXP chipset IDE support

< > CMD64{3|6|8|9} chipset support

< > Compaq Triflex IDE support

< > CY82C693 chipset support

< > Cyrix/National Semiconductor CS5530 MediaGX chipset support

< > HPT34X chipset support

< > HPT36X/37X chipset support

< > National SCx200 chipset support

<*> Intel PIIXn chipsets support

<*> IT821X IDE support

< > NS87415 chipset support

<*> PROMISE PDC202{46|62|65|67} support

[ ] Special UDMA Feature

<*> PROMISE PDC202{68|69|70|71|75|76|77} support

[*] Enable controller even if disabled by BIOS

< > ServerWorks OSB4/CSB5/CSB6 chipsets support

< > Silicon Image chipset support

< > SiS5513 chipset support

< > SLC90E66 chipset support

< > Tekram TRM290 chipset support

< > VIA82CXXX chipset support

[ ] Other IDE chipset support

[ ] IGNORE word93 Validation BITS

# 因为我的是 Intel 芯片组的主机板,所以全部无关的我都没有选择。

# 不过,为了您自己好~其实,上面绝大部分的资料都给他做成模块比较妥当!



SCSI device support --->

# 不论你有没有 SCSI 装置,你都必须要激活 SCSI 的支持!理由有二:

# 1. 因为 USB 装置用的就是仿真 SCSI 啊!

# 2. 因为 SATA 的设定项目就在这里面!

< > RAID Transport Class

SCSI device support

[*] legacy /proc/scsi/ support

--- SCSI support type (disk, tape, CD-ROM)

SCSI disk support

SCSI tape support

SCSI OnStream SC-x0 tape support

SCSI CDROM support

[*] Enable vendor-specific extensions (for SCSI CDROM)

SCSI generic support

SCSI media changer support

--- Some SCSI devices (e.g. CD jukebox) support multiple LUNs

[*] Probe all LUNs on each SCSI device

[*] Verbose SCSI error reporting (kernel size +=12K)

[*] SCSI logging facility

SCSI Transport Attributes --->

SCSI low-level drivers --->

# 在这个项目当中,都保留默认值即可不过,

# 如果你有 SATA 的硬盘,请确认底下已经编译起来了!

Serial ATA (SATA) support

AHCI SATA support

ServerWorks Frodo / Apple K2 SATA support

Intel PIIX/ICH SATA support

Promise SATA TX2/TX4 support

Pacific Digital SATA QStor support

VIA SATA support

VITESSE VSC-7174 SATA support

PCMCIA SCSI adapter support --->



Old CD-ROM drivers (not SCSI, not IDE) --->

Multi-device support (RAID and LVM) --->

# 还记得不久之前才谈过的 LVM 吧?这里当然要选择?!

[*] Multiple devices driver support (RAID and LVM)

<*> RAID support

Linear (append) mode

RAID-0 (striping) mode

RAID-1 (mirroring) mode

RAID-4/RAID-5 mode

RAID-6 mode

Multipath I/O support

Faulty test module for MD

Device mapper support



Fusion device support --->

IEEE 1394 (FireWire) support --->

I2O device support --->

# 上面也编译成为模块即可!那个 IEEE 1394 就是我们常听到的『火线』。



Network device support --->

# 您总是有网络卡吧?所以?~这里得要选择一个网络卡装置啊!

[*] Network device support

Dummy net driver support

Bonding driver support

EQL (serial line load balancing) support

Universal TUN/TAP device driver support

General Instruments Surfboard 1000

ARCnet devices --->

PHY device support --->

Ethernet (10 or 100Mbit) --->

# 这里面含有的就是 10/100 的网络卡!大部分都可以编成模块。

RealTek RTL-8129/8130/8139 PCI Fast Ethernet Adapter support

VIA Rhine support

# 上面这两个就是有名的螃蟹卡与 D-Link 530 所用的驱动程序。

Ethernet (1000 Mbit) --->

# 这里面含有的就是 10/100/1000 的网络卡!大部分都可以编成模块。

Ethernet (10000 Mbit) --->

Token Ring devices --->

Wireless LAN (non-hamradio) --->

PCMCIA network device support --->

Wan interfaces --->

[*] FDDI driver support

< > Digital DEFEA and DEFPA adapter support

SysKonnect FDDI PCI support

PLIP (parallel port) support

<*> PPP (point-to-point protocol) support

[*] PPP filtering

PPP support for async serial ports

PPP support for sync tty ports

PPP Deflate compression

# 如果您有 ADSL 拨接的话,呵呵!PPP 的装置也要选择上喔!

< > PPP BSD-Compress compression

SLIP (serial line) support

[*] CSLIP compressed headers

[*] Keepalive and linefill

[ ] Six bit SLIP encapsulation

[*] Fibre Channel driver support



ISDN subsystem --->

Telephony Support --->

# 上面这两个我都没有,所以并没有选择!



Input device support --->

# 这里面含有鼠标、键盘、摇杆等等的输入装置,也是需要挑选的!

--- Generic input layer (needed for keyboard, mouse, ...)

--- Userland interfaces

--- Mouse interface

# 底下这三个与鼠标有关啦!也可以选择的!

[ ] Provide legacy /dev/psaux device

(1024) Horizontal screen resolution

(768) Vertical screen resolution

Joystick interface

< > Touchscreen interface

<*> Event interface

< > Event debugging

--- Input Device Drivers

--- Keyboards --->

[*] Mouse --->

[ ] Joysticks --->

[ ] Touchscreens --->

# 我没有摇杆也没有触控式面版,所以上面两个不选!

[*] Miscellaneous devices --->

Hardware I/O ports --->



Character devices --->

# 里面的资料也很多,也要注意 AGP 显示卡的芯片组啊!

# 而因为鸟哥的环境是 Intel 的芯片,所以自然将那个编进去,

# 其它的成为模块即可!其它的除非确定不需要,否则保留默认值即可!

<*> /dev/agpgart (AGP Support)

ALI chipset support

ATI chipset support

AMD Irongate, 761, and 762 chipset support

AMD Opteron/Athlon64 on-CPU GART support

<*> Intel 440LX/BX/GX, I8xx and E7x05 chipset support

NVIDIA nForce/nForce2 chipset support

SiS chipset support

Serverworks LE/HE chipset support

VIA chipset support

Transmeta Efficeon support

Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)

3dfx Banshee/Voodoo3+

ATI Rage 128

ATI Radeon

Intel I810

Intel 830M, 845G, 852GM, 855GM, 865G

i830 driver

i915 driver

Matrox g200/g400

SiS video cards

Via unichrome video cards

< > Savage video cards

I2C support --->

# 还记得我们去侦测主机板的温度与压力吧?呵呵!那就是透过核心的

# 这个 I2C 的模块功能了!预设情况下,这个项目都有支持,所以,

# 保留默认值即可。


Dallas's 1-wire bus --->

# 这个与某些热感应装置有关,可以不编译,也可以保留编成模块即可!

Hardware Monitoring support --->

# 这个也与 I2C 有点关系,他主要可以接受硬件的侦测,

# 所以在这个项目内您会看到 LM_XX 之类的模块!啊!就保留模块即可!


Misc devices --->

Multimedia Capabilities Port drivers --->

Multimedia devices --->

# 类似影像撷取卡、FM 广播声卡等等,可在这里设定!

# 如果您的主机是用作服务器,那么这里或许可以不要选择。

# 当然啦,这个项目几乎都是模块,保留默认值也不错!


Graphics support --->

# 嘿嘿!重点之一,显示卡的芯片组~刚刚前面提到的都是主机板的

# 对显示卡的总线支持 (PCI-E 与 AGP) ,这里则是针对显示卡芯片!

# 鸟哥的显示卡是 NVidia 的,所以将他选择即可!其它的可以编成模块!

<*> Support for frame buffer devices

--- Enable Video Mode Handling Helpers

--- Enable Tile Blitting Support

Cirrus Logic support

< > Permedia2 support

< > CyberPro 2000/2010/5000 support

< > Arc Monochrome LCD board support

[ ] Chips 69000 display support

[ ] IMS Twin Turbo display support

VGA 16-color graphics support

[*] VESA VGA graphics support

< > Hercules mono graphics support

nVidia Framebuffer Support

nVidia Riva support

[ ] Enable DDC Support

[ ] Lots of debug output from Riva(nVidia) driver

Matrox acceleration

[*] Millennium I/II support

[*] Mystique support

[*] G100/G200/G400/G450/G550 support

Matrox I2C support

G400 second head support

[*] Multihead support

< > ATI Radeon display support (Old driver)

ATI Radeon display support

[*] DDC/I2C for ATI Radeon support

[ ] Lots of debug output from Radeon driver

ATI Rage128 display support

ATI Mach64 display support

[*] Mach64 CT/VT/GT/LT (incl. 3D RAGE) support

[*] Mach64 generic LCD support (EXPERIMENTAL)

[ ] Rage XL No-BIOS Init support

[*] Mach64 GX support

SiS/XGI display support

NeoMagic display support

IMG Kyro support

3Dfx Banshee/Voodoo3 display support

3Dfx Voodoo Graphics (sst1) support

< > Cyberblade/i1 support

Trident support

< > Epson S1D13XXX framebuffer support

< > Virtual Frame Buffer support (ONLY FOR TESTING!)

Console display driver support --->

Logo configuration --->

[*] Backlight & LCD device support --->

Sound --->

# 这个是声卡啊!鸟哥的机器上面没有声卡,所以直接不选。

# 您可以进入后选择您的声卡啊!
USB support --->

# 这个则是 USB 的驱动模块!还记得我们在硬件维护的地方讲过的

# USB 的模块名称吧?呵呵!在里面找找吧!

# 其实这里面鸟哥仅保留默认值,然后再加上选择 USB 2.0 的支持,

# 其它的 usb 装置全部给他勾成模块!这样就 OK 啦!

MMC/SD Card support --->

# 这是多媒体卡 (multi-media card) ,鸟哥是用不到的,所以不选!


InfiniBand support --->

SN Devices --->

# 这两个应该也用不到,所以保留默认值即可!

在这里面真的很重要,因为很多资料都与你的硬件有关。核心推出时的默认值是比较符合一般状态的, 所以很多资料其实保留默认值就可以编的很不错了!不过,也因为较符合一般状态, 所以核心额外的编译进来很多跟你的主机系统不符合的资料,例如网络卡装置~ 你可以针对你的主机板与相关硬件来进行编译。不过,还是要记得有『未来扩充性』的考量! 之前鸟哥不是谈过吗,我的网络卡由螃蟹卡换成 3Com 时,核心捉不到~ 因为......我并没有将 3Com 的网络卡编译成为模块啊! @_@


--------------------------------------------------------------------------------
File systems

档案系统的支持也是很重要的一项核心功能!因为如果不支持某个档案系统, 那么我们的 Linux kernel 就无法认识,当然也就无法使用啦!例如 Quota, NTFS 等等特殊的 filesystem 。底下是详细的资料?!

<*> Second extended fs support

[*] Ext2 extended attributes

[*] Ext2 POSIX Access Control Lists

[*] Ext2 Security Labels

[ ] Ext2 execute in place support

<*> Ext3 journalling file system support

[*] Ext3 extended attributes

[*] Ext3 POSIX Access Control Lists

[*] Ext3 Security Labels

[ ] JBD (ext3) debugging support

# EXT2/EXT3 是必选的吧!将他选择起来先!

Reiserfs support

[ ] Enable reiserfs debug mode

[*] Stats in /proc/fs/reiserfs

[*] ReiserFS extended attributes

[*] ReiserFS POSIX Access Control Lists

[*] ReiserFS Security Labels

JFS filesystem support

[*] JFS POSIX Access Control Lists

[*] JFS Security Labels

[ ] JFS debugging

[ ] JFS statistics

XFS filesystem support

[*] XFS Quota support

[*] XFS Security Label support

[*] XFS POSIX ACL support

Minix fs support

# 上面这几个 filesystem 不知道什么时候会用到,当然是编成模块比较好!

ROM file system support

[*] Inotify file change notification support

[*] Quota support

< > Old quota format support

<*> Quota format v2 support

# Quota 够重要吧!务必要将他圈选起来才行喔!


Kernel automounter support

Kernel automounter version 4 support (also supports v3)

< > Filesystem in Userspace support

CD-ROM/DVD Filesystems --->

<*> ISO 9660 CDROM file system support

[*] Microsoft Joliet CDROM extensions

[*] Transparent decompression extension

UDF file system support

# 注意!那个 ISO 9660 的 filesystem 务必要挑选!


DOS/FAT/NT Filesystems --->

MSDOS fs support

VFAT (Windows-95) fs support

(950) Default codepage for FAT

(big5) Default iocharset for FAT

NTFS file system support

[ ] NTFS debugging support (NEW)

[*] NTFS write support

# 哇!不但可以选择预设是中文语系,而且,还可以支持 NTFS

# 可擦写哩!这一版真强!不过,NTFS 能否真的可以写入,不确定~


Pseudo filesystems --->

[*] /proc file system support

[*] /proc/kcore support

[*] Virtual memory file system support (former shm fs)

[*] HugeTLB file system support

< > Relayfs file system support

# 这几个是一定要的啦!



Miscellaneous filesystems --->

# 这里面的资料可以选择预设即可!



Network File Systems --->

NFS file system support

[*] Provide NFSv3 client support

[*] Provide client support for the NFSv3 ACL protocol extension

NFS server support

[*] Provide NFSv3 server support

[*] Provide server support for the NFSv3 ACL protocol extension

[*] Provide NFS server over TCP support

SMB file system support (to mount Windows shares etc.)

[*] Use a default NLS

(cp950) Default Remote NLS Option

# 这里可以加上这个预设参数,支持中文语系啊!

CIFS support (advanced network filesystem for Samba, Window and othe

[ ] CIFS statistics

[*] CIFS extended attributes (EXPERIMENTAL)

[*] CIFS POSIX Extensions (EXPERIMENTAL)

[ ] CIFS Experimental Features (EXPERIMENTAL)

NCP file system support (to mount NetWare volumes)

[*] Packet signatures

[*] Proprietary file locking

[*] Clear remove/delete inhibit when needed

[*] Use NFS namespace if available

[*] Use LONG (OS/2) namespace if available

[*] Lowercase DOS filenames

[*] Use Native Language Support

[*] Enable symbolic links and execute flags

Coda file system support (advanced network fs)

[ ] Use 96-bit Coda file identifiers

# 其实大部分仍然是模块的项目啦!


Partition Types --->

# 里面含有 Minix, sun 等等的磁盘分割表的格式支持,

# 您如果确定不需要,可以将他拿掉就是了!

Native Language Support --->

(utf8) Default NLS Option

<*> Traditional Chinese charset (Big5)

# 其它都保留默认值即可,这两个项目稍微确认一下!

这部份也是有够麻烦~因为涉及核心是否能够支持某些档案系统,以及某些操作系统支持的 partition table 的支持项目。在进行选择时,也务必要特别的小心在意喔! 尤其是我们常常用到的网络操作系统 (NFS/Samba 等等),以及基础篇谈到的 Quota 等, 您都得要勾选啊!否则是无法被支持的。比较有趣的是 NTFS 在这一版的核心里面竟然有支持可写入的项目, 着实让鸟哥吓了一跳了!^_^

--------------------------------------------------------------------------------

Security options

这一部份与安全性比较有关。几乎保留默认值即可,仔细注意一下 SELinux 的项目, 该项目是美国国家安全局发展的 Linux 细部安全维护控件目,需要勾选才行!

--------------------------------------------------------------------------------

Cryptographic options

这部份则是加密参数的设定。一般我们使用的帐号密码登入,利用的就是 MD5 这个加密机制,要让核心有支持才行啊!几乎所有的项目都给他做成模块即可! 不过 MD5 与 SHA1 必须要直接由核心支持比较好!

--- Cryptographic API

--- HMAC support

Null algorithms

MD4 digest algorithm

<*> MD5 digest algorithm

<*> SHA1 digest algorithm

SHA256 digest algorithm

SHA384 and SHA512 digest algorithms

Whirlpool digest algorithms

Tiger digest algorithms

DES and Triple DES EDE cipher algorithms

Blowfish cipher algorithm

Twofish cipher algorithm

Serpent cipher algorithm

AES cipher algorithms (i586)

CAST5 (CAST-128) cipher algorithm

CAST6 (CAST-256) cipher algorithm

TEA, XTEA and XETA cipher algorithms

ARC4 cipher algorithm

Khazad cipher algorithm

Anubis cipher algorithm

Deflate compression algorithm

Michael MIC keyed digest algorithm

CRC32c CRC algorithm


--------------------------------------------------------------------------------
取用旧资料与储存设定

还有底下这两个项目:

Load an Alternate Configuration File

Save Configuration to an Alternate File

这两个项目分别是储存刚刚做好的所有项目的设定资料,另一个则是将来自其它人作的选择给他读入! 事实上,刚刚我们所做的设定只要在离开时选择 SAVE ,那么这些项目 通通会记录到目前这个目录下的 .config 档案内。 而我们也可以使用上面提到的 Save Configuration 这个项目来将刚刚做完的设定储存成另外的档案, 做成这个档案的好处是,你可以在下次在其它版本的核心作选择时,直接以 Load 来将这个档案的设定项目读入,这样可以减少您还要重新挑选一遍的困境啊!

在最初的画面上面选择 项目后,画面会出现一个询问你是否要储存的窗口,选择 Yes 后, 您所有的选择资料就都会被纪录到 .config 这个隐藏档案里面去了!有兴趣的话, 您可以使用 vi 去到该档案查阅一下,就知道你做过哪些设定?! ^_^

要请您注意的是,上面的资料主要是适用在鸟哥的个人机器上面的, 目前鸟哥比较习惯使用原本 distributions 提供的预设核心,因为他们也会主动的进行更新, 所以鸟哥就懒的自己重编核心了~ ^_^

此外,因为鸟哥重视的地方在于『网络服务器』上面,所以里头的设定少掉了相当多的个人桌上型 Linux 的硬件编译!所以,如果你想要编译出一个适合您的机器的核心, 那么可能还有相当多的地方需要来修正的!不论如何,请随时以 Help 那个选项来看一看内容吧!反正 Kernel 重编的机率不大!花多一点时间重新编译一次! 然后将该编译完成的参数档案储存下来,未来就可以直接将该档案叫出来读入了! 所以花多一点时间安装一次就好!那也是相当值得的!

4. 核心的编译与安装

  4.1 编译的流程

  4.2 模块安装时的注意事项:

  4.3 安装旧版与新版的核心成多重开机系统\

核心的编译与安装

做完核心项目的选择?~接下来呢?当然是编译与安装啦!核心的编译与安装很简单啦!来看看吧!

--------------------------------------------------------------------------------

编译的流程

整个编译的过程真的很简单!作这个动作即可:

[root@linux linux-2.6.14.2]# make clean

# 将以前曾经进行过的 *.o 档案删除掉,这样比较不会产生新旧版本的误差!



[root@linux linux-2.6.14.2]# make bzImage

# 制作出核心档案!这个重要!过程很长啊!而且那个是大写的 I 喔!

[root@linux linux-2.6.14.2]# make modules

# 制作出模块相关的档案!

只要这三个动作,您的核心与模块就通通制作出来了!不过,制作出来的资料还是被放置在 /usr/src/linux-2.6.14.2 这个目录下~并没有被放到系统的相关路径中喔! 在上面的过程当中,如果有发生任何错误的话,那么很可能是核心项目的挑选选择的不好, 可能您需要重新以 make menuconfig 再次的检查一下您的相关设定喔! 如果还是无法成功的话,那么或许将原本的核心资料内的 .config 档案,复制到您的核心原始文件目录下, 然后据以修改,应该就可以顺利的编译出您的核心了。注意到,下达了 make bzImage 后, 最后的结果应该会像这样:

Root device is (3, 2)

Boot sector 512 bytes.

Setup is 7016 bytes.

System is 1721 kB

Kernel: arch/i386/boot/bzImage is ready (#1)

[root@linux linux-2.6.14.2]# ll arch/i386/boot/bzImage

-rw-r--r-- 1 root root 1770185 Dec 2 14:32 arch/i386/boot/bzImage

如此一来,您就可以发现您的核心已经编译好而且放置在 /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage 里面?~那个就是我们的核心档案!最重要就是他啦!我们等一下就会安装到这个档案哩! 然后就是编译模块的部分?~ make modules 进行完毕后,就等着安装啦! ^_^

--------------------------------------------------------------------------------

模块安装时的注意事项:


要强调的还是得强调,是这样的,在上面的介绍里,我们不是说过 Kernel 的外挂模块是放在 /lib/modules/`uname -r` 吗?好了,那么现在来想一想,如果你的『同一版本的核心编译两次』 的情况下,会怎样?这是很可能的情况呢!怎么说?万一你的第一次的编译没有成功的话, 那总得编译第二次吧?而由于第一次编译完成之后,你的一些模块已经放在 /lib/modules/2.6.14.2 当中了( 以这一次我们使用的核心版本为例 ),那么下次在编译完成后,核心的模块还是会放在 /lib/modules/2.6.14.2 这个目录下,那不是重复了吗?有些模块会被重复放置,导致问题重重的~ 因此上,如果同一个版本的核心被编译两次以上的话,那么请将 /lib/modules 里面的该版核心先移动掉吧!举个例子来说,假如你的核心版本是 2.6.14.2 ,而又要对 2.6.14.2 重新编译一次,那么就必需要:

[root@linux ~]# cd /lib/modules

[root@linux modules]# mv 2.6.14.2 2.6.14.2.old

这样才行呢!不然安装之后还是会有问题的呦!请特别留意呢!

处理完毕后,开始要安装模块了~安装的方法很简单,直接这样做就好了!

[root@linux linux-2.6.14.2]# make modules_install


整个模块就安装到 /lib/modules 里面去喔~一般来说,目录名称会是 /lib/modules/2.6.14-2 ,但是如果您有填写核心附版本的话, 就会出现类似 2.6.14-1.1644_FC4 之类的目录名称?! ^_^ 接下来,就是准备要进行核心的安装了!哈哈!又跟 grub 有关?~

--------------------------------------------------------------------------------

安装旧版与新版的核心成多重开机系统

在编译好核心之后,我们已经知道核心档案放置在 /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage ,而我们也晓得一部主机是可以做成多重开机系统的!这样说,应该知道鸟哥想要干嘛了吧? 呵呵!对啦!我们将同时保留旧版的核心,并且新增新版的核心在我们的主机上面。


这样做有什么好处呢?最大的好处是可以确保能够顺利开机啦!因为核心虽然被编译成功了, 但是并不保证我们刚刚挑选的核心项目完全适合于目前这部主机系统, 可能有某些地方我们忘记选择了,这个将导致新核心无法顺利驱动整个主机系统,更差的情况是, 您的主机无法成功开机完成!此时,如果我们保留旧的核心, 呵呵!若新核心测试不通过,就用旧核心来激活啊!嘿嘿!保证比较不会有问题嘛!

关于多重开机的设定详情请参考 开机关机流程与 Loader 那一章,我这里不详细的说明了。我只假设您与我一样使用 grub 开机管理程序, 那么只要这样做,就能够设定好您的新核心了!

1. 移动新核心到 /boot 里面去:

[root@linux ~]# cp /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage \

> /boot/vmlinuz-2.6.14-2

# 就一般的习惯而言,鸟哥建议您将核心档名设定成以 vmlinuz 为首的名称,

# 比较容易管理啦!

[root@linux ~]# cp /usr/src/linux-2.6.14.2/System.map \

> /boot/System.map-2.6.14-2



2. 修改 grub 设定档

[root@linux ~]# vi /boot/grub/menu.lst

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title VBird linux 2.6.14-2

root (hd0,0)

kernel /vmlinuz-2.6.14-2 ro root=/dev/hda2 rhgb quiet vga=788

title Fedora Core (2.6.11-1.1369_FC4)

root (hd0,0)

kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda2 rhgb quiet vga=788

initrd /initrd-2.6.11-1.1369_FC4.img

# 这个是鸟哥我的个人环境,您请依照您的主机系统来编写这个档案!


嘿嘿!这样才算成功的完成了整个核心的编译与安装~接下来呢? 当然就是 reboot 去测试一下新核心是否可以顺利的激活您的系统啦! 加油的啦!

引用:
5. 额外(单一)模块编译:

  5.1 单一模块编译: depmod

  5.2 核心模块管理: lsmod, modinfo, modprobe, insmod, rmmod...



额外(单一)模块编译:


我们现在知道核心所支持的功能当中,有直接编译到核心内部的,也有使用外挂模块的,外挂模块可以简单的想成 就是驱动程序 啦!那么也知道这些核心模块依据不同的版本, 被分别放置到 /lib/modules/`uname -r`/ 目录中,各个硬件的驱动程序则是放置到 /lib/modules/`uname -r`/kernel/drivers/ 当中!而这些模块与装置代号的对应, 就必须要被写入 /etc/modprobe.conf 档案当中了。更多与 modprobe.conf 的数据请参考 开机流程与 loader 章节?!

另外,关于模块的管理方面,我们也已经在 开机流程与 loader 当中稍微提过了。事实上,我们的 Linux 核心真的是越来越聪明了, 一般来说,当我们的软件有使用到核心的某项功能时,其实核心是会『主动的』去加载该功能的! 根本不需要使用什么 modprobe 还是 insmod 之类的指令去加载呢!不过,有时候某些程序写的不好时, 确实可能需要我们手动来加载模块就是了。


那么在 Linux kernel 2.6 版里面的模块文件名是怎样呢?这个得要特别说明一下?。在 kernel 2.4 版以前,模块的文件名都是 *.o 的,例如 vfat.o 这个档案系统模块就放在:

/lib/modules/`uname -r`/kernel/fs/vfat/vfat.o

但是在 kernel 2.6 版以后,所有的核心模块都被改名字成为 *.ko 了!所以,如果你有 vfat 的模块, 他就会被放置到:

/lib/modules/`uname -r`/kernel/fs/vfat/vfat.ko

请特别留意这个差异喔! ^_^。此外,由于我们的核心原本就有提供很多的核心工具给硬件开发商来使用, 而硬件开发商也需要针对核心所提供的功能来设计他们的驱动程序模块,因此, 我们如果想要自行使用硬件开发商所提供的模块来进行编译时,就需要使用到核心所提供的原始档当中, 所谓的标头档案 (header include file) 来取得驱动模块所需要的一些函式库或标头的定义啦! 也因此我们常常会发现到,如果想要自行编译核心模块时,就得要拥有核心原始码嘛!

那核心原始码我们知道他是可能放置在 /usr/src/ 底下,早期的核心原始码被要求一定要放置到 /usr/src/linux/ 目录下,不过,如果您有多个核心在一个 Linux 系统当中,而且使用的原始码并不相同时, 呵呵~问题可就大了!所以,在 2.6 版以后,核心使用比较有趣的方法来设计他的原始码放置目录, 那就是以 /lib/modules/`uname -r`/build 及 /lib/modules/`uname -r`/source 这两个连结档来指向正确的核心原始码放置目录。如果以我们刚刚由 kernel 2.6.14.2 建立的核心模块来说, 那么他的核心模块目录底下有什么咚咚?

[root@linux ~]# ls -l /lib/modules/2.6.14.2/

lrwxrwxrwx 1 root root 23 Dec 2 15:45 build -> /usr/src/linux-2.6.14.2

drwxr-xr-x 9 root root 4096 Dec 2 15:46 kernel

-rw-r--r-- 1 root root 216725 Dec 2 15:46 modules.alias

-rw-r--r-- 1 root root 69 Dec 2 15:46 modules.ccwmap

-rw-r--r-- 1 root root 176206 Dec 2 15:46 modules.dep

-rw-r--r-- 1 root root 739 Dec 2 15:46 modules.ieee1394map

-rw-r--r-- 1 root root 206 Dec 2 15:46 modules.inputmap

-rw-r--r-- 1 root root 16383 Dec 2 15:46 modules.isapnpmap

-rw-r--r-- 1 root root 175001 Dec 2 15:46 modules.pcimap

-rw-r--r-- 1 root root 83299 Dec 2 15:46 modules.symbols

-rw-r--r-- 1 root root 231507 Dec 2 15:46 modules.usbmap

lrwxrwxrwx 1 root root 23 Dec 2 15:45 source -> /usr/src/linux-2.6.14.2

其中比较有趣的除了那两个连结档之外,还有那个 modules.dep 档案也挺有趣的, 那个档案是记录了核心模块的相依属性的地方,依据该档案,我们可以简单的使用 modprobe 这个指令来加载模块呢!至于核心原始码提供的标头档,在上面的案例当中, 则是放置到 /usr/src/linux-2.6.14.2/include/ 目录中,当然就是藉由 build/source 这两个连结档案来取得目录所在的啦!^_^

--------------------------------------------------------------------------------

单一模块编译

想象两个情况:

如果我的预设核心忘记加入某个功能,而且该功能可以编译成为模块,不过, 预设核心却也没有将该项功能编译成为模块,害我不能使用时,该如何是好?

如果 Linux 核心原始码并没有某个硬件的驱动程序 (module) ,但是开发该硬件的厂商有提供给 Linux 使用的驱动程序原始码,那么我又该如何将该项功能编进核心模块呢?

很有趣对吧!不过,在这样的情况下其实没有什么好说的,反正就是 『去取得原始码后,重新编译成为系统可以加载的模块』啊!很简单,对吧!^_^ 但是,上面那两种情况的模块编译行为是不太一样的,不过,都是需要 make, gcc 以及核心所提供的 include 标头档与函式库等等。

--------------------------------------------------------------------------------
硬件开发商提供的额外模块:

很多时候,可能由于核心预设的核心驱动模块所提供的功能您不满意, 或者是硬件开发商所提供的核心模块具有更强大的功能, 又或者该硬件是新的,所以预设的核心并没有该硬件的驱动模块时,那您只好自行由硬件开发商处取得驱动模块, 然后自行编译?!


如果您的硬件开发商有提供驱动程序的话,那么真的很好解决,直接下载该原始码,重新编译, 将他放置到核心模块该放置的地方后,呵呵!就能够使用了!举例来说,如果您不想使用核心原本提供的 Intel 网络卡模块,而想使用 Intel 官方释出的最新模块,例如下面这个例子:

模块说明与下载:http://downloadfinder.intel.com/scripts-df-external/Detail_Desc.aspx? agr=Y&Inst=Yes&ProductID=993&DwnldID=2896&strOSs=39&OSFullName=Linux*&lang=eng

您可以利用各种方法将他下载后,假设这个档案放置到 /root ,那么直接将他解压缩吧! 之后就可以读一读 INSTALL/README ,然后找一下 Makefile ,就能够编译了。整体流程有点像这样:

1. 将档案解压缩:

[root@linux ~]# cd /usr/local/src

[root@linux src]# tar -zxvf /root/e100-3.4.14.tar.gz

[root@linux src]# cd e100-3.4.14


2. 开始进行编译与安装:

[root@linux e100-3.4.14]# vi README <==注意查一下该档案内容

[root@linux e100-3.4.14]# cd src

[root@linux src]# make

# 此时您会看到出现如下这一行:

# make[1]: Entering directory `/usr/src/kernels/2.6.13-1.1532_FC4-i686'

# 这代表这个驱动程序在编译时,会去读取的核心原始码 include file

# 的目录所在!有兴趣的朋友,务必查阅一下 Makefile 啦!

[root@linux src]# ls -l

-rw-r--r-- 1 root root 77908 Jul 2 08:24 e100.c

-rw-r--r-- 1 root root 351351 Dec 5 00:48 e100.ko

-rw-r--r-- 1 root root 4775 Dec 5 00:48 e100.mod.c

-rw-r--r-- 1 root root 39684 Dec 5 00:48 e100.mod.o

-rw-r--r-- 1 root root 312564 Dec 5 00:48 e100.o

-rw-r--r-- 1 root root 21092 Jul 2 08:24 ethtool.c

-rw-r--r-- 1 root root 43258 Jul 2 08:24 kcompat.h

-rw-r--r-- 1 root root 9610 Jul 2 08:24 Makefile


3. 开始将该模块移动到核心目录,并且更新模块相依属性!

[root@linux src]# cp e100.ko \

> /lib/modules/`uname -r`/kernel/drivers/net

[root@linux src]# cd /lib/modules/`uname -r`

[root@linux 2.6.13-1.1532_FC4]# depmod -a


有趣吧!透过这样的动作,我们就可以轻易的将模块编译起来,并且还可以将他直接放置到核心模块目录中, 同时以 depmod 将模块建立相关性,未来就能够利用 modprobe 来直接取用啦!^_^ 但是需要提醒您的是,当自行编译模块时, 若您的核心有更新 (例如利用自动更新机制进行线上更新) 时,则您必须要重新编译该模块一次, 重复上面的步骤!才行!因为这个模块仅针对目前的核心来编译的啊!对吧!

--------------------------------------------------------------------------------

利用旧有的核心原始码进行编译:

举个例子来说,鸟哥目前 FC4 的核心就是 2.6 版,而且也有 NTFS 的原始码,只不过, FC4 就是没有将这个模块给他编译起来!那我能否使用目前的核心原始码进行 NTFS 档案系统的模块编译呢?当然可以啊!不过,我是否需要整个核心编译的过程从头来一次呢? 呵呵!当然不需要啊!否则~多麻烦~那该怎么作?


很简单啦~我们首先到目前的核心原始码所在目录下达 make menuconfig , 然后将 NTFS 的选项设定成为模块,之后直接下达:

make fs/ntfs/

那么 ntfs 的模块就会自动的被编译出来了!可惜的是,预设的 FC4 核心原始码并没有附上所有的程序代码, 仅有提供相关的 Makefile 档案而已,伤脑筋~ 因此,您仅能以我们刚刚才建立的 /usr/src/linux-2.6.14.2 这个目录, 直接下达 make fs/ntfs 来建立起 ntfs.ko 这个模块~ 然后将该模块复制到 /lib/modules/2.6.14.2/kernel/fs/ntsf/ 目录下, 再去到 /lib/modules/2.6.14.2 底下执行 depmod -a ,呵呵~ 就可以在原来的核心底下新增某个想要加入的模块功能?~ ^_^

--------------------------------------------------------------------------------

核心模块管理: lsmod, modinfo, modprobe, insmod, rmmod...


核心与核心模块是分不开的,至于驱动程序模块在编译的时候,更与核心的原始码功能分不开~ 因此,您必须要先了解到:核心、核心模块、驱动程序模块、核心原始码与标头档案的相关性, 然后才有办法了解到为何编译驱动程序的时候老是需要找到核心的原始码才能够顺利编译! 然后也才会知道,为何当核心更新之后,自己之前所编译的核心模块会失效~

此外,与核心模块有相关的,还有那个很常被使用的 modprobe 指令, 以及开机的时候会读取到的模块定义数据文件 /etc/modprobe.conf , 这些资料您也必须要了解才行~相关的指令说明我们已经在开机流程与 loader 文章内谈过了, 您应该要自行前往了解喔!
文章评论

共有 3 条评论

  1. balini 于 2009-07-22 15:04:47发表:

    学习了

  2. lz307 于 2006-11-28 10:25:42发表:

    好文 谢谢:ha3nd

  3. kt69608 于 2006-11-27 21:39:17发表: