The Linux Bootdisk HOWTO 作者: Tom Fawcett () 譯者: v4.0, April 2000, 翻譯日期: 27 July 2000 本文描述如何設計與建造你自己的 Linux boot/root 磁片。這些磁片能用來當做救援磁片 (rescue disks) ,或是能用來測試新系統元件 (components) 。在企圖建造你自己的 bootdisk 之前,你應該要相當熟悉系統管理工作。如果你只是想要一張緊急時使用的救援磁片,請參考 前言 -- Preface

這份文件可能已經過期了。 如果標題頁上的日期距今已超過 6 個月,那麼請查閱 看看是否已有較新的版本。 雖然本文以 text 格式也是可以閱讀,但是因為印刷符號的關係, 版本注意事項 -- Version notes

尚未完成的事

有任何自願者嗎 ? 請描述 (或是鏈結到另一份有敘述的文件)如何製作其它可開機的類磁片物品,諸如 CDROMs, ZIP disks 與 LS110 disks 。 請描述如何處理巨大的 libc.so 共享函式庫。基本上可選擇獲取較舊、較小的函式庫,或是刪減現有的函式庫。 重新分析 distribution bootdisks 與更新 "How the Pros do it" 這一節。 刪減敘述關於如何升級現有 distribution bootdisks 的章節。 This is usually more trouble than it's worth. 重寫 / 潤飾 Troubleshooting 這一節。 回應與感謝 -- Feedback and credits

我接受任何關於本文內容之回應,無論是好是壞。我/我們 已力求這份文件內的指令與資訊是正確而可靠的。如果你發現任何錯誤或遺漏,請讓我知道。在撰寫時, 散佈政策 -- Distribution policy

Copyright © 1995,1996,1997,1998,1999,2000 by Tom Fawcett and Graham Chapman. 本文可以在 的條件下流通。如果你未能拿到此 license ,請與作者聯絡。 本文是一份免費文件。我們發行它是希望它能有助於你,但是 不能給你任何保證 ;本文也沒有 具有商業能力 適合特定用途 的保證。

簡介 -- Introduction

Linux 開機磁片 (boot disks) 在很多情況下是很有用的,諸如 測試一個新的核心 (kernel)。 從磁碟錯誤中復原 (這類錯誤從遺失開機磁區到磁碟讀寫頭毀損都有可能) 。 修復一個癱瘓 (disabled) 的系統 安全地升級臨界共用 (critical) 的系統檔案 (諸如 libc.so) 。 有好幾種獲得 boot disks 的方法: 使用發行套件 (distribution) 像是 Slackware 所提供的。它至少能讓你開機。 使用救援套件 (package) 建造用來做為救援磁片的磁片。 學習每一種 disk 運作系統時所需的東西,然後自己製作。 有些人選擇最後一種方法,如此他們能靠自己動手做。這樣子,如果某處發生問題,就能找 出辦法去解決問題。此外也可以學到很多有關 Linux 如何運作的知識。 本文假設讀者已熟悉基本的 Linux 系統管理觀念。舉例來說,你應該知道有關目錄、 filesystems 與軟碟片的議題。你也應該知道如何使用 /etc/passwd 與 fstab 這兩個檔案的用途以及它們看起來像什麼。最後,你應該知道 HOWTO 文件內大部分的指令,都要以 root 的身份來執行。 剛開始製作你自己的 bootdisk 是很複雜的。如果你未曾讀過 Linux FAQ 與相關文件,諸如 Linux Installation HOWTO 與 Linux Installation Guide ,那麼你不應該嘗試建造開機磁片。如果你只需要緊急時用的 bootdisk ,下載一個別人事先完成的 bootdisk 拿來用會 為容易。請參考下面的 以得知在哪裡可以找到這些東西。 Bootdisks與開機流程 -- Bootdisks and the boot process

開機流程 -- The boot process

