引子
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位版也勉强能用,但配置要麻烦很多。插入U盘后在系统(我的桌面系统是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: 64K swap: 4G zroot: 16G tank: 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 ad4 gpart add -s 64K -t freebsd-boot ad4 gpart add -s 4G -t freebsd-swap -l swap0 ad4 gpart add -s 16G -t freebsd-zfs -l zroot ad4 gpart add -t freebsd-zfs -l tank ad4 gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad4
其中ad4是我用U盘启动后硬盘的名字,请自己在启动后检查你的硬盘名字并加以替换。
以上命令分别为创建GPT分区表,创建boot分区、swap分区、zroot分区、tank分区,写入GPT引导记录。其中除boot分区以外全都加上了label,以方便后续操作使用。
安装:创建ZFS
首先需要加载相关zfs模块:
kldload /mnt2/boot/kernel/opensolaris.ko kldload /mnt2/boot/kernel/zfs.ko kldload /mnt2/boot/kernel/geom_nop.ko
其中geom_nop是为了后面使用4KiB分区格式使用的。
然后先创建系统zpool:
mkdir /boot/zfs zpool create zroot /dev/gpt/zroot zpool set bootfs=zroot zroot
再创建支持4KiB的tank zpool:
gnop create -S 4096 /dev/gpt/tank zpool create tank /dev/gpt/tank.nop zdb -C tank # 检查ashift=12说明4KiB成功 zpool export tank gnop destroy /dev/gpt/tank.nop zpool import tank zdb -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.sh cd ../lib32 && ./install.sh cd ../manpages && ./install.sh cd ../src && ./install.sh all cd ../kernels && ./install.sh generic cp -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 /dev export DESTDIR="" cd /usr/src/sys/boot/ make obj && make depend && make cd i386/loader make install
安装:安装后的配置
基础的设置命令
passwd tzsetup cd /etc/mail && make aliases # 退出chroot umount /dev exit
安装:完成
cp /boot/zfs/zpool.cache /zroot/boot/zfs/ export LD_LIBRARY_PATH=/mnt2/lib zfs unmount -a zfs set mountpoint=legacy zroot zfs set mountpoint=/home tank/home exit
重启即可。
这个家用服务器系统的基本安装就算是完成了,之后可以进行系统优化和应用配置。比如用ZFS的压缩功能来放源码和ports,对重要的数据建立定时快照,对于冗余数据进行去重之类,ZFS的优势就在这里了。另外就是安装一些系统监控软件,各种服务软件什么的。