16.4. RAID

16.4.1. 软件 RAID

16.4.1.1. 连接磁盘驱动器配置 (CCD)

Original work by Christopher Shumway. Revised by Jim Brown.

选择一个大容量存储比较好的解决方案,最重要的因素是产品的速度、 性能和成本。通常这三者不可能都满足;要获得比较快和可靠的大容量存储 设备,就比较昂贵。但如果将成本降下来,那它的速度或可靠性就会打折扣。

在设计下面描述的系统时,价格被选为最重要的因素,接下来是速度 和性能。这人系统的数据传输速度及大的取决于网络。性能也非常重要, CCD 驱动器上的所有数据都被备份到了 CD-R 盘,可以很容易的对数据进行恢复。

在选择一个大容量的存储解决方案时,第一步是要设计您自己的需求。 如果您的需求更偏重于速度和性能,那么您的解决方案将就不同于上面的设计。

16.4.1.1.1. 安装硬件

除了 IDE 系统磁盘外,还有三个 Western Digital 30GB、5400 RPM 的 IDE 磁盘构成了大约 90G 的连接磁盘驱动存储空间。最好是每个 IDE 硬盘 都使用一个自己的 IDE 控制器和数据线,为了降低成本,没有使用更多的 IDE 控制器,取而代之配置跳线使每个 IDE 控制器都拥有一个主盘和一个 从盘。

重启动后,系统 BIOS 被配置成自动检测硬盘。FreeBSD 检测到它们:

ad0: 19574MB <WDC WD205BA> [39770/16/63] at ata0-master UDMA33
ad1: 29333MB <WDC WD307AA> [59598/16/63] at ata0-slave UDMA33
ad2: 29333MB <WDC WD307AA> [59598/16/63] at ata1-master UDMA33
ad3: 29333MB <WDC WD307AA> [59598/16/63] at ata1-slave UDMA33

Note: 如果 FreeBSD 没有检测到它们,请确定它们的跳线是否设置 正确。大多数 IDE 磁盘有一个 “Cable Select” 跳线。这个 不是 设置 master/slave 硬盘的跳线。查阅文档 信息来确定正确的跳线设置。

接下来考虑的是,如何创建文件系统。应该好好研究一下 vinum(8) (Chapter 17)和 ccd(4) 两种方式,在这里我们选择 ccd(4)

16.4.1.1.2. 安装 CCD

ccd(4) 允许用户将几个相同的的磁盘通过一个逻辑文件系统 连接起来。要使用 ccd(4),您需要在内核中配置 ccd(4) 支持选项。把这行加入到内核配置文件中,然后重建内核:

pseudo-device   ccd     4

在 5.X 和以后的版本中,您必须使用下面的行来代替:

device   ccd

Note: 在 FreeBSD 5.X 里,不必指定一系统的 ccd(4) 设备, ccd(4) 设备将自动按需要创建新的 -- 设备。

ccd(4) 在FreeBSD 3.0 或以后的版本中也可以作为一个内核模块 来加载

要安装 ccd(4), 首先需要使用 disklabel(8) 来编辑硬盘:

disklabel -r -w ad1 auto
disklabel -r -w ad2 auto
disklabel -r -w ad3 auto

这儿把整个硬盘创建成 ad1c, ad2cad3c

Note: 从 FreeBSD 5.1-RELEASE 开始, bsdlabel(8) 程序代替 了老版本的 disklabel(8) 程序。bsdlabel(8) 中大量过时的选项 和参数也被取消; 在上面的例子中,选项 -r 应该被删掉。 更的信息可以参考 bsdlabel(8) 手册。

下一步是改变 disklable 的类型。也可以使用 disklabel(8) 来编辑:

disklabel -e ad1
disklabel -e ad2
disklabel -e ad3

这儿在每个已经设置了 EDITOR 环境变量的磁盘上打开了 disklable,在我我例子中使用的是 vi(1)

可以看到:

8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  c: 60074784        0    unused        0     0     0   # (Cyl.    0 - 59597)

添加一个新的 e 分区给 ccd(4) 用。这可以是 c 分区的一个拷贝,但 fstype 必须4.2BSD。做完之后,您会看到一面这些:

8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  c: 60074784        0    unused        0     0     0   # (Cyl.    0 - 59597)
  e: 60074784        0    4.2BSD        0     0     0   # (Cyl.    0 - 59597)

16.4.1.1.3. 建立文件系统

ccd0c 的设备节点可能不存在,所以要 创建它,执行下面的命令:

cd /dev
sh MAKEDEV ccd0

Note: 在 FreeBSD 5.0 中,devfs(5) 将自动管理在 /dev, 里的设备结点,所以没有必要使用 MAKEDEV 命令。

现在已给每个磁盘都加上了标签,下面需要建立 ccd(4)。要这样做, 需要使用 ccdconfig(8) 工具,同时要提供类似下面的选项:

