📄 bootdisk-howto-4.html
字号:
-->
<!--
libraries
-->
<p>在 /lib 中,你要放入必要的共享函式庫 (libraries)
與載入程式 (loaders) 。如果無法在你的 /lib
目錄中找到必要的函式庫,那麼系統將不能夠開機。如果你很幸運,你可能會看到告訴你為什麼會發生如此情況的錯誤訊息。
<p><!--
libc.so
-->
近來每一個程式至少都要求 libc 函式庫, libc.so.<em>N</em>
,其中 <em>N</em> 是目前版本的編號。請檢查你的 /lib
目錄。 Libc.so.N 通常是一個 symlink
,它指向一個具有完整版本編號的檔名:
<p>
<blockquote>
<code>
<pre>% ls -l /lib/libc*
-rwxr-xr-x 1 root root 4016683 Apr 16 18:48 libc-2.1.1.so*
lrwxrwxrwx 1 root root 13 Apr 10 12:25 libc.so.6 -> libc-2.1.1.so*
</pre>
</code>
</blockquote>
<p>在這個情況下,你會想要 libc-2.1.1.so
。為了找到其它函式庫,你應該要看過所有你打算包括的二進位檔,並且用
<code>ldd</code> 指令檢查它們的相依性。舉例來說:
<p>
<pre> % ldd /sbin/mke2fs
libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000)
libuuid.so.1 => /lib/libuuid.so.1 (0x40028000)
libc.so.6 => /lib/libc.so.6 (0x4002c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
</pre>
在右手邊的每一個檔案是一定要有的。有些檔案可能是一個
symbolic link 。
<p>請注意某些函式庫 <em>相當地大 </em>,而且並不能輕易地配合你的
root filesystem 。舉例來說,上述的 libc.so 大約有 4 megabytes
。因此,在你 copy 它們到你 root filesystem
的同時,你可能需要除去一些函式庫。請看 <a href="http://www.linux.org.tw/CLDP/Bootdisk-HOWTO-8.html#Slimfast">Reducing
root filesystem size</a> 這一節以了解 instructions 。
<p><!--
loaders
-->
<p>在 /lib 內,你也必須包括一個 loader
供這些函式庫使用。這個 loader 不是 ld.so (給 A.OUT
函式庫使用),就是 ld-linux.so (給 ELF 函式庫使用)。較新版的
<code>ldd</code>
會如同上述的例子,正確地告訴你需要哪一種 loader
,然而舊版的就不會。如果你並不確定你需要哪一種
loader ,就對函式庫執行 <code>file</code> 指令。舉例來說:
<pre>% file /lib/libc.so.4.7.2 /lib/libc.so.5.4.33 /lib/libc-2.1.1.so
/lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped
/lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
/lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped
</pre>
<code>QMAGIC</code> 指出 <code>4.7.2</code> 版是給 A.OUT
函式庫使用,而 <code>ELF</code> 指出 <code>5.4.33</code> 以及 <code>2.1.1</code>
版是給 ELF 使用。 <!--
ELF
-->
<p>請 copy 你所需要的指定 loader(s) 到你所建立的 root
filesystem 。針對所包括的二進位檔,函式庫與 loaders
應該被 <em>仔細地檢查 </em>。如果 kernel
不能載入所需的函式庫,那麼 kernel
就會在沒有錯誤訊息的情況下停止運作。
<p>
<h2><a name="ss4.4">4.4 對 PAM 與 NSS 的提供 -- Providing for PAM and
NSS</a></h2>
<p><a name="PAMandNSS"></a>
<p>你的系統可能會需要動態地載入未被 ldd
所見的函式庫。如果你沒有提供函式庫給這些項目,那麼你會在登錄
(log in) 或使用你的 bootdisk 時遭遇到困難。
<p>
<h3>PAM (Pluggable Authentication Modules)</h3>
<p>
<p>如果你的系統使用 PAM (Pluggable Authentication Modules)
,那麼你必須在你的 bootdisk上為 PAM
做一些預備。簡而言之, PAM
是一種複雜精密的模組化方法,針對使用者認證以及控制使用者對服務的存取。一個決定你的系統是否使用
PAM 的簡單方法,是對你的 login 可執行檔執行 ldd
;如果輸出包括 libpam.so ,你就需要 PAM 。
<p>幸運地,安全性通常並非 bootdisk
所關心的議題,因為任何對機器有實際存取權的人,通常能做任何他們無論如何想做的事。因此,你可以有效地關閉
PAM ,只要在你的 root filesystem 造出一個簡單的 /etc/pam.conf
檔,這個檔看起來像這樣:
<p>
<hr>
<pre>OTHER auth optional /lib/security/pam_permit.so
OTHER account optional /lib/security/pam_permit.so
OTHER password optional /lib/security/pam_permit.so
OTHER session optional /lib/security/pam_permit.so
</pre>
<hr>
<p>請記得也 copy /lib/security/pam_permit.so 這個檔到你的 root
filesystem 。這個函式庫只有大約 8K
,因此它只佔用極小量的 overhead 。
<p>請記得這個組態設定允許任何人對這台機器上的檔案以及服務有完整的存取權。如果你因某種理由而在乎你
bootdisk 的安全性,那麼你就必須 copy
一些或是全部你硬碟的 PAM setup 到你的 root filesystem
。請確定曾仔細地讀過 PAM 文件,並且 copy 任何在
/lib/security 中所需要的函式庫到你的 root filesystem 上。
<p>你同時必須包含 /lib/libpam.so 到你的 bootdisk
上。但是你已知這件事,因為你已對 /bin/login 執行過 ldd
,這動作顯示了其相依性。
<p>
<h3>NSS (Name Service Switch)</h3>
<p>
<p>如果你正使用 glibc (aka libc6) ,你就必須為名稱服務
(name switch) 進行預備,否則你會無法 log in 。 /etc/nsswitch.conf
這個檔案控制資料庫對各式服務之搜尋 (lookups)
。如果你並不打算從網路上存取服務 (比如說: DNS或 NIS
搜尋),那麼你只需要準備一個簡單的 nsswitch.conf
檔,這個檔案看起來像這樣:
<p>
<hr>
<pre> passwd: files
shadow: files
group: files
hosts: files
services: files
networks: files
protocols: files
rpc: files
ethers: files
netmasks: files
bootparams: files
automount: files
aliases: files
netgroup: files
publickey: files
</pre>
<hr>
<p>這樣就指定每一項服務只被 local files
提供。你同時需要包括 /lib/libnss_files.so.<em>X</em> ,在此 <em>X</em>
是 1 的話是指 glibc 2.0 ,而 2 的話是指 glibc 2.1
。這個函式庫將被以動態方式載入以處理檔案搜尋。
<p>如果你打算從你的 bootdisk
存取網路,那麼你會想要製作一個更精巧複雜的
nsswitch.conf 檔。細節請參考 nsswitch man page。最後,請記得你必須為你所指定的每一項
<em>服務 (service)</em> ,把 /lib/libnss_<em>service</em>.so.1
檔放入 bootdisk 中。
<p>
<h2><a name="ss4.5">4.5 模組 -- Modules</a></h2>
<p><!--
modules
-->
<p>如果你有一個模組化的 kernel
,你必須考量在開機後,你想要從你的 bootdisk
上載入哪一種模組。你可能會想要包括 <code>ftape</code> 與
<code>zftape</code> 模組 (如果你的備份磁帶是floppy tape),以及給
SCSI 設備用的模組 (如果你有 SCSI 設備),也可能是 PPP 或
SLIP 支援的模組 (如果你在緊急情況下想要存取網路)。
<p>這些模組可能會被放在 /lib/modules 。你同時也應該包括
<code>insmod</code>, <code>rmmod</code> 與 <code>lsmod</code>
。根據你是否想要自動地載入模組,你可能也要包括 <code>modprobe</code>,
<code>depmod</code> 與 <code>swapout</code> 。如果你使用 <code>kerneld</code>,請與
/etc/conf.modules 一起包括進來。
<p>然而,使用模組的主要優點在於你可以把非關鍵
(non-critical)模組移到 utility disk
上,在需要用到時才載入,這樣在你的 root disk
上會使用比較少的空間。如果你要處理許多不同的設備,這個方法比建立一個內建支援許多設備的巨大
kernel 來得好。
<p>請注意,為了啟動 (boot) 一個壓縮的 ext2 filesystem
,你必須有 ramdisk 與內建 ext2 支援。 <em>它們不能夠以模組的方式被提供。</em>
<p>
<h2><a name="ss4.6">4.6 一些最後的細節 -- Some final details</a></h2>
<p>
<p>某些系統程式,諸如 <code>login</code> ,當 /var/run/utmp
檔與 /var/log 目錄不存在時,會發出警告。所以:
<p>
<pre> mkdir -p /mnt/var/{log,run{
touch /mnt/var/run/utmp
</pre>
<p>最後,在你設定 (set up)
完所有你所需的函式庫後,執行 <code>ldconfig</code> 以在
root filesystem上重新製作 (remake) /etc/ld.so.cache 。這個 cache
會告訴 loader 到哪裡找到函式庫。要重新製作 ld.so.cache,請下達以下指令:
<pre> chdir /mnt; chroot /mnt /sbin/ldconfig
</pre>
<p><!--
ldconfig
-->
<!--
ld.so.cache
-->
<p><code>chroot</code> 是必要的,因為 <code>ldconfig</code>
總是會為 root filesystem 重新製作 cache 。
<p>
<h2><a name="ss4.7">4.7 Wrapping it up</a></h2>
<p><a name="WrappingItUp"></a>
<p>一旦你完成 root filesystem 的建構工作,就 unmount
它,將之 copy 成一個檔案並壓縮它:
<pre> umount /mnt
dd if=DEVICE bs=1k | gzip -v9 > rootfs.gz
</pre>
<p>結束後,你會有一個名為 rootfs.gz
的檔案,這就是你被壓縮過的 root filesystem。你應該檢查它的
size
以確保它能放在一張軟碟片上;如果不行,你就必須回溯並移除一些檔案。
<a href="http://www.linux.org.tw/CLDP/Bootdisk-HOWTO-8.html#Slimfast">Reducing
root filesystem size</a> 這節有一些提示,告訴你有關減少
root filesystem 的 size 。
<p>
<hr>
<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></td>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -