進行到這裡,你已經有一個 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 這一節。
你所必須做的第一件事是為 LILO 編寫一個小型的組態檔。這個檔看起來像這樣:
boot =/dev/fd0 install =/boot/boot.b map =/boot/map read-write backup =/dev/null compact image =KERNEL label =Bootdisk root =/dev/fd0
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/devLILO 需要一份它的 boot loader 的 copy , boot.b ,你可以從你的硬碟得到它。它通常是放在 /boot 目錄內。
cp /boot/boot.b /mnt/boot最後,隨附你的 kernel , copy 你在上一節所編寫的 LILO 組態檔。它們兩者可以被放在根目錄下。
cp bdlilo.conf KERNEL /mntLILO 所需的每一項現在都在 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 這一節。
如果你 不 使用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
。
在 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" 的磁片組,這裡會產生兩種情況。
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 進位,
在仔細地為 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 。
最後一步是要傳送 root filesystem 。
dd
指令及其 seek
選項傳送它,這會指定要跳過多少個 blocks :
dd if=rootfs.gz of=/dev/fd0 bs=1k seek=KERNEL_BLOCKS
dd if=rootfs.gz of=/dev/fd0 bs=1k
恭喜你,已經完成了!
在把 bootdisk 挪為緊急使用之前,請記得先測試它 !如果你的成品不能執行,請繼續讀下去。