Tom
Rhodes
原作
GEOM: 模块化磁盘变换框架
概述
GEOM
GEOM 磁盘框架
GEOM
本章将介绍以 &os; GEOM 框架来使用磁盘。
这包括了使用这一框架来配置的主要的 RAID
控制工具。 这一仗不会深入讨论 GEOM
如何处理或控制 I/O、 其下层的子系统或代码。
您可以从 &man.geom.4; 联机手册及其众多 SEE ALSO 参考文献中得到这些信息。
这一章也不是对 RAID 配置的权威介绍,
它只介绍由 支持GEOM 的 RAID
级别。
读完这章, 您将了解:
通过 GEOM 支持的 RAID 类型。
如何使用基本工具来配置和管理不同的 RAID
级别。
如何通过 GEOM 使用镜像、 条带、 加密和挂接在远程的磁盘设备。
如何排除挂接在 GEOM 框架上的磁盘设备的问题。
阅读这章之前, 您应:
理解 &os; 如何处理磁盘设备
()。
了解如何配置和安装新的 &os; 内核
()。
GEOM 介绍
GEOM 允许访问和控制类 (classes) — 主引导记录、
BSD 标签 (label), 等等 — 通过使用
provider, 或在
/dev 中的特殊文件。
它支持许多软件 RAID 配置, GEOM 能够向操作系统,
以及在其上运行的工具提供透明的访问方式。
Tom
Rhodes
原作
Murray
Stokely
RAID0 - 条带
GEOM
条带
条带是一种将多个磁盘驱动器合并为一个卷的方法。
许多情况下, 这是通过硬件控制器来完成的。 GEOM
磁盘子系统提供了 RAID0 的软件支持,
它也成为磁盘条带。
在 RAID0 系统中, 数据被分为多个块,
这些块将分别写入阵列的所有磁盘。 与先前需要等待系统将 256k
数据写到一块磁盘上不同, RAID0 系统,
能够同时分别将打碎的 64k 写到四块磁盘上, 从而提供更好的 I/O
性能。 这一性能提升还能够通过使用多个磁盘控制器来进一步改进。
在 RAID0 条带中的每一个盘的尺寸必须一样,
因为 I/O 请求是分散到多个盘上的, 以便让这些盘上的读写并行完成。
磁盘条带图
在未格式化的 ATA 磁盘上建立条带
加载 geom_stripe
模块:
&prompt.root; kldload geom_stripe
确信存在合适的挂接点 (mount point)。 如果这个卷将成为根分区,
那么暂时把它挂接到其他位置i, 如 /mnt:
&prompt.root; mkdir /mnt
确定将被做成条带卷的磁盘的设备名,
并创建新的条带设备。 举例而言,
要将两个未用的、 尚未分区的 ATA 磁盘
/dev/ad2 和
/dev/ad3 做成一个条带设备:
&prompt.root; gstripe label -v st0 /dev/ad2 /dev/ad3
接着需要写标准的 label, 也就是通常所说的分区表到新卷上,
并安装标准的引导代码:
&prompt.root; bsdlabel -wB /dev/stripe/st0
上述过程将在
/dev/stripe
目录中的 st0 设备基础上建立两个新设备。
这包括 st0a 和
st0c。 这时, 就可以在
st0a 设备上用下述
newfs 命令来建立文件系统了:
&prompt.root; newfs -U /dev/stripe/st0a
在屏幕上将滚过一些数字, 整个操作应该能在数秒内完成。
现在可以挂接刚刚做好的卷了。
要挂接刚创建的条带盘:
&prompt.root; mount /dev/stripe/st0a /mnt
要在启动过程中自动挂接这个条带上的文件系统,
需要把关于卷的信息放到
/etc/fstab 文件中:
&prompt.root; echo "/dev/stripe/st0a /mnt ufs rw 2 2" \
>> /etc/fstab
此外, geom_stripe 模块也必须通过在
/boot/loader.conf 中增加下述设置,
以便在系统初始化过程中自动加载。
&prompt.root; echo 'geom_stripe_load="YES"' >> /boot/loader.conf
RAID1 - 镜像
GEOM
磁盘镜像
镜像是一种许多公司和家庭用户使用的不需中断的备份技术。
当存在镜像时, 它的意思是说 磁盘B 简单地复制 磁盘A。
或者, 也可能是 磁盘C+D
复制 磁盘A+B。 无论磁盘如何配置, 共同的特征,
都是磁盘或卷的信息会被复制。 随后,在无需中断服务或访问的情况下,
可以很容易地复原和备份这些信息, 甚至把它们存储到其他更安全的地方。
要开始做这件事, 首先要确保系统中有两个同样大的磁盘驱动器,
下面的例子假定使用直接访问方式 (Direct Access, &man.da.4;)
SCSI 的磁盘。
首先需要把 &os; 安装到第一块磁盘上, 并建立两个分区。
第一个分区将成为交换区, 其尺寸应该是两倍的
RAM 尺寸, 而余下的空间,
则作为根 (/) 文件系统来使用。
当然, 也可以为其他挂接点划分不同的分区;
但是, 这将使难度提高一个量级,
因为您将不得不手工修改 &man.bsdlabel.8; 和 &man.fdisk.8;
的设置。
重新启动系统, 并等待其完全初始化完。
当这个过程完成之后, 以 root
用户的身份登录。
创建 /dev/mirror/gm 设备,
并将其连接到 /dev/da1:
&prompt.root; gmirror label -vnb round-robin gm0 /dev/da1
系统应会给出下列回应:
Metadata value stored on /dev/da1.
Done.
初始化 GEOM, 这将加载
/boot/kernel/geom_mirror.ko 内核模块:
&prompt.root; gmirror load
这个命令应该会在
/dev/mirror
目录中创建
gm0 设备节点。
在刚创建的 gm0
设备上安装通用的 fdisk 标签以及引导区代码:
&prompt.root; fdisk -vBI /dev/mirror/gm0
接下来安装通用的 bsdlabel
信息:
&prompt.root; bsdlabel -wB /dev/mirror/gm0s1
如果存在多个区段 (slice) 或分区 (partition),
则需要修改一部分上面命令的参数。
它们必须与另一个盘上对应的区段和分区匹配。
使用 &man.newfs.8; 工具来在 gm0s1a
设备上建立默认的 UFS
文件系统:
&prompt.root; newfs -U /dev/mirror/gm0s1a
这将让系统输出很多信息和一系列数字。 不必为此担心,
只需看看是否有错误提示就可以了, 如果没问题, 接下来把它挂到
/mnt 挂接点上面:
&prompt.root; mount /dev/mirror/gm0s1a /mnt
现在需要把所有引导盘上的数据迁移到新的文件系统上了。
下面的例子使用了 &man.dump.8; 和 &man.restore.8;
这两个命令; 不过, 用 &man.dd.1; 在这里也可以达到完全一样的目的。
&prompt.root; dump -L -0 -f- / |(cd /mnt && restore -r -v -f-)
这个操作必须在所有文件系统上都作一遍。 您可以将前述命令中的文件系统,
改为所希望的文件系统的位置。
接下来应该编辑复制出来的 /mnt/etc/fstab
文件, 并删去或注释掉交换文件
需要注意的是,
在 fstab 注释掉交换文件,
通常会需要您以其他方式重建交换空间。
请参见 以了解进一步的细节。
。 修改其他文件系统对应的信息,
以便让它们使用新盘。 参考下面的例子:
# Device Mountpoint FStype Options Dump Pass#
#/dev/da0s2b none swap sw 0 0
/dev/mirror/gm0s1a / ufs rw 1 1
接下来需要建一个 boot.conf 文件,
在当前和新盘的根分区上各放一份。 这个文件将
帮助
系统的 BIOS
从正确的驱动器上引导:
&prompt.root; echo "1:da(1,a)/boot/loader" > /boot.config
&prompt.root; echo "1:da(1,a)/boot/loader" > /mnt/boot.config
在所有的分区上都放这些是为了保证系统能够正确引导。
如果由于某种原因系统无法从新的根分区读数据,
则还有一根救命稻草。
用下面的命令来确保系统引导时会加载 geom_mirror.ko:
&prompt.root; echo 'geom_mirror_load="YES"' >> /mnt/boot/loader.conf
最后重新启动系统:
&prompt.root; shutdown -r now
如果一切顺利, 系统将从
gm0s1a 设备启动, 并给出 login
提示等待用户登录。 如果发生错误, 请查阅接下来的故障排除环节。 我们接着将
da0 磁盘也加入 gm0
设备:
&prompt.root; gmirror configure -a gm0
&prompt.root; gmirror insert gm0 /dev/da0
此处 告诉 &man.gmirror.8; 采用自动同步,
或换言之: 自动地将磁盘的写操作做镜像处理。 联机手册中详细解释了如何重建,
以及替换磁盘, 只不过它用 data
表示这里的 gm0。
故障排除
系统拒绝引导
如果系统引导时出现类似下面的提示:
ffs_mountroot: can't find rootvp
Root mount failed: 6
mountroot>
这种情况应使用电源或复位按钮重启机器。
在引导菜单中, 选择第六 (6) 个选项。
这将让系统进入 &man.loader.8; 提示符。
在此处手工加载内核模块:
OK? load geom_mirror
OK? boot
如果这样做能解决问题, 则说明由于某种原因模块没有被正确加载。
可以通过在内核配置文件中加入:
options GEOM_MIRROR
然后重新编译和安装内核来解决这个问题。
GEOM Gate 网络设备
通过 gate 工具, GEOM 支持以远程方式使用设备, 例如磁盘、
CD-ROM、 文件等等。 这和 NFS 类似。
在开始工作之前, 首先要创建一个导出文件。
这个文件的作用是指定谁可以访问导出的资源,
以及提供何种级别的访问授权。 例如,
要把第一块 SCSI 盘的第四个 slice 导出,
对应的 /etc/gg.exports 会是类似下面的样子:
192.168.1.0/24 RW /dev/da0s4d
这表示允许同属私有子网的所有机器访问
da0s4d 分区上的文件系统。
要导出这个设备, 首先请确认它没有被挂接,
然后是启动 &man.ggated.8; 服务:
&prompt.root; ggated
现在我们将在客户机上 mount 该设备,
使用下面的命令:
&prompt.root; ggatec create -o rw 192.168.1.1 /dev/da0s4d
ggate0
&prompt.root; mount /dev/ggate0 /mnt
到此为止, 设备应该已经可以通过挂接点
/mnt 访问了。
请注意, 如果设备已经被服务器或网络上的任何其他机器挂接,
则前述操作将会失败。
如果不再需要使用这个设备,
就可以使用 &man.umount.8; 命令来安全地将其卸下了,
这一点和其他磁盘设备类似。