第21章 其他文件系统
附录 D. OpenPGP 密钥
19.5.软件 RAID 设备
一些主板和扩展卡增加了一些简单的硬件,通常只是一个 ROM ,允许计算机从 RAID 阵列中启动。启动后,对 RAID 阵列的访问由运行在计算机主处理器上的软件处理。这种“硬件辅助的软件 RAID”使 RAID 阵列不依赖于任何特定的操作系统,甚至在操作系统被加载之前就能发挥作用。
根据使用的硬件,支持几种级别的 RAID 。参见 graid(8) 以获得完整的列表。
graid(8) 需要 geom_raid.ko 内核模块,它从 FreeBSD 9.1 开始包含在 GENERIC 内核中。如果需要,可以通过 graid load 手动加载。

19.5.1. 创建一个阵列

软件 RAID 设备通常有一个菜单,可以在计算机启动时按下特殊键进入。该菜单可以用来创建和删除 RAID 阵列。graid(8) 也可以直接从命令行创建阵列。
graid 标签用于创建一个新的阵列。本例中使用的主板有一个 Intel 软件 RAID 芯片组,所以指定了 Intel 元数据格式。新的阵列被赋予 gm0 的标签,它是一个镜像(RAID1),并且使用 ada0ada1 硬盘。
注意:
当硬盘被做成一个新的阵列时,硬盘上的一些空间将被覆盖。请先备份现有的数据!
1
# graid label Intel gm0 RAID1 ada0 ada1
2
GEOM_RAID: Intel-a29ea104: Array Intel-a29ea104 created.
3
GEOM_RAID: Intel-a29ea104: Disk ada0 state changed from NONE to ACTIVE.
4
GEOM_RAID: Intel-a29ea104: Subdisk gm0:0-ada0 state changed from NONE to ACTIVE.
5
GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from NONE to ACTIVE.
6
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NONE to ACTIVE.
7
GEOM_RAID: Intel-a29ea104: Array started.
8
GEOM_RAID: Intel-a29ea104: Volume gm0 state changed from STARTING to OPTIMAL.
9
Intel-a29ea104 created
10
GEOM_RAID: Intel-a29ea104: Provider raid/r0 for volume gm0 created.
Copied!
状态检查显示新的镜像已经可以使用了:
1
# graid status
2
Name Status Components
3
raid/r0 OPTIMAL ada0 (ACTIVE (ACTIVE))
4
ada1 (ACTIVE (ACTIVE))
Copied!
阵列设备出现在 /dev/raid/ 。第一个阵列被称为 r0 。其他的阵列,如果存在的话,将是 r1r2 ,以此类推。
一些设备上的 BIOS 菜单可以创建名称中有特殊字符的阵列。为了避免这些特殊字符的问题,数组被赋予简单的编号名称,如 r0 。要显示实际的标签,如上面例子中的 gm0 ,请使用 sysctl(8)
1
# sysctl kern.geom.raid.name_format=1
Copied!

19.5.2. 多卷

一些软件 RAID 设备支持在一个阵列上有一个以上的卷。卷的工作方式类似于分区,允许物理驱动器上的空间被分割并以不同方式使用。例如,英特尔软件 RAID 设备支持两个卷。这个例子创建了一个 40G 的镜像,用于安全存储操作系统,然后是一个 20G 的 RAID0 (条带)卷,用于快速临时存储:
1
# graid label -S 40G Intel gm0 RAID1 ada0 ada1
2
# graid add -S 20G gm0 RAID0
Copied!
卷在/dev/raid/中显示为额外的 rX 条目。一个有两个卷的阵列将显示 r0r1
关于不同的软件 RAID 设备所支持的卷的数量,请参见graid(8)

19.5.3. 将单个驱动器转换为镜像

在某些特定的条件下,有可能将现有的单个硬盘转换成 graid(8) 阵列,而不需要重新格式化。为了避免转换过程中的数据丢失,现有的硬盘必须满足这些最低要求。
  • 驱动器必须用 MBR 分区方案进行分区。GPT 或其他分区方案的元数据在硬盘的末端,会被 graid(8) 的元数据覆盖和破坏。
  • 驱动器末端必须有足够的未分区和未使用的空间来容纳 graid(8) 元数据。这个元数据的大小各不相同,但最大的占据了 64M ,所以建议至少有这么多的可用空间。
  • 如果驱动器满足这些要求,则首先进行完全备份。然后用这个驱动器创建一个单驱动器镜像:
1
# graid label Intel gm0 RAID1 ada0 NONE
Copied!
graid(8) 元数据被写到驱动器末端的未使用空间中。现在可以在镜像中插入第二个驱动器:
1
# graid insert raid/r0 ada1
Copied!
原始硬盘的数据将立即开始复制到第二个硬盘。镜像将以降级状态运行,直到复制完成。

19.5.4. 将新的硬盘插入阵列中

驱动器可以被插入到阵列中,作为故障或丢失的驱动器的替代。如果没有故障或丢失的驱动器,新的驱动器就成为备用驱动器。例如,将一个新的驱动器插入到一个工作的双驱动器镜像中,结果是一个有一个备用驱动器的双驱动器镜像,而不是一个三驱动器的镜像。
在这个例子的镜像阵列中,数据立即开始被复制到新插入的硬盘。新驱动器上的任何现有信息将被覆盖:
1
# graid insert raid/r0 ada1
2
GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from NONE to ACTIVE.
3
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NONE to NEW.
4
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NEW to REBUILD.
5
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 rebuild start at 0.
Copied!

19.5.5. 从阵列中移除硬盘

单个驱动器可以从一个阵列中永久移除,其元数据也被删除:
1
# graid remove raid/r0 ada1
2
GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from ACTIVE to OFFLINE.
3
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-[unknown] state changed from ACTIVE to NONE.
4
GEOM_RAID: Intel-a29ea104: Volume gm0 state changed from OPTIMAL to DEGRADED.
Copied!

19.5.6. 停止阵列

阵列可以被停止,而不需要从驱动器上删除元数据。当系统被启动时,该阵列将被重新启动:
1
# graid stop raid/r0
Copied!

19.5.7. 检查阵列状态

阵列状态可以在任何时候检查。在上面的例子中,一个驱动器被添加到镜像中后,数据正从原来的驱动器复制到新的驱动器上:
1
# graid status
2
Name Status Components
3
raid/r0 DEGRADED ada0 (ACTIVE (ACTIVE))
4
ada1 (ACTIVE (REBUILD 28%))
Copied!
某些类型的阵列,比如 RAID0CONCAT ,如果磁盘发生故障,可能不会显示在状态报告中。要看到这些部分失败的阵列,请添加 -ga
1
# graid status -ga
2
Name Status Components
3
Intel-e2d07d9a BROKEN ada6 (ACTIVE (ACTIVE))
Copied!

19.5.8. 删除阵列

阵列是通过删除其中所有的卷来销毁的。当最后一个卷被删除时,阵列被停止,元数据从驱动器上被删除:
1
# graid delete raid/r0
Copied!

19.5.9. 删除意外的阵列

驱动器可能意外地包含 graid(8) 元数据,可能是以前的使用或制造商的测试。graid(8) 会检测到这些驱动器并创建一个阵列,干扰对单个驱动器的访问。要删除不需要的元数据。
  1. 1.
    启动系统。在启动菜单上,选择 2 为加载器提示。输入:
1
OK set kern.geom.raid.enable=0
2
OK boot
Copied!
系统将在禁用 graid(8) 的情况下启动。
  1. 1.
    备份受影响驱动器上的所有数据。
  2. 2.
    作为一种变通方法,可以通过添加以下内容禁用 graid(8) 阵列检测:
1
kern.geom.raid.enable=0
Copied!
/boot/loader.conf
要从受影响的驱动器中永久删除 graid(8) 元数据,请启动 FreeBSD 安装光盘或记忆棒,并选择 Shell。使用 status 找到阵列的名称,通常是 raid/r0
1
# graid status
2
Name Status Components
3
raid/r0 OPTIMAL ada0 (ACTIVE (ACTIVE))
4
ada1 (ACTIVE (ACTIVE))
Copied!
按名称删除卷。
1
# graid delete raid/r0
Copied!
如果显示有多个卷,对每个卷重复该过程。在最后一个阵列被删除后,卷将被销毁。
重新启动并验证数据,必要时从备份中恢复。在删除元数据后,也可以删除 /boot/loader.conf 中的 kern.geom.raid.enable=0 条目。