020-29133788
    资 讯
    您的位置:首页 >> 资 讯 >> LINUX应用 >> LINUX安装 >> 正文
    如何制作简易Floppy Liunx?

    点击:   发布日期:2013-01-04

    本文来自 www.020fix.com

    这篇文章的内容:要使读者了解 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 啦。