基于GPT和ZFS的FreeBSD安装

引子

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
hint.apic.0.clock=0
hint.atrtc.0.clock=0
hw.pci.do_power_nodriver=3
hint.ahcich.0.pm_level=5
hint.ahcich.1.pm_level=5
hint.ahcich.2.pm_level=5
hint.ahcich.3.pm_level=5
hint.ahcich.4.pm_level=5
hint.ahcich.5.pm_level=5

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的优势就在这里了。另外就是安装一些系统监控软件,各种服务软件什么的。

推送到[go4pro.org]