前言
大家可能見到過很多在軟盤上運行的Linux系統,可在軟盤上運行的FreeBSD反而比較少,雖然有PICOBSD,然而很多時候PICOBSD並不能滿足我們的需要,那麼可不可以自己製作一個在軟盤上運行的FreeBSD系統呢?答案是肯定的。我在維護著一個Floppy Firewall的Project,它是一個基於FreeBSD和IPFilter的運行在軟盤上的防火牆系統,很多網友在使用了Floppy Firewall之後發郵件來詢問如何使FreeBSD運行在一張小小的軟盤上。但由於前段時間事情太多一直沒有時間,今天終於找到時間,所以把製作在軟盤上運行的FreeBSD的過程寫出來與大家分享,由於時間倉促,文中難免有錯誤之處,還請大家指教。同時非常歡迎大家訪問CNFUG(China FreeBSD User Group, http://www.cnfug.org/),它是一個由一些FreeBSD愛好者組織起來的自由組織,目的是為大家提供中文的FreeBSD方面的資源,目前CNFUG定期的向大家發行免費的FreeBSD中文技術期刊(http://www.cnfug.org/journal/)和維護一些 Project(http://www.cnfug.org/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格式)。
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設備支持
下面是我使用的一個內核配製文件:
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,否則你原來的內核會被替換。
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,編輯它以選擇你需要哪些軟體,下面以一個例子來說明它的用法。
# 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
這時會生成一個名為crunch1的程序,我們要的就是它了。
5、建立內存磁碟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來完成這些操作:
8、最後工作
到目前為止,我們的啟動部分,Kernel和內存磁碟都已經準備好了,下面就開始整合它們了。
因為init啟動的時候會查找login class中的daemon這個類別,如果沒有則會出現錯誤提示,為了使init不報錯,我們還需要複製/etc/login.conf到/mnt/etc中:
現在用你的這張軟盤就可以啟動你的機器,如果一切正常的話,你將看到"Hello, it's my Floppy BSD"的提示,並且看到可愛的shell符"#"了,是不是很有滿足感呢?:)
到此為止一個基本的BSD系統已經完成了,如果你想繼續擴展Floppy BSD的功能,那就按照上面的方法自己做吧!
同時我在CNFUG(China FreeBSD User Group, http://www.cnfug.org)維護著一個Floppy Firewall(http://www.cnfug.org/project/ffw/)的Project,就是利用這種方法製作的一個在軟盤上運行的防火牆系統,你可以用來做參考。
按照本文的步驟,我製作了一個例子,大家可以到這裡下載:http://www.cnfug.org/tmp/flp-bsd.bin 使用方法請參照Floppy Firewall的使用方法。
這幾天太累了,我現在得去睡覺了。
原文鏈接:http://cnfug.org/journal/systems/2004/000010.html
本文
[火星人 ] 製作軟盤上運行的FreeBSD系統已經有320次圍觀