開機過程簡述
在還沒有談論如可制作簡易 Floppy Linux 之前,首先要了解整個開機的過程。當一部計算機一打開電源時,計算機裡的 BIOS 就會找尋有無系統開機磁片,此時會有兩種狀況產生:第一種狀況就是找到系統開機磁片,此時就會從系統開機磁片中的第 0 磁區、第 0 磁柱載入可開機磁區;另一種狀況就是找不到系統開機磁片的話, BIOS 就會找尋硬盤的 MBR ( Master Boot Record ),並且執行記錄在 MBR 上的開機載入程序( Boot Loader )進行開機。
不管是從軟碟開機也好,還是從硬盤開機也罷,首先整個操作系統的 loader (就 Linux 來講就是 LILO 『 LInux LOader 』)會載入 Linux Kernel ,而 Kernel 一起動的第一件事就是進入保護模式( protected mode ),所有的硬件交由 Kernel 來控制,擺 脫 BIOS 的牽絆。
一旦 Kernel 載入完畢之後,開始初始化系統所有硬件設備。當所有的硬件初始化完成之後,接著系統將嘗試掛載( mount ) root filesystem 。Root filesystem 就是被掛上當作” / ”目錄的 filesystem 。Kernel 必須知道從哪裡可以找到 root filesystem ( PS :一般系統磁盤片的 root filesystem 會被制作成以 ramdisk 執行方式的影像檔【 image 】),否則系統就會停止運作( halt )。
當 root filesystem 成功 的載之後,就會去執行 init 這個程序,init 就會開始檢查 /etc/inittab ,找出該檔中標明 sysinit 這一行,並執行該行的 script ,在 redhat 上為 rc.sysinit ,而 rc.sysinit 會進行系統的初始化動作,在這裡我打算不介紹這支 script 有興趣可以參考 redhat 上的 rc.sysinit 。
當 rc.sysinit 執行完畢之後,控制權立即轉回到 init 的手中,接下來馬上進入默認 runlevel 。若內定的 runlevel 為 3 的話, init 就執行 /sbin/mingetty 激活 virtual console 並且以 : ” login :”提示讓使用者登入,完成開機。登入後系統會提供一個 shell 給使用者,就可以使用 Linux 。若 runlevel 為 5 的話,則在開啟 virtual console 之後,init 會再執行 xdm 激活 X window system ,讓使用者以 xdm 界面登入。
以上就是 Linux 開機的過程。
制作簡易 Floppy Linux
在這裡必須說明一下,所制作的簡易 Floppy Linux 是一個功 能非常精簡的 Linux ,其功 能簡述為:只支援軟碟、並不支援硬盤及光盤, 沒 有網絡功 能,可以執行簡單的 shell 程序及一些常用的工具程序。接下來,你應該准備一些發展 Floopy Linux 的 source package 及工具程序: kernel source 、 syslinux 、 BusyBox 。首先,你可以觀察出這個 Floppy Linux 的開機過程與上述開機過程稍有不同:將 LILO 更換成 syslinux ,開機完之後直接提供一個 shell 給使用者用。 Floppy Linux 完整開機如圖所示。
首先針對我們的 Floppy Linux 來量身制作它所屬 kernel ( PS :請把所需的 driver make 進內核中),聰明的你應該很快設定好簡易 kernel 所需的選項並 make 出 kernel 來。在這裡並不論討如何 make kernel ,假如你對如何 make kernel 不懂的話,你應該多下一點功 夫在這上面或參考 HowTo 。以下為 make kernel 命令。
#make menuconfig
#make dep
#make zImage 或 make bzImage (若內核大於 640K 的話)
接下來,我們需要一些常用的工具程序, BusyBox 是一個蠻不錯的選擇。在這裡先對這個大名鼎鼎 BusyBox 簡單的介紹一下: BusyBox 它包含了七十多種 Linux 上標准的工具程序,它只需要的磁盤空間僅僅幾百 k (視所選擇工具程序的數目來決定大小),在嵌入式系統上常用到它(例如 Linux Router Project 和 Debian boot floppies 就使用到它)。你可以在網址 http://busybox.lineo.com 找到一些參考資料及下載它,它是 Open Source tool 由 lineo,Inc 這家嵌入廠商所贊助。好了趕緊建立出一個靜態連結的 BusyBox ( Floppy Linux 這一個例子用到了 init 、 ls 、 cp 、 cat 、 mount 、 umount 、 more 、 ps 、 sh ),將 BusyBox 編程成靜態連結的原因就是不希望 Floppy Linux 使用到 glibc 而增加磁盤的使用空間。以下為建立 BusyBox 的步驟:
#tar zxvf busybox-0.51.tar.gz
修改 Makefile 中的 DOSTATIC 參數,從 false 改為 true
#make
制作簡易 Floppy Linux
到現在為止,我們已經有了 Liunx kernel 及一些常用的工具程序,似乎還少了 root filesysem 。所以我們現在為 Floppy Linux 開始來打造迷你的 root filesystem 。在開始建造 root filesystem 之前你必須成為 super uesr 也就是 root ,因為我們必須要用到 mknod 不得不為 root 。首先為 root filesystem 建一個目錄叫做 floppy-linux ,然後進入 floppy-linux 目錄內:
#mkdir floppy-linux
#cd floppy-linux
接下來的步驟就是為 root filesystem 建立一些標准的目錄:
#mkdir dev etc etc/rc.d bin proc mnt tmp var
#chmod 755 dev etc etc/rc.d bin mnt tmp var
#chmod 555 proc
#ln -s sbin bin
進入 /dev 目錄下建立一般終端機設備:
#cd dev
#mknod tty c 5 0
#mkdir console c 5 1
#chmod 666 tty console
接著建立 VGA Display 虛擬終端機設備:
#mknod tty0 c 4 0
#chmod 666 tty0
再建立 RAM disk 設備:
#mknod ram0 b 1 0
#chmod 600 ram
再建立 floppy 設備:
#mknod fd0 b 2 0
#chmod 600 fd0
最後在建立 null 設備:
#mknod null c 1 3
#chmod 666 null
若你覺得以 mknod 的方式建造這些檔案不方便的話,另一個方法就是以 tar 的方式來建立。現在開始編輯有關的 shell srcipt ,先來編輯 /etc/inittab 這一支 script ,因為我們用的是 BusyBox 上的 init ,它與一般所使用的 init 有點不太一樣,它會先執行 /etc/init.d/rcS 而不是 /etc/rc.d/rc.sysinit ,為了做出來的 Floppy Linux 架構與 redhat 的架構一樣,所以修改了 BusyBox 中的 init.c 。底下是修到的部分內容:
#ifndef INIT_SCRIPT
#define INIT_SRCIPT “ /etc/rc.d/rc.sysinit ”
#endif
請進入到 /floppy-linux/etc/rc.d 這個目錄下編輯 inittab ,內容如下:
::sysinit:/etc/rc.d/rc.sysinit
::askfirst:/bin/sh
修改 inittab 的權限:
#chmod 644 inittab
編輯好 rc.sysinit 之後,緊接著就是編輯 /floppy-linux/etc/rc.d 底下的 rc.sysinit ,其內容如下:
#!/bin/sh
mount -a
變更其權限:
#chmod 755 rc.sysinit
再來在編輯 /floppy-linux/etc/ 底下的 fstab , fstab 內容如下:
proc /proc proc defaults 0 0
修改 fstab 權限:
#chmod 644 fstab
完成上述編輯之後,就要把靜態連結版的 BusyBox 搬到 /floppy-linux/bin 下,並做出所需要的工具程序的連結符號,其步驟為下:
#cd /floppy-linux/bin
#cp /busybox-0.51/busybox ./init
#ln -s init ls
#ln -s init cp
#ln -s init mount
#ln -s init umount
#ln -s init more
#ln -s init ps
#ln -s init sh
到這裡為止,可以說 floppy-linux 的 root filesystem 已經制作好了,但我們的 floppy-linux 的 root filesystem 要以 ram disk 的方式來實現。所現在我們就來制作 ram disk ,其方法如下:
#dd if=/dev/zero of=/tmp/tmp_loop bs=1k count=2048
#losetup /dev/loop0 /tmp/tmp_loop
#mke2fs -m 0 /dev/loop0
#mount -t ext2 /dev/loop0 /mnt
#cp -a /floppy-linux /mnt
#umount /mnt
#losetup -d /dev/loop0
#dd if=/tmp/tmp_loop | gzip -9 > /tmp/Image.gz
#rm -f /tmp/tmp_loop
#sync
此時你就可以在 /tmp 底下發現 Image.gz 這個檔案,這就是我們的 ram disk 影像檔,假如你經常修改 root filesystem 的內容,建議你可以將上述步驟寫成一支 shell srcipt ,你就可以省下蠻多的時間。到目前為止我們已經完成制 floppy-linux 的准備,接下來就將我們努力的成果擺 入磁盤片。我們的 floppy-linux 的 loader 為 syslinux ,所以先要准備好 syslinux 。首先,將空白的磁片格式化,然後載入 sysliunux ,步驟如下:
#mkdosfs /dev/fd0
#syslinux /dev/fd0
完成上述步驟之後,請編輯 syslinux 的組態檔 syslinux.cfg ,其 syslinux.cfg 內容如下:
TIMEOUT 20
DEFAULT linux
LABEL linux
KERNEL linux
APPEND root=/dev/ram0 initrd=Image.gz
然後將 syslinux.cfg 、 kernel 、 Image.gz 拷貝到磁片中:
#mount -t msdos /dev/fd0 /mnt
#cp /usr/src/linux/arch/i386/boot/zImage /mnt/linux
#cp /tmp/Image.gz /mnt
#cp syslinux.cfg /mnt
現在可以說 Floppy Linux 正式完成,此時你會發現到我們的 Floppy Linux 的大小竟然只有幾百 k 。你現在可以測試你的 Floopy Linux 啦。