?? bootdisk-howto-4.html
字號:
系統都一定會有。這個目錄本身是一個普通目錄,可以以一般的方法用
<code>mkdir</code>
造出來。然而,這些特別的檔案必須以特別的方法用 <code>mknod</code>
指令造出來。
<p>但還是有一條捷徑 -- 直接 copy 你現有 /dev
目錄的內容,然後再清除你不想要的設備檔。唯一的要求是
copy 這些特別的設備檔時,要用 <code>-R</code>
選項。這個選項會 copy 整個目錄中的檔案,但是不會 copy
這些檔案的內容。請確定使用 <em>大寫字母 R</em>
。這個指令是:
<pre> cp -dpR /dev /mnt
</pre>
<p>在此我們假設磁片是被掛在 /mnt 底下。 <code>dp</code>
選項 (switches) 確保 symbolic links 是以 links 的方式來 copy
,而不是 copy 鏈結檔所指向的 target file
,同時原本的檔案屬性也被保留,因此保留了檔案的所有權資訊。
<p>如果你想要用高難度技巧完成這個任務,就利用 <code>ls
-l</code> 列出你想要的設備檔之 major 與 minor device numbers
,然後再用 <code>mknod</code> 在磁片上造出它們。
<p>無論如何 copy
這些設備檔,還是要檢查任何你所需之設備檔 (device
special file) 是否已放入這張救援磁片中。舉例來說, <code>ftape</code>
使用磁帶設備,如果你想要從 bootdisk
存取軟式磁帶機,你就需要 copy 所有有關的設備檔。
<p>請注意,每一個設備檔需要一個 inode ,但 inodes
一直都是稀少的資源,特別是在磁片 filesystems
上。因此,從磁片上的 /dev
目錄移除任何你所不需要的設備檔是有意義的。舉例來說,如果你沒有
SCSI 磁碟,你可以放心地移除所有以 <code>sd</code>
開頭的設備檔。同樣地,如果你並不想使用你的序列埠
(serial port) ,那麼你也可以移除所有以 <code>cua</code>
開頭的設備檔。
<p><em>請確定從這個目錄放入了以下檔案的: </em><code>console,
kmem, mem, null, ram0 and tty1</code>.
<p>
<h3>/etc</h3>
<p><!--
etc directory
-->
<p>這個目錄包含了重要的組態設定檔。在大部分的系統上,這些檔案被分為三個群組:
<p>
<ol>
<li>一直都是必備的, <i>e.g.</i> <code>rc, fstab, passwd</code>
。 <!--
rc
-->
<!--
fstab
-->
<!--
passwd
-->
<li>可能是必備的,但是沒有人能十分確定。
<li>偷跑進來的垃報。</li>
</ol>
<p>通常可以用以下指令識出哪些是非基本的檔案:
<p>
<blockquote>
<code>
<pre> ls -ltru
</pre>
</code>
</blockquote>
<p>這個指令將檔案依據上次被存取的日期,以先早後晚
(reverse)
的順序列出,所以如果有任何檔案不會被存取,那麼它們就可以從
root 磁片中刪去。
<p>在我的 root 磁片上,我的組態檔數目已減至 15
個。這可減少我處理以下三種檔案的工作:
<p>
<ol>
<li>我必須為 boot/root 系統進行組態設定的檔案:
<ol>
<li>rc.d/* -- 系統啟動與改變 run level 的 scripts
<li><code>fstab</code> -- 要被掛上的 file systems 清單
<li><code>inittab</code> -- 給 <code>init</code> process
的參數,於開機時啟動的第一個 process 。 <!--
init
-->
</li>
</ol>
<li>我們應該為 boot/root 系統整理的檔案:
<ol>
<li><code>passwd</code> -- 重要的使用者、 home
目錄等其它項目的清單。
<li>group -- 使用者群組。 <!--
user groups
-->
<li>shadow -- 使用者的密碼。你可能沒有這個檔。 <!--
shadow passwords
-->
<li>termcap -- the terminal capability database.</li>
</ol>
如果系統安全 (security) 對你很重要,那麼 passwd 與
shadow 應該被刪減,以避免將使用者密碼 copy
出系統,這樣當你從磁片開機時,不想要的 logins
會被拒絕。 <!--
restoring files
-->
請確定 <code>passwd</code> 至少包含了 <code>root</code>
。如果你要讓其他的使用者 login ,請確定他們的 home
目錄與 shells 都存在。 termcap
,終端機資料庫,一般而言有幾百個 kilobytes 。你
boot/root
磁片的版本應該被刪減到只包含你所使用的終端機,這通常就是
<code>linux</code> 或 <code>linux-console</code> 項目 (entry) 。
<li>The rest. They work at the moment, so I leave them alone.</li>
</ol>
<p>Out of this,
我實際上只必須設定兩個檔,而它們所應包含的項目驚人地少。
<ul>
<li>rc 應該包含:
<pre> #!/bin/sh
/bin/mount -av
/bin/hostname Kangaroo
</pre>
請確定上述的目錄都是正確的。你並不需要真地去執行
<code>hostname</code> -- 如果你執行只是讓系統比較好看 (譯註:如此系統會有個名字)
。
<li><code>fstab</code> 應該至少要包含:
<pre> /dev/ram0 / ext2 defaults
/dev/fd0 / ext2 defaults
/proc /proc proc defaults
</pre>
你可以從你現存的 fstab copy
你想要的項目,但是你並不應該自動地掛上你硬碟任何的
partitions ;請對這些項目使用 <code>noauto</code> 關鍵字 (譯註:用
noauto 代替 default ) 。當使用 bootdisk
時,你的硬碟可能是早已損壞或掛了。</li>
</ul>
<p>你的 <code>inittab</code> 應該被改變,以使其中 <code>sysinit</code>
這行能執行 rc 或無論什麼將被執行的基本開機 script
。同時,如果你想要確保不可從序列埠 login
,請在所有行尾包括 ttys 或 ttyS 的 getty 項目前加上「#」符號
(comment out) 。請保留 tty 埠以讓你可以在 console 前 login 。
<p>一個最起碼的 <code>inittab</code> 檔看起來樣這樣:
<pre> id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
</pre>
<p><code>inittab</code>
檔定義了系統在各種不同的情況中將執行什麼項目,包括
startup 、切換至多使用者模式等等。請仔細地檢查在
inittab 中被提及的檔案名稱 (filenames) ;如果 <code>init</code>
不能找到所提及的程式,那麼 bootdisk
將會停止運作,而你甚至不會得到錯誤訊息。
<p><!--
hardcoded locations
-->
<p>請注意,某些程式不能被移到其它地方,因為其它程式已在撰寫時,就把它們的檔案位置寫死了
(hardcode) 。舉例來說在我的系統上, /etc/shutdown 已把
/etc/reboot 的位置寫死在其中。如果我移動了 reboot 到
/bin/reboot,然後下達一個 <code>shutdown</code>
指令,將會因為找不到 <code>reboot</code> 檔而發生錯誤。
<p><!--
etc directory
-->
<p>剩下來的,就是 copy 在你 /etc 目錄中的所有文字檔
(text files) ,再加上在你 /etc
目錄中,你無法確定你需不需要的所有可執行檔。需要指示
(guide) 者,請參考在 <a href="http://www.linux.org.tw/CLDP/Bootdisk-HOWTO-13.html#Listings">Sample
roodisk directory listings</a> 的樣本清單。也許只要 copy
這些檔案就足夠了,但是系統差異會有很大的影響,所以你無法確定你系統上相同的檔案組合,就一定等於清單中的檔案。唯一確定的方法就是從
<code>inittab</code> 著手,並找出需要什麼。
<p>現在大部分的系統使用 /etc/rc.d/
目錄,其中包含給不同 run levels 的shell scripts
。最起碼會有一個單一的 rc script,但是僅從你現存的系統
copy <code>inittab</code> 與 /etc/rc.d 這兩個目錄,然後刪減
rc.d 目錄中的 shell scripts 以移除和磁片系統環境無關的
processing ,會是較為簡單的做法。
<p>
<h3>/bin 與 /sbin</h3>
<p><!--
bin directory
-->
<!--
sbin directory
-->
<p>/bin 目錄是一個放置為了執行基本作業 (operations)
而所需之額外工具程式的方便好地方,這些工具程式諸如
<code>ls</code>, <code>mv</code>, <code>cat</code> 與 <code>dd</code> 。
bin/ 與 /sbin 這兩個目錄的檔案清單範例請見 <a href="http://www.linux.org.tw/CLDP/Bootdisk-HOWTO-13.html#Listings">Sample
rootdisk directory listings</a>
。但範例中並沒有包括任何從備份復原時所需之工具程式,諸如
<code>cpio</code>, <code>tar</code> 與 <code>gzip</code>
。這是因為我把這些東西放在另一張 (separate)
工具程式磁片上,以節省 boot/root 磁片的空間。一旦
boot/root 磁片被開機啟動,就會被 copy 到 ramdisk
並釋放軟碟機,讓軟碟機能掛上另一張磁片,就是工具程式片。我通常把它掛上當做
/usr 。
<p>工具程式磁片 (utility diskette) 的製作被描述在下面 <a href="http://www.linux.org.tw/CLDP/Bootdisk-HOWTO-8.html#UtilityDisk">Building
a utility disk</a>
這節。保留一份相同版本之備份用工具程式的copy是比較好的,這個備份用工具程式被用來製作備份,如此你就不用浪費時間在嘗試安裝不能讀取你備份磁帶的版本。
<p>請確定你包括了以下程式: <code>init</code>, <code>getty</code>
或相等的程式, <code>login</code>, <code>mount</code>,
某種可以執行你rc scripts 的 shell, 以及一個從 <code>sh</code>
指向這個 shell 的 link 。
<p><!--
init
-->
<!--
getty
-->
<!--
login
-->
<!--
shells
-->
<p>
<h3>/lib</h3>
<p><!--
library (lib) directory
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -