分类: BSD
2008-11-17 21:36:23
7.0具备以 作为根系统的能力。本文将以一台有6块的服务器介绍从FreeBSD/amd64 7.0 LiveFS光盘(随发行版发行的LiveCD系统)全新一份FreeBSD,并使用ZFS作为根目录的具体方法。
我们假定有6块750GB的SATA硬盘,ad0-ad5;系统有8GB RAM,希望作为存储服务器。在尽量保证数据完整性和性能的前提下,我们会希望有:
分区如下所示:
磁盘 | a | b | d |
ad0 | UFS 2GB | ZFS | |
ad1 | SWAP 2GB | ZFS | |
ad2 | SWAP 2GB | ZFS | |
ad3 | SWAP 2GB | ZFS | |
ad4 | SWAP 2GB | ZFS | |
ad5 | UFS 2GB | ZFS |
使用 LiveFS 光盘引导之后会自动进入sysinstall,选择 Fixit → CDROM。进入Fixit ,会看到这样的提示符:
Fixit#
这时,我们可以开始分区了。首先,初始化覆盖所有磁盘的slice:
fdisk -IB /dev/ad0
fdisk -I /dev/ad1
fdisk -I /dev/ad2
fdisk -I /dev/ad3
fdisk -I /dev/ad4
fdisk -IB /dev/ad5
接下来在这些磁盘上初始化bsdlabel。由于 bsdlabel 需要调用 vi(透过 EDITOR 环境变量),而 sysinstall会将这个环境变量设置为 /mnt2/stand/vi,因此需要改一下:
unsetenv EDITOR
bsdlabel -wB /dev/ad0s1
bsdlabel -w /dev/ad1s1
bsdlabel -w /dev/ad2s1
bsdlabel -w /dev/ad3s1
bsdlabel -w /dev/ad4s1
bsdlabel -wB /dev/ad5s1
分别编辑这些labels。对于ad0和ad5,类似这样:
8 partitions:
# size offset fstype
a: 4194304 16 unused
c: * 0 unused
d: * * unused
对于ad1-ad4,类似这样:
8 partitions:
# size offset fstype
b: 4194304 16 unused
c: * 0 unused
d: * * unused
我们希望不因为盘序问题导致混乱,因此会用到 geom label。在本次时,我们并不立即创建 ZFS,而只是初始化一个用于启动的 UFS 分区:
newfs -L boot /dev/ad0s1a
mount -o async /dev/ufs/boot /mnt
下面,从光盘上复制一系列文件到这个分区上:
cd /mnt
cp -pR /mnt2/*bin /mnt2/boot /mnt2/etc /mnt2/lib* /mnt2/usr /mnt2/var .
mkdir dev
接下来进行初步的配置:
cd /mnt/boot
rm loader.conf mfsroot.gz
echo "/dev/ufs/boot / ufs rw 0 0" > /mnt/etc/fstab
echo "/dev/ad1s1b none swap sw 0 0" >> /mnt/etc/fstab
echo "/dev/ad2s1b none swap sw 0 0" >> /mnt/etc/fstab
echo "/dev/ad3s1b none swap sw 0 0" >> /mnt/etc/fstab
echo "/dev/ad4s1b none swap sw 0 0" >> /mnt/etc/fstab
touch /etc/rc.conf
cd /
umount /mnt
tunefs -n enable /dev/ufs/boot
现在就可以从硬盘引导系统了。
从硬盘引导之后,以 身份登录。首先,我们为将要加入 zpool 的磁盘指定 GEOM label:
glabel label disk0 /dev/ad0s1d
glabel label disk1 /dev/ad1s1d
glabel label disk2 /dev/ad2s1d
glabel label disk3 /dev/ad3s1d
glabel label disk4 /dev/ad4s1d
glabel label disk5 /dev/ad5s1d
然后,在其上建立 zpool,我们将这个zpool命名为tank,将disk0-4作为其raidz1成员,并使用disk5作为热备盘:
zpool create tank raidz /dev/label/disk[0-4] spare /dev/label/disk5
此时,这个zpool会被自动挂接到 /tank。如果CPU比较快,通常启用压缩会改善性能:
zfs set compression=on tank
首先需要为现在我们用来引导的这个 UFS 卷指定一个归宿:
mkdir /tank/bootdir
系统引导之后,需要访问某些 /boot 的内容:
cd /tank
ln -s bootdir/boot boot
复制 / 到 /tank:
cd /
cp -pR /*bin /etc /lib* /usr /var /tank
mtree -deUf /etc/mtree/BSD.root.dist -p /tank
mtree -deUf /etc/mtree/BSD.var.dist -p /tank/var
chmod u+s,g+s /tank/usr/bin/su
配置以ZFS作为 / 启动,修改 /boot/loader.conf 使其包含:
zfs_load="YES"
vfs.root.mountfrom="zfs:tank"
将 zpool 上的 ZFS 挂接方式改为 legacy:
zpool set mountpoint=legacy tank
在重启之前,需要修改 /etc/fstab:
/dev/ufs/boot /bootdir ufs rw 0 0
重新启动系统。此时根目录应该就是 zfs 了,接下来,可以在 /etc 中进行配置。
此后,建议使用通常的方式联编系统,以确保文件/目录权限的正确性。
我们前面将 /dev/ad5s1a 留作配置备份卷。这个卷在未来出问题的时候应该是可以帮助你启动的,现在我们来对它进行初始化:
newfs -U -L altboot /dev/ad5s1a
mkdir -p /altbootdir
接下来我们需要将 /bootdir 的内容复制过去:
mount /dev/ufs/altboot /altbootdir
cd /bootdir
cf - * | tar xf - -C /altbootdir
平时将 /altbootdir 卷卸下即可。当对系统的配置进行较大的变动,特别是对 zpool 内容进行变动或升级之后,应再次重复前面的复制步骤。