Next Previous Contents

6. 把它們放在一起:製作磁片(組) -- 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 檔。如果這個檔存在,而且有一行像``append=...'',你可能需要這個特點 (feature))。使用 LILO 的缺點在於建造 bootdisk 變得更為複雜,並且佔用稍嫌較多的空間。你將必須設定一個小型而獨立的 filesystem ,我們稱之為 kernel filesystem,在其中你傳送 kernel 以及一些 LILO 所需的其它檔案。

如果你將要使用 LILO ,請繼續讀下去;如果你要直接傳送 kernel ,先跳過此,直接到 Without using LILO 這一節。

6.1 用 LILO 傳送 kernel -- Transferring the kernel with LILO

你所必須做的第一件事是為 LILO 編寫一個小型的組態檔。這個檔看起來像這樣:


        boot      =/dev/fd0
        install   =/boot/boot.b
        map       =/boot/map
        read-write
        backup    =/dev/null
        compact
        image     =KERNEL
        label     =Bootdisk
        root      =/dev/fd0

關於這些參數的說明請看 LILO's user documentation 。你或許也會想從你硬碟上的 /etc/lilo.conf 檔,加入一行 append=... 到這個組態檔中。

把這個組態檔存成 bdlilo.conf 。

現在你必須製作一個小型的檔案系統,我們稱之為 kernel filesystem ,有別於 root filesystem 。

首先,指出這個 filesystem 應該會有多大。用 blocks 計算你 kernel 的 size (這個 size 用 ``ls -l KERNEL'' 顯示出來,是被 1024 所除並強迫進位),然後加 50 。這個 50 blocks 是估計的空間,為 inodes 與其它檔案所需。如果你想要,你可以精確地計算這個數字,或是就用 50 就好了。如果你正在製作兩張磁片的磁片組,你會高估這個空間,因為無論如何第一張磁片只給 kernel 使用。我們稱這個數字會 KERNEL_BLOCKS

請把軟碟片放入軟碟機 (為求簡便,我們假設是 /dev/fd0),然後在其上製作 ext2 kernel filesystem 。

        mke2fs -i 8192 -m 0 /dev/fd0 KERNEL_BLOCKS

``-i 8192'' 指定我們想要每 8192 bytes 一個 node 。接下來, mount 這個 filesystem ,移除 lost+found 目錄,然後為 LILO 造出 dev 與 boot 這兩個目錄:

        mount /dev/fd0 /mnt
        rm -rf /mnt/lost+found
        mkdir /mnt/{boot,dev}

再來,造出設備檔 /dev/null 與 /dev/fd0 。不用尋找設備號碼,你只要從你的硬碟上用 -R copy它們:

        cp -R /dev/{null,fd0} /mnt/dev
LILO 需要一份它的 boot loader 的 copy , boot.b ,你可以從你的硬碟得到它。它通常是放在 /boot 目錄內。
        cp /boot/boot.b /mnt/boot
最後,隨附你的 kernel , copy 你在上一節所編寫的 LILO 組態檔。它們兩者可以被放在根目錄下。
        cp bdlilo.conf KERNEL /mnt
LILO 所需的每一項現在都在 kernel filesystem上,所以你已準備好去執行它。 LILO 的 -r 旗號(flag)被用作安裝 boot loader 在某個其它的 root 上:
        lilo -v -C bdlilo.conf -r /mnt

LILO 應該可以在無錯的情況下執行,在此之後,你可以看看你的 kernel filesystem ,應該長得像這樣:


total 361
  1 -rw-r--r--   1 root     root          176 Jan 10 07:22 bdlilo.conf
  1 drwxr-xr-x   2 root     root         1024 Jan 10 07:23 boot/
  1 drwxr-xr-x   2 root     root         1024 Jan 10 07:22 dev/
358 -rw-r--r--   1 root     root       362707 Jan 10 07:23 vmlinuz
boot:
total 8
  4 -rw-r--r--   1 root     root         3708 Jan 10 07:22 boot.b
  4 -rw-------   1 root     root         3584 Jan 10 07:23 map
