我们在前面的几个章节介绍了 Linux 其实指的就是核心而已,而整个 Linux 的世界当中,最重要的也就是核心了!他控制了您的服务器的所有硬件,也控制了所有的您想要的功能,例如软件磁盘阵列(RAID)、各种适配卡的驱动模块、防火墙的新增功能等等。透过管理您的 Linux 核心,将可让您的服务器跑得更加的顺畅,也更稳定您的服务器所提供的相关服务呢!此外,为了让硬件驱动程序与相关的核心功能修订容易,所以 Linux 核心是支持『模块化』的,也就是说,您核心所想要的功能可以『后来才加挂上去』喔!那么如何加挂上去呢?这就需要了解一下所谓的『模块』了!当然,连同模块的相关指令就得也要会用啰!^_^ |
这个『核心』是除了 BIOS 之外,一个操作系统中最早被启动的东西,他包含了所有可以让硬件与软件工作的信息,所以,如果没有搞定核心的话,那么你的系统肯定会有点小问题!好了,那么是不是将『所有目前核心有支持的东西都给他编译进去我的核心中,那就可以支持目前所有的硬件与可执行的工作啦!』, 这话说的是没错啦,但是你是否曾经看过一个为了怕自己今天出门会口渴、会饿、会冷、会热、会被车撞、会摔跤、会被性骚扰,而在自己的大包包里面放了大瓶矿 泉水、便当、厚外套、短裤、防撞钢梁、止滑垫、电击棒....等一大堆东西,结果却累死在半路上的案例吗?当然有!但是很少啦!我相信不太有人会这样做! ( 会这么做的人通常都已经在医院了~ ) 取而代之的是会看一下天气,冷了就只带外套,热了就只带短衣、如果穿的漂亮一点又预计晚点回家就多带个电击棒、出远门到没有便利商店的地方才多带矿泉 水....说这个干什么!对啦!就是要您了解到,核心的编译重点在于『你要你的 Linux 作什么?』,是啦!如果没有必要的工作,就干脆不要加在你的核心当中了!这样才能让你的 Linux 跑得更稳、更顺畅!这也是为什么我们要编译核心的最主要原因了!
说到这里突然想到以前国军研究的『经国号战斗机』事件,在当时,经国号里头的配备都是『最棒的!』包括测量仪器、瞄准配备、武器系统等等,但是呢,却配上一部普普通通的客机用引擎!挖哩ㄌㄟ?最早期试飞的时候,经国号竟然只能『在跑道上滑行!』真是悲哀!同样的道理, Linux 的核心也是这样的,如果你的硬件与核心之间没有办法达到良好的配合,那么 Linux 确实可能会跑得不很顺畅!!
Linux 的核心有几个主要的特色,除了『Kernel 可以随时、随各人喜好而更动』之外,Kernel 的『版本更动次数太频繁』也是一个特点!所以啰,除非你有特殊需求,否则一次编译成功就可以啦!不需要随时保持最新的核心版本,而且也没有必要 ( 编译一次核心要粉久的ㄋㄟ! ) 。话说到这里又突然想到今天看到的一篇文章,大意是说老板想要雇用的人会希望是 Linux 的老手,因为他们比较容易了解问题的所在,除此之外,如果有任何问题发生,由于其使用 Linux 是可以随时修补漏洞的!但是如果是 Windows 的话,就得要将机器关闭,直到 MS 推出修补套件后才能再启用~
那么是否『我就一定需要在安装好了 Linux 之后就赶紧给他编译核心呢?』,老实说,『并不需要的』!这是因为几乎在每一个 distribution 当中,他们已经预设好了相当大量的模块了,所以几乎使用者常常或者可能会使用到的数据都已经被编译成为模块 ( 这个『模块』的意义后面会再解释 ) ,也因此,呵呵!我们使用者确实不太需要重新来编译核心!尤其是『一般的使用者,由于系统已经将核心编译的相当的适合一般使用者使用了,因此一般入门的使用者,基本上,不太需要编译核心』。OK!那么鸟哥闲闲没事干跑来写个什么东西?既然都不需要编译核心还写编译核心的分享文章,鸟哥卖弄才学呀!?很抱歉, VBird 虽然是个『不学有术』的混混,却也不会平白无故的写东西要您来指教~当然是有需要才会来编译核心啦!编译核心的时机可以归纳为几大类:
- 新功能的需求:
我需要新的功能,而这个功能只有在新的核心里面才有,那么为了获得这个功能,只好来重新编译我的核心了 ( 例如 iptables 这个防火墙机制只有在 2.4.xx 版本里面才有,而新出产的 AGP 显示卡,很多也需要新的核心推出之后,才能正常而且有效率的工作!) 再举个例子,在之前的 Red Hat 7.2 的版本中,由于预设是将 CD-ROM 编译成核心的『模块』,也就是说,核心本身还没有支持 CD-ROM 的功能,必须要挂上模块之后才能使用与读取这个 CD-ROM !是否觉得很麻烦呢?呵呵!那么这个时候,如果你想要直接让 kernel 支持 CD ROM 的话,就得要重新编译核心啰;
- 原本核心太过臃肿:
如果您是那种对于系统『稳定性』很要求的人,那么对于核心多编译了很多莫名其妙的功能而不太喜欢的时候,那么就可以重新编译核心来取消掉该功能啰;
- 与硬件的搭配稳定性:
由于原本 Linux 的核心大多是针对 Intel 的 CPU 来作开发的,所以如果你的 CPU 是 AMD 的系统时,有可能 ( 注意!只是有可能,不见得一定会如此 ) 会让系统跑得『不太稳!』就鸟哥的经验来看,使用旧的 Pentum 系列的旧机器安装 Linux 的结果,还没有胡乱当机的经验!但是安装在 K6-2, K6-3 上面的 Linux ,通常需要重新编译一下核心会比较稳定一些!
- 其它:
就是你需要特殊的环境需求时,就得自行设计你的核心啰!( 像是一些商业的软件包系统,由于需要较为小而美的操作系统,那么他们的核心就需要更简洁有力了!)
另外,需要注意重新编译核心虽然可以针对你的硬件作最佳化的步骤 ( 例如刚刚提到的 CPU 的问题! ) ,不过由于这些最佳化的步骤对于整体效能的影响可能还不到百分之五,因此如果是为了增加效能来编译核心的话,基本上,效益不大!然而,如果是针对『系统稳定性』来考虑的话,那么就有绝对充分的理由来支持您重新编译核心啰!
『如果系统已经运行很久了,而且也没有什么大问题,加上我又不增加冷门的硬设备,那么建议就不需要重新编译核心了!』,因为重新编译核心的最主要目的是『想让系统变的更稳!』既然您的 Linux 主机已经达到这个目的了,何必再编译核心?不过,就如同前面提到的,由于预设的核心不见得适合您的需要,加上预设的核心可能并无法与您的硬件配备相配合,所以 VBird 通常都是『一安装完 Linux ,第一个动作 ( 在还没有进行任何的设定之前,也没有上网,也没有更新套件等等,反正就是安装完毕 Linux ,第一次进入 Shell 时! ) 立刻就是以最新版本的 kernel 重新编译一个属于我这部主机的核心!』以让我的核心都能够相当的符合我的硬件配备,让系统运作的更顺畅!
然而由于『核心的主要工作是在控制硬件!』所以编译核心之前,请先了解一下您的硬件配备,与您这部主机的未来功能!由于核心是『越简单越好!』所以只要将这部主机的未来功能给他编进去就好了!其它的就不用去理他啦!
[root@test
root]# uname -r
2.4.20-8 # 这个是 Red Hat 7.2 的预设核心版本! |
1. 下载核心:
[root @test /root]# wget http://aerosol.ev.ncku.edu.tw/~vbird/download/linux-2.4.18.tar.gz <==由本站下载核心 --02:55:31-- http://aerosol.ev.ncku.edu.tw/%7Evbird/download/linux-2.4.18.tar.gz => `linux-2.4.18.tar.gz' Connecting to aerosol.ev.ncku.edu.tw:80... connected! HTTP request sent, awaiting response... 200 OK Length: 30,108,170 [application/x-gzip]
0K .......... .......... .......... .......... .......... 0% @
49.65 KB/s
最后在您的 /root 底下会产生一个名为 linux-2.4.18.tar.gz 的档案!那就适合新的 source 了! 2. 解压缩:
|
需要比较留意的是,核心所放置的地点『一定是 /usr/src/linux』这一个目录,然而由于不论哪一版核心编译都是这一个目录底下编译的,所以我个人相当的建议将每一版的核心都使用不同的目录来指定,然后以 link 的方式将该目录 link 到 linux 就可以啦!较为简单而且明了!底下的动作请都在 /usr/src/linux 底下进行呦!
[root @test
linux]# make mrproper
...... 会显示相当多的 rm 去除档案的讯息.... |
好了!现在您就已经具有相当完整的 Kernel source code 啰!接着下来则是选择编译模式咯!
[root @test linux]# make menuconfig |
出现如下图示:
看到上面的图示之后,你会发现有两个画面,一个是大框框内的反白光柱,另一个则是底下的
Select, Exit, 与 Help 光标,这几个组件的用法如下:
[root @test
linux]# make mrproper
<==去除 .o 的编译过的档案
[root @test linux]# make menuconfig <==以文字选单的模式进行编译! 底下开始编译! Code maturity level options ---> <==关于核心测试功能的 code 开启项目; [ ] Prompt for development and/or incomplete code/drivers <==因为我们没有要研发核心,所以不选 Loadable module support ---> <==这个就是我们之前说的『模块』啦! [*] Enable loadable module support <==让核心可以加载模块项目(必选) [ ] Set version information on all module symbols <==这个除非你要使用旧版本的数据,通常不选! [*] Kernel module loader <==也是必选啦! Processor type and features ---> <==选择 CPU 的型号项目 (Pentium-MMX) Processor family <==请依照您的实际情况选择您的 CPU 型号 < > Toshiba Laptop support <==底下这两个有使用到(笔记型计算机)才选择! < > Dell laptop support <M> /dev/cpu/microcode - Intel IA32 CPU microcode support <==如果是使用 Intel 的,可以编译成模块 <M> /dev/cpu/*/msr - Model-specific register support <==如果是使用 Intel 的,可以编译成模块 <M> /dev/cpu/*/cpuid - CPU information support <==如果是使用 Intel 的,可以编译成模块 (off) High Memory Support <==这个东西跟你的 RAM 有关系,RAM小于 1 GB 则使用 off 即可 [ ] Math emulation <==是否需要数值模拟?当然不需要!我们的 CPU 都够强了! [ ] MTRR (Memory Type Range Register) support <==P6 (PII等级以上) 并且要跑 X-Window 才加上吧,与 AGP 有关 [ ] Symmetric multi-processing support <==如果是双 CPU 的主机板才选择!否则就不要选了! [*] Local APIC support on uniprocessors (NEW) <==如果你的 CPU 有支持 APIC 则选择!通常可以选择起来啦! [*] IO-APIC support on uniprocessors <==跟上面的理由一致!选择起来吧! General setup ---> <==一般设定部分 [*] Networking support <==底下四个一定要选,跟基本的硬件装置有关! [*] PCI support (Any) PCI access mode [*] PCI device name database [ ] EISA support <==底下这两个则与主机板上面的插槽有关!除非笔记型,否则不选 [ ] MCA support [*] Support for hot-pluggable devices <==有点类似随插即用吧!可以选择呦! PCMCIA/CardBus support ---> < > PCMCIA/CardBus support <==因为我没有笔记型,所以不选,若为笔记型计算机,请选择! PCI Hotplug Support ---> [*] System V IPC <==底下这三个东西对于效能都不错!可以选择呦! [*] BSD Process Accounting [*] Sysctl support (ELF) Kernel core (/proc/kcore) format <==底下这几个东西可以编译成模块啦!但是我直接编到核心啰! <*> Kernel support for a.out binaries <*> Kernel support for ELF binaries <*> Kernel support for MISC binari [*] Power Management support < > Advanced Power Management BIOS support <==如果你想要你的 BIOS 接管电源管理,可以选择!我是不选的啦! Memory Technology Devices (MTD) ---> < > Memory Technology Device (MTD) support <==没必要就不要选吧! Parallel port support ---> < > Parallel port support <==由于我的主机上面并没有接打印机,所以没选!如果你有打印机的话,一定要选择 Plug and Play configuration ---> <*> Plug and Play support <==底下两个 随插即用! 马上勾选! <*> ISA Plug and Play support Block devices ---> <==一些比较冷门的储存机器!如果不确定的话,直接编译成模块吧!没关系的! <*> Normal PC floppy disk support < > XT hard disk support < > Compaq SMART2 support < > Compaq Smart Array 5xxx support < > Mylex DAC960/DAC1100 PCI RAID Controller support < > Loopback device support < > Network block device support < > RAM disk support Multi-device support (RAID and LVM) ---> [ ] Multiple devices driver support (RAID and LVM) <==除非要完 RAID (磁盘阵列)与 LVM ,否则不用选! Networking options ---> <==这一部份是最重要的除非特别强调,否则能编成模块就编成模块! <*> Packet socket [*] Packet socket: mmapped IO <M> Netlink device emulation (NEW) [*] Network packet filtering (replaces ipchains) [ ] Network packet filtering debugging (NEW) [*] Socket Filtering <*> Unix domain sockets [*] TCP/IP networking [*] IP: multicasting [*] IP: advanced router [*] IP: policy routing (NEW) [*] IP: use netfilter MARK value as routing key (NEW) [*] IP: fast network address translation (NEW) [*] IP: equal cost multipath (NEW) [*] IP: use TOS value as routing key (NEW) [*] IP: verbose route monitoring (NEW) [ ] IP: large routing tables (NEW) [*] IP: kernel level autoconfiguration [*] IP: DHCP support (NEW) [*] IP: BOOTP support (NEW) [*] IP: RARP support (NEW) <M> IP: tunneling <M> IP: GRE tunnels over IP [*] IP: broadcast GRE over IP (NEW) [*] IP: multicast routing [*] IP: PIM-SM version 1 support (NEW) [*] IP: PIM-SM version 2 support (NEW) [*] IP: TCP Explicit Congestion Notification support [*] IP: TCP syncookie support (disabled per default) IP: Netfilter Configuration ---> <==这就是防火墙机制里头的 iptables 啦!都编成模块! <M> Connection tracking (required for masq/NAT) (NEW) <M> FTP protocol support (NEW) <M> IRC protocol support (NEW) <M> IP tables support (required for filtering/masq/NAT) (NEW) <M> limit match support (NEW) <M> MAC address match support (NEW) <M> netfilter MARK match support (NEW) <M> Multiple port match support (NEW) <M> TOS match support (NEW) <M> AH/ESP match support (NEW) <M> LENGTH match support (NEW) <M> TTL match support (NEW) <M> tcpmss match support (NEW) <M> Connection state match support (NEW) <M> Packet filtering (NEW) <M> REJECT target support (NEW) <M> Full NAT (NEW) <M> MASQUERADE target support (NEW) <M> REDIRECT target support (NEW) <M> Packet mangling (NEW) <M> TOS target support (NEW) <M> MARK target support (NEW) <M> LOG target support (NEW) <M> TCPMSS target support (NEW) <M> ipchains (2.2-style) support (NEW) <M> ipfwadm (2.0-style) support (NEW) <M> The IPX protocol [ ] IPX: Full internal IPX network (NEW) < > Appletalk protocol support < > DECnet Support < > 802.1d Ethernet Bridging QoS and/or fair queueing ---> [ ] QoS and/or fair queueing Telephony Support ---> <==这东西我也不知道怎么玩~~ < > Linux telephony support ATA/IDE/MFM/RLL support ---> <==储存界面的选择!当然 IDE 一定要选的啦!! 里面如果有看到属于您的芯片组,请记得将他选择起来!例如如果使用 VIA 的芯片组,那么最后一项VIA82CXXX chipset support就一定要选择起来呢!如果你是跟 VBird 一样,使用较老旧的主机板,那么就用系统默认值也就可以了! <*> ATA/IDE/MFM/RLL support IDE, ATA and ATAPI Block devices ---> <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support <*> Include IDE/ATA-2 DISK support [*] Use multi-mode by default <*> Include IDE/ATAPI CDROM support ---- IDE chipset support/bugfixes [*] CMD640 chipset bugfix/support [*] RZ1000 chipset bugfix/support [*] Generic PCI IDE chipset support [*] Sharing PCI IDE interrupts support [*] Generic PCI bus-master DMA support [*] Use PCI DMA by default when available [*] Intel PIIXn chipsets supportt [*] PIIXn Tuning supportt SCSI support ---> <==我的旧机器上并没有安装 SCSI 卡!我确定我不会使用到 SCSI ,但是如果你可能会安装的话,请编译! < > SCSI support Fusion MPT device support ---> I2O device support ---> < > I2O support Network device support ---> <==仔细的将你的网络设备编译进来吧!这个也很重要的! [*] Network device support <*> Dummy net driver support <==这个一定要装!但是请注意!如果你之前已经使用了 MRTG 了!这个装完之后 MRTG 要重跑一次! <M> Bonding driver support <M> EQL (serial line load balancing) support <M> Universal TUN/TAP device driver support <M> General Instruments Surfboard 1000 Ethernet (10 or 100Mbit) ---> <==这里面有相当多的卡,我只列出我要的卡而已!请选择你自己的网络卡呦! [*] Ethernet (10 or 100Mbit) [*] EISA, VLB, PCI and on board controllers <*> EtherExpressPro/100 support <M> RealTek RTL-8139 PCI Fast Ethernet Adapter support [*] Use PIO instead of MMIO [*] Support for older RTL-8129/8130 boards <M> VIA Rhine support <==这就是传说中的 D-Link 530 那块卡的驱动程序啦! <*> PPP (point-to-point protocol) support <==这个一定要编进核心!不然就无法使用 ADSL 的 rp-pppoe 拨接啰! [*] PPP filtering (NEW) <M> PPP support for async serial ports (NEW) <M> PPP support for sync tty ports (NEW) <M> PPP Deflate compression (NEW) <M> PPP BSD-Compress compression (NEW) <M> PPP over ATM (EXPERIMENTAL) (NEW) Amateur Radio support ---> <==底下这四个应该不需要安装吧!? IrDA (infrared) support ---> ISDN subsystem ---> Old CD-ROM drivers (not SCSI, not IDE) ---> Input core support ---> <==这个也编成模块就好啰! <M> Input core support <M> Keyboard support <M> Mouse support (1024) Horizontal screen resolution (NEW) (768) Vertical screen resolution (NEW) <M> Joystick support <M> Event interface support Character devices ---> <==接口设备的选项!最重要的地方在 AGP 的设定项目!因为我没有 AGP 所以没有设定! [*] Virtual terminal [*] Support for console on virtual terminal <*> Standard/generic (8250/16550 and compatible UARTs) serial support [*] Unix98 PTY support <M> Mouse Support (not serial and bus mice) [*] PS/2 mouse (aka "auxiliary device") support < > /dev/agpgart (AGP Support) <==这个相当的重要!就是 AGP 显示卡的支持核心!请选择(若你有 AGP 的话!) [ ] Intel 440LX/BX/GX and I815/I830M/I840/I850 support <==下面的选项要上面的打勾之后才会出现! [ ] Intel I810/I815/I830M (on-board) support 请特别留意选择你的适合的主机板芯片组呢! [ ] VIA chipset support [ ] AMD Irongate, 761, and 762 support [ ] Generic SiS support [ ] ALI chipset support [ ] Serverworks LE/HE support [ ] Direct Rendering Manager (XFree86 DRI support) [ ] Build drivers for old (XFree 4.0) DRM (NEW) --- DRM 4.1 drivers < > 3dfx Banshee/Voodoo3+ < > ATI Rage 128 < > ATI Radeon < > Intel I810 < > Matrox g200/g400 < > SiS (NEW) [ ] Direct Rendering Manager (XFree86 DRI support) Multimedia devices ---> File systems ---> <==底下的选项主要在提供核心支持的档案格式!相当的重要!如果忘记编入的话,系统可是会读不到东西! [*] Quota support <==没有他! Quota 就无法起来!请选择呦! <M> Kernel automounter support <*> Kernel automounter version 4 support (also supports v3) <M> Ext3 journalling file system support (EXPERIMENTAL) <M> DOS FAT fs supportt <M> MSDOS fs supportt <M> UMSDOS: Unix-like file system on top of standard MSDOS fss <M> VFAT (Windows-95) fs supportt <M> Compressed ROM file system support [*] Virtual memory file system support (former shm fs) <*> ISO 9660 CDROM file system support <==在 Red Hat 7.2 这里就是被编成模块了!才需要每次加载! [*] Microsoft Joliet CDROM extensionss <M> Minix fs support <M> NTFS file system support (read only) [*] /proc file system support [*] /dev/pts file system for Unix98 PTYs <*> Second extended fs support <M> System V/Xenix/V7/Coherent file system support Network File Systems ---> <M> Coda file system support (advanced network fs) <*> NFS file system support <==NFS 也是需要的呦! <M> SMB file system support (to mount Windows shares etc.) <==网芳总是需要的吧! [*] Use a default NLS (NEW) Default Remote NLS Option: "cp950" (NEW) <==支持中文的语系! Partition Types ---> Native Language Support ---> <==除了底下说的几个 * 的之外,其它的全部都编译成为模块!(以备不时之需!) Default NLS Option: "iso8859-1" (NEW) <*> Traditional Chinese charset (Big5) (NEW) <*> NLS ISO 8859-1 (Latin 1; Western European Languages) (NEW) <M> for others Console drivers ---> [*] VGA text console Sound ---> < > Sound card support <==你有声卡吗?那就编译他吧! USB support ---> <M> Support for USB Kernel hacking ---> |
好了!编译完成之后选择『Save Configuration to an Alternate File』然后写成一个你喜欢的档名,这个档案内容就是你刚刚编译完成的数据啦!然后选择 <Exit> 之后,再储存一次到系统当中!接着下来就准备要编译啰!
[root @test
linux]# make dep <==建立相依的属性关系!
[root @test linux]# make clean <==将旧的资料去除掉! [root @test linux]# make bzImage <==开始编译核心!这个核心是经过压缩的,此外,这个步骤也很长! [root @test linux]# make modules <==开始编译模块!这个动作视您刚刚编译的模块数量! [root @test linux]# make modules_install <==好了!将数据给他安装在 /lib/modules/`uname -r` 里面啰! [root @test linux]# make install <==嗯!就将刚刚 bzImage 建立完成的核心给他安装上来! |
刚刚上一个步骤就已经将核心安装好了吗?很抱歉!非也非也~我们到前一步骤中,仅是将模块安装到 /lib/modules/`uname –r` 当中,而核心编译完成并放在 /usr/src/linux/arch/i386/boot/bzImage 而已!所以,这个时候,请将核心放置在开机核心预设放置的目录 /boot 吧![root @test root]# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.4.18在一般人的习惯中,我们还是比较喜欢将开机的核心称做为 vmlinuz ,而由于版本不同,所以我们可以将他取名为 vmlinuz-2.4.18 这样的文件名称,比较好进行确认啦!
核心搬移完毕之后就 OK 了吗?当然不对啰!还记得在开机流程里面介绍的 Linux 的开机管理员吗?没错,那就是 lilo 跟 grub 啰,所以,接着下来我们要作的就是开机的设定啰?由于 lilo 与 grub 我们之前就提过了,所以这里不详细的介绍每个对象的内容,仅说明一下我的测试核心的规划!通常,我都喜欢直接以硬盘开机来测试新的核心,而由于害怕新的核心没有办法工作 ( 注:很多时候,由于不同的 distribution 他所考虑的内容不一样,因此,很有可能您编译完成的核心并无法在您的 Linux distribution 上面工作的,所以,虽然他可以被编译成功,但是我们还是得测试测试他呢! ) 因此,我都会将旧的核心继续留下来,因为如果万一新核心没有办法工作,那么最起码我还可以使用旧的核心继续来管理我的 Linux 呢!这个时候就必需要有多重开机系统啦!
- Lilo 的安装设定:
那么如果您是使用 lilo 的话,就需要修改 /etc/lilo.conf 啰!依据刚刚我们建立的名为 /boot/vmlinuz-2.4.18 的核心档案,您的 /etc/lilo.conf 内容应该有点像是这样:
[root @test linux]# vi /etc/lilo.conf
boot=/dev/hda
map=/boot/map
vga=normal
default=linux-2.4.18
keytable=/boot/us.klt
prompt
nowarn
timeout=100
message=/boot/message
menu-scheme=wb:bw:wb:bw
image=/boot/vmlinuz-2.4.18
label=linux-2.4.18
root=/dev/hda1
append="devfs=mount"
read-only
image=/boot/vmlinuz
label=linux
root=/dev/hda1
initrd=/boot/initrd.img
append="devfs=mount"
read-only
image=/boot/vmlinuz
label=failsafe
root=/dev/hda1
initrd=/boot/initrd.img
append="devfs=nomount failsafe"
read-only
image=/boot/vmlinuz
label=linux-test
root=/dev/hda1
initrd=/boot/initrd.img
append="devfs=mount"
read-only[root @test boot]# lilo
Added linux-2.4.18 *
Added linux
Added failsafe
Added linux-test
黄色字体的部分是经过修改的,其它的则是 Mandrake 9.0 的默认值!这样就修改好啰!然后给他安装到 MBR 或 Super block 吧!出现了 * 符号啰!呵呵!安装成功了,请重新开机,试图使用一下您的新核心吧!更详细的 LILO 说明请参考开机流程里面的 LILO 说明喔!
- Grub 安装说明:
那么如果是使用 grub 呢?就修改一下 /boot/grub/menu.lst 吧!修改成类似底下的模样:
[root @test linux]# vi /boot/grub/menu.lst
timeout 10
color black/cyan yellow/cyan
i18n (hd0,0)/boot/grub/messages
keytable (hd0,0)/boot/us.klt
altconfigfile (hd0,0)/boot/grub/menu.once
default 0title linux-2.4.18
kernel (hd0,0)/boot/vmlinuz-2.4.19 root=/dev/hda1 devfs=mounttitle linux-2.4.19-16mdk
kernel (hd0,0)/boot/vmlinuz-2.4.19-16mdk root=/dev/hda1 devfs=mount
initrd (hd0,0)/boot/initrd.imgtitle failsafe
kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 devfs=nomount failsafe
initrd (hd0,0)/boot/initrd.img
上面的黄色字体是经过修改之后的结果?很简单吧!这样就搞定了!然后就可以开机测试看看啰!但是,如果是 Lilo 转换到 grub 的使用者,还得再安装 grub 呢!可以这样做做看:
[root @test boot]# grub-install /dev/hda
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.(hd0) /dev/hda
或者直接进入 grub 的指令列进行安装:
[root @test boot]# grub GRUB version 0.92 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ]grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0x83grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 17 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,0)/boot/grub/stage2
/boot/grub/menu.lst"... succeeded
Done.grub> quit
呵呵!这样就 OK 啰!安装完毕,请马上重新开机测试看看您的核心是否可以正常的工作了吧! ^_^更详细的 Grub 说明请参考开机流程的 Grub 喔!
还记得核心的功能吗?对啦!就是用来控制系统硬件与相关程序的东西啦!那么在上面提到的功能里面,我们也提到了核心可以使用『模块』的方式来动态的加载与移除所需要的模块,OK!那么该如何加载与卸载这些模块呢?!要知道的是,在模块的加载方面,最主要的开机时即加载模块的档案在于:/etc/modules.conf这个档案,如果你有任何的新的驱动程序需要在开机的时候加载,呵呵!写入这个档案就对了!而核心的驱动程序写在哪里?呵呵!就是在底下的目录中:/lib/modules/核心版本/kernel/drivers (也可以写成如下)上面这两行是一模一样的东西,什么?怎么看出来的?别多说废话了,如果忘记的话,使用 uname –r 看一下内容,再去看一下 quote 是什么!赶紧回想一下喔!好了,那么 /etc/modules.conf 的内容是怎样呢?我们举最简单的例子好了,假设你的网络卡是早期有『恶魔卡』称号的 D-Link 530 好了,那么这个卡的模块其实已经被 Linux 编译好了,他就是 via-rhine.o 这个档案,我们又知道说网络卡的第一个代号为 eth0 ,所以呢,要让 eth0 与 via-rhine 划上等号( 注:那个 .o 不要写出来! ),因此,在 /etc/modules.conf 的最后一行加入底下的文字:
/lib/modules/`uname –r`/kernel/driversalias eth0 via-rhine如果一切顺利的话,那么开机的时候他就会自动的帮我们找到相对应的硬件与模块啰!但是如果 Linux 没有帮我们编译好模块呢?怎么编译?就使用 make 呀!请回到 RPM 与 Tarball 那一章去阅读一下 tarball 的安装方式!再来,如果我需要的是手动随时加入与取消某些模块呢?呵呵,这个时候也就需要来了解一下模块的加载与卸载的功能啰!
- 模块编译
还记得要手动编译一些驱动程序或者是 tarball 的套件时,至少需要什么吗?对啦!要 gcc, make 及 kernel-header 等套件,现在我假设这些套件已经都在您的机器上面了,那么我们来模拟一下编译 viarhine.o 这个模块吧!好了,首先先到网络卡的驱动程序中心下载这个模块的原始码吧!
http://www.scyld.com/network/index.html
不过,上面的网站提供的驱动程序有点难以编译成功!所以,我这里也提供一个比较容易编译成功的原厂释出的模块,大家来试看看:
http://linux.vbird.org/download/book_basic/linux530_321.tar
(你可以使用 wget 这个程序在文字接口下载这个档案!)。首先,您必需将此档案解压缩,假设这个档案原本放置在 /root 底下好了,那么我们曾经说过,要编译新的套件或其它林林总总的数据时,最好放在 /usr/local/src 底下,所以:
[root @test root]# wget http://linux.vbird.org/download/book_basic/linux530_321.tar
[root @test root]# cd /usr/local/src
[root @test src]# mkdir dlink-530
[root @test dlink-530]# tar –xvf /root/linux530_321.tar
这步之后会多出 readme.txt, Makefile, viarhine.c, viarhine.h 四个档案,
其中,那个 readme.txt 『真的』要看一看!
[root @test dlink-530]# make
这个 make 会依据 Makefile 这个档案的内容来将你的 viarhine.c 加以编译!
最后就得到了 viarhine.o 这个编译成功的目标档案。
这样就编译完成了,接着下来就是将编译好的模块放置在核心应该要放置的地方,我这里以 2.4.xx 核心版本为例说明,听说明年六月 ( 2003/06 ) 会推出新的 2.6.xx 版核心,无论如何,目前大部分的 Linux 还是使用 2.4.xx 的,因此,这里还是以他为例了:
核心的模块放置目录: /lib/modules/`uname –r`/kernel/
核心的档案格式模块: /lib/modules/`uname –r`/kernel/fs
核心的网络卡驱动程序模块: /lib/modules/`uname –r`/kernel/drivers/net
因此,我们要把这个模块给他直接 copy 到该目录下,所以:
cp /usr/local/src/dlink-530/via-rhine.o /lib/modules/`uname –r`/kernel/drviers/net
这样就完成了系统的驱动程序模块的编译了!完成编译之后,想要在开机的时候立即启动这个模块的对应,那么就写入 /etc/modules.conf 当中,所以:
[root @test root]# vi /etc/modules.conf
alias eth0 via-rhine
加入上面黄色字体那行就对啦!
- depmod
[root @test /root]# depmod [-aens]
参数说明:
-a :将 /etc/modules.conf 可以查询到的模块的相关性都写入 /lib/modules/`uname -r`/当中
-e :显示出目前已加载的不可执行的模块名称
-n :将各模块的相依性直接输出屏幕上,而不是输出到 /lib/modules/`uname -r` 当中
-s :将一些讯息结果输出到 syslog 的登录档中!
范例:
[root @test /root]# depmod -a
[root @test /root]# depmod -n
很多时候,在使用模块时,这些模块基本上是有相关性的!什么意思呢?例如你要在 NAT 服务器的情况下启动 NAT 时,那么就需要 ip_tables 这个模块,以及 ip_nat 这个模块,而若你还想要启用 NAT 下的 ftp 功能,那么就需要启用 ip_nat_ftp 模块!换个角度来想,如果你需要启用 ip_nat_ftp 模块的话,那么就『必需启用 ip_nat 与 ip_tables 模块!』这就是所谓的相依性!而这些相依性的内容都是被纪录在 /lib/modules/`uname –r`/modules.dep 这个档案中的!至于分析这些模块的相关性,则是以 depmod 来执行的啦!此外,如果不想让模块被写入 /lib/modules/`uname -r` 当中的话,那么就加入 -n 参数吧,可以先看一下各模块的相依性呢!
- lsmod
[root @test /root]# lsmod
参数说明:
范例:
[root @test /root]# lsmod
Module Size Used by Tainted: P
ipt_MASQUERADE 1216 1 (autoclean)
iptable_filter 1696 1 (autoclean)
ip_conntrack_irc 2592 0 (unused)
ip_conntrack_ftp 3328 0 (unused)
ip_nat_irc 2400 0 (unused)
ip_nat_ftp 2976 0 (unused)
iptable_nat 13588 3 [ipt_MASQUERADE ip_nat_irc ip_nat_ftp]
ip_tables 11232 5 [ipt_MASQUERADE iptable_filter iptable_nat]
ip_conntrack 13356 3 [ipt_MASQUERADE ip_conntrack_irc ip_conntrack_ftp ip_nat_irc ip_nat_ftp iptable_nat]
ppp_async 6240 1 (autoclean)
8139too 14208 2
usbcore 29632 0 (unused)
在目前系统中的模块有哪些呢?就是以 lsmod 来查看就对啦!例如以我的宿舍 Linux 主机来看,我的网络卡是螃蟹卡,亦即是 8139 这个模块啦,另外,我有进行 NAT ,所以开启了相当多的 iptables 模块,所以你可以看到一堆 ipxxxx 的模块名称啦!
- modinfo
[root @test /root]# modinfo [-adnp] module_name
参数说明:
-a :秀出作者
-d :秀出这个模块的基本说明
-n :秀出这个模块的档案放置路径与名称
范例:
[root @test /root]# modinfo 8139too
filename: /lib/modules/2.4.19/kernel/drivers/net/8139too.o
description: "RealTek RTL-8139 Fast Ethernet driver"
author: "Jeff Garzik <jgarzik@mandrakesoft.com>"
license: "GPL"
parm: multicast_filter_limit int, description "8139too maximum number of filtered multicast addresses"
parm: max_interrupt_work int, description "8139too maximum events handled per interrupt"
parm: media int array (min = 1, max = 8), description "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps"
parm: full_duplex int array (min = 1, max = 8), description "8139too: Force full duplex for board(s) (1)"
parm: debug int, description "8139too bitmapped message enable number"[root @test /root]# modinfo -a 8139too
"Jeff Garzik <jgarzik@mandrakesoft.com>"[root @test /root]# modinfo /usr/local/src/dlink-530/via-rhine.o
filename: /usr/local/src/dlink-530/via-rhine.o
description: "PCI 10/100Mb Fast Ethernet Adapter"
author: "Donald Becker <becker@scyld.com>"
license: <none>
parm: debug int
parm: min_pci_latency int
parm: max_interrupt_work int
parm: rx_copybreak int
parm: options int array (min = 1, max = 8)
parm: full_duplex int array (min = 1, max = 8)
很简单吧!就是用来查看这个模块的作者啦!如果不加任何参数的时候,就是将这个模块的所有讯息都写出来的意思!我们使用的网络卡(螃蟹卡)所挂载的这个模块使用的档案就是: filename 那一行当中的 /lib/modules/2.4.19/kernel/drivers/net/8139too.o 这个档案啦!那么如果我是想看刚刚我们在核心编译当中编译出来的那个模块的信息呢?可以直接加上模块的文件名称!
- modprobe
[root @test /root]# modprobe [-l|-c]
[root @test /root]# modprobe modules_name<==直接加载该模块与其相依属性的模块
参数说明:
-l :列出目前系统所有的模块 ( 在 /lib/modules/`uname -r`/kernel 底下 )
-c :列出目前系统所有的模块!(更详细的代号对应表)
范例:
[root @test /root]# modprobe ip_tables <==直接加载 ip_tables.o 这个模块
[root @test /root]# modprobe –l
这东西相当的好用,因为他除了可以将后面接的模块名称加载之外,还可以依据 /lib/modules/`uname –r`/modules.dep 里面的相依属性,将其它相关的模块也加载!不错吧!此外,需要特别留意的是,模块全部都摆在『 /lib/modules/`uname -r`/kernel 』这个目录下,而且模块的名称都是以 *.o 这个附档名存在,但是在实际加载模块的时候,只要写入名称即可,千万不可写入 .o 或者是路径名称,例如要加载 ip_tables.o 这个模块时,就写 modprobe ip_tables 即可!其实,这个程序与底下的 insmod 有点类似,只是他是依据系统已经建立好的模块相依属性来加载模块,而 insmod 则是直接手动来加载模块档案!
- insmod
[root @test /root]# insmod [-fkps] module_name
参数说明:
-f :强制将模块加载,要加载不相同版本的模块时候可能会用到的参数
-k :自动在核心没有使用到该模块的时候,先清除干净!
-p :测试模块是否可以被加载,不会直接加载系统中!
-s :将一些执行讯息写到 syslog 这种登录档,而不是写到 terminal 当中!
范例:
[root @test /root]# insmod -p /usr/local/src/dlink-530/via-rhine.o
Warning: loading /usr/local/src/dlink-530/via-rhine.o will taint the kernel: no license
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
这个跟 modprobe 有点类似啦,但是 insmod 可以读取非 /lib/modules/`uname -r`/kernel 内的模块,而且还可以为模块进行加载测试呢!您可以加上路径与完整的文件名来加载模块,加上 -p 这个参数可以验证该模块的可执行性与否!!『要注意的是,这个 insmod 输入的模块名称必须要完整的路径、文件名来输入呦!』
- rmmod
[root @test /root]# rmmod modules_name
参数说明:
范例:
[root @test /root]# rmmod 8139too
顾名思义,呵呵!移除模块的程序啦!!使用 lsmod 得到以存在的模块之后,,然后再输入『 rmmod 模块名称』就可以移除模块啰!