kerneld mini-HOWTO

1.7 版,上次由 Henrik Storner (storner@osiris.ping.dk)于 1997 年 7 月 19 日(storner@osiris.ping.dk) 更新。

曾达康 (a9504480@graduate.hku.hk) 于 1998 年 6 月 14 日完成翻译。


导言

此文件解释如何使用 Linux 核心中的 kerneld 功能。它会说明:

此文件的最新版本可在 http://eolicom.olicom.dk/~storner/kerneld-mini-HOWTO.html 找到。(译按:中文版则可在 http://www.linux.org.tw/CLDP/mini/Kerneld.html 找到)在此 mini-HOWTO 推出的正式版本期间,你可在 http://eolicom.olicom.dk/~storner/kern.html 找到未经组织的更新清单。

荣誉

如果你发现此文件中出现错误,请告诉文章的原作者。以下各人都曾对本文作出贡献:

我非常感谢此 mini-HOWTO 读者寄给我们的鼓励和提议。

(译按︰当然,如果问题出在译文中,请通知曾达康 <a9504480@graduate.hku.hk>)


kerneld 是什么?

kerneld 是由 Bjorn Ekwall 引入 1.3 版的发展核心 (development kernel) 的功能。它可在所有 2.0 及 2.1 版本的核心找到。它令模块 (modules)─即驱动程序 (device drivers)、网络驱动器 (network drivers)、文档系统 (filesystems)─自动在有需要时载入,而不需自行使用 modprobe 或 insmod。

还有更有趣的东西,虽然它们尚未整合到标准的核心中︰

kerneld 包括两个独立部分:

要使用 kerneld,两个部分都要正常运作。只设定好其中一个是没用的。


为什么要用它?

有不少好理由去使用 kerneld。这里提出的是我个人的──其他人可能有其他的理由。

当然,你也有不使用它的理由─你可能喜欢在一个核心映象 (kernel image) 中包括所有你要的驱动程序。如果是这样,你看错文章了。


如何取得所需东西?

对 kerneld 的支持始于 1.3.57 版。如果你正使用较旧的版本,你需要更新它才可用 kerneld 了。所有主要的 Linux ftp 台都有核心的原程序码。我建议你更新至最新版本的稳定核心,2.0,目前是嵌补等级 (patch level) 2.0.29 (译按:现时已是 2.0.35):

  ftp://sunsite.unc.edu/pub/Linux/kernel/v2.0/linux-2.0.29.tar.gz
  ftp://tsx-11.mit.edu/pub/linux/sources/system/v2.0/linux-2.0.29.tar.gz
  ftp://ftp.funet.fi/pub/Linux/PEOPLE/Linus/v2.0/linux-2.0.29.tar.gz

使用者层面的监控程序包含在 modules-1.2.8 及更新的 modules-2.0 中。它们一般会和核心源程序码在同一地点找到,而官方位置包括:

  ftp://sunsite.unc.edu/pub/Linux/kernel/v2.0/modules-2.0.0.tar.gz
  ftp://tsx-11.mit.edu/pub/linux/sources/sbin/modules-2.0.0.tar.gz
  ftp://ftp.funet.fi/pub/Linux/tools/modules-2.0.0.tar.gz

注意:如果你想在 2.1 版的开发核心尝试载入模块,你必须用最新的 modutils-(不是 modules-)。但请看 以下有关模块和 2.1 版核心部分的问题。


如何设定它?

首先要取得所需的东西:合用的核心部分及最新版的 modules-utilities。之后你要安装 modules-utilities。十分简单:只需把原程序码解压及执行 make install. 这样便会编译 genksysm, insmod, lsmod, modprobe, depmod, kerneld,及把它们安装到 /sbin。我建议你加数行到你的开机命令手稿 (startup-script) 来完成启动时所需的设定。如果你使用 Slackware,请把以下数行加入你的 /etc/rc.d/rc.S 档,如果你使用 SysVinit,如 Debian, RedHat, Caldera,请把以下数行加入你的 /etc/rc.d/rc.sysinit 档。(译按:据我所知,RedHat 5.0的 SysVinit已加入此功能):

        # 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

