kerneld mini-HOWTO 1.7 版,上次由 Henrik Storner (storner@osiris.ping.dk)於 1997 年 7 月 19 日(storner@osiris.ping.dk) 更新。 曾達(dá)康 (a9504480@graduate.hku.hk) 於 1998 年 6 月 14 日完成翻譯。 -------------------------------------------------------------------------------- 導(dǎo)言 此文件解釋如何使用 linux 核心中的 kerneld 功能。它會(huì)說(shuō)明: kerneld 是什麼 為什麼要用它 如何取得所需東西 如何設(shè)定它 如何告訴 kerneld 它不認(rèn)識(shí)的模組的資料 如何偵察 kerneld (設(shè)定時(shí)可能有用) kerneld 的特別用途 常見(jiàn)問(wèn)題及怪事 此文件的最新版本可在 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 找到未經(jīng)組織的更新清單。 榮譽(yù) 如果你發(fā)現(xiàn)此文件中出現(xiàn)錯(cuò)誤,請(qǐng)告訴文章的原作者。以下各人都曾對(duì)本文作出貢獻(xiàn): Bjorn Ekwall Ben Galliart Cedric Tefft Brian Miller James C. Tsiao 我非常感謝此 mini-HOWTO 讀者寄給我們的鼓勵(lì)和提議。 (譯按∶當(dāng)然,如果問(wèn)題出在譯文中,請(qǐng)通知曾達(dá)康 ) -------------------------------------------------------------------------------- kerneld 是什麼? kerneld 是由 Bjorn Ekwall 引入 1.3 版的發(fā)展核心 (development kernel) 的功能。它可在所有 2.0 及 2.1 版本的核心找到。它令模組 (modules)—即驅(qū)動(dòng)程式 (device drivers)、網(wǎng)絡(luò)驅(qū)動(dòng)器 (network drivers)、檔案系統(tǒng) (filesystems)—自動(dòng)在有需要時(shí)載入,而不需自行使用 modPRobe 或 insmod。 還有更有趣的東西,雖然它們尚未整合到標(biāo)準(zhǔn)的核心中∶ 它可設(shè)定成不使用內(nèi)定的空白畫(huà)面,而讓你選擇其他程式,使你可自選螢?zāi)槐Wo(hù)器 (screen saver)。 和螢?zāi)槐Wo(hù)器相似,你可把主控臺(tái) (console) 的‘嗶’聲改為完全不同的東西… kerneld 包括兩個(gè)獨(dú)立部分: 核心向監(jiān)控程式 (daemon) 就所需模組提出要求的支援。 懂找出所需模組來(lái)滿(mǎn)足核心要求的使用者層面 (user-level) 監(jiān)控程式。 要使用 kerneld,兩個(gè)部分都要正常運(yùn)作。只設(shè)定好其中一個(gè)是沒(méi)用的。 -------------------------------------------------------------------------------- 為什麼要用它? 有不少好理由去使用 kerneld。這里提出的是我個(gè)人的——其他人可能有其他的理由。 如果你要為多個(gè)只有少許不同的系統(tǒng)(如使用不同的網(wǎng)絡(luò)控制卡)建立核心,你只需建立一個(gè)核心和數(shù)個(gè)模組,而不需為每個(gè)系統(tǒng)建立不同的核心。 對(duì)開(kāi)發(fā)人員而言,模組比較容易測(cè)試—你不需重新啟動(dòng)電腦以載入及卸下驅(qū)動(dòng)程式(這點(diǎn)適用於所有模組,并不限於 kerneld 載入的)。 它減少核心占用的記憶體,即你有更多記憶體供其他程式使用。核心所占用的記憶體是 *永不* 被換出 (swap-out) 的,所以如果你的核心中有 100kB 沒(méi)用的驅(qū)動(dòng)程式的話(huà),那只是在浪費(fèi)你的記憶體。 有一些我要用的東西,如 ftape floppy-tape driver 或 iBCS,只以模組形式出現(xiàn)。但我懶得自己載入和卸下它們。 Linux 發(fā)行者不再需要建立 284 個(gè)不同的開(kāi)機(jī)影象 (boot images) —使用者只載入配合其硬件的驅(qū)動(dòng)程式。例如 RedHat 4.0 就使用了這方法。 當(dāng)然,你也有不使用它的理由—你可能喜歡在一個(gè)核心映象 (kernel image) 中包括所有你要的驅(qū)動(dòng)程式。如果是這樣,你看錯(cuò)文章了。 -------------------------------------------------------------------------------- 如何取得所需東西? 對(duì) kerneld 的支援始於 1.3.57 版。如果你正使用較舊的版本,你需要更新它才可用 kerneld 了。所有主要的 Linux ftp 臺(tái)都有核心的原程式碼。我建議你更新至最新版本的穩(wěn)定核心,2.0,目前是嵌補(bǔ)等級(jí) (patch level) 2.0.29 (譯按:現(xiàn)時(shí)已是 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 使用者層面的監(jiān)控程式包含在 modules-1.2.8 及更新的 modules-2.0 中。它們一般會(huì)和核心源程式碼在同一地點(diǎn)找到,而官方位置包括: 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 版的開(kāi)發(fā)核心嘗試載入模組,你必須用最新的 modutils-(不是 modules-)。但請(qǐng)看 以下有關(guān)模組和 2.1 版核心部分的問(wèn)題。 -------------------------------------------------------------------------------- 如何設(shè)定它? 首先要取得所需的東西:合用的核心部分及最新版的 modules-utilities。之後你要安裝 modules-utilities。十分簡(jiǎn)單:只需把原程式碼解壓及執(zhí)行 make install. 這樣便會(huì)編譯 genksysm, insmod, lsmod, modprobe, depmod, kerneld,及把它們安裝到 /sbin。我建議你加數(shù)行到你的開(kāi)機(jī)命令手稿 (startup-script) 來(lái)完成啟動(dòng)時(shí)所需的設(shè)定。如果你使用 Slackware,請(qǐng)把以下數(shù)行加入你的 /etc/rc.d/rc.S 檔,如果你使用 SysVinit,如 Debian, RedHat, Caldera,請(qǐng)把以下數(shù)行加入你的 /etc/rc.d/rc.sysinit 檔。(譯按:據(jù)我所知,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 第一部分啟動(dòng) kerneld。 第二部分開(kāi)始時(shí)執(zhí)行 'depmod -a'。depmod 建立所有可找到的模組的清單及分析它們之間互相依賴(lài)的情況。所以,它會(huì)知道載入一個(gè)模組前是否需要先載入其他模組。 注意∶最新版本的 kerneld 可選擇鏈結(jié) (link) GNU 的 dbm 程式庫(kù) libgdbm。如果在編譯 module-utilities 時(shí)作了此抉擇,找不到 libgdbm 時(shí) kerneld 便不能啟動(dòng)。這很有可能當(dāng) /usr 在另一個(gè)磁碟分區(qū) (partition),而企圖在掛 (mount) /usr 前啟動(dòng) kerneld 時(shí)發(fā)生。建議的解決方法是把 libgdbm 從 /usr/lib 移到 /lib,或靜態(tài)連結(jié) kerneld (link kerneld statically)。 之後,你要把核心的源程式解壓,設(shè)定及建立一個(gè)你喜歡的核心。如果你未試過(guò)這樣做,你必須閱讀在 Linux 源程式碼頂層目錄 (top directory) 中的 README 檔。在執(zhí)行 make config 設(shè)定核心時(shí),你要注意數(shù)條在早期出現(xiàn)的問(wèn)題: Enable loadable module support (CONFIG_MODULES) [Y/n/?] Y 你要選擇 loadable module support,否則根本不會(huì)有模組讓 kerneld 載入。答 Yes。 Kernel daemon support (CONFIG_KERNELD) [Y/n/?] Y 當(dāng)然,這也是需要的,很多東西都可建立為模組。你會(huì)見(jiàn)到類(lèi)似的問(wèn)題: Normal floppy disk support (CONFIG_BLK_DEV_FD) [M/n/y/?] 你可回答 'M' 來(lái)代表模組。通常只有開(kāi)機(jī)時(shí)必須的驅(qū)動(dòng)程式,如硬碟機(jī)驅(qū)動(dòng)程式,和根目錄的檔案系統(tǒng)等必需建立在核心中。其他皆可建立為模組。 完成 'make config' 後,執(zhí)行 'make dep', 'make clean', 'make zImage' 或 'make zlilo', 'make modules' 和 'make modules_install'。 成功! 'make zImage' 會(huì)把你的新核心映像 (kernel image) 放到 arch/i386/boot/zImage。你要把它拷貝到你放置啟動(dòng)映像的地方或用 LILO 安裝它。 想得到更多有關(guān)設(shè)定,建立及安裝核心部分的資料,請(qǐng)閱讀定時(shí)貼上 comp.os.linux.answers 的Kernel-HOWTO ,你也可在 sunsite.unc.edu 的 /pub/Linux/docs/HOWTO 找到它。(譯按:中文版可在 http://www.linux.org.tw/CLDP/Kernel-HOWTO.html找到。) -------------------------------------------------------------------------------- 試用 kerneld 現(xiàn)在你可用新的核心部分開(kāi)機(jī)。在系統(tǒng)啟動(dòng)後,執(zhí)行 'ps -ax',你應(yīng)該會(huì)見(jiàn)到 kerneld 的一行: PID TTY STAT TIME COMMAND 59 ? S 0:01 /sbin/kerneld kerneld 其中一個(gè)好處是只要你有所需的核心及安裝好監(jiān)控程式,你只需作很少設(shè)定。現(xiàn)在,你可嘗試用一個(gè)建立成模組的驅(qū)動(dòng)程式—它多數(shù)會(huì)不需再作設(shè)定而能使用。我把軟磁碟的驅(qū)動(dòng)程式建立成模組,所以我放入一只 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 即是說(shuō)軟磁碟的驅(qū)動(dòng)程式運(yùn)作正常—當(dāng)我嘗試使用軟磁碟時(shí),它被自動(dòng)載入。 要看到軟磁碟的模組真的被載入,你可執(zhí)行 /sbin/lsmod,它會(huì)列出現(xiàn)時(shí)載入了的模組。 osiris:~ $ /sbin/lsmod Module: #pages: Used by: floppy 11 0 (autoclean) "(autoclean)" 代表如果有一分鐘沒(méi)用此模組,它就會(huì)被 kerneld 自動(dòng)移走。所以,那 11 頁(yè)記憶體(44 kB,一頁(yè)等於 4kB)只會(huì)在我使用軟碟機(jī)時(shí)被占用。如果我一分鐘不用軟碟,它會(huì)被釋放。如果你的記憶體不敷應(yīng)用,這就太棒了! -------------------------------------------------------------------------------- kerneld 如何知道該載入什麼模組? 雖然 kerneld 本身對(duì)常用的模組有所認(rèn)識(shí),有時(shí)它會(huì)不知如何應(yīng)付核心提出的要求。例如光碟機(jī)驅(qū)動(dòng)程式或網(wǎng)絡(luò)驅(qū)動(dòng)程式等可能需要超過(guò)一個(gè)模組的情形。 kerneld 從核心部分會(huì)收到以下種類(lèi)的要求: 區(qū)塊設(shè)備驅(qū)動(dòng)程式 (a block-device driver) 字元設(shè)備驅(qū)動(dòng)程式 (a character-device driver) 二元格式 (a binary format) tty 連線(xiàn)規(guī)則 (a tty line discipline) 檔案系統(tǒng) (a filesystem) 網(wǎng)絡(luò)設(shè)備 (a network device) 網(wǎng)絡(luò)服務(wù) (a network service),如 rarp 網(wǎng)絡(luò)協(xié)定 (a network protocol),如 IPX kerneld 從架構(gòu)檔案 (configuration file) /etc/conf.modules 中得知有什麼模組需要載入。這里有兩類(lèi)項(xiàng)目:路徑 (paths)(模組檔案的位置)和代號(hào) (aliases)(要載入什麼模組)。如果你未有此檔,你可用以下方法自己制造: /sbin/modprobe -c | grep -v '^path' >/etc/conf.modules 如果你想加多一個(gè)路徑到預(yù)定路徑中,你必須包括所有現(xiàn)有的路徑。因?yàn)樵凇?etc/conf.modules 里的一個(gè)路徑項(xiàng)目會(huì)取代 所有 modprobe 內(nèi)置的路徑! 通常你是不用自己加上路徑的,因?yàn)轭A(yù)設(shè)的路行將己照顧到所有正常的設(shè)定。我可保證! 另一方面,如果你只想加入代號(hào) (alias) 或者選項(xiàng) (option directive),你在 /etc/conf.modules 的新項(xiàng)目會(huì)加入到 modprobe 所知的。如果你想再定義一個(gè)代號(hào)或選擇,你在 /etc/conf.modules 中的項(xiàng)目會(huì)凌駕預(yù)設(shè)那個(gè)。 區(qū)塊設(shè)備 如果你執(zhí)行 '/sbin/modprobe -c',你會(huì)得到一個(gè) kerneld 已知的模組的名單及它們所對(duì)應(yīng)的要求。例如,導(dǎo)致載入軟碟驅(qū)動(dòng)程式的要求是主號(hào)碼 (major number) 是 2 的區(qū)塊設(shè)備。 osiris:~ $ /sbin/modprobe -c | grep floppy alias block-major-2 floppy 為什麼是 block-major-2?因?yàn)檐浀O(shè)備 /dev/fd* 的主號(hào)碼 (major number) 是 2 ,又是區(qū)塊設(shè)備。 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 字元設(shè)備 字元設(shè)備的方法處理也差不多。例如 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 驅(qū)動(dòng)程式,它不會(huì)在 '/sbin/modprobe -c' 的結(jié)果中出現(xiàn)。 所以,要使 kerneld 載入 ftape 驅(qū)動(dòng)程式,我要加一行到 kerneld 的設(shè)定檔 /etc/conf.modules 中: alias char-major-27 ftape 網(wǎng)絡(luò)設(shè)備 你也可以用設(shè)備的名稱(chēng)來(lái)代替那些 'char-major-xxx' 或 'block-major-yyy' 設(shè)定。這樣對(duì)網(wǎng)絡(luò)設(shè)備尤其有用,例如把 ne2000 網(wǎng)絡(luò)卡用作 eth0 可以籍此載入: alias eth0 ne 如果你需要傳遞一些選項(xiàng)給你的驅(qū)動(dòng)程式,例如告訴模組這網(wǎng)絡(luò)卡使用什麼 IRQ,你可加上如下一 'options' 行: options ne irq=5 這樣會(huì)使 kerneld 用以下指令來(lái)載入 NE2000 驅(qū)動(dòng)程式∶ /sbin/modprobe ne irq=5 當(dāng)然,實(shí)際上所用的選項(xiàng)會(huì)因應(yīng)所用模組而有所不同。 二元格式 二元格式也以相似的方法處理。每當(dāng)你嘗試執(zhí)行一個(gè)核心不懂載入的程式,kerneld 便會(huì)收到一個(gè) "binfmt-xxx" 的要求, xxx 是一個(gè)由檔案開(kāi)頭數(shù)個(gè)字元決定的數(shù)字。使 kerneld 為 ZMAGIC (a.out) 執(zhí)行檔載入 binfmt_aout 模組的設(shè)定是: alias binfmt-267 binfmt_aout 因?yàn)椤MAGIC 檔的幻數(shù) (magic number) 是 267。(如果你查看 /etc/magic,你會(huì)見(jiàn)到 0413 這個(gè)數(shù)字,但 /etc/magic 使用八進(jìn)位數(shù) (octal numbers) 而 kerneld 使用十進(jìn)數(shù) (decimal),而八進(jìn)位的 413 即十進(jìn)數(shù)的 267。)由於 a.out 格式共有三款稍為稍為不同的可執(zhí)行檔 (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 可自動(dòng)辨認(rèn) a.out, java 和 iBCS 二元格式,毋須特別設(shè)定。 連線(xiàn)規(guī)則 (slip, cslip and ppp) 連線(xiàn)規(guī)則用 "tty-ldisc-x"來(lái)作要求,而 x 一般是 1 (slip) 或 3 (ppp)。kerneld 本身都認(rèn)識(shí)這兩樣。 說(shuō)起 ppp,如果你想 kerneld 載入 bsd_comp 資料壓縮模組,你需要加兩行到 /etc/conf.modules 中: alias tty-ldisc-3 bsd_comp alias ppp0 bsd_comp 網(wǎng)絡(luò)協(xié)定 (IPX, AppleTalk, AX.25) 部分網(wǎng)絡(luò)協(xié)定也可以模組載入。核心要用到一個(gè)網(wǎng)絡(luò)家族 (network family)(如 IPX)時(shí),會(huì)向 kerneld 作出對(duì)一個(gè)類(lèi)似 "net-pf-X" 的要求,而 X 是一個(gè)代表所屬家族的數(shù)字。例如 net-pf-3 是 AX.25,net-pf-4 是 IPX,而 net-pf-5 是 AppleTalk。(這些數(shù)字是由 linux 源程式檔 include/linux/socket.h 中 AF_AX25, AF_IPX 的定義而來(lái)的。)故此要自動(dòng)載入 IPX 模組,你要加一個(gè)類(lèi)似以下的項(xiàng)目到 /etc/conf.modules 中: alias net-pf-4 ipx 也請(qǐng)閱讀以下有關(guān)防止開(kāi)機(jī)時(shí)出現(xiàn)關(guān)於未定義的協(xié)定的常見(jiàn)問(wèn)題。 檔案系統(tǒng) 有關(guān)檔案系統(tǒng)的 kerneld 要求就是檔案系統(tǒng)的名稱(chēng)。一個(gè)常見(jiàn)的用途是為光碟載入 isofs 的模組,例如 "iso9660" 檔案系統(tǒng): alias iso9660 isofs -------------------------------------------------------------------------------- 需要特別設(shè)定的設(shè)備 部分設(shè)備不只要使用代碼 (aliasing),還要其他設(shè)定,如模組的設(shè)備 (a device to a module)。 主數(shù)碼 10 的字元設(shè)備:雜項(xiàng)設(shè)備 (The miscellaneous devices) SCSI 設(shè)備 需特別初始化 (initialization) 的設(shè)備 char-major-10:滑鼠、看門(mén)狗和隨機(jī)數(shù) (Mice, watchdogs and randomness) 大多數(shù)硬件設(shè)備都以主數(shù)碼分辨,例如 ftape 是 char-major-27。但如果你看看在 /dev 中主數(shù)碼是 10 的字元設(shè)備,你會(huì)見(jiàn)到一堆毫無(wú)關(guān)連的設(shè)備,包括: 各種各樣的滑鼠(bus mice, PS/2 mice) 看門(mén)狗設(shè)備 (watchdog devices) 核心的 'random' 設(shè)備 APM 介面 (Advanced Power Management interface) 很明顯,這些設(shè)備是由多個(gè)不同的模組控制的。所以,這些雜項(xiàng)設(shè)備的 kerneld 設(shè)定用到主號(hào)碼及副號(hào)碼 (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 要用到此特性,你需要一個(gè) 1.3.82 或之後的核心部分。較舊的核心不會(huì)把副號(hào)碼傳給 kerneld,因此,kerneld 不能找出所需要的雜項(xiàng)設(shè)備。 載入 SCSI 驅(qū)動(dòng)程式: scsi_hostadapter 項(xiàng)目 SCSI 設(shè)備包括一個(gè) SCSI 配接卡 (SCSI host adapter, 例如 Adaptec 1542)及一個(gè)所需設(shè)備(如硬碟機(jī) (hard disk)、光碟機(jī) (CD-ROM) 或磁帶機(jī) (tape-drive))的驅(qū)動(dòng)程式。這全都可以模組來(lái)載入。但是,當(dāng)你想存取連接到 Adaptec 卡的光碟機(jī)時(shí),核心和 kerneld 只知道它需要載入 sr_mod 模組來(lái)支援那 SCSI 光碟機(jī)—它不知道那光碟機(jī)連接到什麼 SCSI 控制器 (SCSI controller),所以不知道載入什麼模組來(lái)支援那光碟機(jī)。 要解決這問(wèn)題,你可加一個(gè)你的 SCSI 驅(qū)動(dòng)程式的項(xiàng)目到你的 /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 或之後的核心。 這方法只當(dāng)你只用一個(gè) SCSI 控制器時(shí)適用。如果你有超過(guò)一個(gè),難度就高一點(diǎn)。 一般來(lái)說(shuō),如果已經(jīng)載入了一個(gè)配接器,你不能再叫 kerneld 載入另一個(gè)。你可把兩個(gè)都編譯到核心中(不用模組),或自己把模組載入。 事實(shí)上,有一個(gè)方法可使 kerneld 載入多個(gè) SCSI 驅(qū)動(dòng)程式。James Tsiao 有以下提議: 只要你親手建立 modules.dep 的倚賴(lài) (dependency),你可很輕易使 得 kerneld 載入第二個(gè) SCSI 驅(qū)動(dòng)程式。你只需一個(gè)類(lèi)似的項(xiàng)目: /lib/modules/2.0.30/scsi/st.o: /lib/modules/2.0.30/scsi/aha1542.o 來(lái)使 kerneld 在載入 st.o 前先載入 aha1542.o。我家中的電腦就使用 了幾乎相同的設(shè)定,對(duì)我所有二級(jí) SCSI 設(shè)備 (secondary scsi devices), 包括磁帶機(jī)、光碟機(jī)和其他一般的 SCSI 設(shè)備都沒(méi)問(wèn)題。缺點(diǎn)是 'depmod -a' 不能自動(dòng)查出這些倚賴(lài),所以你要自己加入這些,而且不 可在開(kāi)機(jī)時(shí)執(zhí)行 'depmod -a'。但只要設(shè)定好了,kerneld 就能自動(dòng)載入 aha1542.o。 你要知道這技考只當(dāng)你有不同種類(lèi)的 SCSI 設(shè)備接駁在兩個(gè)控制器時(shí)才有用,例如,把硬碟駁在其中一個(gè),而把光碟機(jī)、磁帶或其他 SCSI 駁到另一個(gè)。 要載入超過(guò)一個(gè)模組時(shí):“post-install”項(xiàng)目 有時(shí),只把模組載入不足以使設(shè)備運(yùn)作。例如,如果你把音效卡編譯為模組,你也會(huì)希望調(diào)整至適當(dāng)音量。問(wèn)題題你的設(shè)定在下次載入時(shí)便會(huì)失去。這里是由 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 這樣,當(dāng)音效的模組載入後,kerneld 會(huì)執(zhí)行 'post-install sound' 項(xiàng)目的指令。因此該模組會(huì)被 '/usr/local/bin/setmix -f /etc/volume.conf 指令設(shè)定好。 這方法對(duì)其他模組也有用,例如 lp 模組可籍以下一句用 tunelp 程式設(shè)定好: post-install lp tunelp 只有 1.3.69f 版或之後的 kerneld 才支援這些選項(xiàng)。 注意: :此 mini-HOWTO 的較舊版本曾提及一個(gè) "pre-remove" 選項(xiàng),讓你可在 kerneld 卸下一個(gè)模組時(shí)執(zhí)行一個(gè)指令。但這從未成功,因此并不鼓勵(lì)使用。這個(gè)選項(xiàng)多數(shù)會(huì)在未來(lái)版本的 kerneld 中消失。所有有關(guān)模組 "設(shè)定" 的事情都在改變中,在你看到這文件時(shí),可能已有所不同了。 -------------------------------------------------------------------------------- 偵察 kerneld 如果你什麼方法都已試過(guò),但仍找不出核心在要在 kerneld 做什麼,你可用一個(gè)方法找出 kerneld 收到什麼要求,從而知道該加什麼到 /etc/conf.modules。你需要 kdstat 程式。 這個(gè)好用的程式已包括在 modules-package 中,但預(yù)定是不會(huì)編譯及安裝的。你可用以下方法建立它: cd /usr/src/modules-2.0.0/kerneld make kdstat 之後,要使 kerneld 顯示它正在做什麼,執(zhí)行 kdstat debug kerneld 便會(huì)開(kāi)始在主控臺(tái)印出其工作的資料。當(dāng)你執(zhí)行所需的指令時(shí),你會(huì)見(jiàn)到 kerneld 收到的要求。這些要求可放到 /etc/conf.modules 中,加上所需模組的別名 (alias),便可使工作完成。 要停止除錯(cuò)時(shí),執(zhí)行 '/sbin/kdstat nodebug'。 -------------------------------------------------------------------------------- kerneld 的特殊用途 我知道你想問(wèn)如何設(shè)定螢?zāi)槐Wo(hù)程式 (screensaver) 的模組… modules-package 的 'kerneld/GOODIES' 目錄中有一些和螢?zāi)槐Wo(hù)程式及主控臺(tái)嗶聲支援有關(guān)的核心修補(bǔ) (kernel patches)。它們尚未在官方的核心出現(xiàn)。所以你要自行修正及重新編譯核心。 要安裝修補(bǔ),你要用 "patch" 指令: cd /usr/src/linux patch -s -p1 之後重建安裝新核心。 當(dāng)螢?zāi)槐Wo(hù)程式啟動(dòng)時(shí),kerneld 會(huì)執(zhí)行 "/sbin/screenblanker" 指令。這可以是一個(gè)執(zhí)行你喜歡的螢?zāi)槐Wo(hù)程式的命令手稿 (shell script)。 在核心想重繪螢?zāi)粫r(shí),它會(huì)送出一個(gè) SIGQUIT 訊號(hào)到正執(zhí)行 /sbin/screenblanker 的行程 (process)。你的命令稿或螢?zāi)槐Wo(hù)程式要捕捉 (trap) 這訊號(hào)及結(jié)□。記著之後還要把螢?zāi)贿€原到原本的文字模式 (text mode)。 -------------------------------------------------------------------------------- 常見(jiàn)問(wèn)題及你可能懷疑的事情 為何當(dāng)我執(zhí)行 ifconfig 時(shí)為何我會(huì)得到 "Cannot locate module for net-pf-X" 訊息 在核心 1.3.80 左右,網(wǎng)絡(luò)的程式修改至容許把通訴協(xié)定 (protocol families,如 IPX, AX.25 和 AppleTalk) 載入為模組。這導(dǎo)致額外的 kerneld 要求:net-pf-X,X 是一個(gè)用以辨別通訊協(xié)定的數(shù)字(參看 /usr/src/linux/include/linux/socket.h 來(lái)找出不同數(shù)字的意思)。 不幸地,ifconfig 會(huì)意外地造成這些訊息,所以很多人會(huì)在開(kāi)機(jī)期間執(zhí)行 ifconfig 來(lái)設(shè)定回歸設(shè)備 (loopback device) 時(shí)收到。這些訊息并無(wú)壞處,你可在 /etc/conf.modules 中加入以下數(shù)行來(lái)避免它們: alias net-pf-3 off # Forget AX.25 alias net-pf-4 off # Forget IPX alias net-pf-5 off # Forget AppleTalk 當(dāng)然,如果你把 IPX 編譯了為模組,你不可加上和它有關(guān)的一行。 開(kāi)始 Kerneld 後,啟動(dòng) PPP 連線(xiàn)會(huì)使我的電腦慢如蝸牛 已經(jīng)有多個(gè)這類(lèi)個(gè)案。這似乎是因?yàn)椤erneld 和部分系統(tǒng)用來(lái)設(shè)定和監(jiān)察 PPP 連線(xiàn)的 tkPPP script 不正常地互相影向所致。因?yàn)槟恰cript 在執(zhí)行 ifconfig 時(shí)好像用到回圈 (loops)。這樣會(huì)觸發(fā) kerneld 找尋 net-pf-X 模組(見(jiàn)前),增加系統(tǒng)工作量和可能導(dǎo)致系統(tǒng)紀(jì)錄 (system log) 中出現(xiàn)大量 "Cannot locate module for net-pf-X" 訊息。除了不使用 tkPPP 或改用其他方法來(lái)監(jiān)察連線(xiàn),這問(wèn)題未有其他解決方法。 kerneld 不載入我的 SCSI 驅(qū)動(dòng)程式! 在你的 /etc/conf.modules 中加上一個(gè) SCSI 配接器的項(xiàng)目。詳情這看之前有關(guān) scsi_hostadapter 的部分。 modprobe 投訴 'gcc2_compiled' 未定義 (undefined) 這是 module-utilities 的一個(gè)錯(cuò)誤。它只在使用 binutils 2.6.0.9 或更新版本時(shí)出現(xiàn),而且已在 binutils 的出版說(shuō)明 (release note) 中說(shuō)明。所以你應(yīng)該看看它。你也可更新 module-utilities,如 modules-2.0.0 來(lái)解決這問(wèn)題。 我的音響驅(qū)動(dòng)程式 (sound driver) 老是忘記音量之類(lèi)設(shè)定 模組載入後的設(shè)定是儲(chǔ)存在模組之內(nèi)的。所以,當(dāng) kerneld 自動(dòng)卸下模組時(shí),你所做的設(shè)定都會(huì)被忘掉,下次載入時(shí)又回復(fù)原狀。 你可使 kerneld 在自動(dòng)載入模組後執(zhí)行一個(gè)程式,以作出設(shè)定。請(qǐng)參看以上有關(guān) 'post-install' 項(xiàng)目的部分。 DOSEMU 需要一些模組,我怎樣使 kerneld 載入它們? 你不能。不論是官方 (official) 或開(kāi)發(fā) (development) 版的 dosemu,都不支援用 kerneld 載入 dosemu 模組。不過(guò),如果你有 2.0.26 或更新的核心,你不再需要那些 dosemu 模組 -- 你只需要更新 dosemu 至 0.66.1 版。(譯按∶目前最新的 DOSEMU 穩(wěn)定版本 (stable version) 是 0.66.7。) 為何會(huì)有 "Ouch, kerneld timed out, message failed" 這訊息? 當(dāng)核心對(duì) kerneld 作出要求時(shí),它會(huì)期望在 1 秒之內(nèi)得到應(yīng)答 (acknowledgement)。如果 kerneld 不作出回應(yīng),這個(gè)訊息會(huì)被記錄下來(lái) (logged)。這要求會(huì)再被提出,直到完成為止。 這通常在系統(tǒng)負(fù)荷 (load) 非常高時(shí)發(fā)生。因?yàn)椤erneld 也是一個(gè)使用者行程 (user-process),它會(huì)如其他程序般排程 (scheduling)。負(fù)荷高時(shí),它可能來(lái)不及在核心超時(shí) (time out) 前作出回應(yīng)。 如果這問(wèn)題在負(fù)荷低時(shí)也發(fā)生,請(qǐng)?jiān)賳?dòng) kerneld (殺掉 kerneld 行程,以 /usr/sbin/kerneld指令來(lái)重新開(kāi)始它)。如果仍有問(wèn)題,你應(yīng)該寄一份錯(cuò)誤報(bào)告給linux-kernel@vger.rutgers.edu,但在寄出前請(qǐng)先確保你的核心和 kerneld 都是最新的。 mount 不等待 kerneld 載入檔案系統(tǒng)模組 已經(jīng)收到一定數(shù)目有關(guān) mount (8) 指令不等待 kerneld 載入檔案系統(tǒng)模組的報(bào)告。 ismod 顯示模組已被載入,如果你立刻再執(zhí)行 mount 的話(huà)便會(huì)成功。這似乎是 module-utilities 1.3.69f 版中一個(gè)會(huì)影響 Debian 使用者的錯(cuò)誤,使用一個(gè)新版的 module-utilities 可解決這問(wèn)題。 kerneld 不能載入 ncpfs 模組 你編譯 ncpfs utilities 時(shí)要用 -DHAVE_KERNELD。請(qǐng)參閱 ncpfs 的 Makefile。 kerneld 不能載入 smbfs 模組 你在使用一個(gè)舊的 smbmount utilities。請(qǐng)從 ftp://tsx-11.mit.edu/pub/linux/filesystems/smbfs/ 下載最新版本 (0.10 或之後)。 我把所有東西都編譯成模組,現(xiàn)在我的系統(tǒng)不能啟動(dòng) kerneld 不能載入根檔案系統(tǒng) (root filesystem) 模組。 你不可把所有東西都編譯成模組∶核心要有足夠的驅(qū)動(dòng)程式以使它能掛上 (mount) 根檔案系統(tǒng),和執(zhí)行所有要用於啟動(dòng) kerneld 的程式。所以你不能把以下東西模組化∶ 根檔案系統(tǒng)所在的硬碟的驅(qū)動(dòng)程式 根檔案系統(tǒng)的驅(qū)動(dòng)程式 init, kerneld和其他程式的二元格式載入程式 (binary format loader) [事實(shí)上,這并不正確。新的 1.3.x 及所有 2.0.x 核心都容許 LILO 或 LOADLIN 載入初始的 ram-disk,而你可以在啟動(dòng)的早期在這『磁碟』中載入模組。做法可在核心原程式碼中的 Documentation/initrd.txt 檔中可找到。] kerneld 不能在啟動(dòng)時(shí)載入 -- 投訴 libgdbm 較新版的 kerneld 要 GNU dbm 程式庫(kù) libgdbm.so 才能執(zhí)行。大多數(shù)的安裝程式都會(huì)把這檔案放在 /usr/lib,而你多數(shù)是在掛上 /usr 檔案系統(tǒng)前執(zhí)行了 kerneld。這問(wèn)題的其中一個(gè)癥狀是 kerneld 在啟動(dòng)時(shí)不能籍 rc-scripts 載入,但如果你在啟動(dòng)系統(tǒng)後自己開(kāi)始它,它便沒(méi)有問(wèn)題。解決方法,一是把 kerneld 的啟動(dòng)放在掛上 /usr 後,另一是把 gdbm 程式庫(kù)放到你的根檔案系統(tǒng),如 /lib。 我重新設(shè)定核心至沒(méi)有 xxx 支援後出現(xiàn) "Cannot load module xxx" Slackware(其他也可能)會(huì)在安裝時(shí)籍執(zhí)行 modprobe 來(lái)建立一個(gè)預(yù)設(shè)的 /etc/rc.d/rc.modules。modprode 得出來(lái)的結(jié)果會(huì)因原本的核心的設(shè)定而異。你可能在重新設(shè)定時(shí)排除了一些在 rc.modules 的模組,因此造成錯(cuò)誤。你可把你在 rc.modules 中不用的模組變?yōu)樽⑨尅?comment out),或刪除 rc.modules,讓 kerneld 在需要模組時(shí)自行載入。 我重新建立了核心及模組,但在啟動(dòng)時(shí)仍出現(xiàn)未分辨的符號(hào) (unresolved symbol) 訊息 你可能在設(shè)定或建立新核心時(shí)排除了一些模組,但已不用的舊模組仍在 /lib/modules 目錄下。最簡(jiǎn)單的解決方法是刪除你的 /lib/modules/x.y.z 目錄及在核心的源程式碼的目錄下做一次 'make modules_install'。這問(wèn)題只在重新設(shè)定同一版本的核心時(shí)發(fā)生。如果你在更新核心時(shí)遇到此問(wèn)題,你有其他問(wèn)題。 我安裝了 Linux 2.1 後不能載入任何模組 Linux 2.1 是目前的開(kāi)發(fā)核心 (development kernel)。也就是說(shuō),它隨時(shí)可能出現(xiàn)錯(cuò)誤。其中一樣大幅改變的是模組的處理方法,及核心和模組載入到什麼地方。Richard Henderson 現(xiàn)正負(fù)責(zé)核心的模組發(fā)展。 總結(jié)一句,如果你想在 2.1 版核心使用模組,你要∶ 閱讀 Documentation/Changes 檔案及找出更新你的系統(tǒng)所需的模組 使用最新的 modutils,可從以下地方得到ftp://ftp.redhat.com/pub/alphabits/ 或在ftp://tsx-11.mit.edu/pub/linux/packages/alphabits/ 的映像站 (mirror site) 如果你想在 2.1 版核心使用模組的話(huà),我會(huì)建議最少使用 2.1.29 版的核心。 自選撥號(hào) (dial-on-demand) 網(wǎng)絡(luò)又怎樣? kerneld 對(duì)有需要時(shí)建立網(wǎng)絡(luò)連線(xiàn)原本有些支援。嘗試在沒(méi)有連線(xiàn)時(shí)傳送訊息包 (packet) 會(huì)使 kerneld 執(zhí)行 /sbin/request_route 命令稿來(lái)建立 PPP 或 SLIP 連線(xiàn)。 這并不是一個(gè)好方法。Linux 網(wǎng)絡(luò)發(fā)展人員 Alan Cox 在 Linux 核心的通信論壇 (Mailing List) 中批評(píng)∶ 路徑要求 (request-route) 的東西是過(guò)時(shí)、不對(duì)及無(wú)用的 [...],它已在 2.1.x 的源程式碼中消失。 我誠(chéng)心建議你從 http://www.dna.lth.se/~erics/diald.html 取 Eric Schenk 的 diald 套裝軟件來(lái)安裝,而不要使用路徑要求及 kerneld。 -------------------------------------------------------------------------------- 版權(quán)訊息 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. |
新聞熱點(diǎn)
疑難解答
圖片精選