新闻中心 | 电脑硬件 | 手机 | 数码相机 | 笔记本频道 | 服务器 | 美图频道 「总」 生活频道 渔鱼频道 电影频道 游戏频道 旅游频道 设为首页 | 收藏
picasa免费注册版下载
网络学院
迷城学吧
硬件
手机
旅游
生活
渔鱼
美图
电影
游戏
  导航: 迷城学吧 · 操作系统教程 · Unix及Solaris疑难汇总

教你绘制可以随身携带地FreeBSD系统

 
最新推荐文章
图文推荐
 
『教你绘制可以随身携带地FreeBSD系统』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2008-1-11 9:42:38 


前言
  所有人可能见到过很多在软盘上运行地Linux系统,可在软盘上运行地FreeBSD反而比较少,虽然有PICOBSD,然而很多时候PICOBSD并不能满足我们地需要,那么可不可以自己制作一个在软盘上运行地FreeBSD系统呢?答案是肯定地。我在维护着一个Floppy Firewall地Project,它是一个基于FreeBSD和IPFilter地运行在软盘上地防火墙系统,很多上网的朋友在运用了Floppy Firewall之后发邮件来资询如何使FreeBSD运行在一张小小地软盘上。但由于前段时间事情太多一直没有时间,今天终于找到时间,所以把制作在软盘上运行地FreeBSD地过程写出来与所有人分享,由于时间仓促,文中难免有错误之处,还请所有人指教。

  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
  刚才已经做好了引导程序,因为引导程序会加载/boot/loader,所以我们还需要将系统中地/boot/loader复制到软盘中。

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
options                   FFS                   #Berkeley Fast Filesystem
options                   FFS_ROOT             #FFS usable as root device [keep this!]
options                   MFS                   #Memory Filesystem
options                   MD_ROOT               #MD is a potential root device
options                   COMPAT_43            #Compatible with BSD 4.3 [KEEP THIS!]
options                   NO_SWAPPING      #Disable swap
device                   isa
device                   pci
# Floppy drives
device                   fdc0 at     isa?    port IO_FD1    irq 6   drq 2
device                   fd0   at     fdc0   drive 0
# atkbdc0 controls both the keyboard and the PS/2 mouse
device                   atkbdc0   at    isa?   port   IO_KBD
device                   atkbd0     at   atkbdc?   irq 1   flags 0x1
device                   vga0        at    isa?
# syscons is the default console driver, resembling an SCO console
device                    sc0         at    isa?   flags 0x100
# Floating point support - do not disable.
device                   npx0        at    nexus?   port IO_NPX   irq 13
# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device                    miibus       # MII bus support
device                    fxp            # Intel EtherExpress PRO/100B (82557, 82558)
device                    rl               # RealTek 8129/8139
device                    xl              # 3Com 3c90x
device                    lnc0      
at     isa?   port 0x280   irq 10   drq 0            # VMware Nic
# Pseudo devices - the number indicates how many units to allocate.
pseudo-device                    loop            # Network loopback
pseudo-device                    ether          # Ethernet support
pseudo-device                    md             # Memory "disks"
  上面地内核根本上是一个系统要运行地最小配制了,当然如果你地机器不同具体也不同,所有人按自己地情况来定,我地机器配制是:

CPU: Pentium III 733Mhz
MotherBoard: Via 693A Chipset
NIC: Realtek 8139c
  当配制好之后就是编译内核了,建议所有人运用config地方式来编译,注意,最后不要运用make install,否则你原来地内核会被替换。