A槽 與 Linux 的 /dev/fd0)。接著 BIOS 會嘗試執行這個磁區。在大部分可開機的 disks 上,第 0 磁區、第 0 磁柱包含以下兩者之一: 開機載入程式 (boot loader ,如 LILO)的程式碼,它會找出 kernel 所在位置,接著載入並執行它以啟動開機程序。 一個作業系統 kernel 的開頭 (start) ,諸如 Linux 。 如果一個 Linux kernel 已利用 raw-copied 的方式置入一張磁片內,那麼這張磁片的第一個磁區就是 Linux kernel 本身的第一個磁區。這個磁區將從開機設備載入 kernel 的剩餘部分以繼續開機流程。 一旦 kernel 載入完畢,一些基本設備也完成初始化 (initialization) 。然後系統將嘗試從某個設備載入以及掛上 (mount) 。所謂的 root filesystem 只是一個被掛上當作 ``/'' 目錄的 filesystem 。 kernel 必須被告知可從哪裡找到此 root filesystem ;如果 kernel 在那裡找不到一個可載入的影像檔 (image) ,系統就會停止運作 (halt) 。 在某些開機情況下 -- 常常是從軟碟片開機 -- root filesystem 會被載入到 中,也就是被系統所存取的 RAM ,如同系統存取磁碟一般。為何系統會載入到 ramdisk 的理由有二。第一, RAM 是幾個比軟碟片快的有序磁性體,所以系統在其上運作較快; 第二, kernel 可以從軟碟片載入一個 並且在解壓縮後放到 ramdisk 上,如此可讓更多的檔案儲存在軟碟片上。 一旦 root filesystem 被載入並掛上,你會看到一行訊息像: VFS: Mounted root (ext2 filesystem) readonly. init inittab sysinit 此時系統會在 root filesystem 上找到 /bin or /sbin) 並執行它。 init 讀取它的組態設定檔 (configuration file) /etc/inittab ,找出檔中標明 /etc/rc 或 /etc/init.d/boot 這兩個檔。這個 script 是一組建立基本系統服務的 shell 指令,諸如: 對所有磁碟執行 載入必備的核心模組 (modules), 啟動 swapping, 進行網路初始化, 將指定在 內的磁碟掛上。 這個 script 常會啟動其它各種不同的 scripts 執行模組的 (modular) 初始化。舉例來說,在一般的 SysVinit 架構下, /etc/rc.d/ 這個目錄包含一個複雜的子目錄架構,其中的檔案指出如何啟動與關閉大部分的系統服務。然而,在一張 bootdisk 上,這樣的 sysinit script 常常是非常簡單的。 當 sysinit script 結束後,控制權回到 預設的runlevel ,此預設的 runlevel 以 inittab 內。此 runlevel line 通常指定一個像 的程式,這個程式負責處理 console 與 ttys 之間的通訊。事實上,就是 磁碟類型 -- Disk types

如果你已了解基本的開機流程,那麼我們現在可以定義所涉及到之各種不同類型的磁碟。我們將磁碟分類成四種。本文與在此討論所稱之 ``磁碟 (disk)'' 除非有特別聲明,否則都是指軟碟片,雖然絕大部分的討論也同樣可應用在硬碟上。 root 在其 filesystem 上包含運作 Linux 系統必備檔案的一張磁片。這張磁片不一定有 kernel 或 boot loader 。 boot/root boot/root disk 一張同時包含 kernel 與 root filesystem 的磁片。換句話說,這張磁片包含不用硬碟而能啟動與運作 Linux 系統之所有必備項目。這種磁片的優點在於簡單輕便 -- 每一項必備的東西都放在同一張磁片上。然而,隨著檔案 size 的逐漸增加,讓所有東西都存在同一張磁片上就越顯困難,甚至利用壓縮也一樣。 utility 一張包含 filesystem 的磁片,但是並不是要掛上做為 root file system 來使用。這張磁片可視為額外的資料片 (data disk) 。你可以利用這種磁片把原本過多而不能放在 root disk 上的工具程式放在其上。 一般而言,當我們提及 ``建造一張 bootdisk'' 時,是指造出 boot ( kernel ) 與 root (files) 這兩個部分。這兩個部分不是放在一起 (一張單張的boot/root disk) ,就是兩張分開的磁片 (boot + root disks) 。對救援磁片而言最具彈性之做法,可能是使用兩張分開的 boot 與 root 磁片,再加上一張或多張的 utility diskettes 以處理多出來的東西。 建立一個root filesystem -- Building a root filesystem

