?? kerneld.txt
字號:
kerneld mini-HOWTO 1.7 版,上次由 Henrik Storner [1](storner@osiris.ping.dk)於 1997 年 7 月 19 日(storner@osiris.ping.dk) 更新。 曾達康 [2](a9504480@graduate.hku.hk) 於 1998 年 6 月 14 日完成翻譯。 _________________________________________________________________ 導言 此文件解釋如何使用 Linux 核心中的 kerneld 功能。它會說明: * [3]kerneld 是什麼 * [4]為什麼要用它 * [5]如何取得所需東西 * [6]如何設定它 * [7]如何告訴 kerneld 它不認識的模組的資料 * [8]如何偵察 kerneld (設定時可能有用) * [9]kerneld 的特別用途 * [10]常見問題及怪事 此文件的最新版本可在 [11]http://eolicom.olicom.dk/~storner/kerneld-mini-HOWTO.html 找到。( 譯按:中文版則可在 [12]http://www.linux.org.tw/CLDP/mini/Kerneld.html 找到)在此 mini-HOWTO 推出的正式版本期間,你可在 [13]http://eolicom.olicom.dk/~storner/kern.html 找到未經組織的更新清單 。 榮譽 如果你發現此文件中出現錯誤,請告訴文章的原作者。以下各人都曾對本文作出 貢獻: * Bjorn Ekwall <bj0rn@blox.se> * Ben Galliart <bgallia@luc.edu> * Cedric Tefft <cedric@earthling.net> * Brian Miller <bmiller@netspace.net.au> * James C. Tsiao <jtsiao@madoka.jpl.nasa.gov> 我非常感謝此 mini-HOWTO 讀者寄給我們的鼓勵和提議。 (譯按∶當然,如果問題出在譯文中,請通知曾達康 <a9504480@graduate.hku.hk>) _________________________________________________________________ kerneld 是什麼? kerneld 是由 [14]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): [15]ftp://sunsite.unc.edu/pub/Linux/kernel/v2.0/linux-2.0.29.tar.gz [16]ftp://tsx-11.mit.edu/pub/linux/sources/system/v2.0/linux-2.0.29.tar.gz [17]ftp://ftp.funet.fi/pub/Linux/PEOPLE/Linus/v2.0/linux-2.0.29.tar.gz 使用者層面的監控程式包含在 modules-1.2.8 及更新的 modules-2.0 中。它們 一般會和核心源程式碼在同一地點找到,而官方位置包括: [18]ftp://sunsite.unc.edu/pub/Linux/kernel/v2.0/modules-2.0.0.tar.gz [19]ftp://tsx-11.mit.edu/pub/linux/sources/sbin/modules-2.0.0.tar.gz [20]ftp://ftp.funet.fi/pub/Linux/tools/modules-2.0.0.tar.gz 注意:如果你想在 2.1 版的開發核心嘗試載入模組,你必須用最新的 modutils-(不是 modules-)。但請看 [21]以下有關模組和 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 的[22]Kernel-HOWTO ,你也可在 sunsite.unc.edu 的 /pub/Linux/docs/HOWTO 找到它。(譯按:中文版可在 [23]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 其中一個好處是只要你有所需的核心及安裝好監控程式,你只需作很少 設定?,F在,你可嘗試用一個建立成模組的驅動程式—它多數會不需再作設定而 能使用。我把軟磁碟的驅動程式建立成模組,所以我放入一只 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 即是說軟磁碟的驅動程式運作正?!斘覈L試使用軟磁碟時,它被自動載入。 要看到軟磁碟的模組真的被載入,你可執行 /sbin/lsmod,它會列出現時載入了 的模組。 osiris:~ $ /sbin/lsmod Module: #pages: Used by: floppy 11 0 (autoclean) "(autoclean)" 代表如果有一分鐘沒用此模組,它就會被 kerneld 自動移走。所 以,那 11 頁記憶體(44 kB,一頁等於 4kB)只會在我使用軟碟機時被占用。如 果我一分鐘不用軟碟,它會被釋放。如果你的記憶體不敷應用,這就太棒了! _________________________________________________________________ kerneld 如何知道該載入什麼模組? 雖然 kerneld 本身對常用的模組有所認識,有時它會不知如何應付核心提出的要 求。例如光碟機驅動程式或網絡驅動程式等可能需要超過一個模組的情形。 kerneld 從核心部分會收到以下種類的要求: * [24]區塊設備驅動程式 (a block-device driver) * [25]字元設備驅動程式 (a character-device driver) * [26]二元格式 (a binary format) * [27]tty 連線規則 (a tty line discipline) * [28]檔案系統 (a filesystem) * [29]網絡設備 (a network device) * 網絡服務 (a network service),如 rarp * [30]網絡協定 (a network protocol),如 IPX kerneld 從架構檔案 (configuration file) /etc/conf.modules 中得知有什麼 模組需要載入。這里有兩類項目:路徑 (paths)(模組檔案的位置)和代號 (aliases)(要載入什麼模組)。如果你未有此檔,你可用以下方法自己制造: /sbin/modprobe -c | grep -v '^path' >/etc/conf.modules 如果你想加多一個路徑到預定路徑中,你必須包括所有現有的路徑。因為在
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -