[Power by FreeBSD]
顏國雄 2002/02 初
PicoBSD
2002/02 修改 

FreeBSD 也可以小到只有一片磁片容量的大小,利用 PicoBSD 加上一台軟碟機 (甚至直接燒在 ROM , Flash Disk 裡面) 不需硬碟、光碟系統就可以運作囉!!

PicoBSD 並不是一個新的作業系統,它是利用 FreeBSD 的 source,然後依使用者需求將系統核心及其它所需的工具通通編譯後打包、壓縮放到一個可開機的檔案 (通常命名為 kernel) 後放到做成可開機的一張磁碟片中,開機時檔案會被解壓縮到 RAM Disk 中後開始執行,利用這個特性我們可以設計 無硬碟的 router,firewall 、急救磁片、無硬碟系統的網路開機片甚至嵌入式系統......等。

下面的例子打算利用一張 3.5 吋 1.44 MB 軟碟片的 PicoBSD 及一台過時的 PC 當 ADSL 的 gateway + NAT,也就是所謂的 IP 分享器。

製作步驟

準備工作

確認核心支援 vn

Virtual Node (vn) 可以讓我們將一個檔案變成一個 device (例如模擬成一台軟碟機)
PICOBSD 利用 vn 產生的虛擬磁碟機 (實際是對映到一個叫 picobsd.bin 的檔案)
來放編譯完的東東,所以必須先確認一下核心有支援 vn 。

取得 source

PicoBSD 是利用 FreeBSD 的 source ,所以只要用 CTM 或 CVS 取得 FreeBSD 最新的 source 即可。

更新完,在 /usr/src/release/picobsd 目錄中可看到:製作 PicoBSD 的 scripts 、說明文件 (很久沒更新了) 及一些設定的參考範例

 

編修設定檔

現在製作 PicoBSD 在熱心人士的努力下,只要依個人需求修改幾個設定檔就可以輕輕鬆鬆地完成,下面是設定檔的目錄結構

  • PICOBSD 這是核心編譯時用的設定檔

  • conf 這個檔案內放需要用到的 device node (/dev 目錄下的東東)

  • crunch.conf 這個檔決定你的 PicoBSD 中到底放哪些要執行程式 , libraries 和連結

  • floppy.tree 這個目錄主要是放一些 scripts 和設定檔,裡面的 etc 目錄將對應到 /etc

  • 如果有 floppy.tree.exclude 目錄,裡面的東西表示要從預設的 floppy.tree (/usr/src/release/picobsd/floppy.tree.exclude) 中去掉的檔案或目錄

在 /usr/src/release/picobsd 中已經有幾個不同用途的設定檔範例可供參考

  • bridge
  • dial
  • isp
  • net
  • router

只要利用上面幾個目錄中的設定稍加修改即可馬上製作

複製設定檔

cd /usr/src/release/picobsd
cp -R net adsl

修改核心設定檔

核心設定檔的部份最重要的是網卡支援的部份,及為了讓 ppp 的 PPPoE 能運作需啟動 NETGRAPH 的相關選項

承續前面的指令

cd adsl
ee PICOBSD

開始修改 kernel 的設定檔

加入所要的網卡選項

像我有兩張 ISA NE2000 comparible 的 NIC
第一張的 IRQ : 5 I/O Base : 280
第二張的 IRQ : 10 I/O Base : 300
就加入
-----------------------------------
device miibus
device ed0 at isa? port 0x280 irq 5 iomem 0xd0000
device ed1 at isa? port 0x300 irq 10 iomem 0xd8000

-----------------------------------
同理
如果是用 d-link 530 TX 就加入 device vr0
如果是用螃蟹卡就加入 device rl0
其它用不到的網卡可以把它註解掉(加井字號)

在最後面加入PPPoE 要用到的 NETGRAPH 相關選項

-----------------------------------
options NETGRAPH
options NETGRAPH_PPP
options NETGRAPH_PPPOE
options NETGRAPH_SOCKET
options NETGRAPH_ETHER

-----------------------------------

依個人需求再加入或刪除其它選項,
像我就把下面的東東做了修改

#options USERCONFIG #boot -c editor
#options INTRO_USERCONFIG #imply -c and parse inf
#options VISUAL_USERCONFIG #visual boot -c editor

