有没有想过为低端服务器做软 RAID?你或许想过在不购置硬 RAID 控制卡的前提下,通过磁盘镜像为你的工作站带来冗余保护。你是否有过痛苦的配置经历,使你对 Unix 系统上的软 RAID 却步?
FreeBSD 5.3 及更高的版本加入了 gmirror(8);它让你轻易地配置使用软 RAID 1。尽管 gmirror 已有不少教程,但我发现它们不是要求用 bsdlabel 来手动计算分区的大小就是要用到一张用以修正现有系统的软盘。
我以为在安装操作系统的过程中配置 RAID 更为合理。我也希望配置步骤能做到易于理解并且不造成诸如计算出错的人为错误。通过拼凑现有的说明文字,自己进行多方配置实验后,我找到了在数个不同系统上都适用的配置步骤。我也从 gmirror 的编写者 Pawel Jakub Dawidek 那里得到了很有价值的回馈;他透露了 gmirror 一些尚未公开的特性。
GEOM 背景知识
在介绍配置步骤之前,先了解一下 GEOM 是很有用的。GEOM 是 FreeBSD 5.0 引入的模块磁盘构架。该模块构架允许通过编写程序来操控磁盘。FreeBSD 5.3 引入的软 RAID 程序就是最好的例子。
gstripe(8) 可做 RAID 0
gmirror(8) 可做 RAID 1
graid3(8) 可做 RAID 3
以上的首字符 g 表示这些程序都利用到了 GEOM。
注:若你不知道 RAID 为何物,则可参阅 Webopedia 有关定义不同 RAID 的链接 http://www.webopedia.com/TERM/R/RAID.html。
man 4 geom 述说了 geom 所用到的磁盘术语;在设置 gmirror 的过程中,我们将会看到一些。它们包括:
provider -- 该 GEOM 实体在 /dev 下出现。本文将介绍如何创建 /dev/mirror/gm0 这个 provider,它代表磁盘镜像或双工。
consumer -- 该实体接收 I/O 请求。在镜像/双工的例子中,这指的就是两块硬盘。我用两根数据线分别连接两块 IDE 硬盘,得到 /dev/ad0 和 /dev/ad2。
metadata (元数据) -- 在不同的 RAID 中,它包括阵列成员及其尺寸、位置,逻辑磁盘及分区的描述和磁盘阵列的当前状态。
镜像/双工 -- RAID 1 保持两块硬盘的数据一致。换句话说,它将一块硬盘的数据镜射到另一块硬盘。若两块硬盘同接在一根 IDE 数据线上,则称为镜像;若两块硬盘接在不同的数据线上,则称为双工。因为单一数据线易造成单点故障,所以采用双工的占大多数。
在安装操作系统的过程中配置镜像/双工
若你打算用 RAID 1,为避免节外生枝,购置两块一模一样的硬盘(相同的型号和尺寸)。若型号或尺寸不一致,事情将会变得很复杂;就算经过艰辛的配置成事了,到头来,你只能以浪费较大硬盘多出来的空间收场。将一个作为第一主盘,另一个作为第二主盘,接好两块一样的硬盘。在安装操作系统之前,再次检查 CMOS 是否已认出两块硬盘。
按自己喜欢的安装方式开始安装 FreeBSD 任一版本(5.3 或以上)。到了 Select Drives (选定硬盘)菜单时,将会显示 ad0 和 ad2。选 ad0,因为你将把操作系统安装于该主盘上。
进入 fdisk 界面后,删除所有现存的分区,然后选 Use entire disk (使用整个磁盘)。当提示启动菜单时,选 Standard MBR (标准 MBR)。
来到 disklabel 界面时,根据自己的需要将 ad0 分区。若不知道该怎么做,选 a 让系统自动分区。然后选择预设的安装套件和安装媒体源,让操作系统如常安装。
安装完毕后,浏览到 postinstall configurations (后安装配置)设置你的时区,创建用户帐号,设定 root 的密码等。
不过,当回到 sysinstall 主菜单时,不要急于重启系统。按下 Alt-F4,进入命令提示行。我们首先键入 csh 命令,这样就得到一个带历史记录的 shell (默认的 shell 是 Bourne)。
创建镜像/双工很简单,只要键入:
# gmirror label -v -b round-robin gm0 /dev/ad0
其中,gmirror label 创建镜像;-v 开启冗长模式;-b round-robin 选用平衡算法(目前 round-robin 算法性能最佳);gm0 即镜像/双工的名称(该名称代表第一个 GEOM 镜像);/dev/ad0 代表用以镜射的源盘。
然而,若现在便键入命令会使你失望。
# gmirror label -v -b round-robin gm0 /dev/ad0
Can't store metadata on /dev/ad0: Operation not permitted
(无法将元数据保存于 /dev/ad0 上:禁止操作)
这是一种安全特性,表示磁盘已被加载以便写入;因此不可用。不过,你可通过 sysctl MIB,暂时让 gmirror 绕过这个特性,从而创建镜像/双工。
# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16
不用担心,系统重启后(数分钟后的事),该 MIB 将复位为 0。再来一次:
# gmirror label -v -b round-robin gm0 /dev/ad0
Metadata value stored on /dev/ad0
就这样,RAID 1 配置告成。
我们有必要让操作系统每次重启时自动装载 RAID。这需要修改两个文件。第一个文件当前是空的,用 echo 创建即可:
# echo geom_mirror_load="YES" > /boot/loader.conf
第二个文件 /etc/fstab 不是空的,所以我建议在修改前做个备份:
# cp /etc/fstab /etc/fstab.orig
# vi /etc/fstab
将所有 ad 改为 gm,在 /dev 后插入 mirror。比如将 /dev/ad0s1a 改为 /dev/mirror/gm0s1a。如果没有创建别的分区,你会看到以 a, b, d, e 和 f 结尾的五个 ad0s1 分区;你需要逐一修改。
修改完毕后,再仔细检查对 /etc/fstab 及 /boot/loader.conf 作出的更改。虽说事后可以修正,但是因敲错一个字而不能启动新的系统是很烦的事。
注:有些教程说过需要在 /etc/rc.conf 中加入 swapoff 选项。现已没必要。同样地,没必要将 shutdown -r now 当成 reboot 来用。
确定没有错误之后,取出安装盘后,按下 Alt+F1 退出安装菜单。
启用镜像/双工
若你注意看启动信息,在系统读出磁盘信息后,你应看到以白色粗体字显示的信息:
GEOM_MIRROR: Device gm0 created (id=2125638583).
GEOM_MIRROR: Device gm0: provider ad0 detected.
GEOM_MIRROR: Device gm0: provider ad0 activated.
GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
GEOM_MIRROR: Device gm0 already configured.
Mounting root from ufs:/dev/mirror/gm0s1a
![nixsky[www.nixsky.com]](/templets/images/toplogo.gif)