root filesystem 必須包含支援完整 Linux 系統運作所需的每一個項目。為了能夠達成這個目的,這張磁片必須包括能讓 Linux 系統運作最起碼 (minimum) 的需求: 基本的檔案系統架構, 最起碼的目錄: /dev, /proc, /bin, /etc, /lib, /usr, /tmp, 基本的工具程式: sh, ls, cp, mv, etc., 最起碼的組態設定檔: rc, inittab, fstab, etc., 設備檔: /dev/hd*, /dev/tty*, /dev/fd0, etc., Runtime 函式庫以提供工具程式所使用之基本功能 (functions) 。 當然,任何系統只有在你能於其上執行某些東西時才會顯得有用,而一張 root 磁片通常只有在你能做到以下事情時才會顯得有用: 檢查另一台磁碟機的 file system ,舉例來說,檢查你硬碟上的 root file system ,你必須能夠從另一台磁碟機啟動 Linux ,例如你可以用一張 root 磁片辦到這件事。然後你可以在你原本的 root 磁碟機未被掛上時,對其執行 使用檔案 (archive) 與壓縮工具程式,諸如 我們將敘述如何建造一個 壓縮的 filesystem ,就是平時被壓縮在磁片上,只有當開機時,才會解壓縮後存入ramdisk 。 製作 filesystem -- Creating the filesystem

以下是你的 root filesystem 最起碼該有的目錄 此處所呈現之目錄架構僅供 root diskette 使用。真正的 Linux 系統有一套更為複雜且設計良好的架構方法,稱為 ,它決定檔案應該如何放置。 : /dev -- 裡面存放設備檔 (Devices) ,為達成 I/O 工作所需 /proc -- Directory stub required by the proc filesystem /etc -- 裡面存放系統組態設定檔 /sbin -- 重要的 (critical) 系統二進位執行檔 (binaries) /bin -- 被認為是系統一部分的基本二進位執行檔 /lib -- 提供 run-time 支援的共享函式庫 /mnt -- 維護其它磁碟所用的磁碟掛入點 (mount point) /usr -- 額外的工具程式與應用程式 /proc 目錄基本上是一個把 proc filesystem 放置於其下的 stub 。 /mnt/usr 這兩個目錄只是在 boot/root 系統運作時所使用的 mount points 。因此再重覆一次,這些目錄只需要被造出來就可以了。 剩下的四個目錄描述於以下各節。 /dev

/dev 目錄包含一群特別的檔案,這些檔案是給系統上所有設備使用的,這樣的 /dev 目錄每個 Linux 系統都一定會有。這個目錄本身是一個普通目錄,可以以一般的方法用 指令造出來。 但還是有一條捷徑 -- 直接 copy 你現有 /dev 目錄的內容,然後再清除你不想要的設備檔。唯一的要求是 copy 這些特別的設備檔時,要用 大寫字母 R 。這個指令是: cp -dpR /dev /mnt 在此我們假設磁片是被掛在 /mnt 底下。 使用磁帶設備,如果你想要從 bootdisk 存取軟式磁帶機,你就需要 copy 所有有關的設備檔。 請注意,每一個設備檔需要一個 inode ,但 /dev 目錄移除任何你所不需要的設備檔是有意義的。舉例來說,如果你沒有 SCSI 磁碟,你可以放心地移除所有以 請確定從這個目錄放入了以下檔案的: console, kmem, mem, null, ram0 and tty1. /etc