#因為用不到 IDE 硬碟,光碟就把 ata 的註解,開機可加快
#device ata0 at isa? port IO_WD1 irq 14
#device ata1 at isa? port IO_WD2 irq 15
#device atadisk
#device atapicd
#options ATA_STATIC_ID #Static device numbering

pseudo-device tun 2 可以改成 pseudo-device tun 1 就好了

修改 device node 需求檔

ee config 在裡面放入

MY_DEVS="std tun0 cuaa0 cuaa1 vty10 fd0 ad0 pty0 ttyd0 bpf0"

  • tun0 給 ppp 用
  • cuaa0 cuaa1 給 COM1,COM2 用(用不到也可以刪除)
  • fd0 給軟磁機用
  • ad0 給硬磁機用
  • bpf0 如果有 dhcpd 會用得到

修改應用程式需求表

利用 crunch.conf 可以告訴 picobsd 的製作工具要把哪些程式放入磁片中,因為目標是要以一張 3.5 吋的磁片來裝所有的東西,只能選擇必要的程式,不然可能會擺不下。

ee crunch.conf

修改 buildopts (編譯時的選項),將:

buildopts -DNOPAM -DRELEASE_CRUNCH -DNOSECURE -DNOCRYPT -DNONETGRAPH -DNOIPSEC

改成:(去掉 -DNONETGRAPH , 因為 PPPoE 會用到 NETGRAPH , 必須去掉)

buildopts -DNOPAM -DRELEASE_CRUNCH -DNOSECURE -DNOCRYPT -DNOIPSEC


加入下面這行:(用 NETGRAPH 必須和 lib netgraph link )

libs -lnetgraph

再加入下面這兩行:(加入 natd 和 ee 兩支程式)

progs natd ee

如果用不到的程式可以把它去掉節省磁碟空間還能加快載入的時速度,像 routd ,

 

增/刪設定檔

修改兩個檔案

ee /usr/src/release/picobsd/floppy.tree/etc/rc1

找到:

pwd_mkdb -p ./master.passwd
dev_mkdb

在下面加入兩行:

[ -f /etc/rc.local ] && \
{ echo "Starting others..." ; sh /etc/rc.local; }

說明:這樣我們可以將要其它指令放在 /etc/rc.local 讓系統自動執行

ee /usr/src/release/picobsd/floppy.tree/etc/rc.conf.defaults

找到 hostname=""

改成 hostname="picobsd"

說明:當 hostname 為空值時,在 rc1 中會要求手動輸入第一個 NIC 的 hostname 等資訊,會造成開機流程中斷,無法全自動開機,所以故意隨便給個預設值)

/usr/src/release/picobsd/adsl 中新增四個檔案

floppy.tree/etc/rc.conf

裡面放:
----------------------------------
hostname="gate.adsl"

ifconfig_ed0="inet 192.168.1.254"
ifconfig_ed1="inet 192.168.2.254"

sshd_enable="NO"
inetd_enable="NO"
inetd_flags=""
snmpd_enable="NO"

gateway_enable="YES"
----------------------------------

說明:ed0 為對外接 ADSL 的網卡,ed1為對內的網卡

floppy.tree/etc/rc.local

裡面放:
----------------------------------
#!/bin/sh

# start PPPoE login
echo "Start ADSL PPPoE login ..."
sh /etc/adsl.sh start

# Firewall rules
/sbin/ipfw -q -f flush
/sbin/ipfw -q add skipto 65535 all from 192.168.2.0/24 to 192.168.2.0/24
/sbin/ipfw -q add divert natd all from any to any via tun0
----------------------------------

說明: 192.168.2.0/24 為對內的網段(Class C)

floppy.tree/etc/adsl.sh

裡面放:
----------------------------------
#!/bin/sh
ppp=/usr/sbin/ppp
natd=/usr/sbin/natd
pidfiledir=/var/run
# start
if [ "x$1" = "x" -o "x$1" = "xstart" ]; then
if [ -f $ppp ]; then
$ppp -ddial adsl
fi
if [ -f $natd ]; then
$natd -dynamic -interface tun0
fi

# stop
elif [ "x$1" = "xstop" ]; then
if [ -f $pidfiledir/natd.pid ]; then
kill `cat $pidfiledir/natd.pid`
fi
if [ -f $pidfiledir/tun0.pid ]; then
kill `cat $pidfiledir/tun0.pid`
fi
fi
----------------------------------

