boot/root盤由兩部分組成,即核心和根文件系統。要把這兩部分都放到一個1.44MB的軟盤上去,通常要對內核和根文件系統進行壓縮,壓縮核心的最好方法是進行重新編譯內核,將一些不必要的支持去掉,如對網絡和其它周邊設備的支持,重要的一點是記住內核必須支持RAMDISK及ext2,否則系統不能正常引導。關於內核的編譯本文不再闡述,下面重點介紹如何生成根文件系統的壓縮包。對於根文件系統的壓縮包括兩方面的問題,第一是只保留必要的根文件系統組件,第二是將根文件系統做成一個壓縮包,類似於內核工作的原理。
(1)根文件系統概述
一個根文件系統必須包括支持完整Linux系統的全部東西,它至少應包括以下幾項:
·基本文件系統結構
·至少含有以下目錄:/dev、 /proc、 /bin、 /etc、 /lib、 /usr、 /tmp
·最基本的應用程序,如sh、 ls、 cp、 mv等
·最低限度的配置文件,如rc、 inittab、 fstab等
·設備:/dev/hd*、 /dev/tty*、 /dev/fd0
·基本程序運行所需的庫函數
以上所需文件一般情況下會超過1.44M,因此我們通常的做法是先准備好內容後再壓縮到軟盤中,當用軟盤啟動時,再把文件解壓到內存中,形成一個虛擬盤(RAMDISK),通過RAMDISK控制系統啟動。
為了能創建以上的根文件系統,你必須有一個空閒的能夠放下大約4MB文件的RAMDISK。系統缺省情況下已替我們建好了一個大小為4096KB的RAMDISK,其設備名一般為/dev/ram0,我們就使用它來保存我們預先准備好的根文件系統。
2.2 創建根文件系統
Linux內核識別兩種可以直接拷貝到RAMDISK的文件系統,它們是minix 和ext2,ext2性能更好。mke2fs缺省情況下在1.44M的軟盤上產生360個信息節點,使用壓縮格式的根文件系統需要更多的信息節點,所以使用如下命令創建文件系統可以創建2000個信息節點,而且一般不會用完。
mke2fs -m 0 -i 2000 /dev/ram0
mke2fs將會自動判斷設備容量的大小並相應地配置自身,-m 0參數防止它給root保留空間,這樣會騰出更多的有用空間。接著把虛擬盤掛在節點/mnt上:
mount -t ext2 /dev/ram0 /mnt/floppy
接著是創建目錄。根文件系統最少應該有如下8個目錄:
/dev — 設備
/proc — proc 文件系統所需目錄
/etc — 系統配置文件
/sbin — 重要的系統程序
/bin — 基本應用程序
/lib — 共享函數庫
/mnt — 裝載其他磁盤節點
/usr — 附加應用程序
執行如下命令創建這些目錄:
#cd /mnt/floppy
#mkdir dev proc etc sbin bin lib mnt usr
接下來的工作就是確定各個目錄下的內容了:
·/dev:/dev中含有系統不可缺少的設備文件。可以把現有系統中/dev的文件拷貝過來,然後刪除不必要的文件。命令cp -dpR /dev /mnt會拷貝/dev整個目錄但不拷貝文件內容,dp開關保證鏈接文件仍然不變,不會拷貝鏈接所指原文件,而且屬性不變。如果你沒有SCSI設備,刪除所有的以sd開頭的文件。如果你不想使用串口設備,刪除所有以cua開頭的文件。不過記住一定要保留console、kmem、mem、null、ram、tty1等文件。
·/etc:這個目錄中含有一些必不可少的系統配置文件。這下面的文件比較多,那麼到底哪些文件是必需的,哪些可有可無呢?由於這下面的文件一般是一些文本文件,都不是很大,干脆全部保留算了。
我的啟動盤中含有不到15個配置文件,大致可分為3部分:
·rc.d/* — 系統啟動腳本
·fstab — 列出要登錄的文件系統
·inittab — 包含啟動過程參數
而且這些文件都是最簡單的。rc應該包括:
#!/bin/sh
/bin/mount -av
/bin/hostname yjy
fstab應包括:
/dev/ram0 / ext2 defaults
/dev/fd0 / ext2 defaults
/proc /proc proc defaults
inittab包括:
id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
·/bin和/sbin:該目錄中包含有必不可少的應用程序,如ls, mv, cat,你可以根據自己的需要選擇,不過一定要記住包括以下程序:init, getty,login, mount,運行你的rc的外殼shell。
·/lib: 該目錄中包含有你的啟動盤啟動過程中所需要的共享函數庫,如果缺少必須的函數庫,系統會停止啟動或出現一大堆錯誤信息,所以一定要注意。
幾乎所有的程序都需要libc庫,列一下目錄/lib中的libc:
% 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*
libc.so.6的6表示版本號,它指向的文件才是你真正需要的。
查看每一個程序使用的函數庫,用命令ldd,如:
% 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)
輸出右邊的庫都是必須的,有的可能是鏈接文件。
在/lib目錄下你還必須有函數庫裝載器,這個裝載器或是ld.so (對 a.out 庫) 或是 ld-linux.so (對 ELF 庫)。新版本的ldd一般會告訴你所需庫的裝載器。
把裝載器和庫拷貝到/lib後,再仔細檢查一遍,一定保證沒有遺漏。
2.3 模塊
如果你有一個模塊化的內核,你還得考慮需要加載的模塊,它們都位於/lib/modules,你可以把不是很重要的模塊放到別的盤上,當系統啟動後再加載,這樣會節省啟動盤的空間。
2.4 打包
一旦你完成了上述工作,卸下虛擬盤,拷貝到一個文件中,然後壓縮。
umount /mnt
dd if=/dev/ram0 bs=1k | gzip -v9>rfs.gz
壓縮結束後,你就擁有了一個壓縮的根文件系統,不過你得檢查它的大小,如果大了,你還得刪除一些東西。
3.組織引導盤
有了根文件系統和內核之後,最後的工作就是把它們組織在一起。
先檢查總文件的大小,如果超出1.44MB,就得考慮重新創建所需或用兩張磁盤,即使用兩張磁盤,你的根文件系統也得小於1.44MB。
接著就是確定是用LILO控制啟動還是直接用拷貝到盤上的內核控制啟動。用LILO的好處是你能增加支持初始化硬件的參數到內核中,缺點是較復雜且占用珍貴的磁盤空間,不過我還是建議使用LILO控制系統啟動。下面我就介紹用LILO的過程,直接用拷貝到盤上的內核控制啟動的方法就不作敘述了。
用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
參數說明見相關資料。然後把它命名為bdlilo.conf。 接下來就是創建一個內核文件系統。把一張干淨的軟盤插入軟驅,在上面創建ext2文件系統。
mke2fs -i 8192 -m 0 /dev/fd0 50
“-i 8192”表示每8192位創建一個信息節點。接著登錄系統:
mount /dev/fd0 /mnt/floppy
rm -rf /mnt/floppy/lost+found
mkdir /mnt/floppy{boot,dev}
刪去目錄/ lost+found,創建兩個目錄/boot和/dev,再執行:
cp -R /dev/{null,fd0} /mnt/floppy/dev
接著拷貝啟動加載器boot.b到目錄/boot中,
cp /boot/boot.b /mnt/floppy/boot
最後,拷貝你創建的配置文件bdlilo.conf和內核到內核文件系統的根目錄下,
cp bdlilo.conf KERNEL /mnt/floppy
現在,根文件系統所需的所有文件都准備就緒了。再執行下面的命令可以幫助安裝LILO引導器到軟盤的根文件系統上面:
lilo -v -C bdlilo.conf -r /mnt
OK,可以運行它了,如果運行結果沒有錯誤就表明成功,否則就應該仔細檢查一下上面的設置。