首先获取必要的组件:一个合适的内核和最新的 modules 软件包。然后您应该按照软件包中包含的说明安装模块实用程序。非常简单:只需解压源代码并运行 make install。这将在以下目录编译和安装以下程序:/sbin:genksysm, insmod, lsmod, modprobe, depmod 和 kerneld。我建议您在启动脚本中添加一些行,以便在每次启动 Linux 时执行一些必要的设置。将以下行添加到您的/etc/rc.d/rc.S文件(如果您运行的是 Slackware),或添加到/etc/rc.d/rc.sysinit如果您运行的是 SysVinit,例如 Debian、Corel、RedHat、Mandrake 或 Caldera
# Start kerneld - this should happen very early in the # boot process, certainly BEFORE you run fsck on filesystems # that might need to have disk drivers autoloaded if [ -x /sbin/kerneld ] then /sbin/kerneld fi # Your standard fsck commands go here # And you mount command to mount the root fs read-write # Update kernel-module dependencies file # Your root-fs MUST be mounted read-write by now if [ -x /sbin/depmod ] then /sbin/depmod -a fi |
这些命令可能已经安装在您的 SysV init 脚本中。第一部分启动 kerneld 本身。第二部分在启动时调用 depmod -a 以构建所有可用模块的列表,并分析它们之间的相互依赖关系。然后,depmod 映射告诉 kerneld,如果一个模块在加载自身之前需要加载另一个模块。
注意:最新版本的 kerneld 有一个选项可以链接到 GNU gdbm 库,libgdbm。如果您在构建模块实用程序时启用此选项,如果 libgdbm 不可用,kerneld 将不会启动,如果您将/usr放在单独的分区上并在/usr挂载之前启动 kerneld,则很可能发生这种情况。推荐的解决方案是将/usr/lib/libgdbm移动到/lib,或者静态链接 kerneld。
接下来,解压内核源代码,配置并构建您喜欢的内核。如果您以前从未这样做过,您绝对应该阅读 Linux 源代码顶层的 README 文件。当您运行 make xconfig 来配置内核时,您应该注意一些早期出现的问题
Enable loadable module support (CONFIG_MODULES) [Y/n/?] Y |
您需要选择可加载模块支持,否则 kerneld 将无模块可加载!只需选择“是”。
Kernel daemon support (CONFIG_KERNELD) [Y/n/?] Y |
当然,这也是必要的。然后,内核中的许多内容可以构建为模块 - 您将看到如下问题
Normal floppy disk support (CONFIG_BLK_DEV_FD) [M/n/y/?] |
您可以在其中回答 M,表示 “模块”。通常,只有启动系统必需的驱动程序才应构建到内核中;其余的可以构建为模块。
必要的驱动程序 |
启动系统所需的必要驱动程序必须编译到核心内核中,并且不能作为模块加载。通常,这将包括硬盘驱动程序和根文件系统驱动程序。如果您有双启动机器并且依赖于外部分区中的文件,则还必须将对外部分区文件系统的支持编译到核心内核中。 |
当您完成 make config 后,使用 make dep clean bzlilo modules modules_install 编译并安装新内核和模块。
呼。
编译内核镜像:make zImage 命令将不会安装内核,并将新的内核镜像留在以下文件中arch/i386/boot/zImage。要使用此镜像,您需要将其复制到您保存启动镜像的位置,并使用 LILO 手动安装它。
有关配置、构建和安装您自己的内核的更多信息,请查看定期发布到comp.os.linux.answers,并可从 Linux 文档项目及其镜像站点获取。
现在使用新内核重启。当系统重新启动后,您可以运行 ps ax,您应该看到 kerneld 的一行
PID TTY STAT TIME COMMAND 59 ? S 0:01 /sbin/kerneld |
kerneld 的优点之一是,一旦您安装了内核和守护程序,几乎不需要任何设置。首先,尝试使用您构建为模块的驱动程序之一;它很可能会在没有进一步配置的情况下工作。如果我将软盘驱动程序构建为模块,我可以将 DOS 软盘放入驱动器并输入
osiris:~ $ mdir a: Volume in drive A has no label Volume Serial Number is 2E2B-1102 Directory for A:/ binuti~1 gz 1942 02-14-1996 11:35a binutils-2.6.0.6-2.6.0.7.diff.gz libc-5~1 gz 24747 02-14-1996 11:35a libc-5.3.4-5.3.5.diff.gz 2 file(s) 26689 bytes |
软盘驱动程序工作了!当我尝试使用软盘时,它会被 kerneld 自动加载。
要查看软盘模块是否确实已加载,您可以运行 /sbin/lsmod 以列出所有当前加载的模块
osiris:~ $ /sbin/lsmod Module: #pages: Used by: floppy 11 0 (autoclean) |
“(autoclean)” 表示如果模块超过一分钟未使用,则会被 kerneld 自动删除。因此,11 页内存(= 44kB,一页为 4 kB)仅在我访问软盘驱动器时使用 - 如果我超过一分钟不使用软盘,它们将被释放。如果您应用程序的内存不足,这非常棒!