一直都是必備的, 可能是必備的,但是沒有人能十分確定。 偷跑進來的垃報。 通常可以用以下指令識出哪些是非基本的檔案: ls -ltru 這個指令將檔案依據上次被存取的日期,以先早後晚 (reverse) 的順序列出,所以如果有任何檔案不會被存取,那麼它們就可以從 root 磁片中刪去。 在我的 root 磁片上,我的組態檔數目已減至 15 個。這可減少我處理以下三種檔案的工作: 我必須為 boot/root 系統進行組態設定的檔案: rc.d/* -- 系統啟動與改變 run level 的 scripts -- 要被掛上的 file systems 清單 -- 給 我們應該為 boot/root 系統整理的檔案: -- 重要的使用者、 home 目錄等其它項目的清單。 group -- 使用者群組。 shadow -- 使用者的密碼。你可能沒有這個檔。 termcap -- the terminal capability database. 如果系統安全 (security) 對你很重要,那麼 passwdshadow 應該被刪減,以避免將使用者密碼 copy 出系統,這樣當你從磁片開機時,不想要的 logins 會被拒絕。 至少包含了 termcap ,終端機資料庫,一般而言有幾百個 kilobytes 。你 boot/root 磁片的版本應該被刪減到只包含你所使用的終端機,這通常就是 The rest. They work at the moment, so I leave them alone. Out of this, 我實際上只必須設定兩個檔,而它們所應包含的項目驚人地少。 rc 應該包含: #!/bin/sh /bin/mount -av /bin/hostname Kangaroo 請確定上述的目錄都是正確的。你並不需要真地去執行 -- 如果你執行只是讓系統比較好看 (譯註:如此系統會有個名字) 。 應該至少要包含: /dev/ram0 / ext2 defaults /dev/fd0 / ext2 defaults /proc /proc proc defaults 你可以從你現存的 fstab copy 你想要的項目,但是你並不應該自動地掛上你硬碟任何的 partitions ;請對這些項目使用 你的 應該被改變,以使其中 rc 或無論什麼將被執行的基本開機 script 。同時,如果你想要確保不可從序列埠 login ,請在所有行尾包括 ttysttySgetty 項目前加上「#」符號 (comment out) 。請保留 tty 埠以讓你可以在 console 前 login 。 一個最起碼的 檔看起來樣這樣: id:2:initdefault: si::sysinit:/etc/rc 1:2345:respawn:/sbin/getty 9600 tty1 2:23:respawn:/sbin/getty 9600 tty2 檔定義了系統在各種不同的情況中將執行什麼項目,包括 startup 、切換至多使用者模式等等。請仔細地檢查在 inittab 中被提及的檔案名稱 (filenames) ;如果 /etc/shutdown 已把 /etc/reboot 的位置寫死在其中。如果我移動了 reboot/bin/reboot,然後下達一個 /etc 目錄中的所有文字檔 (text files) ,再加上在你 /etc 目錄中,你無法確定你需不需要的所有可執行檔。需要指示 (guide) 者,請參考在 的樣本清單。也許只要 copy 這些檔案就足夠了,但是系統差異會有很大的影響,所以你無法確定你系統上相同的檔案組合,就一定等於清單中的檔案。唯一確定的方法就是從 /etc/rc.d/ 目錄,其中包含給不同 run levels 的shell scripts 。最起碼會有一個單一的 rc script,但是僅從你現存的系統 copy /etc/rc.d 這兩個目錄,然後刪減 rc.d 目錄中的 shell scripts 以移除和磁片系統環境無關的 processing ,會是較為簡單的做法。 /bin 與 /sbin

/bin 目錄是一個放置為了執行基本作業 (operations) 而所需之額外工具程式的方便好地方,這些工具程式諸如 /sbin 這兩個目錄的檔案清單範例請見 。但範例中並沒有包括任何從備份復原時所需之工具程式,諸如 /usr 。 工具程式磁片 ( 這節。保留一份相同版本之備份用工具程式的copy是比較好的,這個備份用工具程式被用來製作備份,如此你就不用浪費時間在嘗試安裝不能讀取你備份磁帶的版本。 請確定你包括了以下程式: /lib

/lib 中,你要放入必要的共享函式庫 (libraries) 與載入程式 (loaders) 。如果無法在你的 /lib 目錄中找到必要的函式庫,那麼系統將不能夠開機。如果你很幸運,你可能會看到告訴你為什麼會發生如此情況的錯誤訊息。 libc 函式庫, libc.so.N ,其中 N 是目前版本的編號。請檢查你的 /lib 目錄。 Libc.so.N 通常是一個 symlink ,它指向一個具有完整版本編號的檔名: % ls -l /lib/libc* -rwxr-xr-x 1 root root 4016683 Apr 16 18:48 libc-2.1.1.so* lrwxrwxrwx 1 root root 13 Apr 10 12:25 libc.so.6 -> libc-2.1.1.so* 在這個情況下,你會想要 libc-2.1.1.so 。為了找到其它函式庫,你應該要看過所有你打算包括的二進位檔,並且用 指令檢查它們的相依性。舉例來說: % ldd /sbin/mke2fs libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000) libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000) libuuid.so.1 => /lib/libuuid.so.1 (0x40028000) libc.so.6 => /lib/libc.so.6 (0x4002c000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 在右手邊的每一個檔案是一定要有的。有些檔案可能是一個 symbolic link 。 請注意某些函式庫 相當地大 ,而且並不能輕易地配合你的 root filesystem 。舉例來說,上述的 libc.so 大約有 4 megabytes 。因此,在你 copy 它們到你 root filesystem 的同時,你可能需要除去一些函式庫。請看 這一節以了解 instructions 。 /lib 內,你也必須包括一個 loader 供這些函式庫使用。這個 loader 不是 ld.so (給 A.OUT 函式庫使用),就是 ld-linux.so (給 ELF 函式庫使用)。較新版的 % file /lib/libc.so.4.7.2 /lib/libc.so.5.4.33 /lib/libc-2.1.1.so /lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped /lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped /lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped 仔細地檢查 。如果 kernel 不能載入所需的函式庫,那麼 kernel 就會在沒有錯誤訊息的情況下停止運作。 對 PAM 與 NSS 的提供 -- Providing for PAM and NSS

如果你的系統使用 PAM (Pluggable Authentication Modules) ,那麼你必須在你的 bootdisk上為 PAM 做一些預備。簡而言之, PAM 是一種複雜精密的模組化方法,針對使用者認證以及控制使用者對服務的存取。一個決定你的系統是否使用 PAM 的簡單方法,是對你的 login 可執行檔執行 ldd ;如果輸出包括 libpam.so ,你就需要 PAM 。 幸運地,安全性通常並非 bootdisk 所關心的議題,因為任何對機器有實際存取權的人,通常能做任何他們無論如何想做的事。因此,你可以有效地關閉 PAM ,只要在你的 root filesystem 造出一個簡單的 /etc/pam.conf 檔,這個檔看起來像這樣: OTHER auth optional /lib/security/pam_permit.so OTHER account optional /lib/security/pam_permit.so OTHER password optional /lib/security/pam_permit.so OTHER session optional /lib/security/pam_permit.so 請記得也 copy /lib/security/pam_permit.so 這個檔到你的 root filesystem 。這個函式庫只有大約 8K ,因此它只佔用極小量的 overhead 。 請記得這個組態設定允許任何人對這台機器上的檔案以及服務有完整的存取權。如果你因某種理由而在乎你 bootdisk 的安全性,那麼你就必須 copy 一些或是全部你硬碟的 PAM setup 到你的 root filesystem 。請確定曾仔細地讀過 PAM 文件,並且 copy 任何在 /lib/security 中所需要的函式庫到你的 root filesystem 上。 你同時必須包含 /lib/libpam.so 到你的 bootdisk 上。但是你已知這件事,因為你已對 /bin/login 執行過 ldd ,這動作顯示了其相依性。 NSS (Name Service Switch)

如果你正使用 glibc (aka libc6) ,你就必須為名稱服務 (name switch) 進行預備,否則你會無法 log in 。 /etc/nsswitch.conf 這個檔案控制資料庫對各式服務之搜尋 (lookups) 。如果你並不打算從網路上存取服務 (比如說: DNS或 NIS 搜尋),那麼你只需要準備一個簡單的 nsswitch.conf 檔,這個檔案看起來像這樣: passwd: files shadow: files group: files hosts: files services: files networks: files protocols: files rpc: files ethers: files netmasks: files bootparams: files automount: files aliases: files netgroup: files publickey: files 這樣就指定每一項服務只被 local files 提供。你同時需要包括 /lib/libnss_files.so.X ,在此 X 是 1 的話是指 glibc 2.0 ,而 2 的話是指 glibc 2.1 。這個函式庫將被以動態方式載入以處理檔案搜尋。 如果你打算從你的 bootdisk 存取網路,那麼你會想要製作一個更精巧複雜的 nsswitch.conf 檔。細節請參考 nsswitch man page。最後,請記得你必須為你所指定的每一項 服務 (service) ,把 /lib/libnss_service.so.1 檔放入 bootdisk 中。 模組 -- Modules

/lib/modules 。你同時也應該包括 /etc/conf.modules 一起包括進來。 然而,使用模組的主要優點在於你可以把非關鍵 (non-critical)模組移到 utility disk 上,在需要用到時才載入,這樣在你的 root disk 上會使用比較少的空間。如果你要處理許多不同的設備,這個方法比建立一個內建支援許多設備的巨大 kernel 來得好。 請注意,為了啟動 (boot) 一個壓縮的 ext2 filesystem ,你必須有 ramdisk 與內建 ext2 支援。 它們不能夠以模組的方式被提供。 一些最後的細節 -- Some final details

某些系統程式,諸如 /var/run/utmp 檔與 /var/log 目錄不存在時,會發出警告。所以: mkdir -p /mnt/var/{log,run{ touch /mnt/var/run/utmp 最後,在你設定 (set up) 完所有你所需的函式庫後,執行 /etc/ld.so.cache 。這個 cache 會告訴 loader 到哪裡找到函式庫。要重新製作 ld.so.cache,請下達以下指令: chdir /mnt; chroot /mnt /sbin/ldconfig Wrapping it up

/usr/src/linux 為起點。如果你在建造 kernel 上有困難,你或許不應該企圖不擇手段地建造 boot/root systems 。請記得用 ``把它們放在一起:製作磁片(組) -- Putting them together: Making the diskette(s)

進行到這裡,你已經有一個 kernel 與一個壓縮的 root filesystem 。如果你正在製作一張 boot/root 磁片,請檢查它們的 size ,以確定它們都能放在同一張磁片上。如果你正在製作一套兩張磁片的 boot + root 磁片組。請檢查 root filesystem 以確定它能放在一張磁片上。 你應該決定是否使用 LILO 以啟動 bootdisk的 kernel 。替代的方法是直接把 kernel copy 到磁片上,然後不使用 LILO 開機。使用 LILO 的好處在於讓你能夠提供一些參數給 kernel ,這些參數對初始化硬體來說可能是必要的(請檢查你系統上的 /etc/lilo.conf 檔。如果這個檔存在,而且有一行像``kernel filesystem,在其中你傳送 kernel 以及一些 LILO 所需的其它檔案。 這一節。 用 LILO 傳送 kernel -- Transferring the kernel with LILO

最後一步是要傳送 root filesystem 。 如果 root filesystem 將被放置在做為 kernel 之 相同 磁片上,請使用 dd if=rootfs.gz of=/dev/fd0 bs=1k seek=KERNEL_BLOCKS 如果 root filesystem 會被放置在 第二張 磁片上,請自磁碟機中拿走第一張軟碟片然後放入第二張磁碟片,接著將 root filesystem 傳送到其上: dd if=rootfs.gz of=/dev/fd0 bs=1k 恭喜你,已經完成了! 在把 bootdisk 挪為緊急使用之前,請記得先測試它 !如果你的成品不能執行,請繼續讀下去。 問題解決 -- Troubleshooting, or The Agony of Defeat

如果 Id xxx respawning too fast: disabled for 5 minutes 它是來自於 /etc/inittab 內的呼叫 (invocations) 是正確的。如果你得到來自 /etc/inittab 內的呼叫格式是錯誤的。 如果你得到一個 login 提示 (prompt) ,然後你輸入一個有效的 login name ,但是系統卻立即提示你要輸入另一個 login name ,那麼這個問題可能是出在 PAM 或 NSS 。請看 這一節。問題也可能是你使用 shadow passwords 而你卻沒有 copy /etc/shadow 到你的 bootdisk 上。 如果你嘗試去執行某個可執行檔,諸如 其它各種主題 -- Miscellaneous topics

減少 root filesystem 的 size -- Reducing root filesystem size

Q. 我從我的 boot/root 磁片開機,但是什麼都跑不出來。我現在怎麼辦 ?

請看之前的 這節。 Q. Slackware/Debian/RedHat 的 bootdisk 如何運作 ?

請看之前的 這節。 Q. 我要如何以 XYZ 驅動程式製作一張開機磁片 ?

最簡單的方法是去從離你最近的 Slackware 映射站拿到一個 Slackware 的 kernel 。 Slackware 的 kernel 是一般的 (generic) kernel ,這些 kernel 企圖將許多設備的驅動程式儘可能地包含於其中,因此,假如你有一個 SCSI或IDE控制器,試試看,很有可能它的驅動程式會在 Slackware 的 kernel 當中。 找到 a1 目錄,並且依據你所擁有的控制器種類,選擇 IDE 或 SCSI 兩者之一的 kernel 。對所選擇的 kernel 檢視其 xxxxkern.cfg 檔,並且去了解這份 kernel 中所擁有的驅動程式。如果你想要使用的設備在這份列表中,那麼這個符合的 kernel 就應該能用來開機。下載 xxxxkern.tgz 檔,並且用之前在有關 making boot disks 的章節中所描述之方法, copy 它到你的開機磁片中。 /dev/sda2 ,但是我的 root SCSI partition 是 /dev/sda8 。為了能使用 root 磁片,你將必須使用這個指令 Q. 我如何以新的檔案更新我的 root 磁片 ?

這節而得的)。然後掛上這個檔案系統並且進行改變動作。你必須記住你的 root 檔案系統從哪裡開始,以及它佔了多少 block: dd if=/dev/fd0 bs=1k skip=ROOTBEGIN count=BLOCKS | gunzip > DEVICE mount -t ext2 DEVICE /mnt 在完成改變之後,如同之前一樣進行下去 (在 這節中) ,並且把 root filesystem 傳送回那張磁片上。如果你並沒有改變新的 root filesystem 的啟始位置,你應該不用再重傳 kernel ,或是重新計算 ramdisk 的 word。 Q. 我要如何移除 LILO ,好讓我能再用 DOS 開機 ?

/sbin/lilo -u 你也可以使用 FDISK /MBR MBR 是 Master Boot Record(主要開機記錄)的縮寫,它會用一個乾淨的 DOS 開機磁區,替換原本的開機磁區,而且這個動作不會影響 partition table 。一些有潔癖的人 (purists) 並不同意這一點,可是就連 LILO 的原作者, Werner Almesberger ,都同意此作法。這個作法簡單,而且有用。 Q. 如果我遺失了我的 kernel 我的開機磁片,我要如何開機 ?

如果你並沒有一張已準備好的開機磁片,最簡單的作法可能是要依照你的磁碟控制器類型 (IDE 或 SCSI) 取得一份 Slackware kernel ,如同之前所述的 ``我如何用XXX驅動程式製作一張開機磁片 ?'' 。然後你就可以用這個 kernel 開機,接著修理有損壞的地方。 你取得的 kernel 可能沒有與你想要的磁碟種類和 partition 相對應的 root 設備集。舉例來說, Slackware 的 generic SCSI kernel 有與 /dev/sda2 相對應的 root設備集,然而,我的 root Linux partition 是在 /dev/sda8 。在此情況下, kernel 中的 root 設備將必須被改變。 你仍然可以改變 kernel 的 root 設備與 ramdisk 的設定,縱使你手上只有一個 kernel 和某種其它的作業系統,像 DOS 。 HEX(16進位) DEC(10進位) DESCRIPTION(用途描述) 0x01F8 504 RAMDISK word的低字元組 (Low byte of RAMDISK word) 0x01F9 505 RAMDISK word的高字元組 (High byte of RAMDISK word) 0x01FC 508 Root minor設備號碼 - 詳見其後 0X01FD 509 Root major設備號碼 - 詳見其後 關於 ramdisk word 之解釋,寫在之前的 這節裡。 Major 與 minor 設備號碼必須設成你想要掛你的 root filesystem 於其上的設備。一些可供選擇的有用參考數值如下: DEVICE MAJOR MINOR /dev/fd0 2 0 第一台軟碟機 /dev/hda1 3 1 在第一顆IDE硬碟上的partition 1 /dev/sda1 8 1 在第一顆SCSI硬碟上的partition 1 /dev/sda8 8 8 在第一顆SCSI硬碟上的partition 8 一旦你設定了這些值,接下來你可以將這個檔案寫入一張磁片內,你可以利用 Norton Utilities Disk Editor ,不然就是利用名為 Q. 我要如何製作 boot/root 磁片的額外備份 ?

因為磁性媒介可能在一段時間後遭遇損害,你應該保留幾張你的救援磁片的備份,以防原來的那一片不能被電腦讀取。 製作任何磁片的備份,包括開機用與公用程式 (utility) 磁片,最簡單的方法是利用 dd if=DEVICENAME of=FILENAME 在此, dd if=FILENAME of=DEVICENAME 請注意,以上的討論是假設你只有一台軟碟機。假如相同種類的軟碟機你有兩台,你可以利用像下面的指令去 copy 磁片: dd if=/dev/fd0 of=/dev/fd1 Q. 我如何能在每一次開機時,不用輸入 “ahaxxxx=nn,nn,nn” ?

aha152x=0x340,11,3,1 這行參數字串可以利用 LILO 以數種方法提供給 kernel : 每次當系統以 LILO 開機時,你可以在命令列輸入它。但是每次這樣做會很煩。 你可以使用 LILO 的 你可以在 LILO 的組態檔中,使用 舉例來說,一行使用上述參數字串的樣本命令列將長成這樣: zImage aha152x=0x340,11,3,1 root=/dev/sda1 lock 如此將會傳遞設備參數字串給 kernel ,同時也要求 kernel 把 root 設備設定到 /dev/sda1 ,並且儲存整行命令列,讓以後開機時都能再使用這個命令列。 以下是一個 APPEND 敘述的樣本: APPEND = “aha152x=0x340,11,3,1” 請注意參數字串在命令列上 不能 被雙引號夾住,但是參數字串在 一定要 被雙引號夾住。 另外也請注意,為了能讓參數字串起作用, kernel 內必須有符合這個磁碟類型的驅動程式。如果沒有,那麼就沒有東西會去接受 (listen for) 這個參數字串,所以你將必須重新建造一個包含指定驅動程式的 kernel 。有關重新建立 kernel 的細節,請至目錄 /usr/src/linux 閱讀其 README 檔,以及 Linux FAQ 與 Installation HOWTO 。 Alternatively ,你可以為這種磁碟類型取得一個 generic kernel 並且安裝它。 在體驗 LILO 安裝之前,強烈建議讀者先讀過 LILO 文件。不小心使用 Q. 在開機的時候,出現了 “

在某些版本中, /etc/reboot 寫死在其程式碼內,所以 /etc 這個目錄下。 因為有不能夠找到 為了修正這些問題,不是移動這些程式到正確的目錄,就是更改設定檔 (e.g. inittab)以指向正確的目錄。假如有所懷疑,就請先把程式如同它們在你硬碟上一樣,放入相同的目錄,並且如同它們顯現在你硬碟上一樣,使用相同的 inittab/etc/rc.d 檔。 Q. 我的 kernel 支援 ramdisk ,但是卻初始化 0K 的 ramdisk 。為什麼 ?

當 kernel 正在進行開機動作時,在問題發生之處,會出現一個像這樣的 kernel 訊息: Ramdisk driver initialized : 16 ramdisks of 0K size 這可能是因為 size 已被 kernel 參數在開機時設成 0 。這可能是由於一個 overlooked LILO組態設定檔參數所導致: ramdisk= 0 在某些較舊的 distributions 裡,這個會被包含在 LILO 組態設定檔樣本中,這放在那裡是為了 override 任何 kernel 原先的設定。如果你有這樣的一行,請移除之。 請注意,如果企圖使用一個已被設定成 0 size 的 ramdisk ,這樣的行為將會導致不可預測的結果,同時也會讓 kernel 不知如何是好。 資源與指示 -- Resources and pointers

救援套件 -- Rescue packages

目前可以從 metalab.unc.edu 取得數種製作救援磁片的套件。利用這些套件,你可以指定包含一組檔案,接著軟體就會自動地進行 bootdisk 的製作 (自動化程度會有所不同)。請看 以取得進一步的資訊。 請仔細檢查檔案日期 。一些套件有數年未被更新,而這些套件將無法支援「載入至 ramdisk 之壓縮 root filesystem 」的製作。就目前所知, 是唯一可支援此的套件。 LILO -- the Linux loader

由 Werner Almesberger 撰寫。一個優秀的 boot loader ,其文件包含了開機磁區內容的資訊,以及開機流程的初期階段。 請從 以FTP下載。也可以從 Metalab 與映射站台內取得。 Linux FAQ 與 HOWTOs

這些文件可以從諸多來源中取得。這些文件可以從諸多來源中取得。請見 usenet 新聞論壇 中取得,而 HOWTOs 可以從 中取得。大部分 Linux 文件可以在 中找得到。 Ramdisk使用方法 -- Ramdisk usage

/usr/src/linux/Documentation/ramdisk.txt 。這份文件是由 Paul Gortmaker 所編寫,同時包含了一節關於製作壓縮的 ramdisk 。 Linux開機流程 -- The Linux boot process

Linux System Administrators' Guide 中,有一節是關於 booting 。 LILO ``Technical overview'' 中,擁有關於開機流程一直到 kernel 從何處被啟動之決定性 (definitive) 技術上 low-level 的敘述。 Source code 是你永遠的指南。以下是一些與開機流程有關的 kernel files 。如果你有 Linux 核心的原始碼,你可以在你機器上的 /usr/src/linux 之中找到這些檔案;此外, Shigo Yamguchi ()有非常棒的 ,可以用來讀 kernel source files 。以下是一些可供參考的有關檔案: arch/i386/boot/bootsect.S and setup.S 包含 bootsector 自己的組合碼。 arch/i386/boot/compressed/misc.c 包含未壓縮的 kernel 程式碼。 arch/i386/kernel/ 包含了 kernel 初始化程式碼的目錄。 setup.c 定義了 ramdisk 的 word 。 drivers/block/rd.c 包含 ramdisk 的驅動程式。 LILO boot error codes

。 當 LILO 載入自己時,螢幕上會顯示 (nothing) LILO 完全沒有被載入。 LILO 不是沒有被安裝好,就是 LILO 開機磁區所在的 partition 並非使用中的 partition 。 /boot/boot.b 所造成。 如果在 LILO 正試著載入 boot image 時, BIOS 發出一個錯誤訊號,那麼相對映的 (respective)錯誤碼會顯示出來。錯誤碼的範圍從 Root filesystem 列表樣本 -- Sample root filesystem listings