21.5.软件 RAID 设备

一些主板和扩展卡增加了一些简单的硬件,通常只是一个 ROM,允许计算机从 RAID 阵列中启动。启动后,对 RAID 阵列的访问由运行在计算机主处理器上的软件处理。这种“硬件辅助的软件 RAID”使 RAID 阵列不依赖于任何特定的操作系统,甚至在操作系统被加载之前就能发挥作用。

根据使用的硬件,支持几种级别的 RAID。参见 graid(8) 以获得完整的列表。

graid(8) 需要 geom_raid.ko 内核模块,它从 FreeBSD 9.1 开始包含在 GENERIC 内核中。如果需要,可以通过 graid load 手动加载。

21.5.1.创建阵列

软件 RAID 设备通常有一个菜单,可以在计算机启动时按下特殊键进入。该菜单可以用来创建和删除 RAID 阵列。graid(8) 也可以直接从命令行创建阵列。

graid label 标签用于创建新的阵列。本例中使用的主板有一个 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

21.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)

21.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

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

21.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.

21.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.

21.5.6.停止阵列

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

# graid stop raid/r0

21.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))

21.5.8.删除阵列

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

# graid delete raid/r0

21.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 安装光盘或 U 盘,并选择 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 条目。