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 硬盘。

注意:

当硬盘被做成一个新的阵列时,硬盘上的一些空间将被覆盖。请先备份现有的数据!

# graid label Intel gm0 RAID1 ada0 ada1
GEOM_RAID: Intel-a29ea104: Array Intel-a29ea104 created.
GEOM_RAID: Intel-a29ea104: Disk ada0 state changed from NONE to ACTIVE.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:0-ada0 state changed from NONE to ACTIVE.
GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from NONE to ACTIVE.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NONE to ACTIVE.
GEOM_RAID: Intel-a29ea104: Array started.
GEOM_RAID: Intel-a29ea104: Volume gm0 state changed from STARTING to OPTIMAL.
Intel-a29ea104 created
GEOM_RAID: Intel-a29ea104: Provider raid/r0 for volume gm0 created.

状态检查显示新的镜像已经可以使用了:

# graid status
   Name   Status  Components
raid/r0  OPTIMAL  ada0 (ACTIVE (ACTIVE))
                  ada1 (ACTIVE (ACTIVE))

阵列设备出现在 /dev/raid/。第一个阵列被称为 r0。其他的阵列,如果存在的话,将是 r1r2,以此类推。

一些设备上的 BIOS 菜单可以创建名称中有特殊字符的阵列。为了避免这些特殊字符的问题,数组被赋予简单的编号名称,如 r0。要显示实际的标签,如上面例子中的 gm0,请使用 sysctl(8)

# sysctl kern.geom.raid.name_format=1

19.5.2. 多卷

一些软件 RAID 设备支持在一个阵列上有一个以上的卷。卷的工作方式类似于分区,允许物理驱动器上的空间被分割并以不同方式使用。例如,英特尔软件 RAID 设备支持两个卷。这个例子创建了一个 40G 的镜像,用于安全存储操作系统,然后是一个 20G 的 RAID0(条带)卷,用于快速临时存储:

# graid label -S 40G Intel gm0 RAID1 ada0 ada1
# graid add -S 20G gm0 RAID0

卷在/dev/raid/中显示为额外的 rX 条目。一个有两个卷的阵列将显示 r0r1

关于不同的软件 RAID 设备所支持的卷的数量,请参见graid(8)

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

在某些特定的条件下,有可能将现有的单个硬盘转换成 graid(8) 阵列,而不需要重新格式化。为了避免转换过程中的数据丢失,现有的硬盘必须满足这些最低要求。

  • 驱动器必须用 MBR 分区方案进行分区。GPT 或其他分区方案的元数据在硬盘的末端,会被 graid(8) 的元数据覆盖和破坏。
  • 驱动器末端必须有足够的未分区和未使用的空间来容纳 graid(8) 元数据。这个元数据的大小各不相同,但最大的占据了 64M,所以建议至少有这么多的可用空间。
  • 如果驱动器满足这些要求,则首先进行完全备份。然后用这个驱动器创建一个单驱动器镜像:
# graid label Intel gm0 RAID1 ada0 NONE

graid(8) 元数据被写到驱动器末端的未使用空间中。现在可以在镜像中插入第二个驱动器:

# graid insert raid/r0 ada1

原始硬盘的数据将立即开始复制到第二个硬盘。镜像将以降级状态运行,直到复制完成。

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

驱动器可以被插入到阵列中,作为故障或丢失的驱动器的替代。如果没有故障或丢失的驱动器,新的驱动器就成为备用驱动器。例如,将一个新的驱动器插入到一个工作的双驱动器镜像中,结果是一个有一个备用驱动器的双驱动器镜像,而不是一个三驱动器的镜像。

在这个例子的镜像阵列中,数据立即开始被复制到新插入的硬盘。新驱动器上的任何现有信息将被覆盖:

# graid insert raid/r0 ada1
GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from NONE to ACTIVE.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NONE to NEW.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NEW to REBUILD.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 rebuild start at 0.

19.5.5. 从阵列中移除硬盘

单个驱动器可以从一个阵列中永久移除,其元数据也被删除:

# graid remove raid/r0 ada1
GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from ACTIVE to OFFLINE.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-[unknown] state changed from ACTIVE to NONE.
GEOM_RAID: Intel-a29ea104: Volume gm0 state changed from OPTIMAL to DEGRADED.

19.5.6. 停止阵列

阵列可以被停止,而不需要从驱动器上删除元数据。当系统被启动时,该阵列将被重新启动:

# graid stop raid/r0

19.5.7. 检查阵列状态

阵列状态可以在任何时候检查。在上面的例子中,一个驱动器被添加到镜像中后,数据正从原来的驱动器复制到新的驱动器上:

# graid status
   Name    Status  Components
raid/r0  DEGRADED  ada0 (ACTIVE (ACTIVE))
                   ada1 (ACTIVE (REBUILD 28%))

某些类型的阵列,比如 RAID0CONCAT,如果磁盘发生故障,可能不会显示在状态报告中。要看到这些部分失败的阵列,请添加 -ga

# graid status -ga
          Name  Status  Components
Intel-e2d07d9a  BROKEN  ada6 (ACTIVE (ACTIVE))

19.5.8. 删除阵列

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

# graid delete raid/r0

19.5.9. 删除意外的阵列

驱动器可能意外地包含 graid(8) 元数据,可能是以前的使用或制造商的测试。graid(8) 会检测到这些驱动器并创建一个阵列,干扰对单个驱动器的访问。要删除不需要的元数据。

  1. 启动系统。在启动菜单上,选择 2 为加载器提示。输入:
OK set kern.geom.raid.enable=0
OK boot

系统将在禁用 graid(8) 的情况下启动。

  1. 备份受影响驱动器上的所有数据。

  2. 作为一种变通方法,可以通过添加以下内容禁用 graid(8) 阵列检测:

kern.geom.raid.enable=0

/boot/loader.conf

要从受影响的驱动器中永久删除 graid(8) 元数据,请启动 FreeBSD 安装光盘或记忆棒,并选择 Shell。使用 status 找到阵列的名称,通常是 raid/r0

# graid status
  Name   Status  Components
raid/r0  OPTIMAL  ada0 (ACTIVE (ACTIVE))
                 ada1 (ACTIVE (ACTIVE))

按名称删除卷。

# graid delete raid/r0

如果显示有多个卷,对每个卷重复该过程。在最后一个阵列被删除后,卷将被销毁。

重新启动并验证数据,必要时从备份中恢复。在删除元数据后,也可以删除 /boot/loader.conf 中的 kern.geom.raid.enable=0 条目。