kerneld mini-HOWTO

资讯 驱动中国 348 次阅读 0 条评论
分享 Q
kerneldmini-HOWTO
1.7版,上次由HenrikStorner(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找到未经组织的更新清单。

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

BjornEkwall
BenGalliart
CedricTefft
BrianMiller
JamesC.Tsiao
我非常感谢此mini-HOWTO读者寄给我们的鼓励和提议。

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



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


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

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

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

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



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


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

如果你要为多个只有少许不同的系统(如使用不同的网络控制卡)建立核心,你只需建立一个核心和数个模组,而不需为每个系统建立不同的核心。
对开发人员而言,模组比较容易测试—你不需重新启动电脑以载入及卸下驱动程式(这点适用於所有模组,并不限於kerneld载入的)。
它减少核心占用的记忆体,即你有更多记忆体供其他程式使用。核心所占用的记忆体是*永不*被换出(swap-out)的,所以如果你的核心中有100kB没用的驱动程式的话,那只是在浪费你的记忆体。
有一些我要用的东西,如ftapefloppy-tapedriver或iBCS,只以模组形式出现。但我懒得自己载入和卸下它们。
Linux发行者不再需要建立284个不同的开机影象(bootimages)—使用者只载入配合其硬件的驱动程式。例如RedHat4.0就使用了这方法。
当然,你也有不使用它的理由—你可能喜欢在一个核心映象(kernelimage)中包括所有你要的驱动程式。如果是这样,你看错文章了。



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


如何取得所需东西?
对kerneld的支援始於1.3.57版。如果你正使用较旧的版本,你需要更新它才可用kerneld了。所有主要的Linuxftp台都有核心的原程式码。我建议你更新至最新版本的稳定核心,2.0,目前是嵌补等级(patchlevel)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。十分简单:只需把原程式码解压及执行makeinstall.这样便会编译genksysm,insmod,lsmod,modprobe,depmod,kerneld,及把它们安装到/sbin。我建议你加数行到你的开机命令手稿(startup-script)来完成启动时所需的设定。如果你使用Slackware,请把以下数行加入你的/etc/rc.d/rc.S档,如果你使用SysVinit,如Debian,RedHat,Caldera,请把以下数行加入你的/etc/rc.d/rc.sysinit档。(译按:据我所知,RedHat5.0的SysVinit已加入此功能):

#Startkerneld-thisshouldhappenveryearlyinthe
#bootprocess,certainlyBEFOREyourunfsckonfilesystems
#thatmightneedtohavediskdriversautoloaded
if[-x/sbin/kerneld]
then
/sbin/kerneld
fi

#Yourstandardfsckcommandsgohere
#Andyoumountcommandtomounttherootfsread-write

#Updatekernel-moduledependenciesfile
#Yourroot-fsMUSTbemountedread-writebynow
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(linkkerneldstatically)。

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

Enableloadablemodulesupport(CONFIG_MODULES)[Y/n/?]Y

你要选择loadablemodulesupport,否则根本不会有模组让kerneld载入。答Yes。

Kerneldaemonsupport(CONFIG_KERNELD)[Y/n/?]Y

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

Normalfloppydisksupport(CONFIG_BLK_DEV_FD)[M/n/y/?]

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

完成'makeconfig'後,执行'makedep','makeclean','makezImage'或'makezlilo','makemodules'和'makemodules_install'。

成功!

'makezImage'会把你的新核心映像(kernelimage)放到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的一行:

PIDTTYSTATTIMECOMMAND
59?S0:01/sbin/kerneld

kerneld其中一个好处是只要你有所需的核心及安装好监控程式,你只需作很少设定。现在,你可尝试用一个建立成模组的驱动程式—它多数会不需再作设定而能使用。我把软磁碟的驱动程式建立成模组,所以我放入一只DOS磁碟及

osiris:~$mdira:
VolumeindriveAhasnolabel
VolumeSerialNumberis2E2B-1102
DirectoryforA:/

binuti~1gz194202-14-199611:35abinutils-2.6.0.6-2.6.0.7.diff.gz
libc-5~1gz2474702-14-199611:35alibc-5.3.4-5.3.5.diff.gz
2file(s)26689bytes

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

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

osiris:~$/sbin/lsmod
Module:#pages:Usedby:
floppy110(autoclean)

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



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


kerneld如何知道该载入什麽模组?
虽然kerneld本身对常用的模组有所认识,有时它会不知如何应付核心提出的要求。例如光碟机驱动程式或网络驱动程式等可能需要超过一个模组的情形。

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

区块设备驱动程式(ablock-devicedriver)
字元设备驱动程式(acharacter-devicedriver)
二元格式(abinaryformat)
tty连线规则(attylinediscipline)
档案系统(afilesystem)
网络设备(anetworkdevice)
网络服务(anetworkservice),如rarp
网络协定(anetworkprotocol),如IPX
kerneld从架构档案(configurationfile)/etc/conf.modules中得知有什麽模组需要载入。这里有两类项目:路径(paths)(模组档案的位置)和代号(aliases)(要载入什麽模组)。如果你未有此档,你可用以下方法自己制造:

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

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

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

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

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

osiris:~$/sbin/modprobe-c|grepfloppy
aliasblock-major-2floppy

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

osiris:~$ls-l/dev/fd0/dev/fd1
brw-rw-rw-1rootroot2,0Mar31995/dev/fd0
brw-r--r--1rootroot2,1Mar31995/dev/fd1

字元设备
字元设备的方法处理也差不多。例如ftapefloppytapedriver的是major-device27:

osiris:~$ls-lL/dev/ftape
crw-rw----1rootdisk27,0Jul181994/dev/ftape

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

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

aliaschar-major-27ftape

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

aliaseth0ne

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

optionsneirq=5

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

/sbin/modprobeneirq=5

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

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

aliasbinfmt-267binfmt_aout

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

aliasbinfmt-264binfmt_aout#pureexecutable(NMAGIC)
aliasbinfmt-267binfmt_aout#demand-pagedexecutable(ZMAGIC)
aliasbinfmt-204binfmt_aout#demand-pagedexecutable(QMAGIC)

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

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

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

aliastty-ldisc-3bsd_comp
aliasppp0bsd_comp

网络协定(IPX,AppleTalk,AX.25)
部分网络协定也可以模组载入。核心要用到一个网络家族(networkfamily)(如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中:

aliasnet-pf-4ipx

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

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

aliasiso9660isofs



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


需要特别设定的设备
部分设备不只要使用代码(aliasing),还要其他设定,如模组的设备(adevicetoamodule)。

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



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

各种各样的滑鼠(busmice,PS/2mice)
看门狗设备(watchdogdevices)
核心的'random'设备
APM介面(AdvancedPowerManagementinterface)
很明显,这些设备是由多个不同的模组控制的。所以,这些杂项设备的kerneld设定用到主号码及副号码(themajornumberandtheminornumber):

aliaschar-major-10-1psaux#ForPS/2mouse
aliaschar-major-10-130wdt#ForWDTwatchdog

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


载入SCSI驱动程式:scsi_hostadapter项目
SCSI设备包括一个SCSI配接卡(SCSIhostadapter,例如Adaptec1542)及一个所需设备(如硬碟机(harddisk)、光碟机(CD-ROM)或磁带机(tape-drive))的驱动程式。这全都可以模组来载入。但是,当你想存取连接到Adaptec卡的光碟机时,核心和kerneld只知道它需要载入sr_mod模组来支援那SCSI光碟机—它不知道那光碟机连接到什麽SCSI控制器(SCSIcontroller),所以不知道载入什麽模组来支援那光碟机。

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

aliasscd0sr_mod#sr_modforSCSICD-ROM's...
aliasscsi_hostadapteraha1542#...needtheAdaptecdriver

这只适用於1.3.82或之後的核心。

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

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

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


只要你亲手建立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设备(secondaryscsidevices),
包括磁带机、光碟机和其他一般的SCSI设备都没问题。缺点是
'depmod-a'不能自动查出这些倚赖,所以你要自己加入这些,而且不
可在开机时执行'depmod-a'。但只要设定好了,kerneld就能自动载入
aha1542.o。
你要知道这技考只当你有不同种类的SCSI设备接驳在两个控制器时才有用,例如,把硬碟驳在其中一个,而把光碟机、磁带或其他SCSI驳到另一个。



要载入超过一个模组时:“post-install”项目
有时,只把模组载入不足以使设备运作。例如,如果你把音效卡编译为模组,你也会希望调整至适当音量。问题题你的设定在下次载入时便会失去。这里是由BenGalliart(bgallia@luc.edu)提供的秘诀:

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

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

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

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

post-installlptunelp

只有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
makekdstat

之後,要使kerneld显示它正在做什麽,执行

kdstatdebug

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

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



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


kerneld的特殊用途
我知道你想问如何设定萤幕保护程式(screensaver)的模组…

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

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

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

之後重建安装新核心。

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

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



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


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

aliasnet-pf-3off#ForgetAX.25
aliasnet-pf-4off#ForgetIPX
aliasnet-pf-5off#ForgetAppleTalk

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


开始Kerneld後,启动PPP连线会使我的电脑慢如蜗牛
已经有多个这类个案。这似乎是因为kerneld和部分系统用来设定和监察PPP连线的tkPPPscript不正常地互相影向所致。因为那script在执行ifconfig时好像用到回圈(loops)。这样会触发kerneld找寻net-pf-X模组(见前),增加系统工作量和可能导致系统纪录(systemlog)中出现大量"Cannotlocatemodulefornet-pf-X"讯息。除了不使用tkPPP或改用其他方法来监察连线,这问题未有其他解决方法。

kerneld不载入我的SCSI驱动程式!
在你的/etc/conf.modules中加上一个SCSI配接器的项目。详情这看之前有关scsi_hostadapter的部分。

modprobe投诉'gcc2_compiled'未定义(undefined)
这是module-utilities的一个错误。它只在使用binutils2.6.0.9或更新版本时出现,而且已在binutils的出版说明(releasenote)中说明。所以你应该看看它。你也可更新module-utilities,如modules-2.0.0来解决这问题。

我的音响驱动程式(sounddriver)老是忘记音量之类设定
模组载入後的设定是储存在模组之内的。所以,当kerneld自动卸下模组时,你所做的设定都会被忘掉,下次载入时又回复原状。

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

DOSEMU需要一些模组,我怎样使kerneld载入它们?
你不能。不论是官方(official)或开发(development)版的dosemu,都不支援用kerneld载入dosemu模组。不过,如果你有2.0.26或更新的核心,你不再需要那些dosemu模组--你只需要更新dosemu至0.66.1版。(译按∶目前最新的DOSEMU稳定版本(stableversion)是0.66.7。)

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

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

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

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

kerneld不能载入ncpfs模组
你编译ncpfsutilities时要用-DHAVE_KERNELD。请参阅ncpfs的Makefile。

kerneld不能载入smbfs模组
你在使用一个旧的smbmountutilities。请从ftp://tsx-11.mit.edu/pub/linux/filesystems/smbfs/下载最新版本(0.10或之後)。

我把所有东西都编译成模组,现在我的系统不能启动
kerneld不能载入根档案系统(rootfilesystem)模组。
你不可把所有东西都编译成模组∶核心要有足够的驱动程式以使它能挂上(mount)根档案系统,和执行所有要用於启动kerneld的程式。所以你不能把以下东西模组化∶

根档案系统所在的硬碟的驱动程式
根档案系统的驱动程式
init,kerneld和其他程式的二元格式载入程式(binaryformatloader)
[事实上,这并不正确。新的1.3.x及所有2.0.x核心都容许LILO或LOADLIN载入初始的ram-disk,而你可以在启动的早期在这『磁碟』中载入模组。做法可在核心原程式码中的Documentation/initrd.txt档中可找到。]

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

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

我重新建立了核心及模组,但在启动时仍出现未分辨的符号(unresolvedsymbol)讯息
你可能在设定或建立新核心时排除了一些模组,但已不用的旧模组仍在/lib/modules目录下。最简单的解决方法是删除你的/lib/modules/x.y.z目录及在核心的源程式码的目录下做一次'makemodules_install'。这问题只在重新设定同一版本的核心时发生。如果你在更新核心时遇到此问题,你有其他问题。

我安装了Linux2.1後不能载入任何模组
Linux2.1是目前的开发核心(developmentkernel)。也就是说,它随时可能出现错误。其中一样大幅改变的是模组的处理方法,及核心和模组载入到什麽地方。RichardHenderson现正负责核心的模组发展。

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

阅读Documentation/Changes档案及找出更新你的系统所需的模组
使用最新的modutils,可从以下地方得到ftp://ftp.redhat.com/pub/alphabits/或在ftp://tsx-11.mit.edu/pub/linux/packages/alphabits/的映像站(mirrorsite)
如果你想在2.1版核心使用模组的话,我会建议最少使用2.1.29版的核心。



自选拨号(dial-on-demand)网络又怎样?
kerneld对有需要时建立网络连线原本有些支援。尝试在没有连线时传送讯息包(packet)会使kerneld执行/sbin/request_route命令稿来建立PPP或SLIP连线。

这并不是一个好方法。Linux网络发展人员AlanCox在Linux核心的通信论坛(MailingList)中批评∶

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



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


版权讯息
ThisdocumentisCopyright(c)HenrikStorner,1996,1997.

Unlessotherwisestated,LinuxHOWTOdocumentsarecopyrightedbytheirrespectiveauthors.LinuxHOWTOdocumentsmaybereproducedanddistributedinwholeorinpart,inanymediumphysicalorelectronic,aslongasthiscopyrightnoticeisretainedonallcopies.Commercialredistributionisallowedandencouraged;however,theauthorwouldliketobenotifiedofanysuchdistributions.

Alltranslations,derivativeworks,oraggregateworksincorporatinganyLinuxHOWTOdocumentsmustbecoveredunderthiscopyrightnotice.Thatis,youmaynotproduceaderivativeworkfromaHOWTOandimposeadditionalrestrictionsonitsdistribution.Exceptionstotheserulesmaybegrantedundercertainconditions;pleasecontacttheLinuxHOWTOcoordinatorattheaddressgivenbelow.

Inshort,wewishtopromotedisseminationofthisinformationthroughasmanychannelsaspossible.However,wedowishtoretaincopyrightontheHOWTOdocuments,andwouldliketobenotifiedofanyplanstoredistributetheHOWTOs.

Ifyouhavequestions,pleasecontactTimBynum,theLinuxHOWTOcoordinator,atlinux-howto@sunsite.unc.eduviaemail.
版权声明:本文由驱动中国整理发布,转载需注明出处与原文链接。如有疑问请联系 editor@qudong.com
本文价值 成为第一个评分的人
登录后为本文打分
网友评论0 条评论
正在回复 的评论取消
评论加载中…
🔐

登录后参与互动

评论、点赞均可赚积分
连续签到、邀请好友也有奖励 🎁

电脑端: 微信扫码登录 微信内: 一键登录

微信扫一扫

打开微信「扫一扫」,分享本文到朋友圈或好友