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),并且使用 **ada0** 和 **ada1** 硬盘。 **当心** 当硬盘被做成一个新的阵列时,硬盘上的一些空间将被覆盖。请先备份现有的数据! .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # 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. 状态检查显示新的镜像已经可以使用了: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # graid status Name Status Components raid/r0 OPTIMAL ada0 (ACTIVE (ACTIVE)) ada1 (ACTIVE (ACTIVE)) 阵列设备出现在 **/dev/raid/**\ 。第一个阵列被称为 **r0**\ 。其他的阵列,如果存在的话,将是 **r1** 、 **r2**\ ,以此类推。 一些设备上的 BIOS 菜单可以创建名称中有特殊字符的阵列。为了避免这些特殊字符的问题,阵列被赋予简单的编号名称,如 **r0**\ 。要显示实际的标签,如上面例子中的 **gm0**\ ,请使用 `sysctl(8) `__\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysctl kern.geom.raid.name_format=1 21.5.2.多个卷 ------------- 一些软件 RAID 设备支持在一个阵列上有一个以上的卷。卷的工作方式类似于分区,允许物理磁盘上的空间被分割并以不同方式使用。例如,英特尔软件 RAID 设备支持两个卷。这个例子创建了一个 40G 的镜像,用于安全存储操作系统,然后是一个 20G 的 RAID0(条带)卷,用于快速临时存储: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # graid label -S 40G Intel gm0 RAID1 ada0 ada1 # graid add -S 20G gm0 RAID0 卷在 **/dev/raid/** 中显示为额外的 **rX** 条目。一个有两个卷的阵列将显示为 **r0** 和 **r1**\ 。 关于不同的软件 RAID 设备所支持的卷的数量,请参见 `graid(8) `__\ 。 21.5.3.将单个磁盘转换为镜像 --------------------------- 在某些特定的条件下,有可能将现有的单个硬盘转换成 `graid(8) `__ 阵列,而无需重新格式化。为了避免转换过程中的数据丢失,现有的硬盘必须满足这些最低要求: - 磁盘必须用 MBR 分区方案进行分区。GPT 或其他分区方案的元数据在硬盘的末端,会被 `graid(8) `__ 的元数据覆盖和破坏。 - 磁盘末端必须有足够的未分区和未使用的空间来容纳 `graid(8) `__ 元数据。这个元数据的大小各不相同,但最大的占据了 64M,所以建议至少有这么多的可用空间。 - 如果磁盘满足这些要求,则首先进行完全备份。然后用这个磁盘创建一个单磁盘镜像: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # graid label Intel gm0 RAID1 ada0 NONE `graid(8) `__ 元数据被写到磁盘末端的未使用空间中。现在可以在镜像中插入第二块磁盘: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # graid insert raid/r0 ada1 原始硬盘的数据将立即开始复制到第二个硬盘。镜像将以降级状态运行,直到复制完成。 21.5.4.将新的硬盘插入阵列中 --------------------------- 作为故障或丢失的磁盘的替代,可以插入磁盘到阵列中。如果没有故障或丢失的磁盘,新的磁盘就成为备用磁盘。例如,将一块新的磁盘插入到一个工作的双磁盘镜像中,将成为有一个备用磁盘的双磁盘镜像,而不是三磁盘的镜像。 在这个例子的镜像阵列中,数据立即开始被复制到新插入的硬盘。新磁盘上的任何现有信息将被覆盖: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # 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.从阵列中移除硬盘 ----------------------- 可以从一个阵列中永久移除单个磁盘,其元数据也被删除: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # 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.停止阵列 --------------- 阵列可以被停止,而不需要从磁盘上删除元数据。当系统被启动时,该阵列将被重新启动: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # graid stop raid/r0 21.5.7.检查阵列状态 ------------------- 阵列状态可以在任何时候检查。在上面的例子中,一个磁盘被添加到镜像中后,数据正从原来的磁盘复制到新的磁盘上: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # graid status Name Status Components raid/r0 DEGRADED ada0 (ACTIVE (ACTIVE)) ada1 (ACTIVE (REBUILD 28%)) 某些类型的阵列,比如 ``RAID0`` 或 ``CONCAT``\ ,如果磁盘发生故障,可能不会显示在状态报告中。要看到这些部分失败的阵列,请添加 ``-ga``\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # graid status -ga Name Status Components Intel-e2d07d9a BROKEN ada6 (ACTIVE (ACTIVE)) 21.5.8.删除阵列 --------------- 阵列是通过删除其中所有的卷来销毁的。当最后一个卷被删除时,阵列被停止,元数据从磁盘上被删除: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # graid delete raid/r0 21.5.9.删除意外的阵列 --------------------- 磁盘可能意外地包含 `graid(8) `__ 元数据,可能是以前使用的或制造商的测试。\ `graid(8) `__ 会检测到这些磁盘并创建一个阵列,干扰对单个磁盘的访问。要删除不需要的元数据: 1. 启动系统。在启动菜单上,选择 ``2`` 为加载器提示。输入: .. code:: shell-session OK set kern.geom.raid.enable=0 OK boot 系统将在禁用 `graid(8) `__ 的情况下启动。 1. 备份受影响磁盘上的所有数据。 2. 作为一种变通方法,可以通过以下内容禁用 `graid(8) `__ 阵列检测,添加 .. code:: shell-session kern.geom.raid.enable=0 到 **/boot/loader.conf**\ 。 要从受影响的磁盘中永久删除 `graid(8) `__ 元数据,请启动 FreeBSD 安装光盘或 U 盘,并选择 ``Shell``\ 。使用 ``status`` 找到阵列的名称,通常是 ``raid/r0``\ : .. code:: shell-session # graid status Name Status Components raid/r0 OPTIMAL ada0 (ACTIVE (ACTIVE)) ada1 (ACTIVE (ACTIVE)) 按名称删除卷: .. code:: shell-session # graid delete raid/r0 如果显示有多个卷,对每个卷重复该过程。在最后一个阵列被删除后,卷将被销毁。 重新启动并验证数据,必要时从备份中恢复。在删除元数据后,也可以删除 **/boot/loader.conf** 中的 ``kern.geom.raid.enable=0`` 条目。