http://www.knowsky.com/343408.html

 前言

  大家可能见到过很多在软盘上运行的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的功能,那就按照上面的方法自己做吧!

转载于:https://blog.51cto.com/axlrose/1287434

教你制作可以随身携带的FreeBSD系统[转]相关推荐

  1. 为MacBook制作一个随身携带的windows系统

    为MacBook制作一个随身携带的windows系统 如果你还在为Macbook紧张的容量而烦恼是否使用Boot Camp安装windows操作系统,如果你还在担忧硬件的性能而是否使用虚拟机,如果你还 ...

  2. win10多合一原版系统_手把手教你制作官方原版的WIN10系统安装盘

    随着电脑软硬件的不断升级,WIN10系统已逐渐成为装机首选.但除了自带win10系统的品牌机,市面上大部分的DIY电脑和预装LINUX系统的品牌机都被安装上了Ghost版的盗版WIN10系统,这类系统 ...

  3. 制作可随身携带的Ubuntu系统U盘

    Ubuntu系统对于不弄技术的普通人来讲,可能不知道这是什么系统,但是对于我们这些弄技术的人员来说,学会使用ubuntu系统是一项基本的技能.最近也由于需要使用它,却不想安装双系统,为了这个系统的便携 ...

  4. 教你自己制作Vista与DOS双系统

    教你自己制作Vista与DOS双系统 随着Windows Vista的到来,各位系统玩家们是不是还是希望玩转双系统呢?你知道其实即使是Windows VISTA环境下我们也能安装最原始的MS-DOS喔 ...

  5. 教你制作启动U盘,用U盘装系统(转载)

    Technorati 标签: 启动盘 教你制作启动U盘,用U盘装系统(转载) 有不少朋友在使用不带光驱的笔记本,但是问题也来了,需要重装系统的时候,没有光驱,该怎么办?也许你会说可以在dos下硬盘安装 ...

  6. 教你用html+js制作一个自己的点名系统,实例代码分享

    简介 教你用html+js制作一个自己的点名系统,实例代码如下. 效果 代码 HTML <div class="wrapper"><h1 align=" ...

  7. Linux系统装进U盘里,制作随身携带的便捷系统

    现在的U盘比较便宜,所以很多人都想把系统装进U盘里,而linux的灵活性使它可以做到这一点. USB3.0 第一种安装方法 如果是USB3.0,读写效率还是蛮高的,请看:木子的博客 第二种 可以直接在 ...

  8. openwrt 格式化_一步一步教你制作openwrt卡系统

    1.搭建交叉编译环境 sudo apt-get install build-essential u-boot-tools uboot-mkimage gcc-arm-linux-gnueabihf n ...

  9. 教你制作简单的jsp在线考试系统

    教你制作简单的jsp在线考试系统 代码链接 先给大家看看效果图: 首页Index.jsp <%@ page language="java" contentType=" ...

最新文章

  1. kubernetes的安装
  2. corosync+pacemaker+crm+nfs
  3. 字典树(Trie树)
  4. uni-app使用前的调研和开发心得
  5. MYSQL学习笔记 (二)对数据库结构的增删改查
  6. 数字调色盘【RGB和16位】
  7. 毕设日志5.12凌晨
  8. 简单选择排序_一文带你读懂排序算法(一):冒泡 amp; 快速选择排序 amp; 简单插入排序算法...
  9. 1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法
  10. 计算机 信息安全常识
  11. 单片机_第1章 单片机基础知识概述
  12. wpa/wpa2无线网pin码破解
  13. 三菱Q系列plc11轴运动控制程序
  14. 前端UI框架横向对比
  15. 怎么获取别人服务器信息失败,获取服务器信息失败
  16. Excel如何制作下拉列表
  17. subprocess用法,官方文档
  18. 潍坊学院计算机工程学院天一楼地址,我院志愿汇APP系统培训会
  19. 如何用stc单片机内部ad采集多路交流信号
  20. Java中基本数据类型是几种_JAVA中的基本数据类型有八种,分别是:( )、( )、( )、(...

热门文章

  1. javascript中构造函数的返回值问题和new对象的过程
  2. MathType如何设置标尺的单位
  3. The resource identified by this request is only capable of generating responses with characteristics
  4. sql loader 导入数据时的问题
  5. Python模块学习——optparse
  6. 恢复“资源管理器”右键弹出菜单中的“新建”“文本文件”。
  7. Mysql组复制故障恢复测试
  8. Linux下Redis-3.0.7版本的安装以及Redis主备的部署(一)
  9. Shell tips
  10. nagios::plugin模块安装报错解决