floppy.tree/etc/ppp/ppp.conf

裡面放:
----------------------------------
default:
disable lqr
deny lqr
enable dns

adsl:
set device PPPoE:ed0
set mru 1492
set mtu 1492
set authname YourLoginName
set authkey YourPassword
set dial
set login
set ifaddr 10.0.0.1/0 10.0.0.2/0
add default HISADDR
----------------------------------

說明:ed0 為接 ADSL 的網卡,YourLoginNam 是ADSL的帳號,YourPassword 是ADSL的密碼

編譯

建立 script 的連結

製作 picobsd 的程序現在已經全部簡化成只需呼叫 /usr/src/release/picobsd/build/picobsd 路徑那麼長,打起來很累的,可以利用 soft link 來省些力氣

ln -s /usr/src/release/picobsd/build/picobsd /usr/local/bin/picobsd
rehash

開始編譯

cd /tmp
picobsd adsl

加入自定的設定檔

在 picobsd 的開機流程中會將軟碟片中的 /etc 及 /root 兩個目錄中的檔案複製到開完機後的 /etc (RAM Disk 中的 /etc),如果發現有 *.gz 的檔案就會把它解開來,這樣可以蓋掉當初在製作磁片時的預設值達到保留新設定的目的,所以如果想更換 picobsd 中的系統密碼及 /etc 中其它設定可以這樣:

mount /fd
mkdir-p /fd/etc/ppp

cp /etc/rc.conf /etc/master.passwd /tmp
gzip /tmp/rc.conf
gzip /tmp/master.passwd
cp /tmp/rc.conf.gz /tmp/rc.conf /fd/etc/

cp /etc/ppp/ppp.conf /fd/etc/ppp

說明:

/etc/ppp/ppp.conf 因為在 /etc 的下一層目錄 ppp 中,所以不用壓縮,直接存在 /fd/etc/ppp 目錄中即可,至於為什麼要這樣,觀察一下 /usr/src/release/picobsd/floppy.tree/etc/rc1 就知道囉!!

FAQ

清除編譯後留下的東西

