如果您想要在一个新硬体系统上运作 Linux ,或者想要使用一些原本核心没有支援的特点,也许或 者您想减少核心所占的记忆体使系统记忆体运作的更好,您会发现必须建立自己所定的核心。 更新核心包含了组态所需的模组,编译核心及模组,最後安装核心映像档,随着重新开机而载入新的 核心。在``README''中这些所有的文件都来自於每个核心套件。进一步的资讯可以在 ``Documentation/'' 子目录中找到。一个特别有帮助的档案是``Configure.help'' ,其中包含了有 关编译核心的选项及模组的详细资讯。
下面是一个例,显示如何建立自己的 Intel 平台 2.0.36 版核心。建立订的核心常常只是组态, 编译及安装上的问题。有时(通常因为新的硬体) 需要下载新的驱动程式,因为原本核心编译时该硬体 尚未被支援。
建立订核心的第一个步骤是下载及安装核心,不论是来自 RPM (优先选择) 或从 tarball。参考 第10章,Linux 核心的升级 一节 有关获得合适档案的详细资料。
下一步,使用 ``rpm'' 公用程式 (或 ``tar'',也可以) 安装核心来源及标头档。例如,安装 2.0.36-3 核心的 RPM 档: rpm -Uvh kernel-source-2.0.36-3.i386.rpm kernel-headers-2.0.36-3.i386.rpm rpm -Uvh kernel-ibcs-2.0.36-3.i386.rpm
(如果您在笔记型电脑上运作Linux,您或许想要安装 ``kernel-pcmcia-cs-2.0.36-3.i386.rpm'' 这个 档,它提供了电源管理的功能)
在安装好核心档之後,您应该可以找到新的原始档,位在 ``/usr/src/linux/'' 目录。
下一个步骤是下载任何附加的驱动程式档 (如果有的话),并且安装他们在新的核心来源。例如,要增加 对 Mylex DAC960 硬体 RAID 控制器的支援,我会从网站上下载驱动软体。不幸地,像 http://www.dandelion.com/ 网页上的驱动软体常常只有提供 tarball 而且需要 ``tar'' 公用程式去安 装它。例如: cd /usr/src/ tar zxvpf DAC960-2.0.0-Beta4.tar.gz
可能的话,您应该阅读由您所增加驱动程式软体所提供的文件。例如 DAC960 驱动程式包括了 ``README'' 档案,里面有关於哪里下载最新的驱动程式,及如何索取核心的修正档: mv README.DAC960 DAC960.[ch] /usr/src/linux/drivers/block patch -p0 < DAC960.patch
下面步骤是确保您的系统符号档案连结和新的核心相符。事实上,这个步骤只需要作一次,所以下面步骤只 有在您从未编译过自己的核心情形下才需要: mail:/usr/src# cd /usr/include mail:/usr/include# rm -rf asm linux scsi mail:/usr/include# ln -s /usr/src/linux/include/asm-i386 asm mail:/usr/include# ln -s /usr/src/linux/include/linux linux mail:/usr/include# ln -s /usr/src/linux/include/scsi scsi 注意: 上述步骤在 2.2.x 或更高版本核心已不再需要。
下一个步骤是组态您的核心。这是建立订核心的最重要步骤,如果您 disable 错误的设定,可能漏 失您所需要的特性或硬体支援。然而,如果您 enable 了错误的设定,您会无谓地扩大核心而且浪费珍贵 的系统记忆体 (说是这麽说,但在以後犯错而不是之前可能比较好)
确保您的核心编译正常的最好办法是:了解您所需要使用的特性是什麽,您的系统中哪些硬体需要支援。 在您有几次订核心的经验後,这些过程会变为 “过时?而且不具威胁 !
键入下列各项开始进行组态程序: mail:/usr/include# cd /usr/src/linux mail:/usr/src/linux# make mrproper mail:/usr/src/linux# make menuconfig
(如果您执行 X Window 系统可以键入 ``make xconfig'' 取代 ``make menuconfig''; 参考 第 5 章 有 关如何使 X 运作的细节.)
要组态您的核心,必须经由种种的设定及选择 (enable) 哪一些是您需要的,并且剔除 (disable)您所不 需要的。您可以选择直接经由核心支援,或是建立依需求可由核心载入或卸下的模组。(如果您编译了一个 事实上需要重新启动系统的功能,像是 SCSI 驱动程式,如果是模组,您需要建立 RAMdisk 映像档或系统 必须重新启动。这是使用 ``mkinitrd'' 这个命令去完成; 这个程序在下面会谈到)
当进行这些组态设定时, 您可以选择 获得有关核心各个选项的描述
在您完成对核心的组态设定後,键入下列命令编译您的核心: mail:/usr/src/linux# make dep ; make clean mail:/usr/src/linux# make bzImage mail:/usr/src/linux# make modules
如果您重新编译和之前相同的核心 (在本例中是 2.0.36-3 ),您或许会想要用下面的指令将现有的模组移 到备份的目录下: mail:/usr/src/linux# mv /lib/modules/2.0.36-3 /lib/modules/2.0.36-3-backup
现在,键入下列指令真正地安装新的模组: mail:/usr/src/linux# make modules_install
下一个步骤是将核心到 ``/boot/'' 目录下,并且使用 LILO 更新 boot record ,如此一来新的核 心就会被承认。下面的指令会将现有核心作一个备份,新的核心取代它,然後更新 LILO boot record: mail:/usr/src/linux# cd /boot mail:/boot# cp vmlinuz vmlinuz.OLD mail:/boot# cp /usr/src/linux/arch/i386/boot/bzImage vmlinuz-2.0.36 mail:/boot# /sbin/lilo
最後,您需要编辑 ``/etc/lilo.conf'' 档,并且确定 “image”是指向新的核心。您也应该加入一个项目 指向您的备份核心,也许称作“OldLinux”. 这是一个例档: boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 image=/boot/vmlinuz label=Linux root=/dev/hdb1
read-only image=/boot/vmlinuz.OLD label=OldLinux read-only
藉由此种方法备份您的核心资讯,万一您的新核心无法正常启动(也许因为某设备不被承认,或者一个 daemon 应该启动而未启动),您可以简单地键入 ``OldLinux'' 从原来的核心启动然後检查系统。 注意: 如同前面所提到,如果您已经编译了一个需要以模组方式启动系统的核心,您需要建立一个起始 RAMdisk 映像档以便启动系统。(别忘了将您的核心编译成可支援这样的映像档)
建立及使用起始 RAMdisk 映像档的程序如下:
在您的 ``/etc/lilo.conf''加入项目,以便启动起始 RAMdisk 映像档; 这里是一个先前已经展示过的组态 档增加的例子,: image=/boot/vmlinuz label=Linux root=/dev/hdb1 initrd=/boot/initrd-2.2.4-4.img read-only
在您可以使用 mkinitrd 指令前要先载入loopback 装置. 确定 loopback 装置模组已经载入: /sbin/insmod loop
(如果您得到有关无法载入loopback 模组的错误讯息,您可能需要指定给目前正在运作的核心该模组完整路 径,例如 ``/lib/modules/2.0.35/loop''.)
使用 ``mkinitrd'' 指令真正地建立映像档: /sbin/mkinitrd /boot/initrd-2.0.36-3.img 2.0.36-3
执行 ``/sbin/lilo'' 更新您的 boot loader. 现在,关闭系统且启动新的核心! mail:/boot# /sbin/shutdown -r now
如果您的核心拒绝完成启动,别惊慌。利用在安装 Linux 时所作的开机磁片开机。如果您没有该磁片, 应该可以利用Red Hat CD作。插入磁片然後重新启动电脑。当您看到“boot:” 提示时,键入: mount root=/dev/hda1
上述的指令假设您的“/” (root) partition 位於 /dev/hda1.
Linux 应该然後正常地启动 (既然您是使用开机磁片开机,在这期间不是所有的装置及服务都能正常动作), 然後您可以回存您的旧核心然後重新安装 LILO boot loader 的资料 (亦即. ``mv /vmlinuz.old /vmlinuz ; /sbin/lilo'') 然後关机/重新启动。然後您可以试着用不同选项重 新编译核心再试一次。
| |