当前位置:Linux教程 - Linux业界 - 如何制作简易Floppy Liunx

如何制作简易Floppy Liunx


开机过程简述
在还没有谈论如可制作简易 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 啦。