執行完 picobsd xxx 後會在該目錄中產生 build_dir-xxx 的工作目錄(內含「成品」「半成品」

在 /usr/obj-pico 會有一些 object 檔

在 /tmp 會有 reply.xxxxxxxx 及 picobsd.xxxxxxx

讓 PicoBSD 提供 DNS 服務

如果只是要當純 forward 的 DNS,也就是將使用者的查詢代為向上層的 IPS DNS 查詢後傳給 client 端,這個在 djbdns 的套件中有支 dnscache 可以做到,另外也有個叫 ens 的舊版本也可以,

djbdns 需要用到兩個 ports : daemontools 和 djbdns 滿佔空間的

djbdns 修改

dnscache.c , droproot.c 將所有的 env_get 換成常數

ENS

http://www.linux.org/apps/all/Networking/DNS.html 中找到的連結下載
http://www.kyuzz.org/antirez/ens/ens-0.1.4.tar.gz

提供 dhcp server 的服務

client 如果能透過 dhcp 來自動設定 ip,dns,default gateway ...... 等相關網路設定,這樣應該可以讓系統更加完美。一般常見的 dhcpd 大概屬 isc-dhcp 套件,目前的版本是 dhcp3 ,功能很多但也比較肥大,真的要用可能得使用舊的版本 (dhcp2),不過還是滿大的,另外還有個日本人寫的 wide-dhcp 比較小,應該較合適。

取得 wide-dhcp 的 port 並先 make 好

cd /usr/ports
ncftpget -R ftp://freebsd.csie.nctu.edu.tw/pub/ports/ports/net/wide-dhcp
cd wide-dhcp
make

修改 server/Makefile

cd /usr/ports/wide-dhcp/dhcp-1.4.0p6/server/
cp Makefile.FreeBSD Makefile
ee Makefile 在裡面加入下面四行騙騙 picobsd

obj:
echo "fake .."
depend:
echo "fake..."

修改 PICOBSD

因為 dhcp server 需要用到 bpf 所以必須在核心設定檔 PICOBSD 中加入下面這行

pseudo-device bpf 4

修改 config

配合前面核心的設定,需要為 bpf 加一個 device node ,所以在 config 加入一個 bpf0

修改 crunch.conf

加入下面的東西

progs dhcps
special dhcps objvar OBJ
special dhcps srcdir /usr/ports/wide-dhcp/work/dhcp-1.4.0p6/server
special dhcps objdir /usr/ports/wide-dhcp/work/dhcp-1.4.0p6/server

編寫 dhcps 的設定檔

dhcps 在執行的時候需要兩個設定檔放放 /etc,所以要將下面兩個檔案放到自己picobsd 的 floppy.tree/etc 中

dhcpdb.pool (dhcp server 主要設定檔)

dhcpdb.relay (可以是空的)

讓 dhcps 自動啟動

在 floppy.tree/etc/rc.local 中加入


if [ -f /var/db/dhcpdb.bind ]; then
rm /var/db/dhcpdb.bind
fi
if [ -f /bin/dhcps ]; then
/bin/dhcps ed0
fi

加入 snmpd

snmpd 可以做很多事,如果啟動所有預設的功能可能無法塞到小小的磁片中,在應用上可能得先經過廋身才可以,下面利用 net-snmp 的 port ,在 make 前先修改 Makefile 中的參數,只編譯 snmpd 的部份,並提供 mibII 中的 interfaces 可供 mrtg 做流量分析。

cd /usr/ports
ncftpget -R ftp://freebsd.csie.nctu.edu.tw/pub/ports/ports/net/net-snmp

然後修改 net-snmp 目錄中的 Makefile

將原來的:
CONFIGURE_ARGS+= --enable-shared --with-mib-modules="host" --with-gnu-ld \
--with-libwrap
換成
CONFIGURE_ARGS+= --with-mini-agent --with-gnu-ld \
--with-out-mib-modules="mibII/at mibII/icmp mibII/route mibII/udp \
mibII/sysORTable ucd_snmp snmpv3 agentx notification"


將 CONFIGURE_ARGS+= --enable-ipv6
加上井字號變成 # CONFIGURE_ARGS+= --enable-ipv6

執行

make configure
cd work/ucd-snmp-4.2.3/snmplib/
make
cd ../agent/
make

修改 /usr/ports/net-snmp/work/ucd-snmp-4.2.3/agent/Makefile

找到下面這行
LAGENTOBJS=snmpd.lo
在它的下一行加入
SNMPD_OBJS=$(AGENTOBJS) $(LIBAGENTOBJS) $(LMIBOBJS) \
../snmplib/.libs/libsnmp.a


找到下面四行並全部註解掉(加井字號)
dependlocal:
makedepend $(CPPFLAGS) -o.lo $(srcdir)/*.c

depend: dependlocal
cd mibgroup; $(MAKE) depend; cd ..
變成
#dependlocal:
#makedepend $(CPPFLAGS) -o.lo $(srcdir)/*.c

#depend: dependlocal
#cd mibgroup; $(MAKE) depend; cd ..

並且新增下面四行 (騙 picobsd 用的)
obj:
echo "fake.."
depend:
echo "fake ..."

在 crunch.conf 中加入

progs snmpd
special snmpd objvar SNMPD_OBJS
special snmpd srcdir /usr/ports/net-snmp/work/ucd-snmp-4.2.3/agent
special snmpd objdir /usr/ports/net-snmp/work/ucd-snmp-4.2.3/agent
libs -lcrypto

 

相關文件

A PicoBSD User and Starter FAQ
http://www.cse.ucsc.edu/~brucem/pico_notes.htm

DNS
http://cr.yp.to/djbdns.html

httpd
http://www.hughes.com.au/products/libhttpd/


 


 基礎: 書籤 - 簡介 - 安裝 - Slices - Unix基礎 - 基本指令 - 首次登入 - 目錄架構
 系統: 核心編譯 - 系統升級 - Packages - Ports - PicoBSD - Quota
 網路: 服務管理 - WWW - FTP - MAIL - DNS - Samba - NFS - DHCP - webmin - IMP - OpenWebmail
 其它: Backup - UPS - 系統安全 - ipfw&natd - 撥接服務 - 計時制ADSL - 雜記 - FAQ

北市文山區力行國小顏國雄