全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1756
推到 Plurk!
推到 Facebook!

Floppy Firewall 製作軟碟上運行的FreeBSD系統

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-26 10:13:30 IP:218.175.xxx.xxx 未訂閱
Floppy Firewall http://www.gbunix.com/htmldata/2004_12/1/7/article_858_1.html 製作軟碟上運行的FreeBSD系統 測試平臺:FreeBSD 4.5 Release (i386) 前言大家可能見到過很多在軟碟上運行的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格式)。 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的功能,那就按照上面的方法自己做吧! 同時我在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的使用方法。 這幾天太累了,我現在得去睡覺了。 參考資料: PICOBSD Project 瞭解更多詳情,參與討論,請進入GBUNIX論壇: http://www.gbunix.com/bbs/forums.html
附加檔案:73948_flp-bsd.bin
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-03 22:26:04 IP:218.175.xxx.xxx 未訂閱
http://www.cnfug.org/project/ffw/    Floppy Firewall
負 責 人:        Matthew 
最新版本:        0.03 
更新記錄:        修正了0.02版中的一些錯誤,包括:不能更改密碼的錯誤和使用ipfstat -t顯示終端錯誤。
舊版下載:        0.01    0.02
系統參數:        作業系統        FreeBSD 4.5 Release
防 火 牆        IP Filter v3.4.20 (264)
網卡列表        RealTek 8129/8139系列,D-Link DEF530TX ,Intel EtherExpress PRO/100B,3Com 3c90x,AMD Am79c97x Based
最小記憶體        12M
功能介紹        無需硬碟和光碟機,只需軟碟便可工作。支援包過濾,狀態過濾,支援網路位址轉換,可查看網路連接狀態等。 
支援的命令        ifconfig route hostname netstat ping dhclient cp rm ls cat test gzip mkdir mknod fsck uname less more getty
                login passwd pwd_mkdb sysctl init sh reboot ipnat ipf ipfstat ipmon mount umount MAKEDEV    使用方法:
1、Windows下的使用方法首先你需要下載fdimage.exe,然後將fdimage.exe和Floppy Firewall的鏡像文件ffwxx複製到同一目錄
(如:c:\ffw),然後進行如下操作:
c:\ffw> fdimage ffwxx a:2、UNIX/Linux
下的使用方法UNIX/Linux下使用就比較簡單:# dd if=ffwxx of=/dev/fd0a注:
這裏xx?Floppy Firewall的版本。然後用軟碟?動機器便可。    常見問題:
1.        系統root口令是什??
0.02版默認root口令是CNFUGffw,0.03版之後系統默認口令?空。
2.        ?什?剛安裝的FFW網路不通? 這是由於FFW帶的ipfilter的默認規則是block in allblock out all
        即默認是不允許任何網路連接通過,你可以編輯/etc/ipf.conf來修改它(方法見後)或者暫時關閉ipfilter:ffw# ipf -D 
3.        如何修改防火牆規則?系統默認的防火牆過濾規則是存放在/etc/ipf.conf中,你可以將你的防火牆規則存放到其中,
        當機器重新?動的時候會自動載入。修改規則的方法有很多種,
        這裏舉一個例子:ffw# (cat << _EOF_) > /etc/ipf.conf> pass in all> 
        block in on fxp0 proto tcp from www.badguy.com to any port = 22> pass out all>_EOF_ 
        現在你的過濾規則就已經添加到/etc/ipf.conf中了。
4.        如何修改我的網路配製?網卡配製:在/etc/中生成相應的ifconfig.if文件,然後在其中輸網卡的配製參數,
        如果?動態分配則在配製文件中輸入DHCP便可。
        例如:對rl0的配製,在/etc/中生成文件ifconfig.rl0,
        內容?192.168.0.10 netmask 255.255.255.0設置主機名:修改/etc/rc.conf中hostname的值。
        設置默認路由:修改/etc/rc.conf中default_route?你的默認路由。
5.        如何設置網卡別名?你只要在你的ifconfig.if文件中增加一行,並以alias開頭便可, 
        例如:對rl0的配製,在/etc/中生成文件ifconfig.rl0,內容?:
        192.168.0.10 netmask 255.255.255.0alias 192.168.2.11 
        netmask 255.255.255.0alias 192.168.3.12 netmask 255.255.255.06.        
6.      我如何保存我的設置?保存/etc下面的文件到軟碟輸入save命令,然後按回車,放入軟碟便可,
        下次機器?動的時候會自動從軟碟上讀入這些設置。
7.        如何通過串口控制系統?0.02版本之後開始支援串口連接,你可以通過使用命令bootcfg來設置你的默認控制臺
       ,可以選擇的設置包括:自動探測、標準控制臺、串列控制臺。
8.        系統?動之後我是否可以取出軟碟?可以,因?系統運行時是在記憶體中,所以?動好之後就不再需要軟碟了。
9.        我如何升級系統的版本?目前不能,因?系統的所有文件是存放在FreeBSD內核中,所以目前你不能更新內核版本及防火牆版本。
10.        如何得到技術支援? 請將你的問題發送給:matthew@cnfug.org。    
發表人 - conundrum 於 2005/07/03 22:37:11
系統時間:2024-05-17 18:19:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!