(文:西電)
凡是接觸計算機久的朋友肯定都使用過DOS啟動軟盤,至於啟動軟盤的重要性大家肯定也都
清楚。在Linux底下啟動軟盤同樣重要,它不僅能測試新內核、恢復系統錯誤,而且能升級
重要的系統文件。但是在Linux下制做啟動盤不象在DOS下那麼容易,下面我就一步一步的
教大家制做自己系統的啟動軟盤。
1. Linux啟動過程簡介
一個啟動盤實際上是一個完整系統的縮影,它能夠執行一個完整系統的大部分功能。因此
,如果想制做Linux啟動盤,你必須了解Linux系統啟動的基本過程。接下來我就先簡要介
紹一下Linux的啟動過程。
所有的PC機都是通過執行ROM中的代碼加(ext2 filesystem) readonly.
之後,系統發現init程序並執行它,init程序尋找它的配置文件/etc/inittab,並開始執
行其中的腳本,這些腳本是一些SHELL命令的組合,用來執行如下命令,如加載所需模塊、
裝載SWAP、初始化網絡、裝載fstab中列出的所有驅動器等。最後啟動一個叫getty的程序
,它負責console和ttys之間的通信,它在顯示器上打印login提示符並激活login程序,
login處理登陸的有效性並建立與用戶的對話。至此,啟動過程完畢。
2. 制做啟動盤
創建一個啟動盤首先必須創建根文件系統,由於軟盤容量有限,因此常采用壓縮的根文件
系統。下面我就詳細的介紹怎樣創建壓縮格式根文件系統。
2.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控
制系統啟動。
為了能創建以上的根文件系統,你必須有一個空閒的能夠放下大約4M文件的RAMDISK。
如果你使用LILO控制啟動,先檢查一下LILO的配置文件/etc/lilo.conf中定義的RAMDISK
的大小。/etc/lilo.conf 中有一行
RAMDISK_SIZE = nnn
它決定RAMDISK可使用的最大內存為nnn,缺省情況下為4096K,對我們來說夠了,但是順便
說一下,如果你的系統只有8M內存,千萬不要使用4M的RAMDISK。再檢查一下你的系統設備
中是否有一個叫/dev/ram0或/dev/ram的設備,這是RAMDISK的設備名,如果沒有,用命令
mknod創建一個設備/dev/ram0。
2.2 創建根文件系統
Linux內核識別兩種可以直接拷貝到RAMDISK的文件系統,它們是minix
和ext2,ext2性能更好。如果你使用ext2,你會發現使用-i選項定義比缺省更多的信息節
點非常有用。mke2fs缺省情況下在1.44M的軟盤上產生360個信息節點,使用壓縮格式的根
文件系統需要更多的信息節點,所以使用如下命令創建文件系統可以創建2000個信息節點
,一般不會用光:
mke2fs -m 0 -i 2000 /dev/ram0
mke2fs將會自動判斷設備容量的大小並相應的配置自身,-m 0參數防止它給root保留空間
,這樣會騰出更多的有用空間。接著把虛擬盤掛在節點/mnt上:
mount -t ext2 /dev/ram0 /mnt
如果沒有節點/mnt,建一個。
接著是創建目錄。根文件系統最少應該有如下8個目錄:
/dev ? 設備
/proc -- proc 文件系統所需目錄
/etc ? 系統配置文件
/sbin ? 重要的系統程序
/bin ? 基本應用程序
/lib ? 共享函數庫
/mnt ? 裝載其他磁盤節點
/usr ? 附加應用程序
其中/proc,/mnt和/usr在此情況下都是空的,只需要用mkdir創建它們既可。其余的目錄應
根據需要分別創建,下面我一個一個的詳細敘述。
?/dev:/dev中含有系統不可缺少的設備文件,雖然該目錄很普通,可以用 mkdir創建,
然而目錄中的設備文件必須用mknod創建,當然也有捷徑,你可以把現有系統中/dev的文件
拷貝過來,然後刪除不必要的文件。命令cp -dpR /dev
/mnt會拷貝/dev整個目錄但不拷貝文件內容,dp開關保證鏈結文件仍然不變,不會拷貝鏈
結所指原文件,而且屬性不變。
必須注意的是,每一個設備文件占用一個信息節點,而軟盤上節點數是有限的,因此有必
要刪除沒用的設備文件。例如,如果你沒有SCSI設備,刪除所有的以sd開頭的文件。如果
你不想使用串口設備,刪除所有以cua開頭的文件。不過記住一定要保留console, kmem,
mem, null, ram,
tty1等文件。
?/etc:這個目錄中含有一些必不可少的系統配置文件,那麼到底哪些文件是必需的,哪
些可有可無呢?告訴你一個小竅門,用命令ls ?ltru,該命令會根據最後使用日期反列
一下目錄/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
整理系統所需文件
?passwd ? 用戶名和目錄.
?group ? 用戶組
?shadow ? 用戶加密密碼
如果你覺得這不安全,就把passwd和shadow刪掉,這樣只有root可以進入系統。
(3)偶爾使用的文件,可根據自己的實際情況選擇。
?/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 > rootfs.gz
壓縮結束後,你就擁有了一個壓縮的根文件系統,不過你得檢查它的大小,如果大了,你還得去掉一些東西。
3. 選擇內核
在你完成了制做壓縮的根文件系統後,下一步就是選擇或自己創建一個內核。多數情
況下,你可以拷貝現有系統的內核,但是有些情況下,你不得不自己另外創建一個。最可
能出現的問題就是容量限制:如果你想做單張的啟動盤,盤中最大的文件往往是內核,所
以你必須想方設法壓縮
內核的體積。要想壓縮內核體積,創建它時就得把不必要的功能去掉,如去掉對網絡的支
持和對不必要設備的支持,但是一定要記住保留內核對RAMDISK和ext2的支持,否則你的啟
動盤將不能工作。還有就是要記住把對你備份所用設備的支持加到內核中去,因為啟動盤
的最大用處就是檢測和修復損壞的系統,如果你沒有把對備份設備的支持加到內核中去,
你將沒有辦法修復損壞的系統,只能再重裝Linux。
創建新內核的方法我就不在此敘述了,如有問題,請查閱相關資料。重建完內核後記
住用“make zImage”壓縮內核。
4. 整合
有了根文件系統和內核之後,最後的工作就是把它們整合在一起。
先檢查總文件的大小,如果超出1.44M,就得考慮重新創建所需或用兩張磁盤,即使用
兩張磁盤,你的根文件系統也得小於1.44M。
接著就是確定是用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
rm -rf /mnt/lost+found
mkdir /mnt/{boot,dev}
刪去目錄/ lost+found,創建兩個目錄/boot和/dev。
再拷貝現有系統中的到目錄/dev中,
cp -R /dev/{null,fd0} /mnt/dev
接著拷貝啟動加載器boot.b到目錄/boot中,
cp /boot/boot.b /mnt/boot
最後,拷貝你創建的配置文件bdlilo.conf和內核到內核文件系統的根目錄下,
cp bdlilo.conf KERNEL /mnt
現在,根文件系統所需所有文件都准備就緒了,你可以運行它了,運行結果應該沒有
錯誤,否則就應該仔細檢查一下。最終的文件目錄應該如下所示:
--------------------------------------------------------------------------------
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
接著設置內核鏡像文件中的ramdisk的偏移量以指出如何確定定位根文件系統。該指示
詞可以通過命令rdev來設置,它的內容含義如下所示:
bits 0-10: ramdisk開始的偏移量, 在1024 byte數據塊中
bits 11-13: 不用
bit 14: ramdisk加載的提示標記
bit 15: 加載根文件系統之前提示標記
如果位15被設置,當系統盤啟動時將會提示你准備好另一張軟盤,如果你的啟動盤是
兩張的話,這個設置很有用。
對於使用單張和兩張啟動盤的用戶,ramdisk的偏移量是不同的:
如果你的啟動盤只有一張,那麼壓縮的根文件系統會被放置在內核之後,因此偏移量將會
是第一個空閒的數據塊,bit 14 應設置為1,bit 15設置為0。例如,如果你的啟動盤根文
件系統起始於數據塊253(十進制),你的ramdisk偏移量應該是253 +
214 = 253 + 16384 = 16637。
如果你的啟動盤有兩張,那麼你的根文件系統起始於第二張盤的0數據塊,所以偏移量是0
,bit 14 應設置為1,bit 15應設置為1,最終值為
214 + 215 = 49152。
計算好偏移量後,用命令rdev ?r進行設置,記住用十進制:
rdev -r /mnt/vmlinuz 偏移量
設置完後,從/mnt卸下軟盤。
最後一步是傳輸根文件系統,分兩種情況:
?如果你的內核於根文件系統在同一張軟盤上,用加選項seek的命令dd傳輸,
dd if=rootfs.gz of=/dev/fd0 bs=1k seek=內核數據塊數。
?如果根文件系統位於第二張軟盤上,移走第一張軟盤,插入第二張盤,然後傳輸根文件
系統dd if=rootfs.gz of=/dev/fd0 bs=1k。
∽:啬悖愕南低稱 動盤已經做好了,剩下?就是測試你的啟動盤的正確性了,如果
有問題,對不起,你還得從頭再來。
現在許多Linux的發行套件中都有廠家做好的啟動盤,它們的制做原理和以上我介紹的
大同小異,但是它們常常用許多不同的技巧,因為它們要面對更多的硬件和各種可能發生
的情況。大家可以拿一張來慢慢研究,你會從中學到很多知識。
最後祝大家都能作出一張稱心如意的啟動盤,讓你的linux永保青春。
現在許多Linux的發行套件中都有廠家做好的啟動盤,它們的制做原理和以上我介紹的
大同小異,但是它們常常用許多不同的技巧,因為它們要面對更多的硬件和各種可能發生
的情況。大家可以拿一張來慢慢研究,你會從中學到很多知識。
最後祝大家都能作出一張稱心如意的啟動盤,讓你的linux永保青春。
的情況。大家可以拿一張來慢慢研究,你會從中學到很多知識。
最後祝大家都能作出一張稱心如意的啟動盤,讓你的linux永保青春。