Syslinux這是一個Linux系統(tǒng)引導(dǎo)工具,它可以創(chuàng)建從MS DOS啟動的Linux啟動盤或Linux恢復(fù)盤。它安裝很簡單,一旦安裝創(chuàng)建好之后,SysLinux軟盤就可以操控標(biāo)準的MS DOS工具。它占用的空間也很小,只需要7k的MS DOS空間或13k的Linux空間。最新的版本還包括了一個PxeLinux的系統(tǒng)工具,它可以讓你做無盤工作站。
用SYSLINUX或ISOLINUX制作啟動U盤或光盤
任何一個操作系統(tǒng)在任何一個硬件平臺上的運行都需要一個引導(dǎo)的過程,即,初始化軟件環(huán)境、把內(nèi)核從存儲介質(zhì)放到內(nèi)存當(dāng)中去,并開始運行。當(dāng)然對于某些簡單軟硬件系統(tǒng),這個過程可能及其簡單,而對于 PC 就要略微復(fù)雜一些了。
PC 的引導(dǎo)程序上承 BIOS,下接內(nèi)核的初始化代碼,雖然開一次機只運行一次后就不留痕跡了,不過還是相當(dāng)重要的。所有的引導(dǎo)程序都在做類似的事情:
駐留在存貯介質(zhì)的特殊位置可以被 BIOS 啟動,或是自己是某一系統(tǒng)的可執(zhí)行文件,可以被用戶顯式或隱式在該系統(tǒng)(宿主系統(tǒng))內(nèi)啟動;
了解要被啟動的必要啟動文件的位置,包括系統(tǒng)內(nèi)核、ramdisk 等,并把它們讀取出來、裝載到內(nèi)存之中;
構(gòu)造環(huán)境、運行操作系統(tǒng)的內(nèi)核,自己則就此退出歷史舞臺。
歷史上,用于 Linux 的最著名的引導(dǎo)程序莫過于 LILO 和 Grub 了,作為通用的引導(dǎo)程序,二者用途廣泛,但對于一些特殊的場合,譬如引導(dǎo)程序可利用的空間比較有限的可移動存儲介質(zhì) (通俗地說,包括光盤、軟盤、u 盤等),它們有些過于厚重了,這就引出了我們今天的主角 --- SYSLINUX/ISOLINUX,現(xiàn)在,你只要知道他們是引導(dǎo)程序就足夠了,接下來,我們還要插入一些廢話。
二、initrd
initrd = init ramdisk, 顧名思義,就是在啟動時使用的一個內(nèi)存虛擬磁盤,它是系統(tǒng)廣泛的硬件支持性的必需品。
我們知道,Linux 的驅(qū)動程序是內(nèi)核的一部分,它們提供了硬件向上層的抽象接口,Linux 內(nèi)核的核心子系統(tǒng) --- 虛擬文件系統(tǒng)部分的工作強烈依賴于底層硬件驅(qū)動程序的支持,在啟動過程當(dāng)中,當(dāng)某些必備的驅(qū)動程序無法使用的時候,比如 EXT2 文件系統(tǒng)、IDE 硬盤適配器等無法工作的時候,系統(tǒng)啟動將就此中止,發(fā)生所謂的``Kernel Panic'',這也是初學(xué)者編譯內(nèi)核最常遇到的困難。
然而,我們當(dāng)然不能將所有的驅(qū)動都編譯到內(nèi)核當(dāng)中去,因為
我們不能無限制地加大內(nèi)核的尺寸,這對于系統(tǒng)資源,尤其是引導(dǎo)過程中非常有限的可用存儲資源是難以承受的
我們可以把很多驅(qū)動程序編譯成模塊,隨用隨加載
極少數(shù)情況,某些模塊是相互沖突的,比如 2.4 內(nèi)核的某些版本之中,reiserfs 和 ext3 兩種驅(qū)動不能同時被編譯到內(nèi)核當(dāng)中。
所以,我們只能在內(nèi)核中放入必要的驅(qū)動程序,其余的不那么需要的部分編譯成模塊放到 /lib/modules/`uname -r`/ 之中,在需要的時候會被加載。
但是,對于具有通用性的內(nèi)核,是很難論斷出哪幾種驅(qū)動程序才是真正必須的,究竟是 Intel 的 IDE 磁盤控制器還是 AMD/nVidia 的,抑或是 VIA 的,乃至光纖通道SCSI 磁盤……是阿,這真是個很困擾人的問題,沒有一個驅(qū)動可以在占用絕對少的空間的前提下應(yīng)付所有的設(shè)備,于是,我們退而求其次,尋求一個中間介質(zhì) --- ramdisk
在內(nèi)核啟動前,引導(dǎo)程序首先在內(nèi)存之中構(gòu)建一個 ramdisk,成為一個基本文件系統(tǒng),然后 Linux 內(nèi)核以此為自己的根文件系統(tǒng)啟動,這樣的好處是可以不必理會磁盤驅(qū)動的問題,只要能驅(qū)動 ramdisk 就可以了。
用 ramdisk 啟動之后,在 ramdisk 的啟動腳本 (一般叫 /linuxrc) 之中,針對硬件嘗試 ramdisk 里面的 /lib/modules/`uname -r`/,加載恰當(dāng)?shù)尿?qū)動,這時系統(tǒng)已經(jīng)具備了切換到硬盤或其他介質(zhì)上的文件系統(tǒng)的條件了。
機不可失,這時,我們首先加載硬盤或光盤、u 盤等啟動介質(zhì),然后設(shè)該介質(zhì)為根分區(qū),并運行其 init 進程為 1 進程,之后,在 init 腳本中,釋放掉 initrd 的空間,這就是借助 initrd 的引導(dǎo)過程。在這個過程之中 引導(dǎo)程序幫我們多做了一件事 --- 構(gòu)建 ramdisk, 把 initrd 放入內(nèi)存。
三、用 SYSLINUX/ISOLINUX 引導(dǎo)軟盤和光盤
上文已經(jīng)說過了,SYSLINUX/ISOLINUX 是專門用來引導(dǎo)可移動介質(zhì)的輕量級引導(dǎo)程序,因為這樣的介質(zhì)通常不會固定只針對一種硬件,initrd 當(dāng)然是 SYSLINUX/ISOLINUX 必須支持的功能了。這兩種引導(dǎo)程序其實是一樣的,沒有多大區(qū)別,只是放在不同的設(shè)備的引導(dǎo)區(qū)罷了。
3.1 配置 SYSLINUX/ISOLINUX
對于這兩種引導(dǎo)程序,都會有一段引導(dǎo)代碼,寫入引導(dǎo)代碼的時候,還同時需要一個配置文件: syslinux.cfg/isolinux.cfg,同樣,這兩個文件也是一樣的,唯一的區(qū)別在于文件名,其各個字段的寫法如下:
DISPLAY xxx.txt
這指定了一個文件名,會在啟動的時候顯示的內(nèi)容,該文件甚至可以包含一個 RLE 編碼的圖形文件,也就是大家在安裝光盤啟動時看到的那個;不過這個字段不甚重要,我們就略過了。
DEFAULT linux
指定 label 是 linux 的啟動選項為缺省,當(dāng)然也可以是別的。
LABEL linux
kernel vmlinuz
append initrd=initrd26.gz ramdisk_size=1000000 vga=791
這就是一個啟動描述,前面的 label 大家都認識了,之后分別是指定 kernel 和內(nèi)核參數(shù),其中重要的參數(shù)就是 initrd= 指定 initrd 的文件和 ramdisk_size= 指定 initrd 的尺寸上限。其余的內(nèi)核參數(shù)還可能有很多,不過這里的參數(shù)我們一般都可以抄過來。這樣的啟動選項描述是可以有若干個的。
PROMPT=1
這是說,向用戶提示輸入選擇,直接回車就是缺省選項了
TIMEOUT=0
沒有時間限制,當(dāng)然也可以指定一定時間之后自動進入缺省選項。
好了,就這么多,如果你會用 LILO 的話,用這個一定得心應(yīng)手,說實話 grub 也差不了太多。
3.2 安裝 SYSLINUX/ISOLINUX
配置文件寫完了,現(xiàn)在進入實質(zhì)階段,這里,兩種引導(dǎo)程序還是略有差別的,首先介紹SYSLINUX:
首先格式化引導(dǎo)介質(zhì)為 FAT16 格式 (軟盤似乎應(yīng)該是 FAT12),我們的例子里面是 U 盤,
mkdosfs -F16 -I /dev/sda
我們是操作整個 U 盤,而不是里面的唯一分區(qū),這種情況不是很多見,只是手上的 U 盤比較特殊,大部分情況下,我們也可以
mkdosfs -F16 /dev/sda1
然后掛在該 U 盤,放入我們的 syslinux.cfg 以及 kernel 和 initrd.gz,還有其他啟動所需要的東東,之后 umount 該 U 盤。
* 執(zhí)行下面操作之前,必須 umount U 盤!*
然后寫引導(dǎo)區(qū):
syslinux /dev/sda (或 syslinux /dev/sda1,如果是格式化的 /dev/sda1 的話)
至此就完成了。
對于光盤,同樣不復(fù)雜,我們用 ISOLINUX:
在準備制作 ISO 的目錄里添加一個子目錄,比如 boot/isolinux/ ,然后放入 isolinux.cfg 和一個對所有光盤都一樣的 isolinux 提供的引導(dǎo)介質(zhì) isolinux.bin,當(dāng)然還要放入相應(yīng)的 kernel, initrd 等等,然后,制作 iso 的時候要使用 -b 參數(shù):
mkisofs -o output.iso \
-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table \
for-iso-dir/
最后的參數(shù)就是指定的光盤的目錄了,-c 參數(shù)的那個文件是自動生成的,不用太擔(dān)心,其余參數(shù)都是固定的。事實上,也常常有人用 isolinux/ 而不是 boot/isolinux/ ,這都是約定俗成的,你完全可以用自己的。這里的路徑都是相對于光盤的根的,而和制作光盤時的工作目錄沒有關(guān)系。
至此,你也會用 SYSLINUX/ISOLINUX 了。 :)
四、實戰(zhàn) --- damn small linux + debian installer, 2 in 1 usb disk
1 下載 di 的 hd-image 里的 kernel image 和 initrd,放入 U 盤,同時把 businesscard iso 也放進去,從 iso 里找到 isolinux.cfg,記下里面的啟設(shè)置
2 下載 dsl,把 KNOPPIX 目錄搬到我們的 U 盤里,把 boot/isolinux/ 里面的 kernel image 和 initrd 也放入 U 盤的根目錄,這時,U 盤根目錄里同時有二者的啟動文件了,也記住 dsl 里面的 isolinux.cfg 的啟動選項。
3 以其中一個的 isolinux.cfg 為基礎(chǔ),加入另一個的啟動參數(shù),注意 label 命名不要沖突了就可以了。
4 umount U盤,然后對 U 盤運行 syslinux,寫引導(dǎo)區(qū),大功告成。
如前面帖子說過,dsl 的 initrd 之中,只搜索 /dev/sda[1-9] 而不搜索
/dev/sda,所以,如果如果像我們一樣被迫用 /dev/sda 的話,就不得不修改一下 dsl 的 initrd 里面的 linuxrc 了,除此之外,沒有什么其它值得大書特書的了。
Enjoy it!