第一部分启动 kerneld。

第二部分开始时执行 'depmod -a'。depmod 建立所有可找到的模块的清单及分析它们之间互相依赖的情况。所以,它会知道载入一个模块前是否需要先载入其他模块。

注意︰最新版本的 kerneld 可选择链结 (link) GNU 的 dbm 程序库 libgdbm。如果在编译 module-utilities 时作了此抉择,找不到 libgdbm 时 kerneld 便不能启动。这很有可能当 /usr 在另一个磁盘分区 (partition),而企图在挂 (mount) /usr 前启动 kerneld 时发生。建议的解决方法是把 libgdbm 从 /usr/lib 移到 /lib,或静态连结 kerneld (link kerneld statically)。

之后,你要把核心的源程序解压,设定及建立一个你喜欢的核心。如果你未试过这样做,你必须阅读在 Linux 源程序码顶层目录 (top directory) 中的 README 档。在执行 make config 设定核心时,你要注意数条在早期出现的问题:

  Enable loadable module support (CONFIG_MODULES) [Y/n/?] Y

你要选择 loadable module support,否则根本不会有模块让 kerneld 载入。答 Yes。

  Kernel daemon support (CONFIG_KERNELD) [Y/n/?] Y

当然,这也是需要的,很多东西都可建立为模块。你会见到类似的问题:

  Normal floppy disk support (CONFIG_BLK_DEV_FD) [M/n/y/?] 

你可回答 'M' 来代表模块。通常只有开机时必须的驱动程序,如硬盘机驱动程序,和根目录的文档系统等必须建立在核心中。其他皆可建立为模块。

完成 'make config' 后,执行 'make dep', 'make clean', 'make zImage' 或 'make zlilo', 'make modules' 和 'make modules_install'。

成功!

'make zImage' 会把你的新核心映像 (kernel image) 放到 arch/i386/boot/zImage。你要把它拷贝到你放置启动映像的地方或用 LILO 安装它。

