?? bootdisk-howto-4.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>4</title>
</head>
<body>
<table>
<tr>
<td bgColor="#FFFFFF" vAlign="top"><a href="Bootdisk-HOWTO-5.html"><img alt="Next" src="next.gif" width="16" height="16"></a>
<a href="Bootdisk-HOWTO-3.html"><img alt="Previous" src="prev.gif" width="16" height="16"></a> <a href="Bootdisk-HOWTO.html#toc4"><img alt="Contents" src="toc.gif" width="16" height="16"></a>
<hr>
<h2><a name="s4">4. 建立一個root filesystem -- Building a root
filesystem</a></h2>
<p><a name="BuildRoot"></a>
<p>造出 root filesystem
涉及選擇能讓系統正常運作所必備的檔案。在這一節中,我們將敘述如何建造一個
<em>壓縮的 root filesystem</em>
。在磁片上建造一個直接掛上做為根目錄 (root)
之未經壓縮的 filesystem
是較不普遍的觀念;這個替代方案敘述在 <a href="http://www.linux.org.tw/CLDP/Bootdisk-HOWTO-8.html#NonRamdiskRoot">Non-ramdisk
Root Filesystem</a> 這一節中。
<p>
<h2><a name="ss4.1">4.1 概觀 -- Overview</a></h2>
<p>
<p>root filesystem 必須包含支援完整 Linux
系統運作所需的每一個項目。為了能夠達成這個目的,這張磁片必須包括能讓
Linux 系統運作最起碼 (minimum) 的需求:
<p>
<ul>
<li>基本的檔案系統架構,
<li>最起碼的目錄: <code>/dev, /proc, /bin, /etc, /lib, /usr, /tmp</code>,
<li>基本的工具程式: <code>sh, ls, cp, mv</code>, etc.,
<li>最起碼的組態設定檔: <code>rc, inittab, fstab</code>,
etc.,
<li>設備檔: <code>/dev/hd*, /dev/tty*, /dev/fd0</code>, etc.,
<li>Runtime 函式庫以提供工具程式所使用之基本功能
(functions) 。</li>
</ul>
<p>當然,任何系統只有在你能於其上執行某些東西時才會顯得有用,而一張
root 磁片通常只有在你能做到以下事情時才會顯得有用:
<p>
<ul>
<li>檢查另一臺磁碟機的 file system
,舉例來說,檢查你硬碟上的 root file system
,你必須能夠從另一臺磁碟機啟動 Linux
,例如你可以用一張 root
磁片辦到這件事。然後你可以在你原本的 root
磁碟機未被掛上時,對其執行 <code>fsck </code>。
<li>使用檔案 (archive) 與壓縮工具程式,諸如 <code>cpio,
tar, gzip</code> 與 <code>ftape</code> ,從備份 (backup)
恢復儲存所有或部分你原本 root 磁碟機的資料。</li>
</ul>
<p>我們將敘述如何建造一個 <em>壓縮的 </em>filesystem
,就是平時被壓縮在磁片上,只有當開機時,才會解壓縮後存入ramdisk
。 <!--
compressed root filesystem
-->
用壓縮 filesystem 的方式,你可以在一張標準的 1440K
磁片上放入很多檔案 (大約 6 megabytes) 。因為 filesystem
比磁片大很多,我們不能直接把它建在磁片上。我們必須在其它地方建立它,壓縮它,然後再把它
copy 到磁片上。
<p>
<h2><a name="ss4.2">4.2 製作 filesystem -- Creating the filesystem</a></h2>
<p><a name="CreatingRootFS"></a>
<p>為了建造如此的一個 filesystem
,你需要一個多出而夠大的設備,能夠讓你在壓縮之前存放所有的檔案。你將需要一個能夠存放大約
4 megabytes檔案的設備。有以下幾種選擇:
<p>
<ul>
<li>使用 <b>ramdisk</b> (DEVICE = /dev/ram0)。在這種情況下,記憶體被模擬成一臺磁碟機。
Ramdisk 必須大到能夠存放一個適當大小的 filesystem
。如果你使用 LILO ,請檢查你的組態設定檔 (/etc/lilo.conf)
,找到一行像
<pre> RAMDISK = nnn
</pre>
<!--
RAMDISK_SIZE, LILO parameter
-->
這行決定可以分配給 ramdisk 的 RAM
之極大值。預設值是 4096K
,這應該是足夠了。你應該不可能嘗試在一臺少於 8MB
RAM 的電腦上使用如此的 ramdisk 。
請檢查以確認你有一個設備檔像是 /dev/ram0, /dev/ram
或是 /dev/ramdisk 。如果沒有,請自己以 <code>mknod</code>
(major number 1, minor 0)造出 /dev/ram0 。
<li>如果你有一個未使用且夠大的硬碟 partition (差不多幾megabytes大就可以了),就使用它吧。
<li>使用一個 <b>loopback device</b>
,這可以把一個磁碟檔案當做是一臺設備來使用。使用
loopback device 時,你可以在硬碟上造出一個 3 megabyte
的檔案,並於其上建造 filesystem 。 鍵入 <code>man losetup</code>
找尋指令以使用 loopback devices 。如果你沒有 <code>losetup</code>
,你可以從 <a href="ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/">ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/</a>
目錄中, util-linux 套件 (package) 內相容版本之 <code>mount</code>
與 <code>unmount</code> 的隨附物中找到它。
如果在你的系統上沒有 loop device 檔 (/dev/loop0,
/dev/loop1, etc.),那麼你必須用 ``<code>mknod /dev/loop0 b 7 0</code>''
自己造出一個。一旦安裝好這些特別的 <code>mount</code>
與 <code>umount</code>
二進位檔,就請在一臺容量夠大的硬碟上造出一個暫存檔
(temporary file)(eg, /tmp/fsfile)
。你可以使用像這樣子的指令:
<blockquote>
<code>dd if=/dev/zero of=/tmp/fsfile bs=1k count=<i>nnn</i></code>
</blockquote>
以造出一個 <em>nnn</em>-block 的檔案。
請使用自己的檔名取代以下的 DEVICE 。當你下了 mount
指令,你同時要加上 ``<code>-o loop</code>'' 選項以告知
mount 是使用 loopback device 。 <!--
loopback device
-->
舉例來說:
<pre> mount -o loop -t ext2 /tmp/fsfile /mnt
</pre>
以掛上 loopback device 的方式,把 /tmp/fsfile 掛上 <code>/mnt</code>
這個 mount point 。用 <code>df</code>
指令可讓你看到以上的結果。</li>
</ul>
<p>在你選擇其中一種方法後,請準備 DEVICE 以:
<pre> dd if=/dev/zero of=DEVICE bs=1k count=4096
</pre>
<p>這行指令送出一堆 0 把DEVICE填滿。用 0 填滿 device
是關鍵的一步,因為 filesystem之後將會被壓縮,所以所有未使用的部分應被用
0 填滿以達到最大的壓縮比。無論何時你從你的 root
filesystem 刪除檔案,請記得這個事實。實際上 filesystem
只是釋出 (de-allocate) 這些 blocks , <em>但是並沒有再把它們填為
0 </em>。如果你執行過很多次刪除與 copy
的動作,你的壓縮 filesystem 最後會比必要的大出很多。
<p><!--
inodes, allocation
-->
下一步就是造出 filesystem 。 Linux kernel 承認兩種能讓 root
disks 自動地被 copy 到 ramdisk 上的 file system 。它們是 minix
與 ext2 ,其中 ext2 是比較受歡迎的。如果使用 ext2
,你會發現使用 <code>-i</code> 選項指定比預設值更多的
inodes 是有助益的;我們建議用 <code>-i 2000</code>
,這樣你就不會用完 inodes
。如果不用上述選項,你可以移除許多不必要的 <code>/dev</code>
檔案以節省 inodes 。 <code>mke2fs</code> 預設會造出 360 個
inodes在一張 1.44Mb 的磁片上。我發現在我目前的救援 root
磁片上, 120 個 inodes
是相當足夠了,但是如果你把所有的設備檔都放入 <code>/dev</code>
目錄中,那麼你很容易會超過 360 個inodes 。使用壓縮的
root filesystem 可讓你擁有較大的 filesystem
,同時預設會有更多的 inodes
,但是你仍然必須要不就是減少檔案數量,要不就是增加
inodes 數目。
<p>因此,你所使用的指令看起來會像這樣:
<pre> mke2fs -m 0 -i 2000 DEVICE
</pre>
<p>(如果你使用的是一個 loopback device
,那麼請用你目前所用的磁碟檔案替換掉上面的 DEVICE 。)
<!--
loopback device
-->
<p><code>mke2fs</code>
指令會自動地偵測可獲得的空間,然後依據偵測對自身進行組態設定。
``<code>-m 0</code>'' 參數避免保留空間給 root
,因此可提供更多可用的磁碟空間。
<p>下一步,掛上這個 device :
<p>
<pre> mount -t ext2 DEVICE /mnt
</pre>
(如果 mount point 並不存在,你必須自行造出一個 mount point
<code>/mnt</code> 。) 在剩下的章節中,所有的目的
(destination) 目錄都被假設是相對於 <code>/mnt</code> 。
<p>
<h2><a name="ss4.3">4.3 移植檔案系統 -- Populating the filesystem</a></h2>
<p>
<p>以下是你的 root filesystem 最起碼該有的目錄
<p>此處所呈現之目錄架構僅供 root diskette 使用。真正的
Linux 系統有一套更為複雜且設計良好的架構方法,稱為 <a href="http://www.pathname.com/fhs/2.0/fhs-toc.html">Filesystem
Hierarchy Standard</a> ,它決定檔案應該如何放置。 :
<p>
<ul>
<li>/dev -- 裡面存放設備檔 (Devices) ,為達成 I/O
工作所需
<li>/proc -- Directory stub required by the proc filesystem
<li>/etc -- 裡面存放系統組態設定檔
<li>/sbin -- 重要的 (critical) 系統二進位執行檔 (binaries)
<li>/bin -- 被認為是系統一部分的基本二進位執行檔
<li>/lib -- 提供 run-time 支援的共享函式庫
<li>/mnt -- 維護其它磁碟所用的磁碟掛入點 (mount point)
<li>/usr -- 額外的工具程式與應用程式</li>
</ul>
<p><!--
proc
-->
<!--
mnt
-->
<!--
usr
-->
<p>上述目錄的其中三個在 root filesystem
上會是空的,所以它們只需要用 <code>mkdir</code> 造出來。
/proc 目錄基本上是一個把 proc filesystem 放置於其下的 stub
。 /mnt 與 /usr 這兩個目錄只是在 boot/root
系統運作時所使用的 mount points
。因此再重覆一次,這些目錄只需要被造出來就可以了。
<p>剩下的四個目錄描述於以下各節。
<p>
<h3>/dev</h3>
<p>
<p><!--
device (dev) directory
-->
<p>/dev
目錄包含一群特別的檔案,這些檔案是給系統上所有設備使用的,這樣的
/dev 目錄每個 Linux
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -