WEB开发网
开发学院操作系统Linux/Unix kerneld mini-HOWTO 阅读

kerneld mini-HOWTO

 2005-04-15 11:41:32 来源:WEB开发网   
核心提示:kerneldmini-HOWTO 1.7版,上次由HenrikStorner(storner@osiris.ping.dk)於1997年7月19日(storner@osiris.ping.dk)更新,kerneld mini-HOWTO, 曾达康(a9504480@graduate.hku.hk)於1998年6月14
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 功能。它会说明:

kerneld 是什麽 
为什麽要用它 
如何取得所需东西 
如何设定它 
如何告诉 kerneld 它不认识的模组的资料 
如何侦察 kerneld (设定时可能有用) 
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 找到未经组织的更新清单。 

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

Bjorn Ekwall  
Ben Galliart  
Cedric Tefft  
Brian Miller  
James C. Tsiao  
我非常感谢此 mini-HOWTO 读者寄给我们的鼓励和提议。

(译按∶当然,如果问题出在译文中,请通知曾达康 



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


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

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

它可设定成不使用内定的空白画面,而让你选择其他程式,使你可自选萤幕保护器 (screen saver)。 
和萤幕保护器相似,你可把主控台 (console) 的‘哔’声改为完全不同的东西… 
kerneld 包括两个独立部分:

核心向监控程式 (daemon) 就所需模组提出要求的支援。 
懂找出所需模组来满足核心要求的使用者层面 (user-level) 监控程式。 
要使用 kerneld,两个部分都要正常运作。只设定好其中一个是没用的。



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


为什麽要用它?
有不少好理由去使用 kerneld。这里提出的是我个人的——其他人可能有其他的理由。

如果你要为多个只有少许不同的系统(如使用不同的网络控制卡)建立核心,你只需建立一个核心和数个模组,而不需为每个系统建立不同的核心。 
对开发人员而言,模组比较容易测试—你不需重新启动电脑以载入及卸下驱动程式(这点适用於所有模组,并不限於 kerneld 载入的)。 
它减少核心占用的记忆体,即你有更多记忆体供其他程式使用。核心所占用的记忆体是 *永不* 被换出 (swap-out) 的,所以如果你的核心中有 100kB 没用的驱动程式的话,那只是在浪费你的记忆体。 
有一些我要用的东西,如 ftape floppy-tape driver 或 iBCS,只以模组形式出现。但我懒得自己载入和卸下它们。 
Linux 发行者不再需要建立 284 个不同的开机影象 (boot images) —使用者只载入配合其硬件的驱动程式。例如 RedHat 4.0 就使用了这方法。 
当然,你也有不使用它的理由—你可能喜欢在一个核心映象 (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 从核心部分会收到以下种类的要求:

区块设备驱动程式 (a block-device driver) 
字元设备驱动程式 (a character-device driver) 
二元格式 (a binary format) 
tty 连线规则 (a tty line discipline) 
档案系统 (a filesystem) 
网络设备 (a network device) 
网络服务 (a network service),如 rarp 
网络协定 (a network protocol),如 IPX 
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)。 

主数码 10 的字元设备:杂项设备 (The miscellaneous devices) 
SCSI 设备 
需特别初始化 (initialization) 的设备 



char-major-10:滑鼠、看门狗和随机数 (Mice, watchdogs and randomness)
大多数硬件设备都以主数码分辨,例如 ftape 是 char-major-27。但如果你看看在 /dev 中主数码是 10 的字元设备,你会见到一堆毫无关连的设备,包括:

各种各样的滑鼠(bus mice, PS/2 mice) 
看门狗设备 (watchdog devices) 
核心的 'random' 设备 
APM 介面 (Advanced Power Management interface) 
很明显,这些设备是由多个不同的模组控制的。所以,这些杂项设备的 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 

只有 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 
之後重建安装新核心。

当萤幕保护程式启动时,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 的程式。所以你不能把以下东西模组化∶

根档案系统所在的硬碟的驱动程式 
根档案系统的驱动程式 
init, kerneld和其他程式的二元格式载入程式 (binary format loader) 
[事实上,这并不正确。新的 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 版核心使用模组,你要∶

阅读 Documentation/Changes 档案及找出更新你的系统所需的模组 
使用最新的 modutils,可从以下地方得到ftp://ftp.redhat.com/pub/alphabits/ 或在ftp://tsx-11.mit.edu/pub/linux/packages/alphabits/ 的映像站 (mirror site) 
如果你想在 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. 

Tags:kerneld mini HOWTO

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接