發新話題
打印

如何製作簡易Floppy Liunx

如何製作簡易Floppy Liunx

這篇文章的內容:要使讀者了解 Linux 開機的過程及如何製作簡易的 Floppy Linux 。對想要從事 embedded Linux 的人多多少少有點幫助。在還沒有談論如可製作簡易 Floppy Linux 之前,首先要瞭解整個開機的過程。當一部電腦一打開電源時 ...
BIOS - ->> SYSLINUX - ->> Kernel - ->> Init - - >> Shell 開機過程


開機過程簡述
BIOS - ->> SYSLINUX - ->> Kernel - ->> Init - - >> Shell 開機過程
在還沒有談論如可製作簡易 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
到現在為止,我們已經有了 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 bin sbin

進入 /dev 目錄下建立一般終端機設備:
#cd dev
#mknod tty c 5 0
#mknod 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 ram0

再建立 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 啦。

TOP

發新話題