1,324 瀏覽數

Floppy Linux

Floppy Linux
Step0:前言
Step1:Compile Linux Kernel
Step2:initrd 的建構,使用 BuzyBox
Step3:syslinux Linux Kernel Loader,可以讀取 FAT 及 Ext2 fs

Step0:前言

1.這個 Floppy Linux 的開機過程與一般 Linux 開機過程稍有不同(會將它盡量精簡流程):將 LILO ,GRUB 更換成 syslinux 開機完之後直接提供一個 shell 給使用者用,其完整開機方式如下:
BIOS –> Syslinux –> Kernel –> initrd –> init –> shell
2.預先準備一些發展 Floopy Linux 的 source package 及工具程式.步驟可分為 3 部分:

Step1: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

Step2: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,以便放置更多附加功能。如此一來,整個系統的規劃就變成:
floopy_linux
現在,我們就來製作 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 影像檔

Step3:syslinux [Linux Kernel Loader,可以讀取 FAT 及 Ext2 fs

我們的 floppy-linux 的 loader 為 syslinux ,所以先要準備好 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 個網友的想法 “Floppy Linux

  1. 自動參照通知: Linux 開機流程 – Benjr.tw

  2. 自動參照通知: Busybox | Benjr.tw

發表迴響