分类: BSD
2008-04-07 21:32:32
前言
大家可能见到过很多在软盘上运行的Linux系统,可在软盘上运行的FreeBSD反而比较少,虽然有PICOBSD,然而很多时候PICOBSD并不能满足我们的需要,那么可不可以自己制作一个在软盘上运行的FreeBSD系统呢?答案是肯定的。我在维护着一个Floppy Firewall的Project,它是一个基于FreeBSD和IPFilter的运行在软盘上的防火墙系统,很多网友在使用了Floppy Firewall之后发邮件来询问如何使FreeBSD运行在一张小小的软盘上。但由于前段时间事情太多一直没有时间,今天终于找到时间,所以把制作在软盘上运行的FreeBSD的过程写出来与大家分享,由于时间仓促,文中难免有错误之处,还请大家指教。同时非常欢迎大家访问CNFUG(China FreeBSD User Group, ),它是一个由一些FreeBSD爱好者组织起来的自由组织,目的是为大家提供中文的FreeBSD方面的资源,目前CNFUG定期的向大家发行免费的FreeBSD中文技术期刊(journal/)和维护一些Project(project/)。
1、FreeBSD的启动过程简介
当BIOS读入MBR之后,MBR中的程序读入硬盘FreeBSD Slice(FreeBSD分区)中的引导程序,引导程序默认情况下会加载/boot/loader,然后loader将加载/kernel,此时kernel开始检测一些硬件和做一些初始化。初始化完成后kernel将mount root device,然后启动系统初始化进程/sbin/init,init将根据/etc/rc中的设置来进行初始化等。
可以看出我们需要解决的部分就是:引导程序 -> /boot/loader -> /kernel -> /sbin/init -> /etc/rc
在了解了启动过程之后和问题所在之后,我们便可以开始制作软盘上的FreeBSD了。
2、初始化软盘
首先要做的就是要将软盘初始化,包括设置disklabel和创建文件系统(格式化成ufs格式)。
bsd# disklabel -r -w fd0a fd1440 |
bsd# disklabel -B fd0a |
bsd# newfs fd0a |
bsd# mkdir /fd bsd# mount /dev/fd0a /fd bsd# mkdir /fd/boot bsd# cp /boot/loader /fd/boot/loader |
根据FreeBSD的启动过程,现在我们已经准备好了引导程序和loader,接下来就要准备内核了。
3、定制内核
软盘的空间有限,所以我们需要定制一个小内核,而不能直接使用系统原来的内核。
由于我们只使用软盘,所以内核中的关于scsi、ata、atapi和raid等这些东西都应该删除,因为我们不需要IPv6所以INET6也应该删除,具体留下些什么要看自己的用途了,这没有什么标准。不过有几样是必须的:
options MFS # 内存文件系统支持
options MD_ROOT # 使用MD(内存磁盘)设备做root
options UFS # UFS文件系统支持
options UFS_ROOT # UFS ROOT
pseudo-device md # MD设备支持
下面是我使用的一个内核配制文件:
# # GENERIC -- Generic kernel configuration file for FreeBSD/i386 # # # $FreeBSD: src/sys/i386/conf/GENERIC,v 1.246.2.38 2002/01/25 17:41:40 murray Exp $ machine i386 cpu I386_CPU cpu I486_CPU cpu I586_CPU cpu I686_CPU ident "MINI-KERNEL" maxusers 0 #maxusers最好让系统自动分配,如果设得过大,会占用过多的内存。 options INET #InterNETworking device isa # Floppy drives # atkbdc0 controls both the keyboard and the PS/2 mouse device vga0 at isa? # syscons is the default console driver, resembling an SCO console # Floating point support - do not disable. # PCI Ethernet NICs that use the common MII bus controller code. # Pseudo devices - the number indicates how many units to allocate. |
bsd# cd /sys/i386/conf bsd# config MINI bsd# cd ../../compile/MINI bsd# make depend && make kernel |
# $FreeBSD: src/release/picobsd/router/crunch.conf,v 1.1.2.2 2001/02/20 02:53:35 luigi Exp $ # # NOTE: the string "/usr/src" will be automatically replaced with the # correct value set in 'build' script - you should change it there # Default build options # other sources # 以下为你所需要在crunch包含的程序列表,以空格分隔。 # ln是表示建立一个别名,如ln less more,表示当执行more的时候实际上是执行less # 以下是指定编译时需要的库 |
bsd# make |
5、建立内存磁盘
大家可以看到crunch1加上我们刚才编译的内核和loader程序,已经超出了软盘的容量,同时为了加速程序的运行我们需要使用MD(内存磁盘)来解决这个问题,MD将作为系统的根文件系统和用来存放系统程序。对于内存磁盘的大小一般不易太大,因为这样会占用过多的内存,下面我们就以建立一个3M的内存磁盘为例说明如何建立内存磁盘:
bsd# cd /root bsd# dd if=/dev/zero of=bsd bs=1k count=3072 # 生成一个3M的文件,用来做MD bsd# vnconfig -c -s labels vn0c bsd # 使用bsd来创建一个vn设置,以便在其中存放程序 bsd# disklabel -w -r vn0c auto # 建立disklabel bsd# disklabel -B vn0c # 安装启动代码 bsd# newfs vn0c # 创建UFS文件系统 bsd# mount /dev/vn0c /mnt # 将vn0c即bsd mount到/mnt |
bsd# mkdir /mnt/etc bsd# mkdir /mnt/sbin bsd# mkdir /mnt/bin bsd# mkdir /mnt/dev |
bsd# cp /usr/src/release/picobsd/custom/crunch1/crunch1 /mnt/sbin bsd# cd /mnt/sbin bsd# ln -s ./crunch1 init # init必须在/mnt/sbin目录中 bsd# ln -s ./crunch1 reboot bsd# ln -s ./crunch1 sysctl bsd# ln -s ./crunch1 ifconfig bsd# ln -s ./crunch1 route bsd# ln -s ./crunch1 ping bsd# ln -s ./crunch1 dmesg bsd# cd /mnt/bin bsd# ln -s ../sbin/crunch1 sh # sh必须在/mnt/bin目录中 bsd# ln -s ../sbin/crunch1 hostname bsd# ln -s ../sbin/crunch1 cp bsd# ln -s ../sbin/crunch1 rm bsd# ln -s ../sbin/crunch1 ls bsd# ln -s ../sbin/crunch1 cat bsd# ln -s ../sbin/crunch1 test bsd# ln -s ../sbin/crunch1 mkdir bsd# ln -s ../sbin/crunch1 less bsd# ln -s ../sbin/crunch1 uname bsd# ln -s ../sbin/crunch1 more |
#!/bin/sh # Floppy BSD init script PATH=/sbin:/bin echo # 因为没有使用登录验证,所以这里只是简单的一直运行shell |
bsd# cd /mnt/dev bsd# cp /dev/MAKEDEV . bsd#./MAKEDEV std # 建立标准设备 bsd# rm MAKEDEV |
bsd# cp /etc/login.conf /mnt/etc/login.conf |
bsd# cd /root bsd# cp /sys/compile/MINI/kernel . bsd# gzip -9 kernel # 使用最大压缩率,将生成文件kernel.gz bsd# umount /mnt bsd# gzip -9 bsd # 使用最大压缩率,将生成文件bsd.gz |
bsd# cd /fd/boot bsd# vi loader.rc |
load kernel load -t mfs_root bsd # 表示将bsd.gz以md的方式加载,并且成为root device |
bsd# cd /root bsd# cp kernel.gz /fd bsd# cp bsd.gz /fd bsd# umount /fd |
按照本文的步骤,我制作了一个例子,大家可以到这里下载: 使用方法请参照Floppy Firewall的使用方法。
这几天太累了,我现在得去睡觉了。
参考资料:
PICOBSD Project