📄 bootdisk-howto-6.html
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>6</title>
</head>
<body>
<table>
<tr>
<td bgColor="#FFFFFF" vAlign="top"><a href="Bootdisk-HOWTO-7.html"><img alt="Next" src="next.gif" width="16" height="16"></a>
<a href="Bootdisk-HOWTO-5.html"><img alt="Previous" src="prev.gif" width="16" height="16"></a>
<a href="Bootdisk-HOWTO.html#toc6"><img alt="Contents" src="toc.gif" width="16" height="16"></a>
<hr>
<h2><a name="s6">6. 把它們放在一起:製作磁片(組) -- Putting
them together: Making the diskette(s)</a></h2>
<p>
<p>進行到這裡,你已經有一個 kernel 與一個壓縮的 root
filesystem 。如果你正在製作一張 boot/root
磁片,請檢查它們的 size
,以確定它們都能放在同一張磁片上。如果你正在製作一套兩張磁片的
boot + root 磁片組。請檢查 root filesystem
以確定它能放在一張磁片上。
<p>你應該決定是否使用 LILO 以啟動 bootdisk的 kernel
。替代的方法是直接把 kernel copy 到磁片上,然後不使用
LILO 開機。使用 LILO 的好處在於讓你能夠提供一些參數給
kernel ,這些參數對初始化硬體來說可能是必要的(請檢查你系統上的
/etc/lilo.conf 檔。如果這個檔存在,而且有一行像``<code>append=...</code>'',你可能需要這個特點
(feature))。使用 LILO 的缺點在於建造 bootdisk
變得更為複雜,並且佔用稍嫌較多的空間。你將必須設定一個小型而獨立的
filesystem ,我們稱之為 <em>kernel filesystem</em>,在其中你傳送
kernel 以及一些 LILO 所需的其它檔案。
<p><!--
lilo filesystem
-->
<!--
lilo.conf
-->
<!--
kernel , parameters
-->
<p>如果你將要使用 LILO
,請繼續讀下去;如果你要直接傳送 kernel
,先跳過此,直接到 <a href="#TransferringWithoutLILO">Without
using LILO</a> 這一節。
<p>
<h2><a name="ss6.1">6.1 用 LILO 傳送 kernel -- Transferring the kernel
with LILO</a></h2>
<p><a name="TransferringWithLILO"></a>
<p>你所必須做的第一件事是為 LILO
編寫一個小型的組態檔。這個檔看起來像這樣:
<hr>
<pre> boot =/dev/fd0
install =/boot/boot.b
map =/boot/map
read-write
backup =/dev/null
compact
image =KERNEL
label =Bootdisk
root =/dev/fd0
</pre>
<hr>
關於這些參數的說明請看 LILO's user documentation
。你或許也會想從你硬碟上的 /etc/lilo.conf 檔,加入一行 <code>append=...</code>
到這個組態檔中。
<p>把這個組態檔存成 bdlilo.conf 。
<p>現在你必須製作一個小型的檔案系統,我們稱之為 <em>kernel
filesystem</em> ,有別於 root filesystem 。
<p>首先,指出這個 filesystem 應該會有多大。用 blocks
計算你 kernel 的 size (這個 size 用 ``<code>ls -l KERNEL</code>''
顯示出來,是被 1024 所除並強迫進位),然後加 50 。這個
50 blocks 是估計的空間,為 inodes
與其它檔案所需。如果你想要,你可以精確地計算這個數字,或是就用
50
就好了。如果你正在製作兩張磁片的磁片組,你會高估這個空間,因為無論如何第一張磁片只給
kernel 使用。我們稱這個數字會 <code>KERNEL_BLOCKS</code> 。
<p>請把軟碟片放入軟碟機 (為求簡便,我們假設是
/dev/fd0),然後在其上製作 ext2 kernel filesystem 。
<pre> mke2fs -i 8192 -m 0 /dev/fd0 KERNEL_BLOCKS
</pre>
<p><!--
inodes, allocation
-->
``<code>-i 8192</code>'' 指定我們想要每 8192 bytes 一個 node
。接下來, mount 這個 filesystem ,移除 lost+found
目錄,然後為 LILO 造出 dev 與 boot 這兩個目錄:
<pre> mount /dev/fd0 /mnt
rm -rf /mnt/lost+found
mkdir /mnt/{boot,dev}
</pre>
<p>再來,造出設備檔 /dev/null 與 /dev/fd0
。不用尋找設備號碼,你只要從你的硬碟上用 <code>-R</code>
copy它們:
<pre> cp -R /dev/{null,fd0} /mnt/dev
</pre>
LILO 需要一份它的 boot loader 的 copy , boot.b
,你可以從你的硬碟得到它。它通常是放在 /boot
目錄內。
<pre> cp /boot/boot.b /mnt/boot
</pre>
最後,隨附你的 kernel , copy 你在上一節所編寫的 LILO
組態檔。它們兩者可以被放在根目錄下。
<pre> cp bdlilo.conf KERNEL /mnt
</pre>
LILO 所需的每一項現在都在 kernel filesystem上,所以你已準備好去執行它。
LILO 的 <code>-r</code> 旗號(flag)被用作安裝 boot loader
在某個其它的 root 上:
<pre> lilo -v -C bdlilo.conf -r /mnt
</pre>
<p>LILO
應該可以在無錯的情況下執行,在此之後,你可以看看你的
kernel filesystem ,應該長得像這樣:
<hr>
<pre>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
</pre>
<hr>
<p><!--
kernel filesystem
-->
<p>如果檔案 size 和你自己的 filesystem
有稍微不同,請不用擔心。
<p>現在請把磁片留在軟碟機內,然後前進到 <a href="#SettingRamdiskWord">Setting
the ramdisk word</a> 這一節。
<p>
<h2><a name="ss6.2">6.2 不使用 LILO 來傳送 kernel -- Transferring
the kernel without LILO</a></h2>
<p><a name="TransferringWithoutLILO"></a>
<p>如果你 <em>不 </em>使用LILO,那麼就用 <code>dd</code>
指令來傳送 kernel 給 bootdisk :
<pre> % dd if=KERNEL of=/dev/fd0 bs=1k
353+1 records in
353+1 records out
</pre>
<p>在這個例子中, <code>dd</code> 寫入了 353 個完整記錄(records)
+ 1個partial record ,所以 kernel 佔用了 354 個軟碟片的 blocks
。這個數字稱為 <code>KERNEL_BLOCKS</code>
,請記得它,這個數字要給下一節使用。
<p>最後,請設定 root device 為軟碟片自己,然後再設定
root 要被載入成 read/write :
<pre> rdev /dev/fd0 /dev/fd0
rdev -R /dev/fd0 0
</pre>
<p><!--
rdev
-->
<p>在第二個 <code>rdev</code> 指令中,請小心地使用 <code>-R</code>
。
<p>
<h2><a name="ss6.3">6.3 設定ramdisk -- Setting the ramdisk word</a></h2>
<p><a name="SettingRamdiskWord"></a>
<p>在 kernel image內的是 <em>ramdisk word</em>
,它伴隨其它選項,指定了 root filesystem
應該在哪裡被找到。這個 word 會被以 <code>rdev</code>
指令,來進行存取與設定,而它的內容被解釋如下:
<p>
<pre> 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
</pre>
<p>如果 bit 15 被設定,在開機時 (boot-up)
,會提示你把一張新的軟碟片放入軟碟機中。這對一套雙磁片的開機磁片組來說是必要的。
<p>依據你是建造一張單一的 boot/root 磁片,還是兩張
"boot + root" 的磁片組,這裡會產生兩種情況。
<p>
<ol>
<li>如果你是建造一張單一磁片,壓縮的 root filesystem
會被放置在 kernel 之後,所以 offset 會是第一塊 free
block (這個值應該會與 <code>KERNEL_BLOCKS</code> 相等) 。
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 進位,
<li>如果你建造的是一套雙磁片組,那麼 root filesystem
將自第二張磁片的 block 0 開始,所以 offset 為 0 。 Bit
14 設為 1 而 bit 15 設為 1 。在這個情況下, 10
進位值是 2^14 + 2^15 = 49152 。</li>
</ol>
<p><!--
ramdisk word
-->
<!--
rdev
-->
<p>在仔細地為 ramdisk word 計算後,請用 <code>rdev -r</code>
設定它。請注意要使用 <em>10 進位 </em>值。如果你使用
LILO ,傳給 <code>rdev</code> 的引數在此應該是 <em>mounted
kernel path</em> ,比如說 /mnt/vmlinuz;如果你用 <code>dd</code>
來 copy kernel ,替換成使用軟碟機名稱(<em> 比如說 </em>/dev/fd0)。
<pre> rdev -r KERNEL_OR_FLOPPY_DRIVE VALUE
</pre>
<p>如果你使用 LILO ,現在請把磁片 unmount 。
<p>
<h2><a name="ss6.4">6.4 傳送root filesystem -- Transferring the root
filesystem</a></h2>
<p>
<p>最後一步是要傳送 root filesystem 。
<p>
<ul>
<li>如果 root filesystem 將被放置在做為 kernel 之 <em>相同 </em>磁片上,請使用
<code>dd</code> 指令及其 <code>seek</code>
選項傳送它,這會指定要跳過多少個 blocks :
<pre> dd if=rootfs.gz of=/dev/fd0 bs=1k seek=KERNEL_BLOCKS
</pre>
<li>如果 root filesystem 會被放置在 <em>第二張 </em>磁片上,請自磁碟機中拿走第一張軟碟片然後放入第二張磁碟片,接著將
root filesystem 傳送到其上:
<pre> dd if=rootfs.gz of=/dev/fd0 bs=1k
</pre>
</li>
</ul>
<p>恭喜你,已經完成了!
<p>在把 bootdisk 挪為緊急使用之前,請記得先測試它 !如果你的成品不能執行,請繼續讀下去。
<p>
<hr>
<a href="Bootdisk-HOWTO-7.html"><img alt="Next" src="next.gif" width="16" height="16"></a>
<a href="Bootdisk-HOWTO-5.html"><img alt="Previous" src="prev.gif" width="16" height="16"></a>
<a href="Bootdisk-HOWTO.html#toc6"><img alt="Contents" src="toc.gif" width="16" height="16"></a></td>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -