分类: BSD
2006-05-09 09:57:42
在 FreeBSD 上使用软 RAID-1
在 FreeBSD 上使用软 RAID-1
Dru Lavigne
有没有想过为低端服务器做软 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 的链接 。
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
系统启动还在继续。不过,若在 /etc/fstab 敲错了一个字,启动过程将就此停止并等待你输入正确的信息。在下面例子中,我在修改 /etc/fstab 时忘了插入 mirror 一词,即将本应为 /dev/mirror/gm0s1a 的误作 /dev/gm0s1a,这样,FreeBSD 便不能找到我的根文件系统。
Mounting root from ufs:/dev/gm0s1a
setrootbyname failed
ffs_mountroot: can't find rootvp
Root mount failed: 6
Manual root filesystem specification:
e.g. ufs:da0s1a
? List valid disk boot devices
mountroot>
所幸的是,它并不是看起来那么可怕。可以从列出有效的启动分区入手处理故障:
mountroot> ?
List of GEOM managed disk devices:
mirror/gm0s1f mirror/gm0s1e mirror/gm0s1d mirror/gm0s1c mirror/gm0s1b
mirror/gm0s1a mirror/gm0s1 ad2s1 mirror/gm0 ad0s1 ad2 acd0 ad0 fd0
若你正确输入 / 文件系统的位置,它将继续启动(boot,原文误作 reboot)下去。
mountroot> ufs:/dev/mirror/gm0s1a
Mounting root from /dev/mirror/gm0s1a
登入之后,先更正 /etc/fstab 的误处并重新启动。正常启动且成功登入后,键入以下命令确定镜像的每个分区已被成功加载。
% df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/mirror/gm0s1a 248M 35M 193M 15% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/mirror/gm0s1e 248M 12K 228M 0% /tmp
/dev/mirror/gm0s1f 7.3G 99M 6.7G 1% /usr
/dev/mirror/gm0s1d 248M 196K 228M 0% /var
df 不显示交换分区的信息,可以用以下命令核实:
% swapinfo
Device 1K-blocks Used Avail Capacity
/dev/mirror/gm0s1b 629544 0 629544 0%
同步镜像/双工
剩下的事就是同步两块硬盘的数据了。只要键入向镜像插入第二块硬盘的命令,数据同步将自动进行。
# gmirror insert gm0 /dev/ad2
GEOM_MIRROR: Device gm0: provider ad2 detected.
GEOM_MIRROR: Device gm0: rebuilding provider ad2.
看看进展如何:
# gmirror list | more
Geom name: gm0
State: DEGRADED
Components: 2
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 2125638583
Providers:
1. Name: mirror/gm0
Mediasize: 10262568448 (9.6G)
Sectorsize: 512
Mode: r6w5e2
Consumers:
1. Name: ad0
Mediasize: 10262568448 (9.6G)
Sectorsize: 512
Mode: r1w1e1
State: ACTIVE
Priority: 0
Flags: DIRTY
GenID: 0
SyncID: 1
ID: 3986018406
2. Name: ad2
Mediasize: 10262568448 (9.6G)
Sectorsize: 512
Mode: r1w1e1
State: SYNCHRONIZING
Priority: 0
Flags: DIRTY, SYNCHRONIZING
GenID: 0
SyncID: 1
Synchronized: 1%
ID: 1946262342
注意看 Flags 行上的 SYNCHRONIZING 字眼。这两块硬盘的数据要同步需要一些时间,如当前所示才一个百分点。据我所知,10GB 的硬盘大约需时 30 分钟,75GB 的约需两个半小时。若你觉得好奇,查查进度:
# gmirror status
Name Status Components
mirror/gm0 DEGRADED ad0
ad2 (2%)
数据同步完毕后,你将看到以白色粗体字显示的系统信息:
GEOM_MIRROR: Device gm0: rebuilding provider ad2 finished.
GEOM_MIRROR: Device gm0: provider ad2 activated.
若再次输入 gmirror list,你会看到 State (状态) 已从 DEGRADED (已降级) 变成 COMPLETE (完毕),Synchronized (已同步) 一行已不见了。若在 Flags 行上看到 DIRTY (不干净) 字眼,不用担心;那仅表示系统已写入新的数据但尚未完成镜射。若你在磁盘平静下来后等数秒钟,则你将会看到 Flags 行变成了 NONE (无)。
重启系统,最后检查一下。
这回启动信息应包含以下这些:
GEOM_MIRROR: Device gm0 created (id=2125638583).
GEOM_MIRROR: Device gm0: provider ad0 detected.
GEOM_MIRROR: Device gm0: provider ad2 detected.
GEOM_MIRROR: Device gm0: provider ad0 activated.
GEOM_MIRROR: Device gm0: provider ad2 activated.
GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
Mounting root from ufs:/dev/mirror/gm0s1a
结语
GEOM 实用程序在日益进步,它的开发者不断地将新特性及更新上传到网页去。利用 cvsup 更新你手上的 FreeBSD 版本或在决定安装 FreeBSD 时选用最新的版本是很重要的。
若你想取得镜像/双工的性能数据,用 gstat(8)。通读 gmirror(8) 的说明文字也是值得倡议的,特别是在你想了解如何更换一块坏硬盘的情况下。
如果其中一块硬盘坏了,需要重新插一块硬盘,进行数据同步。具体操作也很简单: gmirror forget gm0 gmirror insert gm0 ad1