ccdconfig ccd0(1) 32(2) 0(3) /dev/ad1e(4) /dev/ad2e /dev/ad3e

每个选项的意义和用法如下所示:

(1)
配置设备的第一个参数,在这是 /dev/ccd0c/dev/ 部分是任选项。
(2)
下一个参数是文件系统的插入页(interleave)。插入页定义了一个 磁盘块中一个分段或条带(stripe)的大小,通常是 512 个字节。所以一个为 32 的插入页将是 16,384 字节。
(3)
插入页为 ccdconfig(8) 附带了标记。如果您要启用驱动器镜像, 需要在这儿指定它。在这个配置中没有做 ccd(4) 的镜像,所以把它 设为 0 (zero)。
(4)
ccdconfig(8) 的最后配置是设备的排列问题。使用完整的设备 路径名。

运行 ccdconfig(8)ccd(4) 就配置好了。现在要创建文件 系统了,参考 newfs(8) 选项,执行下同的命令:

newfs /dev/ccd0c

16.4.1.1.4. 自动创建

最后,要挂上 ccd(4) ,需要先配置它。把当前的配置文件写入 /etc/ccd.conf 中,使用下面的命令:

ccdconfig -g > /etc/ccd.conf

当重新启动系统时,如果 /etc/ccd.conf 存在, 脚本 /etc/rc 就运行 ccdconfig -C。 这样就能自动配置 ccd(4) 以到它能被挂上。

Note: 如果启动进入了单用户模式,在 mount(8)ccd(4) 之前,需要执行下面的命令来配置队列:

ccdconfig -C

要自动挂接 ccd(4),需要为 ccd(4)/etc/fstab 中配置一个记录,以便在启动时它能被挂上。 如下所示:

/dev/ccd0c              /media       ufs     rw      2       2

16.4.1.2. Vinum 卷管理

Vinum 卷管理是一个实现虚拟磁盘的块驱动设备工具。它使磁盘从 块设备的接口和数据映射中独立出来。与传统的存储设备相比,增加了 灵活性、性能和可靠性。 vinum(8) 实现了 RAID-0、RAID-1 和 RAID-5 三种模式,它们即可以独立使用,也可组合使用。

参考 Chapter 17 得到更多 vinum(8) 的信息。

16.4.2. 硬件 RAID

FreeBSD 支持很多硬件 RAID 控制器。 这些硬件不需要 FreeBSD 指定软件来管理 RAID 系统。

使用 BIOS 支持的硬件,一般情况下这些硬件可以自行操作。 下面是一个简明的描述设置一个 Promise IDE RAID 控制器。 当硬件设备装好且系统重启后,屏幕上显示一个询问信息。接着进入硬件设置屏幕。在这里, 您可以把所有的磁盘联合在一起使用。这样 FreeBSD 将磁盘看作一个驱动器。其它 级别的 RAID 也可以相应的进行设置。

16.4.3. 重建 ATA RAID1 阵列

FreeBSD 允许您热插拔阵列中损坏的磁盘。 在您重新启动系统之前请注意这一点。

您可能会在 /var/log/messages 或者在 dmesg(8) 的输出中看到类似下面这些的内容:

ad6 on monster1 suffered a hard error.
ad6: READ command timeout tag=0 serv=0 - resetting
ad6: trying fallback to PIO mode
ata3: resetting devices .. done
ad6: hard error reading fsbn 1116119 of 0-7 (ad6 bn 1116119; cn 1107 tn 4 sn 11)\\
status=59 error=40
ar0: WARNING - mirror lost

使用 atacontrol(8),查看更多的信息:

# atacontrol list
ATA channel 0:
    Master:      no device present
    Slave:   acd0 <HL-DT-ST CD-ROM GCR-8520B/1.00> ATA/ATAPI rev 0

ATA channel 1:
    Master:      no device present
    Slave:       no device present

ATA channel 2:
    Master:  ad4 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
    Slave:       no device present

ATA channel 3:
    Master:  ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
    Slave:       no device present

# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad4 ad6 status: DEGRADED
  1. 您首先需要将磁盘从阵列中移除以便您可以 安全的拆除它:

    # atacontrol detach 3
    
  2. 换上磁盘

  3. 把磁盘作为备用磁盘安装:

    # atacontrol attach 3
    Master:  ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
    Slave:   no device present
    
  4. 重建阵列:

    # atacontrol rebuild ar0
    
  5. rebuild 命令挂起直到完成。然而,可以打开另一个终端 (使用 Alt+Fn) 通过下面的命令来检查进程:

    # dmesg | tail -10
    [output removed]
    ad6: removed from configuration
    ad6: deleted from ar0 disk1
    ad6: inserted into ar0 disk1 as spare
    
    # atacontrol status ar0
    ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 0% completed
    
  6. 等待操作完成。