引子
07年我就在《人人都需要一台伺服器》中說到,我有個家用伺服器,是用的一台淘汰的P3微型台式機做的,裝的是ubuntu系統。主要的工作是網路防火牆,檔案分享權限設定,源碼版本控制,開發用資料庫和WebServer,SSH/SFTP等。這麼多年一直工作正常。但是畢竟時代在發展,這機器實在是太老了,還是換了吧。
當年設想的省電方案現在已經很普及了,成品的NAS伺服器就不說了,自己組裝也有很多選擇,比如INTEL平台就有低端的有ATOM一類,高端的有CULV系列,AMD也有相應的產品線。現在網上自己組裝配置NAS或家用伺服器的人也相當不少,各種軟體方案也不少,比如基於FreeBSD的FreeNAS,或是基於Windows的WHS。
硬軟體方案
首先是硬體。因為我的需求和一般的NAS使用者需求不同,所以產品NAS基本不能滿足我的DIY需要,只能選擇自己組裝。
CPU選定的是INTEL的ATOM系列,看中的是它的發熱相對比AMD小一些。主板必須是17X17的MINI-ITX,因為我用來放機器的地方比較小,裡面的位置只能放下像立人Q5這樣的小機箱,而這種機箱只能裝下這種主板。記憶體支援當然越大越好,但還是要受CPU的限制。各種連接埠也是越多越好,因為儲存功能很重要的,所以SATA口至少要2個,IDE能有最好,沒有也能接受。USB雖然用處不大,但少於4個也是不太方便的。網卡能多幾個當然好,有一個基本也夠用,當然最好是千兆的。
按這些條件去找的話,首先所有的迷你筆記型電腦主板就只能放棄了,因為它們都只有一個SATA。只能從台式機或工業主板中去找。如果要圖省電的話,ATOM的N系列應該是最佳選擇,但可惜的是它主要是為迷你筆記型電腦設計,缺少DIY方案。就算能找到也都是很老的N270,但那個效能實在不行,不考慮。我起先是考慮Atom 330,這是耗電和效能之間一個比較好 的平衡選擇,但因為已經退市,市場上基本都是翻新返修貨,試了一塊問題太多。所以最後還是選了D525,雙核,支援4G記憶體,D系列的缺點就是耗電比N系列大了不少,發熱問題比較麻煩。大致的配置如下:
CPU:Intel D525
主板:NM10晶片集
記憶體:2G(計劃擴到4G,據說2G的記憶體跑ZFS還是比較勉強的,暫時先試試)
硬碟:1T(計劃擴到2T)
至於軟體,我肯定是不會考慮WHS了,因為我不喜歡Windows是說過N多次的了,除了個人喜好以外,著作權問題(除了系統著作權以外還要考慮應用軟體的著作權問題)、病毒問題、安全問題、穩定性問題等都太費事。FreeNAS因為是針對NAS實現,只帶了一個很小的FreeBSD核心,顯然也是不夠我用的,雖然可以在其基礎上再折騰,但終歸是麻煩。所以決定直接裝個FreeBSD,然後在其中裝些軟體來滿足需要。之所以不再使用ubuntu,最主要的原因是我想試試ZFS——雖然linux上已經有各種移植的ZFS或是類似ZFS的方案,但終歸是成熟度等級不夠,話說就算是FreeBSD目前的8.2版所帶的ZFS 15版也還不算很完美,希望FreeBSD 9出來會有一個比較完美的ZFS。
硬體的安裝沒什麼好說的。只是D525的發熱還是有點大的,不加風扇夏天估計撐不過去,最後還是不得不加了個6010的小風扇,不能完全靜音是比較遺憾的事情。要是對效能沒要求的話,用N270的方案散熱就不是什麼問題了。
下面只談軟體的安裝。
安裝前的準備工作
原來看中的另一塊主板是有IDE口的,可以接一個光碟機來裝系統,但是因為那個板缺貨沒買著。現在用的板子沒有IDE口,只能用USB啟動,所以需要先做一個USB啟動盤,當然外接USB光碟機也是可以的。
製作FreeBSD USB啟動盤方法參考這篇文章:
首先下載memstick.img版本的FreeBSD安裝檔案,目前最新的是8.2穩定版,因為我要用ZFS,需要大記憶體,所以下載的是64位版本,雖然據說32位版也勉強能用,但配置要麻煩很多。插入隨身碟後在系統(我的案頭系統是ubuntu 10.04,Windows使用者請自己研究)中用:
sudo fdisk -l
看一下U盤的裝置名稱,比如 sdb。然後用:
sudo dd if=FreeBSD-8.2-RELEASE-amd64-memstick.img of=/dev/sdb bs=10240 conv=sync
做好後用它啟動伺服器開始安裝。
整個安裝過程主要參考這篇文章。以下內容大部分來自該文,特此說明。
硬碟規劃
在開始安裝之前,先規劃一下硬碟的分配。雖然說在ZFS裡分區神馬的都是浮雲,全都可以動態調整,但是還是有一些問題需要考慮。
第一是GPT。隨著硬碟容量的不斷增加,老式的MBR分區已經不能滿足需要,所以GPT將要或者已經成為主流。第二是AF扇區(即所謂4KiB扇區)將要或者已經成為大容量硬碟的標準格式,老式的512B扇區格式雖然還被AF硬碟所相容,但是在AF硬碟上用512B扇區格式(所謂512e模式)效率會比較低,見這篇文章。
所以我是這麼規劃這個1T的硬碟的(實際容量932G):
boot: 64Kswap: 4Gzroot: 16Gtank: 912G
這是四個GPT分區,其中boot為引導區,swap為交換分區,zroot和tank是兩個ZFS Pool分區。之所以要分兩個zpool,是因為上面所說的AF硬碟問題。其中zroot作為系統的根ZFS,因為在系統未裝載完成前,暫時不能支援4KiB扇區,所以只能放在zroot裡,並且使用傳統512B扇區格式。tank為使用者ZFS,把home、ports、src什麼的都放在這裡,這個是使用4KiB扇區的。
雖然FreeBSD早就支援GPT分區了,但是sysinstall裡帶的還是老式的fdisk分區工具,加上因為zroot也是一個ZFS分區,sysinstall裡也沒法搞,所以以下的安裝過程是全手動的。
首是在啟動完成運行sysinstall的時候選擇Fixit-USB進入Fixit模式(提示符為:fixit#)
安裝:GPT分區
手動使用gpart分區:
gpart create -s gpt ad4gpart add -s 64K -t freebsd-boot ad4gpart add -s 4G -t freebsd-swap -l swap0 ad4gpart add -s 16G -t freebsd-zfs -l zroot ad4gpart add -t freebsd-zfs -l tank ad4gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad4
其中ad4是我用隨身碟啟動後硬碟的名字,請自己在啟動後檢查你的硬碟名字並加以替換。
以上命令分別為建立GPT分區表,建立boot分區、swap分區、zroot分區、tank分區,寫入GPT引導記錄。其中除boot分區以外全都加上了label,以方便後續操作使用。
安裝:建立ZFS
首先需要載入相關zfs模組:
kldload /mnt2/boot/kernel/opensolaris.kokldload /mnt2/boot/kernel/zfs.kokldload /mnt2/boot/kernel/geom_nop.ko
其中geom_nop是為了後面使用4KiB分區格式使用的。
然後先建立系統zpool:
mkdir /boot/zfszpool create zroot /dev/gpt/zrootzpool set bootfs=zroot zroot
再建立支援4KiB的tank zpool:
gnop create -S 4096 /dev/gpt/tankzpool create tank /dev/gpt/tank.nopzdb -C tank # 檢查ashift=12說明4KiB成功zpool export tankgnop destroy /dev/gpt/tank.nopzpool import tankzdb -C tank # 再次檢查ashift仍然為12
做法是先建立一個虛擬gnop裝置,指定使用4KiB格式,注意那個 tank.nop。建立後檢查ashift參數是否為12,如果還是9(對就512B格式)說明不對,請檢查後重做。確認無誤後匯出zpool,刪除gnop裝置再重新匯入zpool,再次檢查ashift參數無誤後這個使用4KiB的zpool就算建立成功了。
建立zfs分區,因為系統不支援4KiB格式,所以就把root整個放在zroot裡了(/tmp除外,這個將在後面用md載入),不過home還是放到了tank裡:
zfs create tank/home
安裝:準備安裝系統
如前面所說,手工安裝:
export DESTDIR="/zroot"cd /dist/8.*cd base && ./install.shcd ../lib32 && ./install.shcd ../manpages && ./install.shcd ../src && ./install.sh allcd ../kernels && ./install.sh genericcp -Rlpv /zroot/boot/GENERIC/* /zroot/boot/kernel/
配置基礎系統和zfs引導配置
chroot /zroot
安裝:安裝前的配置
基礎設定檔
vi /etc/src.conf
LOADER_ZFS_SUPPORT=YES
vi /boot/loader.conf
ahci_load="YES"
zfs_load="YES"
vfs.root.mountfrom="zfs:zroot"
vfs.root.mountfrom.options="rw"
vfs.zfs.prefetch_disable=0
hw.pci.do_power_nodriver=3
vi /etc/rc.conf
hostname="gptzfsboot.freebsd.org"
defaultrouter="10.0.0.1"
ifconfig_re0="inet 10.0.0.1 netmask 255.255.255.0"
tmpmfs="YES"
tmpsize="512M"
zfs_enable="YES"
powerd_enable="YES"
powerd_flags="-a hadp -b hadp -n hadp -i 25 -p 1500"
vi /etc/resolv.conf
nameserver 8.8.8.8
vi /etc/fstab
/dev/gpt/swap0 none swap sw 0 0
安裝:編譯安裝
編譯安裝支援zfs的bootloader
mount -t devfs devfs /devexport DESTDIR=""cd /usr/src/sys/boot/make obj && make depend && makecd i386/loadermake install
安裝:安裝後的配置
基礎的設定命令
passwdtzsetupcd /etc/mail && make aliases# 退出chrootumount /devexit
安裝:完成
cp /boot/zfs/zpool.cache /zroot/boot/zfs/export LD_LIBRARY_PATH=/mnt2/libzfs unmount -azfs set mountpoint=legacy zrootzfs set mountpoint=/home tank/homeexit
重啟即可。
這個家用伺服器系統的基本安裝就算是完成了,之後可以進行系統最佳化和應用配置。比如用ZFS的壓縮功能來放源碼和ports,對重要的資料建立定時快照,對於冗餘資料進行去重之類,ZFS的優勢就在這裡了。另外就是安裝一些系統監視軟體,各種服務軟體什麼的。