dev:
total 0
  0 brw-r-----   1 root     root       2,   0 Jan 10 07:22 fd0
  0 crw-r--r--   1 root     root       1,   3 Jan 10 07:22 null           

如果檔案 size 和你自己的 filesystem 有稍微不同,請不用擔心。

現在請把磁片留在軟碟機內,然後前進到 Setting the ramdisk word 這一節。

6.2 不使用 LILO 來傳送 kernel -- Transferring the kernel without LILO

如果你 使用LILO,那麼就用 dd 指令來傳送 kernel 給 bootdisk :

        % dd if=KERNEL of=/dev/fd0 bs=1k
        353+1 records in
        353+1 records out

在這個例子中, dd 寫入了 353 個完整記錄(records) + 1個partial record ,所以 kernel 佔用了 354 個軟碟片的 blocks 。這個數字稱為 KERNEL_BLOCKS ,請記得它,這個數字要給下一節使用。

最後,請設定 root device 為軟碟片自己,然後再設定 root 要被載入成 read/write :

        rdev /dev/fd0 /dev/fd0
        rdev -R /dev/fd0 0

在第二個 rdev 指令中,請小心地使用 -R

6.3 設定ramdisk -- Setting the ramdisk word

在 kernel image內的是 ramdisk word ,它伴隨其它選項,指定了 root filesystem 應該在哪裡被找到。這個 word 會被以 rdev 指令,來進行存取與設定,而它的內容被解釋如下:

        bits  0-10:     Offset to start of ramdisk, in 1024 byte blocks
        bits 11-13:     unused
        bit     14:     Flag indicating that ramdisk is to be loaded
        bit     15:     Flag indicating to prompt before loading rootfs

如果 bit 15 被設定,在開機時 (boot-up) ,會提示你把一張新的軟碟片放入軟碟機中。這對一套雙磁片的開機磁片組來說是必要的。

依據你是建造一張單一的 boot/root 磁片,還是兩張 "boot + root" 的磁片組,這裡會產生兩種情況。

  1. 如果你是建造一張單一磁片,壓縮的 root filesystem 會被放置在 kernel 之後,所以 offset 會是第一塊 free block (這個值應該會與 KERNEL_BLOCKS 相等) 。 Bit 14 會被設定為 1 ,而 bit 15 會被設定為 0 。 舉例來說,假設你正建造一張單一磁片,而 root filesystem 將自 block 253 (10進位)開始。那麼, ramdisk word 值應該是 253 (10進位) , bit 14 設為 1 而 bit 15 設為 0 。要計算這個值,你可以簡單地加一加這個 10 進位數字。 253 + (2^14) = 253 + 16384 = 16637 。如果你並不十分了解這個數字從何而來,把這數字放到工程計算機上,然後把它轉換為 2 進位,
  2. 如果你建造的是一套雙磁片組,那麼 root filesystem 將自第二張磁片的 block 0 開始,所以 offset 為 0 。 Bit 14 設為 1 而 bit 15 設為 1 。在這個情況下, 10 進位值是 2^14 + 2^15 = 49152 。

在仔細地為 ramdisk word 計算後,請用 rdev -r 設定它。請注意要使用 10 進位 值。如果你使用 LILO ,傳給 rdev 的引數在此應該是 mounted kernel path ,比如說 /mnt/vmlinuz;如果你用 dd 來 copy kernel ,替換成使用軟碟機名稱( 比如說 /dev/fd0)。

        rdev -r KERNEL_OR_FLOPPY_DRIVE  VALUE

如果你使用 LILO ,現在請把磁片 unmount 。

6.4 傳送root filesystem -- Transferring the root filesystem

最後一步是要傳送 root filesystem 。

恭喜你,已經完成了!

在把 bootdisk 挪為緊急使用之前,請記得先測試它 !如果你的成品不能執行,請繼續讀下去。


Next Previous Contents