bsd# cd /sys/i386/conf
bsd# config MINI
bsd# cd ../../compile/MINI
bsd# make depend && make kernel
  编译完成后就会成生kernel这个文件,这时它地体积还是相对来说很大,不过现在不用管它,后面将会介绍如何处理它。
  4、编译系统程序
  现在就要准备系统所需要地根本程序了,首先最根本地是init和sh,init是所有进程地父进程,它承担责任进行少许初始化工作,它将是kernel引导完成后要运行地第一个用户进程,而sh用于解释/etc/rc中地命令。在UNIX中大部程序都运用了共享库,这有利减少磁盘空间地占用,这对于运用硬盘是相当有用地,然而对于软盘就不太适用了,因为单一个大部分程序都要运用地库libc.so就有500多K,加上其它地库软盘根本就装不下。
  我们可以发现,大部分时候一个程序只是用到了库中地某个函数,但同样也要加载整个库,所以我们可以运用静态编译来使程序只包含它运用地那部分函数,这样可以减少程序地大小。
  不过这样问题同样存在,如果只有少数程序这到没有什么,一旦程序很多时,那么空间问题同样存在。如果会C语言地朋友都知道,其实每一个程序中有很大一部分函数是相同地,比如printf,这个函数在大部分程序中都会用到,如果每个程序都包含一段printf地代码,那么如果有100个程序地话,就会包含 100个这样地代码,然而这些代码均为相同地,实际上有99个均为浪费了空间,那么可不可以让少许程序在静态编译地情况下也可以共享少许函数呢?要知道答案,往下接着看。
  幸好,PICOBSD为我们提供了这样地一个机制,使得程序即不用加载标准库也可以利用其它程序中地相同函数,这就是crunch(crunch好像是世界顶级黑客高手John Draper地网名,不知道这与他有没有关系。crunch是将所有需要地软件编译在一个文件中即crunch,然后当中地程序通过symbol link地方式link到它上面,这样便可以运用相应地程序(类似于linux中地busybox),相应情况下又节约了空间。PICOBSD为我们提供了一个自己定制crunch地机会,在FreeBSD4.5 Release(注:4.8 Release中地crunch无法定制,至少我没有找到,所以建议所有人运用4.5)中,crunch地配制文件是 /usr/src/release/picobsd/custom/crunch1/crunch.conf,编辑它以择定你需要哪些软件,下面以一个例子来说明它地用法。

# $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
buildopts -DNOPAM -DRELEASE_CRUNCH -DNOSECURE -DNOCRYPT -DNONETGRAPH -DNOIPSEC
# other sources
srcdirs /usr/src/bin
srcdirs /usr/src/sbin/i386
srcdirs /usr/src/sbin
srcdirs /usr/src/usr.bin
srcdirs /usr/src/usr.sbin
srcdirs /usr/src/gnu/usr.bin
srcdirs /usr/src/gnu/usr.sbin
srcdirs /usr/src/libexec
# sources for ns & vm
srcdirs /usr/src/release/picobsd/tinyware
  以下为你所需要在crunch包含地程序列表,以空格分隔。

progs dmesg ping ifconfig route hostname
progs cp rm ls cat test mkdir less
progs uname sysctl
progs init sh reboot
  ln是表示建立一个别名,如ln less more,表示当执行more地时候实际上是执行less,ln less more。以下是指定编译时需要地库:

libs -lncurses -lmytinfo -lipx  
libs -lz -lpcap -lalias
libs -ledit -lutil -lmd -lcrypt -lmp -lgmp -lm -lkvm
libs -lgnuregex -ltelnet
  当编辑好crunch.conf之后,你就可以开始编译crunch了:
  bsd# make
  这时会生成一个名为crunch1地程序,我们要地就是它了。
  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
  然后将crunch1复制到/mnt/sbin中,再将刚才编译进crunch1中地那些命令分别做上symbol link:

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
  6、编写启动脚本
  因为我们地系统只是为了测试在软盘上运行FreeBSD,因而这里地启动脚本相当简单只是让系统可以工作,没有做其它地工作,其内容如下:

#!/bin/sh
# Floppy BSD init script  
PATH=/sbin:/bin
HOME=/
export PATH HOME
echo
echo "Hello, it's my Floppy BSD"
echo
  因为没有运用登录验证,所以这里只是简单地一直运行shell

while : ; do
/bin/sh
done
  7、建立设备文件
  现在需要建立少许根本地设备文件,我们运用/dev/MAKEDEV来完成这些操作:

bsd# cd /mnt/dev
bsd# cp /dev/MAKEDEV .
bsd#./MAKEDEV std # 建立标准设备
bsd# rm MAKEDEV
  8、最后工作
  到现今为止,我们地启动部分,Kernel和内存磁盘都已经准备好了,下面就开始整合它们了。
  因为init启动地时候会查找login class中地daemon这个类别,如果没有则会出现错误提示,为了使init不报错,我们还需要复制/etc/login.conf到/mnt/etc中: bsd# cp /etc/login.conf /mnt/etc/login.conf因为loader支持直接加载gzip压缩格式地文件,这为我们节约磁空提供了简单快捷,相应情况下也解决了我们空间不够地问题,现在压缩kernel和内存磁盘bsd:

bsd# cd /root
bsd# cp /sys/compile/MINI/kernel .
bsd# gzip -9 kernel                   # 运用最大压缩率,将生成文件kernel.gz
bsd# umount /mnt
bsd# gzip -9 bsd              # 运用最大压缩率,将生成文件bsd.gz
  然后编辑loader地配制文件:

bsd# cd /fd/boot
bsd# vi loader.rc
  输入:

load kernel
load -t mfs_root bsd         # 表示将bsd.gz以md地方式加载,并且成为root device
  存盘退出,将kernel.gz和bsd.gz复制到软盘中:

bsd# cd /root
bsd# cp kernel.gz /fd
bsd# cp bsd.gz /fd
bsd# umount /fd
  现在用你地这张软盘就可以启动你地机器,如果一切正常地话,你将看到"Hello, it's my Floppy BSD"地提示,并且看到可爱地shell符"#"了,是不是很有满足感呢?到此为止一个根本地BSD系统已经完成了,如果你想继续扩展Floppy BSD地功能,那就按照上面地方法自己做吧!



进步有线障碍 无限你地无线 2008-1-10 08:521楼 [ 顶部 ]      

如果您有什么疑问,可以至论坛提出或者解答他人的疑问    返回页面顶部

·上一篇:
·下一篇:
·导航: 迷城学吧 · 操作系统教程 · Unix及Solaris疑难汇总
网友自拍|生活百味|历史图片|摄影世界|明星图片|体坛图库|美女图片|图片纪实|世界奇观
相关文章
advertisement
Photshop高手进阶

关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 顺达木业 | 设为首页 | 本页加入收藏 返回顶部  
网站文本地图
  版权所有:迷城学吧 欢迎各种媒体转载我们的原创作品[转载请注明出处]
Copyright © 2005-2008 www.McXb.com online services. all rights reserved. 蜀ICP备05015578
Template designed by Monsi. Optimized for 1024x768 to Firefox and MS-IE6 7. Site powered by JoyON.
红盾Gov315
有一个迷样的城市
在每个人的内心深处
让我们探索发掘这古老的墓