21.5.软件 RAID 设备

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

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

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

21.5.1.创建阵列

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

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)open in new window

# 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)open in new window

21.5.3.将单个磁盘转换为镜像

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

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

graid(8)open in new window 元数据被写到磁盘末端的未使用空间中。现在可以在镜像中插入第二块磁盘:

# 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)open in new window 元数据,可能是以前使用的或制造商的测试。graid(8)open in new window 会检测到这些磁盘并创建一个阵列,干扰对单个磁盘的访问。要删除不需要的元数据:

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

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

  1. 备份受影响磁盘上的所有数据。
  2. 作为一种变通方法,可以通过以下内容禁用 graid(8)open in new window 阵列检测,添加
kern.geom.raid.enable=0

/boot/loader.conf

要从受影响的磁盘中永久删除 graid(8)open in new window 元数据,请启动 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 条目。