Chinaunix首页 | 论坛 | 博客
  • 博客访问: 469690
  • 博文数量: 144
  • 博客积分: 5675
  • 博客等级: 大校
  • 技术积分: 1512
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-20 10:46
文章分类

全部博文(144)

文章存档

2014年(1)

2013年(1)

2012年(12)

2011年(39)

2010年(48)

2009年(29)

2008年(14)

我的朋友

分类: BSD

2011-06-01 17:12:12

我们假定有6块750GB的SATA硬盘,ad0-ad5;系统有8GB RAM,希望作为存储服务器。在尽量保证数据完整性和性能的前提下,我们会希望有:

  • 使用五块硬盘作为RAIDZ1或RAIDZ2卷;一块硬盘作为备盘;
  • 系统的引导和配置信息保存2份,以便当系统无法引导时进行灾难恢复;
  • 适当大小的 swap 空间,在本例中,我们选择的容量是 8GB。

分区如下所示:

磁盘abd
ad0UFS 2GB
ZFS
ad1
SWAP 2GBZFS
ad2
SWAP 2GBZFS
ad3
SWAP 2GBZFS
ad4
SWAP 2GBZFS
ad5UFS 2GB
ZFS

说明:对于新系统,可以使用 GPT 分区、纯ZFS。此时,分配格局大致如下:

磁盘分区编号尺寸类型说明
ad0194freebsd-boot用于存放FreeBSD的GPT引导记录,并对齐到4k扇区
ad024194304freebsd-swap交换分区
ad03其余全部freebsd-zfszfs

初始化命令为:

gpart create -s gpt ad0 gpart add -s 94 -t freebsd-boot ad0 gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ad0 gpart add -s 4194304 -t freebsd-swap -l swap0 ad0 gpart add -t freebsd-zfs -l disk0 ad0

使用 LiveFS 光盘引导之后会自动进入sysinstall,选择 Fixit → CDROM。进入Fixit shell,会看到这样的提示符:

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

现在就可以从硬盘引导系统了。

从硬盘引导之后,以 root 身份登录。首先,我们为将要加入 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:

zfs 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 tar cf - * | tar xf - -C /altbootdir

平时将 /altbootdir 卷卸下即可。当对系统的配置进行较大的变动,特别是对 zpool 内容进行变动或升级内核之后,应再次重复前面的复制步骤。

阅读(3163) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~