Next Previous Contents

10. 常見問題 (FAQ) 列表 -- Frequently Asked Question (FAQ) list

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

請看之前的 Troubleshooting 這節。

Q. Slackware/Debian/RedHat 的 bootdisk 如何運作 ?

請看之前的 What the pros do 這節。

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 它到你的開機磁片中。

然後你必須檢查在 kernel 中的 root 設備,使用 rdev zImage 這個指令。接著 rdev 將顯示目前在 kernel 中的 root 設備。如果這和你所想要的 root 設備不同,那麼使用 rdev 改變它。舉例來說,我試的 kernel 設定到 /dev/sda2 ,但是我的 root SCSI partition 是 /dev/sda8 。為了能使用 root 磁片,你將必須使用這個指令 rdev zImage dev/fd0/ 。

假如你還想知道如何 set up 一張 Slackware 的 root 磁片,這就已經超出這份 HOWTO 的範圍,所以我建議你查閱 Linux Install Guide ,或是設法取得 Slackware distribution 。詳情請看在這份 HOWTO 中,標題為 ``Reference'' 的章節。

Q. 我如何以新的檔案更新我的 root 磁片 ?

最簡單的方法是從 rootdisk copy 檔案系統回你所使用的那個 DEVICE (從之前的 Creating the filesystem 這節而得的)。然後掛上這個檔案系統並且進行改變動作。你必須記住你的 root 檔案系統從哪裡開始,以及它佔了多少 block:

        dd if=/dev/fd0 bs=1k skip=ROOTBEGIN count=BLOCKS | gunzip > DEVICE
        mount -t ext2 DEVICE /mnt
在完成改變之後,如同之前一樣進行下去 (在 Wrapping it up 這節中) ,並且把 root filesystem 傳送回那張磁片上。如果你並沒有改變新的 root filesystem 的啟始位置,你應該不用再重傳 kernel ,或是重新計算 ramdisk 的 word。

Q. 我要如何移除 LILO ,好讓我能再用 DOS 開機 ?

這個問題並非真的是 Bootdisk 的一個主題,只是這個問題常常被問到。在 Linux 的環境下,你可以執行:

        /sbin/lilo -u

你也可以使用 dd 這個指令把被 LILO 所儲存的備份, copy 到開機磁區上。如果你想要這樣做,請參考 LILO 的文件。

在 DOS 與 Windows 的環境下,你可以使用這個 DOS 指令:

        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 。

rdev 藉著改變在 kernel 檔案裡,在固定位移位置 (offset) 上的值,來改變 kernel 的設定,因此,如果你手上有一個 hex 編輯器 (on whatever systems you do still have running) ,你可以完成相同的事 -- 例如在 DOS 環境下的 Norton Utilities Disk Editor 。接著,你需要進行檢查,如果必要的話,你得改變 kernel 檔案裡,在以下位移位置上的值:

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 之解釋,寫在之前的 Setting the 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 ,不然就是利用名為 rawrite.exe 的這支程式。這支程式在所有的 distribution 都找得到。這支程式是一支在DOS環境下執行的程式,它能將檔案寫入一張 ``raw'' disk ,從開機磁區開始寫入,而不是將檔案寫入檔案系統。如果你使用 Norton Utilities ,你必須將檔案寫入一張實體磁片,從磁片的頭開始寫入。

Q. 我要如何製作 boot/root 磁片的額外備份 ?

因為磁性媒介可能在一段時間後遭遇損害,你應該保留幾張你的救援磁片的備份,以防原來的那一片不能被電腦讀取。

製作任何磁片的備份,包括開機用與公用程式 (utility) 磁片,最簡單的方法是利用 dd 這個指令,去 copy 原來那張磁片的內容到你硬碟上的一個檔案之中,然後再用相同的指令將這個檔案 copy 回一張新磁片上。請注意,你並不需要,也不應該去 mount 這張磁片,因為 dd利用raw設備介面。

要 copy 原磁片,請輸入以下指令:

        dd if=DEVICENAME of=FILENAME

在此, DEVICENAME 是指這台磁碟機的設備名 (譯按:/dev/fd0) ,而 FILENAME 是指(存在硬碟上的)輸出檔案檔名。省略 count 參數讓 dd 去copy整張磁片 (如果是高密度磁片,有 2880 個 blocks) 。

要把從上面得到的檔案 copy 到一張新磁片上,請插入一張新磁片並輸入相反的指令:

        dd if=FILENAME of=DEVICENAME

請注意,以上的討論是假設你只有一台軟碟機。假如相同種類的軟碟機你有兩台,你可以利用像下面的指令去 copy 磁片:

        dd if=/dev/fd0 of=/dev/fd1

Q. 我如何能在每一次開機時,不用輸入 “ahaxxxx=nn,nn,nn” ?

當一台磁碟設備不能被自動偵測時,就有必要提供 kernel 指定的設備參數字串,諸如:

        aha152x=0x340,11,3,1

這行參數字串可以利用 LILO 以數種方法提供給 kernel :

舉例來說,一行使用上述參數字串的樣本命令列將長成這樣:

        zImage  aha152x=0x340,11,3,1 root=/dev/sda1 lock

如此將會傳遞設備參數字串給 kernel ,同時也要求 kernel 把 root 設備設定到 /dev/sda1 ,並且儲存整行命令列,讓以後開機時都能再使用這個命令列。

以下是一個 APPEND 敘述的樣本:

        APPEND = “aha152x=0x340,11,3,1”

請注意參數字串在命令列上 不能 被雙引號夾住,但是參數字串在 APPEND 敘述中 一定要 被雙引號夾住。

另外也請注意,為了能讓參數字串起作用, kernel 內必須有符合這個磁碟類型的驅動程式。如果沒有,那麼就沒有東西會去接受 (listen for) 這個參數字串,所以你將必須重新建造一個包含指定驅動程式的 kernel 。有關重新建立 kernel 的細節,請至目錄 /usr/src/linux 閱讀其 README 檔,以及 Linux FAQ 與 Installation HOWTO 。 Alternatively ,你可以為這種磁碟類型取得一個 generic kernel 並且安裝它。

在體驗 LILO 安裝之前,強烈建議讀者先讀過 LILO 文件。不小心使用 BOOT 敘述將會損壞 partition 。

Q. 在開機的時候,出現了 “A: cannot execute B” 的錯誤訊息。為什麼 ?

程式名稱有好幾種不同的寫法被寫死 (hardcoded) 在不同的公用程式裡。這些寫法不會在每個地方都發生,但是它們可能說明了為什麼一個顯而易見的可執行檔,不能在你的系統上被發現,縱使你看到它就在那裡。你可以找出是否一個已知的程式有另一種被寫死的名稱,你可以利用 strings 這個指令,並且利用管道方法 (譯按: piping, |) 將輸出透過 grep 呈現出來。

已知關於寫死的例子有:

為了修正這些問題,不是移動這些程式到正確的目錄,就是更改設定檔 (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 不知如何是好。


Next Previous Contents