想得到更多有关设定,建立及安装核心部分的资料,请阅读定时贴上 comp.os.linux.answers 的Kernel-HOWTO ,你也可在 sunsite.unc.edu 的 /pub/Linux/docs/HOWTO 找到它。(译按:中文版可在 http://www.linux.org.tw/CLDP/Kernel-HOWTO.html找到。)


试用 kerneld

现在你可用新的核心部分开机。在系统启动后,执行 '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

即是说软磁盘的驱动程序运作正常─当我尝试使用软磁盘时,它被自动载入。

要看到软磁盘的模块真的被载入,你可执行 /sbin/lsmod,它会列出现时载入了的模块。

  osiris:~ $ /sbin/lsmod 
  Module:        #pages:  Used by:
  floppy            11    0 (autoclean)

"(autoclean)" 代表如果有一分钟没用此模块,它就会被 kerneld 自动移走。所以,那 11 页内存(44 kB,一页等于 4kB)只会在我使用软盘机时被占用。如果我一分钟不用软盘,它会被释放。如果你的内存不敷应用,这就太棒了!


kerneld 如何知道该载入什么模块?

虽然 kerneld 本身对常用的模块有所认识,有时它会不知如何应付核心提出的要求。例如光驱驱动程序或网络驱动程序等可能需要超过一个模块的情形。

kerneld 从核心部分会收到以下种类的要求:

kerneld 从架构文档 (configuration file) /etc/conf.modules 中得知有什么模块需要载入。这里有两类项目:路径 (paths)(模块文档的位置)和代号 (aliases)(要载入什么模块)。如果你未有此档,你可用以下方法自己制造:

  /sbin/modprobe -c | grep -v '^path' >/etc/conf.modules

如果你想加多一个路径到预定路径中,你必须包括所有现有的路径。因为在 /etc/conf.modules 里的一个路径项目会取代 所有 modprobe 内置的路径!

通常你是不用自己加上路径的,因为预设的路行将己照顾到所有正常的设定。我可保证!

另一方面,如果你只想加入代号 (alias) 或者选项 (option directive),你在 /etc/conf.modules 的新项目会加入到 modprobe 所知的。如果你想再定义一个代号或选择,你在 /etc/conf.modules 中的项目会凌驾预设那个。

区块设备

如果你执行 '/sbin/modprobe -c',你会得到一个 kerneld 已知的模块的名单及它们所对应的要求。例如,导致载入软盘驱动程序的要求是主号码 (major number) 是 2 的区块设备。

  osiris:~ $ /sbin/modprobe -c | grep floppy
  alias block-major-2 floppy

为什么是 block-major-2?因为软盘设备 /dev/fd* 的主号码 (major number) 是 2 ,又是区块设备。

  osiris:~ $ ls -l /dev/fd0 /dev/fd1
  brw-rw-rw-   1 root     root       2,   0 Mar  3  1995 /dev/fd0
  brw-r--r--   1 root     root       2,   1 Mar  3  1995 /dev/fd1

字元设备

字元设备的方法处理也差不多。例如 ftape floppy tape driver 的是 major-device 27:

  osiris:~ $ ls -lL /dev/ftape 
  crw-rw----   1 root     disk      27,   0 Jul 18  1994 /dev/ftape

但 kerneld 本身并不知道 ftape 驱动程序,它不会在 '/sbin/modprobe -c' 的结果中出现。

所以,要使 kerneld 载入 ftape 驱动程序,我要加一行到 kerneld 的设定档 /etc/conf.modules 中:

  alias char-major-27 ftape

网络设备

你也可以用设备的名称来代替哪些 'char-major-xxx' 或 'block-major-yyy' 设定。这样对网络设备尤其有用,例如把 ne2000 网络卡用作 eth0 可以籍此载入:

  alias eth0 ne

如果你需要传递一些选项给你的驱动程序,例如告诉模块这网络卡使用什么 IRQ,你可加上如下一 'options' 行:

  options ne irq=5

这样会使 kerneld 用以下指令来载入 NE2000 驱动程序︰

  /sbin/modprobe ne irq=5

当然,实际上所用的选项会因应所用模块而有所不同。

二元格式

二元格式也以相似的方法处理。每当你尝试执行一个核心不懂载入的程序,kerneld 便会收到一个 "binfmt-xxx" 的要求, xxx 是一个由文档开头数个字元决定的数字。使 kerneld 为 ZMAGIC (a.out) 执行档载入 binfmt_aout 模块的设定是:

  alias binfmt-267 binfmt_aout

因为 ZMAGIC 档的幻数 (magic number) 是 267。(如果你查看 /etc/magic,你会见到 0413 这个数字,但 /etc/magic 使用八进位数 (octal numbers) 而 kerneld 使用十进数 (decimal),而八进位的 413 即十进数的 267。)由于 a.out 格式共有三款稍为稍为不同的可执行档 (NMAGIC, QMAGIC and ZMAGIC),要全面支持 binfmt_aout 模块我们需要

  alias binfmt-264 binfmt_aout  # pure executable (NMAGIC)
  alias binfmt-267 binfmt_aout  # demand-paged executable (ZMAGIC)
  alias binfmt-204 binfmt_aout  # demand-paged executable (QMAGIC)

kerneld 可自动辨认 a.out, Java 和 iBCS 二元格式,毋须特别设定。

连线规则 (slip, cslip and ppp)

连线规则用 "tty-ldisc-x"来作要求,而 x 一般是 1 (slip) 或 3 (ppp)。kerneld 本身都认识这两样。

说起 ppp,如果你想 kerneld 载入 bsd_comp 资料压缩模块,你需要加两行到 /etc/conf.modules 中:

  alias tty-ldisc-3 bsd_comp
  alias ppp0 bsd_comp

网络协定 (IPX, AppleTalk, AX.25)

部分网络协定也可以模块载入。核心要用到一个网络家族 (network family)(如 IPX)时,会向 kerneld 作出对一个类似 "net-pf-X" 的要求,而 X 是一个代表所属家族的数字。例如 net-pf-3 是 AX.25,net-pf-4 是 IPX,而 net-pf-5 是 AppleTalk。(这些数字是由 linux 源程序档 include/linux/socket.h 中 AF_AX25, AF_IPX 的定义而来的。)故此要自动载入 IPX 模块,你要加一个类似以下的项目到 /etc/conf.modules 中:

  alias net-pf-4 ipx

也请阅读以下有关防止开机时出现关于未定义的协定的常见问题

文档系统

有关文档系统的 kerneld 要求就是文档系统的名称。一个常见的用途是为光碟载入 isofs 的模块,例如 "iso9660" 文档系统:

  alias iso9660 isofs


需要特别设定的设备

部分设备不只要使用代码 (aliasing),还要其他设定,如模块的设备 (a device to a module)。


char-major-10:鼠标、看门狗和随机数 (Mice, watchdogs and randomness)

大多数硬件设备都以主数码分辨,例如 ftape 是 char-major-27。但如果你看看在 /dev 中主数码是 10 的字元设备,你会见到一堆毫无关连的设备,包括:

很明显,这些设备是由多个不同的模块控制的。所以,这些杂项设备的 kerneld 设定用到主号码副号码 (the major number and the minor number):

        alias char-major-10-1 psaux     # For PS/2 mouse
        alias char-major-10-130 wdt     # For WDT watchdog

要用到此特性,你需要一个 1.3.82 或之后的核心部分。较旧的核心不会把副号码传给 kerneld,因此,kerneld 不能找出所需要的杂项设备。

载入 SCSI 驱动程序: scsi_hostadapter 项目

SCSI 设备包括一个 SCSI 配接卡 (SCSI host adapter, 例如 Adaptec 1542)及一个所需设备(如硬盘机 (hard disk)、光驱 (CD-ROM) 或磁带机 (tape-drive))的驱动程序。这全都可以模块来载入。但是,当你想存取连接到 Adaptec 卡的光驱时,核心和 kerneld 只知道它需要载入 sr_mod 模块来支持那 SCSI 光驱─它不知道那光驱连接到什么 SCSI 控制器 (SCSI controller),所以不知道载入什么模块来支持那光驱。

要解决这问题,你可加一个你的 SCSI 驱动程序的项目到你的 /etc/conf.modules 中,籍以告诉 kerneld 如何在众多 SCSI 控制器模块中选择:

        alias scd0 sr_mod               # sr_mod for SCSI CD-ROM's ...
        alias scsi_hostadapter aha1542  # ... need the Adaptec driver

这只适用于 1.3.82 或之后的核心。

这方法只当你只用一个 SCSI 控制器时适用。如果你有超过一个,难度就高一点。

一般来说,如果已经载入了一个配接器,你不能再叫 kerneld 载入另一个。你可把两个都编译到核心中(不用模块),或自己把模块载入。

事实上,一个方法可使 kerneld 载入多个 SCSI 驱动程序。James Tsiao 有以下提议:


  只要你亲手建立 modules.dep 的倚赖 (dependency),你可很轻易使
  得 kerneld 载入第二个 SCSI 驱动程序。你只需一个类似的项目:
  
     /lib/modules/2.0.30/scsi/st.o: /lib/modules/2.0.30/scsi/aha1542.o
     
  来使 kerneld 在载入 st.o 前先载入 aha1542.o。我家中的电脑就使用
  了几乎相同的设定,对我所有二级 SCSI 设备 (secondary scsi devices),
  包括磁带机、光驱和其他一般的 SCSI 设备都没问题。缺点是
  'depmod -a' 不能自动查出这些倚赖,所以你要自己加入这些,而且不
  可在开机时执行 'depmod -a'。但只要设定好了,kerneld 就能自动载入
  aha1542.o。

你要知道这技考只当你有不同种类的 SCSI 设备接驳在两个控制器时才有用,例如,把硬盘驳在其中一个,而把光驱、磁带或其他 SCSI 驳到另一个。


要载入超过一个模块时:“post-install”项目

有时,只把模块载入不足以使设备运作。例如,如果你把声卡编译为模块,你也会希望调整至适当音量。问题题你的设定在下次载入时便会失去。这里是由 Ben Galliart (bgallia@luc.edu) 提供的秘诀:

  最终的解决方法需要安装 setmix-0.1
   ( ftp://sunsite.unc.edu/pub/Linux/apps/sound/mixers/setmix-0.1.tar.gz )

  之后把以下一行加到我的 /etc/conf.modules:
       post-install sound /usr/local/bin/setmix -f /etc/volume.conf

这样,当音效的模块载入后,kerneld 会执行 'post-install sound' 项目的指令。因此该模块会被 '/usr/local/bin/setmix -f /etc/volume.conf 指令设定好。

这方法对其他模块也有用,例如 lp 模块可籍以下一句用 tunelp 程序设定好:

        post-install lp tunelp <options>

只有 1.3.69f 版或之后的 kerneld 才支持这些选项。

注意: :此 mini-HOWTO 的较旧版本曾提及一个 "pre-remove" 选项,让你可在 kerneld 卸下一个模块时执行一个指令。但这从未成功,因此并不鼓励使用。这个选项多数会在未来版本的 kerneld 中消失。所有有关模块 "设定" 的事情都在改变中,在你看到这文件时,可能已有所不同了。


侦察 kerneld

如果你什么方法都已试过,但仍找不出核心在要在 kerneld 做什么,你可用一个方法找出 kerneld 收到什么要求,从而知道该加什么到 /etc/conf.modules。你需要 kdstat 程序。

这个好用的程序已包括在 modules-package 中,但预定是不会编译及安装的。你可用以下方法建立它:

  cd /usr/src/modules-2.0.0/kerneld
  make kdstat

之后,要使 kerneld 显示它正在做什么,执行

  kdstat debug

kerneld 便会开始在主控台印出其工作的资料。当你执行所需的指令时,你会见到 kerneld 收到的要求。这些要求可放到 /etc/conf.modules 中,加上所需模块的别名 (alias),便可使工作完成。

要停止除错时,执行 '/sbin/kdstat nodebug'。


kerneld 的特殊用途

我知道你想问如何设定萤幕保护程序 (screensaver) 的模块…

modules-package 的 'kerneld/GOODIES' 目录中有一些和萤幕保护程序及主控台哔声支持有关的核心修补 (kernel patches)。它们尚未在官方的核心出现。所以你要自行修正及重新编译核心。

要安装修补,你要用 "patch" 指令:

  cd /usr/src/linux
  patch -s -p1 </usr/src/modules-2.0.0/kerneld/GOODIES/blanker_patch

之后重建安装新核心。

当萤幕保护程序启动时,kerneld 会执行 "/sbin/screenblanker" 指令。这可以是一个执行你喜欢的萤幕保护程序的命令手稿 (shell script)。

在核心想重绘萤幕时,它会送出一个 SIGQUIT 信号到正执行 /sbin/screenblanker 的行程 (process)。你的命令稿或萤幕保护程序要捕捉 (trap) 这信号及结朿。记著之后还要把萤幕还原到原本的文字模式 (text mode)。


常见问题及你可能怀疑的事情

为何当我执行 ifconfig 时为何我会得到 "Cannot locate module for net-pf-X" 信息

在核心 1.3.80 左右,网络的程序修改至容许把通诉协定 (protocol families,如 IPX, AX.25 和 AppleTalk) 载入为模块。这导致额外的 kerneld 要求:net-pf-X,X 是一个用以辨别通讯协定的数字(参看 /usr/src/linux/include/linux/socket.h 来找出不同数字的意思)。
不幸地,ifconfig 会意外地造成这些信息,所以很多人会在开机期间执行 ifconfig 来设定回归设备 (loopback device) 时收到。这些信息并无坏处,你可在 /etc/conf.modules 中加入以下数行来避免它们:

        alias net-pf-3 off      # Forget AX.25
        alias net-pf-4 off      # Forget IPX
        alias net-pf-5 off      # Forget AppleTalk

当然,如果你把 IPX 编译了为模块,你不可加上和它有关的一行。

开始 Kerneld 后,启动 PPP 连线会使我的电脑慢如蜗牛

已经有多个这类个案。这似乎是因为 kerneld 和部分系统用来设定和监察 PPP 连线的 tkPPP script 不正常地互相影向所致。因为那 script 在执行 ifconfig 时好像用到回圈 (loops)。这样会触发 kerneld 找寻 net-pf-X 模块(见前),增加系统工作量和可能导致系统纪录 (system log) 中出现大量 "Cannot locate module for net-pf-X" 信息。除了不使用 tkPPP 或改用其他方法来监察连线,这问题未有其他解决方法。

kerneld 不载入我的 SCSI 驱动程序!

在你的 /etc/conf.modules 中加上一个 SCSI 配接器的项目。详情这看之前有关 scsi_hostadapter 的部分。

modprobe 投诉 'gcc2_compiled' 未定义 (undefined)

这是 module-utilities 的一个错误。它只在使用 binutils 2.6.0.9 或更新版本时出现,而且已在 binutils 的出版说明 (release note) 中说明。所以你应该看看它。你也可更新 module-utilities,如 modules-2.0.0 来解决这问题。

我的音响驱动程序 (sound driver) 老是忘记音量之类设定

模块载入后的设定是储存在模块之内的。所以,当 kerneld 自动卸下模块时,你所做的设定都会被忘掉,下次载入时又回复原状。

你可使 kerneld 在自动载入模块后执行一个程序,以作出设定。请参看以上有关 'post-install' 项目的部分。

DOSEMU 需要一些模块,我怎样使 kerneld 载入它们?

你不能。不论是官方 (official) 或开发 (development) 版的 dosemu,都不支持用 kerneld 载入 dosemu 模块。不过,如果你有 2.0.26 或更新的核心,你不再需要哪些 dosemu 模块 -- 你只需要更新 dosemu 至 0.66.1 版。(译按︰目前最新的 DOSEMU 稳定版本 (stable version) 是 0.66.7。)

为何会有 "Ouch, kerneld timed out, message failed" 这信息?

当核心对 kerneld 作出要求时,它会期望在 1 秒之内得到应答 (acknowledgement)。如果 kerneld 不作出回应,这个信息会被记录下来 (logged)。这要求会再被提出,直到完成为止。

这通常在系统负荷 (load) 非常高时发生。因为 kerneld 也是一个使用者行程 (user-process),它会如其他程序般排程 (scheduling)。负荷高时,它可能来不及在核心超时 (time out) 前作出回应。

如果这问题在负荷低时也发生,请再启动 kerneld (杀掉 kerneld 行程,以 /usr/sbin/kerneld指令来重新开始它)。如果仍有问题,你应该寄一份错误报告给linux-kernel@vger.rutgers.edu,但在寄出前先确保你的核心和 kerneld 都是最新的。

mount 不等待 kerneld 载入文档系统模块

已经收到一定数目有关 mount (8) 指令不等待 kerneld 载入文档系统模块的报告。 ismod 显示模块已被载入,如果你立刻再执行 mount 的话便会成功。这似乎是 module-utilities 1.3.69f 版中一个会影响 Debian 使用者的错误,使用一个新版的 module-utilities 可解决这问题。

kerneld 不能载入 ncpfs 模块

你编译 ncpfs utilities 时要用 -DHAVE_KERNELD。请参阅 ncpfs 的 Makefile。

kerneld 不能载入 smbfs 模块

你在使用一个旧的 smbmount utilities。请从 ftp://tsx-11.mit.edu/pub/linux/filesystems/smbfs/ 下载最新版本 (0.10 或之后)。

我把所有东西都编译成模块,现在我的系统不能启动

kerneld 不能载入根文档系统 (root filesystem) 模块。

你不可把所有东西都编译成模块︰核心要有足够的驱动程序以使它能挂上 (mount) 根文档系统,和执行所有要用于启动 kerneld 的程序。所以你不能把以下东西模块化︰

[事实上,这并不正确。新的 1.3.x 及所有 2.0.x 核心都容许 LILO 或 LOADLIN 载入初始的 ram-disk,而你可以在启动的早期在这‘磁盘’中载入模块。做法可在核心原程序码中的 Documentation/initrd.txt 档中可找到。]

kerneld 不能在启动时载入 -- 投诉 libgdbm

较新版的 kerneld 要 GNU dbm 程序库 libgdbm.so 才能执行。大多数的安装程序都会把这文档放在 /usr/lib,而你多数是在挂上 /usr 文档系统前执行了 kerneld。这问题的其中一个症状是 kerneld 在启动时不能籍 rc-scripts 载入,但如果你在启动系统后自己开始它,它便没有问题。解决方法,一是把 kerneld 的启动放在挂上 /usr 后,另一是把 gdbm 程序库放到你的根文档系统,如 /lib。

我重新设定核心至没有 xxx 支持后出现 "Cannot load module xxx"

Slackware(其他也可能)会在安装时籍执行 modprobe 来建立一个预设的 /etc/rc.d/rc.modules。modprode 得出来的结果会因原本的核心的设定而异。你可能在重新设定时排除了一些在 rc.modules 的模块,因此造成错误。你可把你在 rc.modules 中不用的模块变为注释 (comment out),或删除 rc.modules,让 kerneld 在需要模块时自行载入。

我重新建立了核心及模块,但在启动时仍出现未分辨的符号 (unresolved symbol) 信息

你可能在设定或建立新核心时排除了一些模块,但已不用的旧模块仍在 /lib/modules 目录下。最简单的解决方法是删除你的 /lib/modules/x.y.z 目录及在核心的源程序码的目录下做一次 'make modules_install'。这问题只在重新设定同一版本的核心时发生。如果你在更新核心时遇到此问题,你有其他问题。

我安装了 Linux 2.1 后不能载入任何模块

Linux 2.1 是目前的开发核心 (development kernel)。也就是说,它随时可能出现错误。其中一样大幅改变的是模块的处理方法,及核心和模块载入到什么地方。Richard Henderson 现正负责核心的模块发展。

总结一句,如果你想在 2.1 版核心使用模块,你要︰

如果你想在 2.1 版核心使用模块的话,我会建议最少使用 2.1.29 版的核心。


自选拨号 (dial-on-demand) 网络又怎样?

kerneld 对有需要时建立网络连线原本有些支持。尝试在没有连线时传送信息包 (packet) 会使 kerneld 执行 /sbin/request_route 命令稿来建立 PPP 或 SLIP 连线。

这并不是一个好方法。Linux 网络发展人员 Alan Cox 在 Linux 核心的通信论坛 (Mailing List) 中批评︰

  路径要求 (request-route) 的东西是过时、不对及无用的 [...],它已在
  2.1.x 的源程序码中消失。
我诚心建议你从 http://www.dna.lth.se/~erics/diald.html 取 Eric Schenk 的 diald 套装软件来安装,而不要使用路径要求及 kerneld。


版权信息

This document is Copyright (c) Henrik Storner, 1996, 1997.

Unless otherwise stated, Linux HOWTO documents are copyrighted by their respective authors. Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions.

All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below.

In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs.

If you have questions, please contact Tim Bynum, the Linux HOWTO coordinator, at linux-howto@sunsite.unc.edu via email.