前言
1.這個 Floppy Linux 的開機過程與一般 Linux 開機過程稍有不同(會將它盡量精簡流程):將 LILO ,GRUB 更換成 syslinux 開機完之後直接提供一個 shell 給使用者用,其完整開機方式如下:
BIOS –> Syslinux –> Kernel –> initrd –> init –> shell
2.預先準備一些發展 Floopy Linux 的 source package 及工具程式.步驟可分為 3 部分:
Compile Linux Kernel
首先,必須針對我們的 Floppy Linux 來量身製作它所屬 Kernel 如下:
[root@benjr ~] # cd /usr/src/kernels/2.4/ [root@benjr 2.4]# make clean [root@benjr 2.4]# make mrproper [root@benjr 2.4]# make xconfig # 在 Block devices 中, Default RAM disk size,initial RAM disk(initrd)support 以及File system 中 , Second extended fs support 一定要選取,且要選為 monic 而不是Module 或空白) Block devices [*] Default RAM disk size [*] initial RAM disk(initrd)support File system [*] Second extended fs support [root@benjr 2.4]# make dep [root@benjr 2.4]# make bzImage
initrd 的建構,使用 BuzyBox
系統會將 initrd 先載入至 ram disk (dev/ram0) 中,執行完 linuxrc 後去存取 root partitaion 並執行第一個程式/sbin/init.這是系統正常開機的方法,為了 diskless 系統我將修改成下列的方式
1.將 root 指向 /dev/ram0 也就是 initrd
2.為了能開機 initrd 必須為最小的且完整的 linux system
最小的且完整的 linux system 所需要的檔案系統
/dev/tty , /dev/console, /dev/tty0, /dev/ram0 , /dev/fd0, /dev/null
/etc/rc.d/rc.sysinit , /etc/inittab /etc/fstab
/bin/init , /bin/ls , /bin/cp , /bin/mount , /bin/umount , /bin/ps , /bin/sh
/proc
/mnt
/tmp
/sbin soft link to /bin
/var
重點是 /sbin/init ,但是我們無法使用原 RedHat 中的 /sbin/init 因為大多的程式皆使用 Dynamic link 方式編輯,因此除了程式本身還要函式庫程式才能正確執行,這樣initrd 將會的很大.所以我將會採用 BuzyBox [匯集常用 UNIX 指令於單一執行檔的工具集,在此對這 BusyBox 簡單的介紹一下:BusyBox 它包含了七十多種 Linux 上標準的工具程式,只需要的磁碟空間僅幾百 k ,在嵌入式 系統上常用到它 ,可在 http://busybox.net 找到參考資料及下載.
Busybox 為何能夠佔有如此小的容量,卻能提供為數不少的常用工具呢?這訣竅在於 busybox 在編譯後,雖然整體只是一個執行檔,卻可以透過 symbolic link 的方式,將常用指令 「連」到 busybox 這個執行檔上
建立出一個靜態連結的 BusyBox (Floppy Linux 這個例子用到了 init、ls、cp、cat、mount、umount、more、ps、sh),之所以要編譯成靜態連結的原因,就是不希望 Floppy Linux 使用到 glibc 而增加磁碟的使用空間。
以下為建立 BusyBox 的步驟:
[root@benjr ~]# tar zxvf busybox-0.51.tar.gz
修改 Makefile 中的 DOSTATIC 參數,從 false 改為 true
[root@benjr ~]# make
到現在為止,我們已經有了 Liunx kernel 及一些常用的工具程式,似乎還少了 rootfilesysem,所以進入打造迷你的 root fs 的步驟。在開始建造 root fs 之前,必須成為 super uesr 也就是 root,因為接下來必須要用到 mknod 不得不為 root。首先,為 root fs 建一個目錄叫做 floppy-linux,然後進入 floppy-linux 目錄內:
[root@benjr ~]# mkdir floppy-linux [root@benjr ~]# cd floppy-linux
再來為 root filesystem 建立一些標準的目錄:
[root@benjr ~]# mkdir dev etc etc/rc.d bin proc mnt tmp var [root@benjr ~]# chmod 755 dev etc etc/rc.d bin mnt tmp var [root@benjr ~]# chmod 555 proc [root@benjr ~]# ln -s sbin bin
進入 /dev 目錄下建立一般終端機設備:
[root@benjr ~]# cd dev [root@benjr ~]# mknod tty c 5 0 [root@benjr ~]# mknodconsole c 5 1 [root@benjr ~]# chmod 666 tty console
接著建立 VGA Display 虛擬終端機設備:
[root@benjr ~]# mknod tty0 c 4 0 [root@benjr ~]# chmod 666 tty0
再建立 RAM disk 設備:
[root@benjr ~]# mknod ram0 b 1 0 [root@benjr ~]# chmod 600 ram0
建立 floppy 設備:
[root@benjr ~]# mknod fd0 b 2 0 [root@benjr ~]# chmod 600 fd0
最後在建立 null 設備:
[root@benjr ~]# mknod null c 1 3 [root@benjr ~]# chmod 666 null
擁有 fs 的框架後,現在開始編輯有關的 shell srcipt。我們先從 /etc/inittab 這一支 script 下手,因為我們用的是 BusyBox 上的 init,與一般所使用的 init 不太一樣,會先執行 /etc/init.d/rcS 而非 /etc/rc.d/rc.sysinit,為了做出來的 FloppyLinux 架構與 Redhat 的架構一樣,所以修改了 BusyBox 中的 init.c 。底下是修到的部分內容:
[root@benjr ~]# vi init.c # ifndef INIT_SCRIPT # define INIT_SRCIPT "/etc/rc.d/rc.sysinit" # endif
請重新再 make 一次
[root@benjr ~]# make clean [root@benjr ~]# make
請進入到 /floppy-linux/etc/rc.d 這個目錄下編輯 rc.sysinit ,內容如下:
::sysinit:/etc/rc.d/rc.sysinit ::askfirst:/bin/sh
修改 /floppy-linux/etc/inittab 的權限:
[root@benjr ~]# chmod 644 inittab
編輯好 inittab
# !/bin/sh mount -a
變更其權限:
[root@benjr ~]# chmod 755 rc.sysinit
再來在編輯 /floppy-linux/etc/ 底下的 fstab , fstab 內容如下:
proc /proc proc defaults 0 0
修改 fstab 權限:
[root@benjr ~]# chmod 644 fstab
完成上述編輯之後,就要把靜態連結版的 BusyBox 搬到 /floppy-linux/bin 下,並做出所需要的工具程式的連結符號,其步驟為下:
[root@benjr ~]# cd /floppy-linux/bin [root@benjr ~]# cp /busybox-0.51/busybox ./init [root@benjr ~]# ln -s init ls [root@benjr ~]# ln -s init cp [root@benjr ~]# ln -s init mount [root@benjr ~]# ln -s init umount [root@benjr ~]# ln -s init more [root@benjr ~]# ln -s init ps [root@benjr ~]# ln -s init sh
到這裡為止,可以說 floppy-linux 的 root fs 已經製作完畢,不過,一般來說,我們會採取 RAM Disk 的方式實現。為什麼呢?從前面 [起點:開機片] 的經驗可以得知,如果我們採取 ramdisk 的方式,而非實體 (physical) 存在於儲存媒體 (當然這裡是指 floppy) 中,那麼,我們甚至可以進一步壓縮這個 ramdisk image,以便放置更多附加功能。如此一來,整個系統的規劃就變成:
現在,我們就來製作 ram disk ,其方法如下:
[root@benjr ~]# dd if=/dev/zero of=/tmp/tmp_loop bs=1k count=2048 [root@benjr ~]# losetup /dev/loop0 /tmp/tmp_loop [root@benjr ~]# mke2fs -m 0 /dev/loop0 [root@benjr ~]# mount -t ext2 /dev/loop0 /mnt [root@benjr ~]# cp -a /floppy-linux /mnt [root@benjr ~]# umount /mnt [root@benjr ~]# losetup -d /dev/loop0 [root@benjr ~]# dd if=/tmp/tmp_loop | gzip -9 > /tmp/Image.gz [root@benjr ~]# rm -f /tmp/tmp_loop [root@benjr ~]# sync
此時,可以在 /tmp 底下發現 Image.gz 這個檔案,這就是 ram disk 影像檔
syslinux (Linux Kernel Loader)
我們的 floppy-linux 的 loader 為 syslinux ( 可以讀取 FAT 及 Ext2 fs ),所以先要準備好 syslinux
1.將空白的磁片格式化,然後載入 sysliunux,步驟如下:
[root@benjr ~]# mkdosfs /dev/fd0 [root@benjr ~]# syslinux /dev/fd0
2.請編輯 syslinux 的組態檔 syslinux.cfg,其 syslinux.cfg 內容如下:
TIMEOUT 20
DEFAULT linux
LABEL linux
KERNEL linux
APPEND root=/dev/ram0 initrd=Image.gz
3.然後將 syslinux.cfg、kernel、Image.gz 拷貝到磁片中:
[root@benjr ~]# mount -t msdos /dev/fd0 /mnt [root@benjr ~]# cp /usr/src/linux/arch/i386/boot/zImage /mnt/linux [root@benjr ~]# cp /tmp/Image.gz /mnt [root@benjr ~]# cp syslinux.cfg /mnt
嗯,大功告成!也可使用 PXE 存放 kernel,inirtd 從網路開機,但要指定 root=/dev/ram0 參數給kernel
note:
1.如果 boot loader 沒有指定 initrd 而且 root 掛在 floppy(fd0) 時 kernel 會要求放入第二片 root 的磁片
2.[root@benjr ~]# dd if=linux-kernel of=/dev/fd0
這樣整個 kernel 就存在磁片中,而且也是可以開機的
參考文件 : http://www.study-area.org/tips/floppy-linux.htm
2 thoughts on “Floppy Linux”