软件 RAID HOWTO

Jakob Østergaard jakob@unthought.net 和 Emilio Bueso bueso@vives.org

v.1.1.1 2010-03-06
本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

本 HOWTO 描述了如何在 Linux 下使用软件 RAID。它涉及一个特定版本的软件 RAID 层,即 Ingo Molnar 等人制作的 0.90 RAID 层。这是 Linux-2.4 中的标准 RAID 层,也是一些供应商提供的 Linux-2.2 内核中使用的版本。0.90 RAID 支持可以通过补丁用于 Linux-2.0 和 Linux-2.2,并且许多人认为它比那些内核中已有的旧 RAID 支持更加稳定。

1. 简介

2. 为什么要 RAID?

3. 设备

4. 硬件问题

5. RAID 设置

6. 检测、查询和测试

7. 调整、优化和故障排除

8. 重建

9. 性能

10. 相关工具

11. 在 RAID 上分区/LVM

12. 鸣谢

13. 更新日志


1. 简介

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

本 HOWTO 仅描述 2.4 和 2.6 内核系列中存在的“新型”RAID。它*不*描述 2.0 和 2.2 内核中存在的“旧型”RAID 功能。

本 HOWTO 的主站点是 http://unthought.net/Software-RAID.HOWTO/,更新版本首先在那里出现。该 howto 最初由 Jakob Østergaard 根据作者与 Ingo Molnar (mingo@chiara.csoma.elte.hu)(RAID 开发人员之一)、linux-raid 邮件列表 (linux-raid@vger.kernel.org) 和其他各种人员之间的许多电子邮件编写。Emilio Bueso (bueso@vives.org) 共同编写了 1.0 版本。

如果您想在 2.0 或 2.2 内核中使用新型 RAID,您应该从 http://people.redhat.com/mingo/ 获取内核补丁。标准 2.2 内核不支持本 HOWTO 中描述的新型 RAID。因此,需要这些补丁。*标准 2.0 和 2.2 内核中的旧型 RAID 支持存在错误,并且缺少新型 RAID 软件中的几个重要功能。*

如果您已经了解 RAID,本 HOWTO 中的某些信息可能看起来很琐碎。直接跳过这些部分即可。

1.1 免责声明

强制性免责声明

本文中的所有信息均按“原样”提供,不作任何明示或暗示的保证。如果您丢失了所有数据、工作、被卡车撞到等等,这不是我的错,也不是开发人员的错。请注意,您需要自行承担使用 RAID 软件和这些信息的风险!不能保证任何软件或此信息在任何方面都是正确的,也不适合任何用途。在进行实验之前,请备份所有数据。安全第一。

1.2 什么是 RAID?

1987 年,加州大学伯克利分校发表了一篇题为 廉价磁盘冗余阵列 (RAID) 的案例 的文章。本文描述了各种类型的磁盘阵列,并用首字母缩略词 RAID 来指代。RAID 的基本思想是将多个小型独立磁盘驱动器组合成一个磁盘驱动器阵列,从而产生超过单个大型昂贵驱动器 (SLED) 的性能。此外,此驱动器阵列对计算机显示为单个逻辑存储单元或驱动器。

阵列的平均故障间隔时间 (MTBF) 将等于单个驱动器的 MTBF,除以阵列中的驱动器数量。因此,对于许多应用要求而言,驱动器阵列的 MTBF 会太低。但是,可以通过以各种方式冗余存储信息来使磁盘阵列具有容错性。

伯克利论文定义了五种类型的阵列架构,即 RAID-1 到 RAID-5,每种架构都提供磁盘容错,并且每种架构在特性和性能方面都提供不同的权衡。除了这五种冗余阵列架构之外,通常将非冗余磁盘驱动器阵列称为 RAID-0 阵列。

如今,一些原始 RAID 级别(即级别 2 和 3)仅在非常专业的系统中使用(事实上,Linux 软件 RAID 驱动程序甚至不支持)。另一个级别“线性”已经出现,尤其是 RAID 级别 0 通常与 RAID 级别 1 结合使用。

1.3 术语

在本 HOWTO 中,“RAID”一词表示“Linux 软件 RAID”。本 HOWTO 不涉及硬件 RAID 的任何方面。此外,它不涉及其他操作系统内核中软件 RAID 的任何方面。

在描述 RAID 设置时,引用磁盘的数量及其大小很有用。始终使用字母 N 表示阵列中活动磁盘的数量(不包括备用磁盘)。字母 S 是阵列中最小驱动器的大小,除非另有说明。字母 P 用作阵列中一个磁盘的性能,以 MB/s 为单位。使用时,我们假设磁盘速度相同,但在实际情况下可能并非总是如此。

请注意,“设备”和“磁盘”这两个词应该意味着大致相同的事情。通常,用于构建 RAID 设备的设备是磁盘上的分区,而不一定是整个磁盘。但是,合并一个磁盘上的多个分区通常没有意义,因此设备和磁盘这两个词仅表示“不同磁盘上的分区”。

1.4 RAID 级别

这是 Linux RAID 驱动程序中支持的内容的简要说明。其中一些信息是绝对基本的 RAID 信息,但我添加了一些关于 Linux 实现级别的特殊之处的注意事项。如果您已经了解 RAID,可以安全地跳过此部分。

Linux 中的当前 RAID 驱动程序支持以下级别

1.5 要求

本 HOWTO 假设您正在使用 Linux 2.4 或更高版本。 但是,也可以在较晚的 2.2.x 或 2.0.x Linux 内核中使用软件 RAID,并带有匹配的 RAID 补丁和 0.90 版本的 raidtools。 补丁和工具都可以在 http://people.redhat.com/mingo/ 找到。 RAID 补丁、raidtools 包和内核应尽可能匹配。 有时,如果最新的内核没有可用的 raid 补丁,则可能需要使用较旧的内核。

如果您使用基于 2.4 内核或更高版本的最新 GNU/Linux 发行版,则您的系统很可能已经有一个与您的内核匹配的 raidtools 版本。


2. 为什么使用 RAID?

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

使用 RAID 有很多好的理由。 其中一些是:将多个物理磁盘组合成一个更大的“虚拟”设备的能力、性能改进和冗余。

但是,非常重要的是要理解,RAID 不能替代良好的备份。 某些 RAID 级别将使您的系统免受单磁盘故障导致的数据丢失,但 RAID 不允许您从意外的 "rm -rf /" 中恢复。 如果服务器本身以某种方式丢失(盗窃、洪水、地震、火星入侵等),RAID 也无助于您保存数据。

通常,RAID 将允许您在发生常见硬件问题(单磁盘故障)时保持系统正常运行。 它本身不是一个完整的数据安全解决方案。 认识到这一点非常重要。

2.1 设备和文件系统支持

Linux RAID 可以在大多数块设备上工作。 使用 IDE 或 SCSI 设备,还是混合使用它们,都无关紧要。 有些人也使用网络块设备 (NBD),但成功程度各不相同。

由于 Linux 软件 RAID 设备本身就是一个块设备,因此上述意味着您可以实际创建其他 RAID 设备的 RAID。 反过来,这使得可以通过简单地一起使用 RAID-0 和 RAID-1 功能来支持 RAID-10(多个 RAID-1 设备的 RAID-0)。 同样支持其他更奇特的配置,例如 RAID-5 over RAID-5 “矩阵”配置。

RAID 层与文件系统层绝对无关。 您可以将任何文件系统放在 RAID 设备上,就像任何其他块设备一样。

2.2 性能

通常,RAID 被用作解决性能问题的解决方案。 虽然 RAID 确实通常是您正在寻找的解决方案,但它不是万能药。 性能问题可能有很多原因,而 RAID 只是其中一些问题的解决方案。

有关每个级别的性能特征的提及,请参见第一章。

2.3 在 RAID 上进行交换

没有理由因为交换性能原因而使用 RAID。 如果您只是在 /etc/fstab 文件中为它们提供相同的优先级,则内核本身可以在多个设备上进行条带化交换。

一个不错的 /etc/fstab 看起来像

/dev/sda2       swap           swap    defaults,pri=1   0 0
/dev/sdb2       swap           swap    defaults,pri=1   0 0
/dev/sdc2       swap           swap    defaults,pri=1   0 0
/dev/sdd2       swap           swap    defaults,pri=1   0 0
/dev/sde2       swap           swap    defaults,pri=1   0 0
/dev/sdf2       swap           swap    defaults,pri=1   0 0
/dev/sdg2       swap           swap    defaults,pri=1   0 0
此设置允许机器在七个 SCSI 设备上并行交换。 无需 RAID,因为这长期以来一直是内核的一项功能。

使用 RAID 进行交换的另一个原因是高可用性。 如果您将系统设置为在 RAID-1 设备上启动,则系统应该能够在磁盘崩溃中幸存下来。 但是,如果系统一直在有故障的设备上进行交换,那么您肯定会失败。 在 RAID-1 设备上进行交换可以解决此问题。

关于交换在 RAID 设备上是否稳定的讨论很多。 这是一个持续的辩论,因为它在很大程度上也取决于内核的其他方面。 在撰写本文时,在 RAID 上进行交换似乎应该非常稳定,但是您应该自己对系统进行压力测试,直到您对稳定性感到满意为止。

您可以根据需要在 RAID 设备上的文件系统中的交换文件中设置 RAID,也可以将 RAID 设备设置为交换分区。 像往常一样,RAID 设备只是一个块设备。

2.4 为什么要使用 mdadm?

经典的 raidtools 是 Linux 的标准软件 RAID 管理工具,因此使用 mdadm 不是必须的。

但是,如果您发现 raidtools 繁琐或有限,mdadm(多设备管理)是运行 RAID 系统的一个非常有用的工具。 它可以作为 raidtools 的替代品或补充。

mdadm 工具由新南威尔士大学的软件工程师和内核开发人员 Neil Brown 编写,目前为 1.4.0 版本,并且已被证明非常稳定。 Linux-raid 邮件列表上的积极响应很多,mdadm 将来可能会得到广泛使用。

mdadm 和 raidtools 之间的主要区别在于


3. 设备

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

软件 RAID 设备是所谓的“块”设备,例如普通磁盘或磁盘分区。 RAID 设备由多个其他块设备“构建”而成——例如,RAID-1 可以由两个普通磁盘或两个磁盘分区(在单独的磁盘上——请参阅 RAID-1 的描述以了解有关此的详细信息)构建而成。

对构建 RAID 设备的设备没有其他特殊要求——这让您在设计 RAID 解决方案时拥有很大的自由。 例如,您可以从 IDE 和 SCSI 设备的组合构建 RAID,甚至可以从其他 RAID 设备构建 RAID(这对于 RAID-0+1 很有用,您只需从普通磁盘构建两个 RAID-1 设备,然后从这两个 RAID-1 设备构建一个 RAID-0 设备)。

因此,在以下文本中,我们将使用“设备”一词表示“磁盘”、“分区”,甚至“RAID 设备”。 以下文本中的“设备”仅指“Linux 块设备”。 它可以是从 SCSI 磁盘到网络块设备的任何东西。 我们通常将这些“设备”简称为“磁盘”,因为这将在常见情况下如此。

然而,设备在您的阵列中可以扮演多种角色。一个设备可能是一个“备用磁盘”,它可能已经发生故障,因此是一个“故障磁盘”,或者它可能是一个正常工作且功能齐全的设备,正在被阵列积极使用。

在下文中,我们将描述两种特殊类型的设备:即“备用磁盘”和“故障磁盘”。

3.1 备用磁盘

备用磁盘是指在活动磁盘发生故障之前不参与 RAID 集的磁盘。当检测到设备故障时,该设备将被标记为“坏”,并且立即在第一个可用的备用磁盘上开始重建。

因此,备用磁盘为 RAID-5 系统(尤其是不易接近的系统(物理上))增加了一个很好的额外安全性。人们可以让系统在出现故障设备的情况下运行一段时间,因为备用磁盘保留了所有冗余。

但是,您不能确定您的系统在磁盘崩溃后是否会继续运行。 RAID 层应该能够很好地处理设备故障,但是 SCSI 驱动程序在错误处理方面可能会出现问题,或者 IDE 芯片组可能会锁定,或者可能会发生许多其他事情。

此外,一旦开始重建到热备盘,RAID 层将开始从所有其他磁盘读取数据以重新创建冗余信息。如果多个磁盘随着时间的推移积累了坏块,则重建本身实际上可能会触发“好”磁盘上的故障。这将导致完全的 RAID 故障。如果您经常对 RAID 阵列上的整个文件系统进行备份,那么您极不可能遇到这种情况 - 这是进行频繁备份的另一个非常好的理由。记住,RAID 不能替代备份。

3.2 故障磁盘

当 RAID 层能够很好地处理设备故障时,崩溃的磁盘将被标记为故障,并且立即在第一个可用的备用磁盘上开始重建。

故障磁盘仍然显示为阵列的成员并表现出阵列成员的特性。 RAID 层只是将崩溃的设备视为文件系统的非活动部分。


4. 硬件问题

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

本节将提及运行软件 RAID 时涉及的一些硬件问题。

如果您追求高性能,则应确保驱动器的总线足够快。您不应在一个 UW 总线上拥有 14 个 UW-SCSI 驱动器,如果每个驱动器可以提供 20 MB/s 的速度,而总线只能支持 160 MB/s。此外,您应该每个 IDE 总线只有一个设备。以主/从模式运行磁盘对性能来说是很糟糕的。 IDE 在访问每个总线多个驱动器方面非常糟糕。 当然,所有较新的主板都有两个 IDE 总线,因此您无需购买更多控制器即可设置两个 RAID 磁盘。 额外的 IDE 控制器现在非常便宜,因此使用 IDE 设置 6-8 个磁盘系统既容易又实惠。

4.1 IDE 配置

确实可以在 IDE 磁盘上运行 RAID。 并且也可以实现出色的性能。 事实上,如今 IDE 驱动器和控制器的价格确实使 IDE 在设置新的 RAID 系统时值得考虑。

非常重要的是,每个 IDE 总线只使用 一个 IDE 磁盘。 两个磁盘不仅会破坏性能,而且磁盘的故障通常会保证总线的故障,从而导致该总线上的所有磁盘都发生故障。 在容错 RAID 设置(RAID 级别 1,4,5)中,可以处理一个磁盘的故障,但两个磁盘的故障(由于一个磁盘的故障而导致故障的总线上的两个磁盘)将使阵列不可用。 此外,当总线上的主驱动器发生故障时,从驱动器或 IDE 控制器可能会变得非常混乱。 一条总线,一个驱动器,这就是规则。

有很多便宜的 PCI IDE 控制器。 您通常可以用大约 80 美元的价格获得两个或四个总线。 考虑到 IDE 磁盘与 SCSI 磁盘相比价格低得多,如果可以接受相对较少的磁盘数量(可能大约 8 个),IDE 磁盘阵列通常是一个非常好的解决方案。

在大型阵列方面,IDE 存在严重的布线问题。 即使您有足够的 PCI 插槽,也不太可能在系统中安装超过 8 个磁盘,并且仍然可以运行而不会因 IDE 电缆过长而导致数据损坏。

此外,一些较新的 IDE 驱动器带有限制,即每天只能使用给定的时间。 这些驱动器用于桌面用途,如果在 24/7 服务器 RAID 环境中使用它们可能会导致严重问题。

4.2 热插拔

虽然在某种程度上支持驱动器的热插拔,但这仍然不是一件容易做的事情。

热插拔 IDE 驱动器

不要这样做! IDE 根本不支持热插拔。 当然,如果您的 IDE 驱动程序编译为模块(仅在 2.2 系列内核中可用),并且在更换驱动器后重新加载它,它可能会对您有效。 但是您也可能最终烧毁 IDE 控制器,并且您将花费比在停机系统上更换驱动器所花费的时间更多的停机时间。

除了可能破坏硬件的电气问题之外,主要问题是必须在交换磁盘后重新扫描 IDE 总线。 虽然较新的 Linux 内核确实支持重新扫描 IDE 总线(在 hdparm 实用程序的帮助下),但重新检测分区仍然是缺乏的。 如果新磁盘与旧磁盘 100% 相同(关于几何形状等),它可能有效,但实际上,您正在走在最前沿。

热插拔 SCSI 驱动器

正常的 SCSI 硬件也不能热插拔。 然而,它可能有效。 如果您的 SCSI 驱动程序支持重新扫描总线以及删除和附加设备,您也许可以热插拔设备。 但是,在正常的 SCSI 总线上,您可能不应在系统仍然启动的情况下拔下设备。 但同样,它可能只是有效(并且您可能最终会烧毁硬件)。

如果磁盘死亡,SCSI 层应该能够幸存下来,但并非所有 SCSI 驱动程序都能处理这种情况。 如果您的 SCSI 驱动程序在磁盘发生故障时崩溃,您的系统也会随之崩溃,那么热插拔就没什么意义了。

使用 SCA 进行热插拔

使用 SCA,可以热插拔设备。 不幸的是,这并不像它应该的那么简单,但它是既可行又安全的。

在下面的示例中,用适当的值替换 RAID 设备、磁盘设备和主机/通道/ID/Lun 编号

"scsi remove-single-device" 命令的参数是:主机、通道、ID 和 Lun。 这些数字可以在 "/proc/scsi/scsi" 文件中找到。

上述步骤已在具有 IBM SCA 磁盘和 Adaptec SCSI 控制器的系统上进行了尝试和测试。 如果您遇到问题或找到更简单的方法来执行此操作,请在 linux-raid 邮件列表中讨论此问题。


5. RAID 设置

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

5.1 通用设置

这是您需要用于任何 RAID 级别的东西

所有这些都作为标准包含在当今大多数 GNU/Linux 发行版中。

如果您的系统具有 RAID 支持,则您应该有一个名为 /proc/mdstat 的文件。 记住它,该文件是您的朋友。 如果您没有该文件,则可能您的内核不支持 RAID。 通过执行 cat /proc/mdstat 来查看其中的内容。 它应该告诉您您已注册了正确的 RAID 个性(例如,RAID 模式),并且当前没有 RAID 设备处于活动状态。

创建要包含在 RAID 集中的分区。

5.2 下载并安装 RAID 工具

RAID 工具包含在几乎所有主要的 Linux 发行版中。

重要提示:如果使用 Debian Woody (3.0) 或更高版本,您可以通过运行以下命令来安装软件包

apt-get install raidtools2
这个 raidtools2 是旧的 raidtools 包的现代版本,它不支持持久超级块和奇偶校验算法设置。

5.3 下载并安装 mdadm

您可以在 http://www.cse.unsw.edu.au/~neilb/source/mdadm/ 下载最新的 mdadm tarball。 执行一个不错的 make install 来编译然后安装 mdadm 及其文档、手册页和示例文件。

tar xvf ./mdadm-1.4.0.tgz
cd mdadm-1.4.0.tgz
make install
如果使用基于 RPM 的发行版,您可以在 http://www.cse.unsw.edu.au/~neilb/source/mdadm/RPM 下载并安装软件包文件。
rpm -ihv mdadm-1.4.0-1.i386.rpm  
如果使用 Debian Woody (3.0) 或更高版本,您可以通过运行以下命令来安装软件包
apt-get install mdadm
Gentoo 在 portage 树中提供了此软件包。 在那里你可以运行
emerge mdadm
其他发行版也可能提供此软件包。 现在,让我们进入特定模式。

5.4 线性模式

好的,所以您有两个或多个分区,这些分区大小不一定相同(但当然可以相同),您想将它们附加到彼此。

设置 /etc/raidtab 文件来描述您的设置。 我为线性模式下的两个磁盘设置了一个 raidtab,该文件如下所示

raiddev /dev/md0
        raid-level      linear
        nr-raid-disks   2
        chunk-size      32
        persistent-superblock 1
        device          /dev/sdb6
        raid-disk       0
        device          /dev/sdc5
        raid-disk       1
此处不支持备用磁盘。 如果磁盘死亡,阵列也会随之死亡。 没有信息可以放在备用磁盘上。

您可能想知道为什么我们在线性模式下指定 chunk-size,因为线性模式只是将磁盘附加到一个大型阵列中,而没有并行性。 好吧,你是完全正确的,这很奇怪。 只需输入一些块大小,不必再担心了。

好的,让我们创建阵列。 运行命令

  mkraid /dev/md0

这将初始化你的阵列,写入持久化的超级块,并启动阵列。

如果你使用 mdadm,一条简单的命令如

   mdadm --create --verbose /dev/md0 --level=linear --raid-devices=2 /dev/sdb6 /dev/sdc5
应该就能创建阵列。参数的含义不言自明。输出可能看起来像这样:
  mdadm: chunk size defaults to 64K
  mdadm: array /dev/md0 started.

查看一下 /proc/mdstat。你应该看到阵列正在运行。

现在,你可以像在任何其他设备上一样创建文件系统,挂载它,并将其包含在你的 /etc/fstab 中等等。

5.5 RAID-0

你有两个或更多大小大致相同的设备,并且你想组合它们的存储容量,并通过并行访问它们来提高性能。

设置 /etc/raidtab 文件来描述你的配置。一个 raidtab 示例看起来像这样:

raiddev /dev/md0
        raid-level      0
        nr-raid-disks   2
        persistent-superblock 1
        chunk-size     4
        device          /dev/sdb6
        raid-disk       0
        device          /dev/sdc5
        raid-disk       1
与线性模式一样,这里也不支持备用磁盘。RAID-0 没有冗余,因此当一个磁盘损坏时,整个阵列都会崩溃。

同样,只需运行

  mkraid /dev/md0
来初始化阵列。这将初始化超级块并启动 raid 设备。查看一下 /proc/mdstat 以了解发生了什么。你应该看到你的设备现在正在运行。

/dev/md0 现在可以格式化、挂载、使用和随意使用了。

5.6 RAID-1

你有两个大小大致相同的设备,并且你希望它们彼此镜像。最终,你可能有更多的设备,你想将它们作为备用磁盘,如果其中一个活动设备损坏,它们将自动成为镜像的一部分。

像这样设置 /etc/raidtab 文件:

raiddev /dev/md0
        raid-level      1
        nr-raid-disks   2
        nr-spare-disks  0
        persistent-superblock 1
        device          /dev/sdb6
        raid-disk       0
        device          /dev/sdc5
        raid-disk       1
如果你有备用磁盘,你可以像这样将它们添加到设备规范的末尾:
        device          /dev/sdd5
        spare-disk      0
记住相应地设置 nr-spare-disks 条目。

好的,现在我们准备好开始初始化 RAID 了。必须构建镜像,例如,两个设备的内容(无论现在多么不重要,因为该设备尚未格式化)必须同步。

发出

  mkraid /dev/md0
命令开始镜像初始化。

查看 /proc/mdstat 文件。它应该告诉你 /dev/md0 设备已启动,镜像正在重建,以及重建完成的预计时间。

重建使用空闲的 I/O 带宽完成。因此,你的系统仍然应该相当有响应,尽管你的磁盘 LED 应该亮起。

重建过程是透明的,因此即使镜像当前正在重建,你也可以实际使用该设备。

尝试在重建运行时格式化该设备。它会工作的。你也可以在重建运行时挂载并使用它。当然,如果在重建运行时错误的磁盘损坏了,那你就不走运了。

5.7 RAID-4

注意! 我自己没有测试过这个设置。下面的设置是我最好的猜测,而不是我实际运行过的东西。如果你使用 RAID-4,请写信给 作者 并分享你的经验。

你有三个或更多大小大致相同的设备,其中一个设备明显比其他设备快,并且你希望将它们组合成一个更大的设备,同时仍然保留一些冗余信息。最终,你有一些想要用作备用磁盘的设备。

像这样设置 /etc/raidtab 文件:

raiddev /dev/md0
        raid-level      4
        nr-raid-disks   4
        nr-spare-disks  0
        persistent-superblock 1
        chunk-size      32
        device          /dev/sdb1
        raid-disk       0
        device          /dev/sdc1
        raid-disk       1
        device          /dev/sdd1
        raid-disk       2
        device          /dev/sde1
        raid-disk       3
如果我们有任何备用磁盘,它们将以类似的方式插入,遵循 raid-disk 规范;
        device         /dev/sdf1
        spare-disk     0
像往常一样。

你的阵列可以使用

   mkraid /dev/md0
命令像往常一样初始化。

在格式化设备之前,你应该查看有关 mke2fs 的特殊选项的部分。

5.8 RAID-5

你有三个或更多大小大致相同的设备,你希望将它们组合成一个更大的设备,但仍然保持一定程度的冗余以确保数据安全。最终,你有一些设备可以用作备用磁盘,它们在另一个设备发生故障之前不会参与阵列。

如果你使用 N 个设备,其中最小的设备大小为 S,则整个阵列的大小将为 (N-1)*S。这个“缺失”的空间用于奇偶校验(冗余)信息。因此,如果任何磁盘发生故障,所有数据都保持完整。但是,如果两个磁盘发生故障,则所有数据都会丢失。

像这样设置 /etc/raidtab 文件:

raiddev /dev/md0
        raid-level      5
        nr-raid-disks   7
        nr-spare-disks  0
        persistent-superblock 1
        parity-algorithm        left-symmetric
        chunk-size      32
        device          /dev/sda3
        raid-disk       0
        device          /dev/sdb1
        raid-disk       1
        device          /dev/sdc1
        raid-disk       2
        device          /dev/sdd1
        raid-disk       3
        device          /dev/sde1
        raid-disk       4
        device          /dev/sdf1
        raid-disk       5
        device          /dev/sdg1
        raid-disk       6
如果我们有任何备用磁盘,它们将以类似的方式插入,遵循 raid-disk 规范;
        device         /dev/sdh1
        spare-disk     0
等等。

对于许多这种大小的通用文件系统,32 kB 的块大小是一个很好的默认值。使用上述 raidtab 的阵列是一个 7 乘以 6 GB = 36 GB 的设备(记住 (n-1)*s = (7-1)*6 = 36)。它保存一个块大小为 4 kB 的 ext2 文件系统。如果你的文件系统更大,或者只是保存非常大的文件,你可以将阵列块大小和文件系统块大小都设置得更高。

好了,说够了。你设置了 /etc/raidtab,所以让我们看看它是否有效。运行

  mkraid /dev/md0
命令,看看会发生什么。希望你的磁盘开始疯狂工作,因为它们开始重建你的阵列。查看一下 /proc/mdstat 以了解发生了什么。

如果设备已成功创建,则重建过程现已开始。在重建阶段完成之前,你的阵列是不一致的。但是,阵列是完全功能的(当然,除了处理设备故障),你甚至可以在重建时对其进行格式化和使用。

在格式化阵列之前,请参阅有关 mke2fs 的特殊选项的部分。

好了,现在你已经有了运行的 RAID 设备,你可以随时使用

  raidstop /dev/md0
  raidstart /dev/md0
命令停止或重新启动它。

使用 mdadm,你可以使用

  mdadm -S /dev/md0
停止设备,并使用
  mdadm -R /dev/md0
重新启动它。与其将这些放入 init 文件并重新启动无数次以使其工作,不如继续阅读,并让自动检测运行起来。

5.9 持久超级块

回到“美好旧时光”(TM),raidtools 会读取你的 /etc/raidtab 文件,然后初始化阵列。但是,这将要求挂载 /etc/raidtab 所在的文件系统。如果你想在 RAID 上启动,这是不幸的。

此外,旧方法在 RAID 设备上挂载文件系统时会导致复杂情况。它们不能像往常一样放入 /etc/fstab 文件中,而必须从 init 脚本中挂载。

持久超级块解决了这些问题。当使用 /etc/raidtab 文件中的 persistent-superblock 选项初始化阵列时,会在参与阵列的所有磁盘的开头写入一个特殊的超级块。这允许内核直接从涉及的磁盘读取 RAID 设备的配置,而不是从可能并非始终可用的某些配置文件中读取。

但是,你仍然应该维护一个一致的 /etc/raidtab 文件,因为你可能需要在以后重建阵列时使用此文件。

如果你希望在系统启动时自动检测你的 RAID 设备,则持久超级块是强制性的。这在自动检测部分中进行了描述。

5.10 块大小

块大小值得解释一下。你永远无法完全并行地写入一组磁盘。如果你有两个磁盘并且想要写入一个字节,你必须在每个磁盘上写入四个位,实际上,每隔一个位会转到磁盘 0,而其他位会转到磁盘 1。硬件只是不支持这一点。相反,我们选择一些块大小,我们将其定义为可以写入设备的最小“原子”数据块。在具有两个磁盘的 RAID-0 情况下,以 4 kB 的块大小写入 16 kB 会导致第一个和第三个 4 kB 块被写入第一个磁盘,而第二个和第四个块被写入第二个磁盘。因此,对于大型写入,通过使用相当大的块,你可能会看到较低的开销,而主要保存小文件的阵列可能会从较小的块大小中受益更多。

必须为所有 RAID 级别指定块大小,包括线性模式。但是,块大小对于线性模式没有任何影响。

为了获得最佳性能,你应该试验该值以及你在阵列上放置的文件系统的块大小。

/etc/raidtab 中块大小选项的参数以千字节为单位指定块大小。因此“4”表示“4 kB”。

RAID-0

数据“几乎”并行写入阵列中的磁盘。实际上,chunk-size 字节被串行地写入每个磁盘。

如果你指定 4 kB 的块大小,并将 16 kB 写入包含三个磁盘的阵列,则 RAID 系统会将 4 kB 并行写入磁盘 0、1 和 2,然后将剩余的 4 kB 写入磁盘 0。

对于大多数阵列,32 kB 的块大小是一个合理的起点。但是,最佳值很大程度上取决于所涉及的驱动器数量、你在其上放置的文件系统的内容以及许多其他因素。对其进行试验,以获得最佳性能。

RAID-0 with ext2

以下提示由 michael@freenet-ag.de 贡献。

在 ext2fs 块组的开头有更多的磁盘活动。在单个磁盘上,这无关紧要,但如果所有块组都恰好从同一磁盘开始,则可能会损害 RAID0。例子:

使用 4k 条带大小和 4k 块大小,每个块占用一个条带。对于两个磁盘,条带-#disk-product 是 2*4k=8k。默认块组大小为 32768 个块,因此所有块组都从磁盘 0 开始,这很容易成为热点,从而降低整体性能。不幸的是,只能以 8 个块(使用 4k 块时为 32k)的步长设置块组大小,因此你无法通过使用 mkfs(8) 的 -g 选项调整块组大小来避免该问题。

如果你添加一个磁盘,则条带-#disk-product 是 12,因此第一个块组从磁盘 0 开始,第二个块组从磁盘 2 开始,第三个块组从磁盘 1 开始。由块组开头处的磁盘活动引起的负载分布在所有磁盘上。

如果你不能添加磁盘,请尝试 32k 的条带大小。条带-#disk-product 是 64k。由于你可以以 8 个块(32k)的步长更改块组大小,因此使用 32760 的块组大小可以解决该问题。

此外,块组边界应落在条带边界上。这在上面的示例中没有问题,但是在更大的条带大小下很容易发生。

RAID-1

对于写入操作,数据块大小不会影响阵列,因为无论如何,所有数据都必须写入所有磁盘。然而,对于读取操作,数据块大小指定了从参与磁盘按顺序读取多少数据。由于阵列中的所有活动磁盘都包含相同的信息,因此 RAID 层可以完全自由地选择从哪个磁盘读取信息 - RAID 代码会利用这一点来改善平均寻道时间,通过选择最适合任何给定读取操作的磁盘。

RAID-4

当在 RAID-4 阵列上执行写入操作时,校验信息也必须在校验盘上更新。

数据块大小对读取性能的影响与 RAID-0 相同,因为 RAID-4 的读取方式与 RAID-0 相同。

RAID-5

对于 RAID-5,数据块大小对于读取的意义与 RAID-0 相同。RAID-5 上的写入稍微复杂一些:当一个数据块写入 RAID-5 阵列时,相应的校验数据块也必须更新。更新校验数据块需要以下两种方法之一:

RAID 代码将选择最简单的方法来更新每个校验数据块,随着写入的进行。当然,如果您的服务器拥有大量内存和/或写入是良好且线性的,那么更新校验数据块只会产生一个额外的写入通过总线的开销(就像 RAID-1 一样)。校验计算本身非常高效,因此虽然它确实会加载系统的主 CPU,但这种影响可以忽略不计。如果写入很小并且分散在阵列的各个位置,RAID 层几乎总是需要从每个被写入的条带中读取所有未触及的数据块,以便计算校验数据块。这将导致额外的总线开销和由于额外读取导致的延迟。

对于 RAID-5 来说,一个合理的数据块大小是 128 kB,但像往常一样,您可能希望尝试不同的值。

另请参阅 mke2fs 的特殊选项部分。这会影响 RAID-5 的性能。

5.11 mke2fs 的选项

在使用 mke2fs 格式化 RAID-4 或 -5 设备时,有一个特殊的选项可用。-R stride=nn 选项将允许 mke2fs 以智能的方式将不同的 ext2 特定数据结构更好地放置在 RAID 设备上。

如果数据块大小为 32 kB,则意味着 32 kB 的连续数据将驻留在单个磁盘上。如果我们想构建一个 4 kB 块大小的 ext2 文件系统,我们意识到一个数组块中将有八个文件系统块。我们可以在创建文件系统时将此信息传递给 mke2fs 实用程序

  mke2fs -b 4096 -R stride=8 /dev/md0

RAID-{4,5} 的性能受此选项的严重影响。我不确定 stride 选项将如何影响其他 RAID 级别。如果有人有关于此的信息,请将其发送到我的方向。

ext2fs 块大小严重影响文件系统的性能。您应该始终在任何大于几百兆字节的文件系统上使用 4kB 块大小,除非您在上面存储大量非常小的文件。


6. 检测、查询和测试

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

本节是关于使用软件 RAID 系统的生活,它与阵列进行通信并对其进行修补。

请注意,在处理 md 设备时,您应该始终记住您正在处理整个文件系统。因此,尽管可能存在一些冗余来保持您的文件存活,但您必须谨慎行事。

6.1 检测驱动器故障

这里没有神秘之处。只需快速查看标准日志和状态文件就足以注意到驱动器故障。

/var/log/messages 总是必须用大量的错误消息填充屏幕,无论发生了什么。但是,当涉及到磁盘崩溃时,会报告大量的内核错误。一些令人讨厌的例子,对于受虐狂来说:

   kernel: scsi0 channel 0 : resetting for second half of retries. 
   kernel: SCSI bus is being reset for host 0 channel 0. 
   kernel: scsi0: Sending Bus Device Reset CCB #2666 to Target 0 
   kernel: scsi0: Bus Device Reset CCB #2666 to Target 0 Completed 
   kernel: scsi : aborting command due to timeout : pid 2649, scsi0, channel 0, id 0, lun 0 Write (6) 18 33 11 24 00 
   kernel: scsi0: Aborting CCB #2669 to Target 0 
   kernel: SCSI host 0 channel 0 reset (pid 2644) timed out - trying harder 
   kernel: SCSI bus is being reset for host 0 channel 0. 
   kernel: scsi0: CCB #2669 to Target 0 Aborted 
   kernel: scsi0: Resetting BusLogic BT-958 due to Target 0 
   kernel: scsi0: *** BusLogic BT-958 Initialized Successfully *** 
大多数情况下,磁盘故障看起来像这样:
   kernel: sidisk I/O error: dev 08:01, sector 1590410 
   kernel: SCSI disk error : host 0 channel 0 id 0 lun 0 return code = 28000002 
或这样:
   kernel: hde: read_intr: error=0x10 { SectorIdNotFound }, CHS=31563/14/35, sector=0
   kernel: hde: read_intr: status=0x59 { DriveReady SeekComplete DataRequest Error }
并且,正如预期的那样,经典的 /proc/mdstat 外观也会揭示问题:
   Personalities : [linear] [raid0] [raid1] [translucent]
   read_ahead not set
   md7 : active raid1 sdc9[0] sdd5[8] 32000 blocks [2/1] [U_]
在本节的后面,我们将学习如何使用 mdadm 监控 RAID,以便我们可以收到关于磁盘故障的警报报告。现在是时候更多地了解 /proc/mdstat 的解释了。

6.2 查询阵列状态

您可以随时查看 /proc/mdstat。这不会有任何坏处。让我们学习如何读取该文件。例如:

              Personalities : [raid1]
              read_ahead 1024 sectors
              md5 : active raid1 sdb5[1] sda5[0]
                    4200896 blocks [2/2] [UU]

              md6 : active raid1 sdb6[1] sda6[0]
                    2104384 blocks [2/2] [UU]

              md7 : active raid1 sdb7[1] sda7[0]
                    2104384 blocks [2/2] [UU]

              md2 : active raid1 sdc7[1] sdd8[2] sde5[0]
                    1052160 blocks [2/2] [UU]

              unused devices: none
要识别备用设备,首先查看行上的 [#/#] 值。第一个数字是定义的完整 raid 设备的数量。假设它是“n”。每个设备后面的 raid 角色编号 [#] 指示其在 raid 集中扮演的角色或功能。任何具有“n”或更高值的设备都是备用磁盘。0,1,..,n-1 用于工作的阵列。

此外,如果您遇到故障,故障设备将在 [#] 后面标记为 (F)。替换此设备的备用设备将是未标记为 (F) 的最低角色编号 n 或更高的设备。一旦重新同步操作完成,设备的角色编号就会交换。

设备出现在 /proc/mdstat 输出中的顺序没有任何意义。

最后,请记住,您可以随时使用 raidtools 或 mdadm 来检查阵列。

        mdadm --detail /dev/mdx
        lsraid -a /dev/mdx
这些命令将清楚地显示备用磁盘和故障磁盘。

6.3 模拟驱动器故障

如果您计划使用 RAID 来获得容错能力,您可能还想测试您的设置,看看它是否真的有效。现在,如何模拟磁盘故障呢?

简而言之,您不能,除非您用消防斧砍穿您想要“模拟”故障的驱动器。您永远无法知道驱动器死亡时会发生什么。它可能会在电气上占用与其连接的总线,导致该总线上的所有驱动器都无法访问。我从未听说过这种情况发生,但这是完全可能的。驱动器也可能只是向 SCSI/IDE 层报告读/写故障,这反过来又使 RAID 层优雅地处理这种情况。幸运的是,这通常是事情发展的方向。

请记住,您必须运行 RAID-{1,4,5} 才能使您的阵列在磁盘故障中幸存下来。当设备丢失时,线性或 RAID-0 将完全失败。

通过硬件强制故障

如果您想模拟驱动器故障,您可以直接拔出驱动器。您应该在关闭电源的情况下执行此操作。如果您有兴趣测试您的数据是否可以在磁盘数量少于通常数量的情况下幸存下来,那么在这里成为一个热插拔牛仔是没有意义的。关闭系统,拔下磁盘,然后再次启动。

查看系统日志,并查看 /proc/mdstat 以了解 RAID 的运行情况。它工作了吗?

如果您查看 /proc/mdstat,故障磁盘应显示为标记有 (F)。此外,mdadm 的用户应将设备状态视为 faulty

当您再次重新连接磁盘时(当然,在关闭电源的情况下,请记住),您可以使用 raidhotadd 命令将“新”设备再次添加到 RAID 中。

通过软件强制故障

较新版本的 raidtools 带有 raidsetfaulty 命令。通过使用 raidsetfaulty,您可以模拟驱动器故障,而无需拔出任何东西。

只需运行命令

    raidsetfaulty /dev/md1 /dev/sdc2
应该足以使阵列 /dev/md1 的磁盘 /dev/sdc2 发生故障。如果您正在使用 mdadm,只需键入
    mdadm --manage --set-faulty /dev/md1 /dev/sdc2
现在事情开始进展,乐趣出现了。首先,您应该在系统的日志中看到类似这样的第一行。如果您配置了备用磁盘,则会出现类似于第二行的内容。
    kernel: raid1: Disk failure on sdc2, disabling device. 
    kernel: md1: resyncing spare disk sdb7 to replace failed disk
检查 /proc/mdstat 将显示降级的阵列。如果存在备用磁盘,则应该已经开始重建。

最新 raidtools 中的另一个新实用程序是 lsraid。尝试使用

    lsraid -a /dev/md1
mdadm 的用户可以运行命令
    mdadm --detail /dev/md1
并享受看到的景象。

现在您已经了解了设备发生故障时的情况。让我们解决问题。

首先,我们将从阵列中删除故障磁盘。运行命令

    raidhotremove /dev/md1 /dev/sdc2
mdadm 的用户可以运行命令
    mdadm /dev/md1 -r /dev/sdc2
请注意,raidhotremove 无法将磁盘从正在运行的阵列中拔出。出于显而易见的原因,只有崩溃的磁盘才能从阵列中热移除(运行 raidstop 和卸载设备也不会有帮助)。

现在我们有一个 /dev/md1,它刚刚丢失了一个设备。这可能是一个降级的 RAID,或者是一个处于重建过程中的系统。我们等待恢复结束,然后将一切恢复正常。

因此,当我们把 /dev/sdc2 送回家时,这段旅程就结束了。

    raidhotadd /dev/md1 /dev/sdc2
像往常一样,您可以使用 mdadm 代替 raidtools。这应该是命令
    mdadm /dev/md1 -a /dev/sdc2
当浪子回头回到阵列时,如果需要,我们将看到它成为 /dev/md1 的活跃成员。如果不是,它将被标记为备用磁盘。这就是简化的管理。

6.4 模拟数据损坏

RAID(无论是硬件还是软件)都假定如果对磁盘的写入没有返回错误,则写入成功。因此,如果您的磁盘损坏了数据而没有返回错误,那么您的数据会损坏。当然,这种情况不太可能发生,但它是可能的,并且会导致文件系统损坏。

RAID 不能也不应该防止介质上的数据损坏。因此,故意损坏磁盘上的数据(例如使用 dd)以查看 RAID 系统将如何处理也没有任何意义。最有可能的是(除非您损坏了 RAID 超级块),RAID 层永远不会发现损坏,但您在 RAID 设备上的文件系统将被损坏。

事情应该这样运作。RAID 不能保证数据完整性,它只是允许您在磁盘发生故障时保留您的数据(也就是说,使用高于或等于 1 的 RAID 级别)。

6.5 监控 RAID 阵列

您可以使用 follow-monitor 模式将 mdadm 作为守护进程运行。如果需要,这将使 mdadm 在阵列遇到错误或发生故障时向系统管理员发送电子邮件警报。此外,follow 模式可用于在磁盘发生故障时触发应急命令,例如通过删除和重新插入来为故障磁盘提供第二次机会,以便可以自动解决非致命故障。

让我们看一个基本的例子。运行

   mdadm --monitor --mail=root@localhost --delay=1800 /dev/md2
应该释放一个 mdadm 守护进程来监控 /dev/md2。delay 参数表示将以 1800 秒的间隔进行轮询。最后,关键事件和致命错误应该通过电子邮件发送给系统管理员。这就是简化的 RAID 监控。

最后,--program--alert 参数指定在检测到事件时要运行的程序。

请注意,mdadm守护进程一旦决定有阵列需要监视,就永远不会退出,所以它通常应该在后台运行。记住,你运行的是一个守护进程,而不是一个 shell 命令。

使用 mdadm 来监控 RAID 阵列既简单又有效。然而,这种监控方式存在根本问题 - 例如,如果 mdadm 守护进程停止运行会发生什么? 为了克服这个问题,应该寻找“真正”的监控解决方案。 有许多免费软件、开源和商业解决方案可用于 Linux 上的 Software RAID 监控。 在 FreshMeat 上搜索应该会返回很多匹配项。


7. 调整、调优和故障排除

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

7.1 raid-levelraidtab

一些 GNU/Linux 发行版,例如 RedHat 8.0 和其他可能的发行版,它们的 init 脚本中存在一个 bug,如果你的 /etc/raidtabraid-level 关键字之前有空格或制表符,它们将无法在启动时启动 RAID 阵列。

解决此问题的简单方法是确保 raid-level 关键字出现在行的最开始,没有任何前导空格。

7.2 自动检测

自动检测允许内核在启动时自动识别 RAID 设备,就在普通的 partition 检测完成之后。

这需要满足以下几个条件:

  1. 你需要内核中的自动检测支持。检查这个:
  2. 你必须使用 persistent-superblock 创建 RAID 设备。
  3. RAID 中使用的设备的 partition-types 必须设置为 0xFD(使用 fdisk 并将类型设置为 "fd")。

注意:在更改分区类型之前,请确保你的 RAID 没有运行。 使用 raidstop /dev/md0 停止该设备。

如果你设置了上面 1、2 和 3,则应该设置好自动检测。 尝试重新启动。 当系统启动时,cat /proc/mdstat 应该告诉你你的 RAID 正在运行。

在启动期间,你可能会看到类似于以下的消息:

 Oct 22 00:51:59 malthe kernel: SCSI device sdg: hdwr sector= 512
  bytes. Sectors= 12657717 [6180 MB] [6.2 GB]
 Oct 22 00:51:59 malthe kernel: Partition check:
 Oct 22 00:51:59 malthe kernel:  sda: sda1 sda2 sda3 sda4
 Oct 22 00:51:59 malthe kernel:  sdb: sdb1 sdb2
 Oct 22 00:51:59 malthe kernel:  sdc: sdc1 sdc2
 Oct 22 00:51:59 malthe kernel:  sdd: sdd1 sdd2
 Oct 22 00:51:59 malthe kernel:  sde: sde1 sde2
 Oct 22 00:51:59 malthe kernel:  sdf: sdf1 sdf2
 Oct 22 00:51:59 malthe kernel:  sdg: sdg1 sdg2
 Oct 22 00:51:59 malthe kernel: autodetecting RAID arrays
 Oct 22 00:51:59 malthe kernel: (read) sdb1's sb offset: 6199872
 Oct 22 00:51:59 malthe kernel: bind<sdb1,1>
 Oct 22 00:51:59 malthe kernel: (read) sdc1's sb offset: 6199872
 Oct 22 00:51:59 malthe kernel: bind<sdc1,2>
 Oct 22 00:51:59 malthe kernel: (read) sdd1's sb offset: 6199872
 Oct 22 00:51:59 malthe kernel: bind<sdd1,3>
 Oct 22 00:51:59 malthe kernel: (read) sde1's sb offset: 6199872
 Oct 22 00:51:59 malthe kernel: bind<sde1,4>
 Oct 22 00:51:59 malthe kernel: (read) sdf1's sb offset: 6205376
 Oct 22 00:51:59 malthe kernel: bind<sdf1,5>
 Oct 22 00:51:59 malthe kernel: (read) sdg1's sb offset: 6205376
 Oct 22 00:51:59 malthe kernel: bind<sdg1,6>
 Oct 22 00:51:59 malthe kernel: autorunning md0
 Oct 22 00:51:59 malthe kernel: running: <sdg1><sdf1><sde1><sdd1><sdc1><sdb1>
 Oct 22 00:51:59 malthe kernel: now!
 Oct 22 00:51:59 malthe kernel: md: md0: raid array is not clean --
  starting background reconstruction 
这是来自未干净关闭的 RAID-5 阵列(例如,机器崩溃)的自动检测输出。 自动启动重建。 挂载此设备是完全安全的,因为重建是透明的,所有数据都是一致的(只有奇偶校验信息不一致 - 但在设备发生故障之前不需要它)。

自动启动的设备也会在关闭时自动停止。 不用担心 init 脚本。 只需像其他 /dev/sd 或 /dev/hd 设备一样使用 /dev/md 设备。

是的,就是这么简单。

你可能想在你的 init 脚本中查找任何 raidstart/raidstop 命令。 这些通常在标准的 RedHat init 脚本中找到。 它们用于旧式 RAID,并且在新式 RAID 与自动检测中没有用处。 只需删除这些行,一切都会正常运行。

7.3 在 RAID 上启动

有几种方法可以设置一个系统,使其将根文件系统挂载在 RAID 设备上。 一些发行版允许在安装过程中设置 RAID,这是设置一个良好 RAID 系统最简单的方法。

较新的 LILO 发行版可以处理 RAID-1 设备,因此内核可以在启动时从 RAID 设备加载。 LILO 会正确地将引导记录写入阵列中的所有磁盘,以便即使主磁盘发生故障也可以启动。

如果你使用 grub 而不是 LILO,那么只需启动 grub 并将其配置为使用你想从中启动的 RAID-1 阵列中的第二个(或第三个,或第四个......)磁盘作为其根设备并运行 setup。 就这样。

例如,在由 /dev/hda1 和 /dev/hdc1 组成的阵列中,其中两个分区都应该是可引导的,你应该这样做:

grub
grub>device (hd0) /dev/hdc
grub>root (hd0,0)       
grub>setup (hd0)

一些用户遇到了问题,报告说虽然连接一个驱动器可以启动,但连接两个驱动器却启动失败。 然而,用两个磁盘运行所描述的过程修复了这个问题,允许系统从任何一个驱动器或从 RAID-1 启动

确保你的系统始终可以启动的另一种方法是在完成所有设置后创建一个启动软盘。 如果 /boot 文件系统所在的磁盘损坏,你始终可以从软盘启动。 在 RedHat 和 RedHat 派生的系统上,这可以通过 mkbootdisk 命令完成。

7.4 RAID 上的根文件系统

为了使系统能够在 RAID 上启动,根文件系统 (/) 必须挂载在 RAID 设备上。 下面提供了两种实现此目的的方法。 以下方法假定你在一个普通分区上安装,然后在安装完成后,将非 RAID 根文件系统的内容移动到新的 RAID 设备上。 请注意,通常不再需要这样做,因为大多数较新的 GNU/Linux 发行版都支持在 RAID 设备上安装(并在安装过程中创建 RAID 设备)。 但是,如果你要将现有系统迁移到 RAID,你可能仍然需要使用以下方法。

方法 1

此方法假定你有一个备用磁盘可以在其上安装系统,该磁盘不是你将要配置的 RAID 的一部分。

如果你使用 IDE 磁盘执行此操作,请确保告诉你的 BIOS 所有磁盘都是“自动检测”类型,以便 BIOS 即使在磁盘丢失时也允许你的机器启动。

方法 2

此方法要求你的内核和 raidtools 了解 /etc/raidtab 文件中的 failed-disk 指令 - 如果你使用的是非常旧的系统,则可能不是这种情况,你需要先升级你的工具和/或内核。

只能在 RAID 级别 1 及更高版本上使用此方法,因为该方法使用“降级模式”下的阵列,而只有在 RAID 级别具有冗余时才有可能。 这个想法是在一个磁盘上安装一个系统,该磁盘故意标记为 RAID 中的失败磁盘,然后将系统复制到将在降级模式下运行的 RAID,最后使 RAID 使用不再需要的“安装磁盘”,清除旧的安装,但使 RAID 在非降级模式下运行。

7.5 使系统在 RAID 上启动

为了使内核能够挂载根文件系统,所有对根文件系统所在设备的支持都必须存在于内核中。 因此,为了在 RAID 设备上挂载根文件系统,内核必须具有 RAID 支持。

确保内核可以看到 RAID 设备的通常方法是简单地编译一个包含所有必要 RAID 支持的内核。 确保你将 RAID 支持编译到内核中,而不是作为可加载模块。 在挂载根文件系统之前,内核无法加载模块(从根文件系统)。

但是,由于 RedHat-6.0 附带了一个内核,该内核具有作为模块的新式 RAID 支持,因此我在此描述如何使用标准的 RedHat-6.0 内核,并且仍然使系统在 RAID 上启动。

将 RAID 作为模块启动

你必须指示 LILO 使用 RAM 磁盘才能实现此目的。 使用 mkinitrd 命令创建一个包含挂载根分区所需的所有内核模块的 ramdisk。 这可以这样做:

 mkinitrd --with=<module> <ramdisk name> <kernel>
例如:
 mkinitrd --preload raid5 --with=raid5 raid-ramdisk 2.2.5-22

这将确保指定的 RAID 模块在启动时存在,供内核在挂载根设备时使用。

将 Debian GNU/Linux 上的模块化 RAID 移动到 RAID 后

如果 Debian 用户将标准的非 RAID Debian 安装迁移到 RAID 上的根目录,则在使用 initrd 从 RAID 挂载其根文件系统时可能会遇到问题。

如果你的系统无法在启动时挂载根文件系统(你会在“内核恐慌”消息中看到这一点),那么问题可能是 initrd 文件系统没有必要的支持来从 RAID 挂载根文件系统。

Debian 似乎假设要挂载的根文件系统是当前文件系统来生成其 initrd.img 文件。 如果根文件系统被移动到 raid 设备,并且你尝试使用相同的 initrd 镜像从该设备启动,这通常会导致内核恐慌。 解决方案是使用 mkinitrd 命令,但指定建议的新根文件系统。 例如,以下命令应该在 Debian 系统上创建和设置新的 initrd:

% mkinitrd -r /dev/md0 -o /boot/initrd.img-2.4.22raid
% mv /initrd.img /initrd.img-nonraid
% ln -s /boot/initrd.img-raid /initrd.img"

7.6 将非 RAID RedHat 系统转换为在 Software RAID 上运行

本节由 IBM 的 Mark Price 编写和贡献。 自他最初的作品以来,文本已经过细微的修改。

注意:以下信息按“原样”提供,不作任何明示或暗示的陈述或保证。 你可以自行承担风险免费使用它,并且任何人都不会对因这种使用而造成的任何损害负责。

简介

该技术说明详细说明了如何转换具有非 RAID 设备的 linux 系统以使用 Software RAID 配置运行。

范围

本场景在 Redhat 7.1 下测试,但应适用于任何支持软件 RAID (md) 设备的版本。

转换前的示例系统

测试系统包含两个 SCSI 磁盘,sda 和 sdb,它们都具有相同的物理大小。作为测试设置的一部分,我配置了两个磁盘具有相同的分区布局,使用 fdisk 确保每个分区的块数相同。

DEVICE      MOUNTPOINT  SIZE        DEVICE      MOUNTPOINT  SIZE
/dev/sda1   /           2048MB      /dev/sdb1               2048MB
/dev/sda2   /boot       80MB        /dev/sdb2               80MB
/dev/sda3   /var/       100MB       /dev/sdb3               100MB
/dev/sda4   SWAP        1024MB      /dev/sdb4   SWAP        1024MB
在我们的基本示例中,我们将设置一个简单的 RAID-1 镜像,这只需要两个物理磁盘。

步骤 1 - 启动救援 CD/软盘

Redhat 安装光盘提供了一个救援模式,该模式从光盘启动 Linux 并挂载它可以在磁盘上找到的任何文件系统。

在 lilo 提示符下键入

    lilo: linux rescue

使用上述设置,安装程序可能会询问你的根文件系统位于哪个磁盘上,是 sda 还是 sdb。选择 sda。

安装程序将以以下方式挂载你的文件系统。

DEVICE      MOUNTPOINT  TEMPORARY MOUNT POINT
/dev/sda1   /           /mnt/sysimage
/dev/sda2   /boot       /mnt/sysimage/boot
/dev/sda3   /var        /mnt/sysimage/var
/dev/sda6   /home       /mnt/sysimage/home

注意: - 请记住,其他发行版可能会将你的文件系统挂载在不同的挂载点上,或者可能需要你手动挂载它们。

步骤 2 - 创建一个 /etc/raidtab 文件

创建文件 /mnt/sysimage/etc/raidtab(或你的真实 /etc 文件系统已挂载到的任何位置)。

对于我们的测试系统,raidtab 文件看起来像这样。

raiddev /dev/md0
    raid-level              1
    nr-raid-disks           2
    nr-spare-disks          0
    chunk-size              4
    persistent-superblock   1
    device                  /dev/sda1
    raid-disk               0
    device                  /dev/sdb1
    raid-disk               1

raiddev /dev/md1
    raid-level              1
    nr-raid-disks           2
    nr-spare-disks          0
    chunk-size              4
    persistent-superblock   1
    device                  /dev/sda2
    raid-disk               0
    device                  /dev/sdb2
    raid-disk               1

raiddev /dev/md2
    raid-level              1
    nr-raid-disks           2
    nr-spare-disks          0
    chunk-size              4
    persistent-superblock   1
    device                  /dev/sda3
    raid-disk               0
    device                  /dev/sdb3
    raid-disk               1

注意: - 设备顺序正确非常重要。即,/dev/sda1raid-disk 0 而不是 raid-disk 1。这指示 md 驱动程序从 /dev/sda1 同步。如果顺序相反,它将从 /dev/sdb1 同步,这将破坏你的文件系统。

现在将 raidtab 文件从你的真实根文件系统复制到当前的根文件系统。

(rescue)# cp /mnt/sysimage/etc/raidtab /etc/raidtab

步骤 3 - 创建 md 设备

有两种方法可以做到这一点,从 /mnt/sysimage/dev 复制设备文件或使用 mknod 创建它们。md 设备是一个主设备号为 9 的 (b)lock 设备。

(rescue)# mknod /dev/md0 b 9 0
(rescue)# mknod /dev/md1 b 9 1
(rescue)# mknod /dev/md2 b 9 2

步骤 4 - 卸载文件系统

为了启动 raid 设备并同步驱动器,必须卸载所有临时文件系统。

(rescue)# umount /mnt/sysimage/var
(rescue)# umount /mnt/sysimage/boot
(rescue)# umount /mnt/sysimage/proc
(rescue)# umount /mnt/sysimage
请注意,你可能无法卸载 /mnt/sysimage。此问题可能是由救援系统引起的 - 如果你选择手动挂载你的文件系统,而不是让救援系统自动执行此操作,则此问题应该消失。

步骤 5 - 启动 raid 设备

因为 /dev/sda1、/dev/sda2 和 /dev/sda3 上存在文件系统,所以必须强制启动 raid 设备。

(rescue)# mkraid --really-force /dev/md2

你可以通过 cat /proc/mdstat 文件来检查完成进度。它显示了 raid 设备的Status 以及剩余的同步百分比。

继续 /boot 和 /

(rescue)# mkraid --really-force /dev/md1
(rescue)# mkraid --really-force /dev/md0

md 驱动程序一次同步一个设备。

步骤 6 - 重新挂载文件系统

将新同步的文件系统重新挂载到 /mnt/sysimage 挂载点。

(rescue)# mount /dev/md0 /mnt/sysimage
(rescue)# mount /dev/md1 /mnt/sysimage/boot
(rescue)# mount /dev/md2 /mnt/sysimage/var

步骤 7 - 切换 root

现在你需要将当前根目录更改为你的真实根文件系统。

(rescue)# chroot /mnt/sysimage

步骤 8 - 编辑配置文件

你需要配置 lilo 和 /etc/fstab 以便从 md 设备启动和挂载。

注意: - 引导设备必须是非 RAID 设备。根设备是你的新 md0 设备。例如。

boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
linear
default=linux

image=/boot/vmlinuz
    label=linux
    read-only
    root=/dev/md0

修改 /etc/fstab

/dev/md0               /                       ext3    defaults        1 1
/dev/md1               /boot                   ext3    defaults        1 2
/dev/md2               /var                    ext3    defaults        1 2
/dev/sda4              swap                    swap    defaults        0 0

步骤 9 - 运行 LILO

在编辑了 /etc/lilo.conf 以反映新的 root=/dev/md0 并且 /dev/md1 挂载为 /boot 的情况下,我们现在可以在 chrooted 文件系统上运行 /sbin/lilo -v

步骤 10 - 更改分区类型

md 驱动程序使用的 ALL 驱动器上所有分区的分区类型必须更改为类型 0xFD。

使用 fdisk 更改分区类型,使用选项“t”。

(rescue)# fdisk /dev/sda
(rescue)# fdisk /dev/sdb

在更改所有必需的分区后,使用“w”选项将分区表保存到磁盘。

步骤 11 - 调整文件系统大小

当我们创建 raid 设备时,物理分区变得稍微小一点,因为第二个超级块存储在分区的末尾。如果你现在重新启动系统,重新启动将失败,并显示错误,表明超级块已损坏。

在重新启动之前调整它们的大小,确保除了 root 之外的所有基于 md 的文件系统都已卸载,并且以只读方式重新挂载 root。

(rescue)# mount / -o remount,ro

你将需要 fsck 每个 md 设备。这是以只读方式重新挂载 root 的原因。需要 -f 标志来强制 fsck 检查干净的文件系统。

(rescue)# e2fsck -f /dev/md0

这将生成关于不一致大小和可能损坏的超级块的相同错误。对“Abort?”说 N。

(rescue)# resize2fs /dev/md0

对所有 /dev/md 设备重复此操作。

步骤 12 - 检查清单

下一步是重新启动系统,在执行此操作之前,请查看下面的检查清单,并确保已完成所有任务。

步骤 13 - 重新启动

你现在可以安全地重新启动系统,当系统启动时,它将自动发现 md 设备(基于分区类型)。

你的根文件系统现在将被镜像。

7.7 在不同的阵列之间共享备用磁盘

在 follow/monitor 模式下运行 mdadm 时,你可以使不同的阵列共享备用磁盘。这肯定会让你节省存储空间,而不会失去回退磁盘的舒适性。

在软件 RAID 的世界中,这是一个全新的前所未有的功能:为了确保备用磁盘区域的安全性,你只需要为一个阵列提供一个空闲磁盘即可。

当 mdadm 作为守护进程运行时,你有一个代理定期轮询阵列。然后,当一个阵列上的磁盘出现故障而没有备用磁盘时,mdadm 从另一个阵列中删除一个可用的备用磁盘,并将其插入到出现故障磁盘的阵列中。现在,重建过程像往常一样在降级的阵列中开始。

要声明共享备用磁盘,只需在将 mdadm 作为守护进程调用时使用 spare-group 参数。

7.8 陷阱

永远不要重新分区作为正在运行的 RAID 一部分的磁盘。如果你必须更改作为 RAID 一部分的磁盘上的分区表,请先停止阵列,然后重新分区。

很容易在一个总线上放置太多的磁盘。一个普通的 Fast-Wide SCSI 总线可以维持 10 MB/s,这低于今天许多磁盘单独可以做到的速度。在总线上放置六个这样的磁盘当然不会给你预期的性能提升。同样容易饱和 PCI 总线 - 请记住,一个普通的 32 位 33 MHz PCI 总线的理论最大带宽约为 133 MB/秒,考虑到命令开销等,你将看到一个较低的实际传输速率。今天的一些磁盘的吞吐量超过 30 MB/秒,因此只有四个这样的磁盘实际上会使你的 PCI 总线达到最大!在设计高性能 RAID 系统时,请务必考虑整个 I/O 路径 - 有更多 PCI 总线的板卡,有 64 位和 66 MHz 总线,以及 PCI-X。

只有当 SCSI 总线几乎被其上的磁盘耗尽时,更多的 SCSI 控制器才会给你额外的性能。如果你使用两个带有两个旧 SCSI 磁盘的 2940s,而不是只在一个控制器上运行两个磁盘,你将看不到性能改进。

如果你忘记了 persistent-superblock 选项,你的阵列可能在停止后不会轻易启动。只需在 raidtab 中正确设置选项重新创建阵列即可。请注意,这将破坏阵列上的信息!

如果在删除并重新插入磁盘后 RAID-5 无法重建,这可能是因为 raidtab 中设备的排序。尝试将第一个“device …”和“raid-disk …”对移动到 raidtab 文件中阵列描述的底部。


8. 重建

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

如果你已阅读本 HOWTO 的其余部分,你应该已经对降级 RAID 的重建过程有一个相当不错的了解。让我们总结一下

就是这样。

嗯,通常是这样,除非你不幸,并且你的 RAID 已被渲染为无法使用,因为失败的磁盘多于冗余磁盘。如果多个磁盘位于同一总线上,并且一个磁盘在崩溃时将其总线带走,则实际上可能会发生这种情况。其他磁盘,无论多好,RAID 层都无法访问,因为总线已关闭,它们将被标记为有故障。在 RAID-5 上,你只能备用一个磁盘,丢失两个或多个磁盘可能是致命的。

以下部分是 Martin Bene 给我的解释,并描述了从上面概述的可怕场景中可能进行的恢复。它涉及在你的 /etc/raidtab 中使用 failed-disk 指令(因此,对于运行修补过的 2.2 内核的人来说,这仅适用于内核 2.2.10 及更高版本)。

8.1 从多个磁盘故障中恢复

方案是

简而言之:通常你会一次获得多个磁盘的临时故障;之后,RAID 超级块将不同步,你将无法再初始化你的 RAID 阵列。

如果使用 mdadm,你可以先尝试运行

  mdadm --assemble --force
如果不是,则剩下的一件事:通过 mkraid --force 重写 RAID 超级块

为了使其正常工作,你需要有一个最新的 /etc/raidtab - 如果它与原始磁盘的设备和排序不完全匹配,则它将无法按预期工作,但很可能会完全清除你曾经拥有的任何数据在你的磁盘上

查看尝试启动阵列生成的 sylog,你将看到每个超级块的事件计数;通常最好省略事件计数最低的磁盘,即最旧的磁盘。

如果你在没有 failed-disk 的情况下 mkraid,则恢复线程将立即启动并开始重建奇偶校验块 - 不一定是你当时想要的。

使用 failed-disk,你可以准确地指定要激活哪些磁盘,并可能尝试不同的组合以获得最佳结果。顺便说一句,在尝试时,仅以只读方式挂载文件系统... 这已由至少两个与我联系过的人成功使用。


9. 性能

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

本节包含来自使用软件 RAID 的真实系统的许多基准测试。还有一些关于基准测试软件的一般信息。

基准测试样本使用 bonnie 程序完成,并且始终在大小为机器物理 RAM 两倍或更大的文件上进行测试。

这里的基准测试测量单个大型文件上的输入和输出带宽。 如果人们对大型读/写的最大 I/O 吞吐量感兴趣,那么这是一个很好的信息。 但是,这些数字无法告诉我们如果将阵列用于新闻缓存、Web 服务器等,性能会如何。 始终要记住,基准测试数字是运行“合成”程序的结果。 很少有真实世界的程序会像 bonnie 那样做,尽管这些 I/O 数字看起来不错,但它们并不是最终的真实世界应用程序性能指标。 甚至差得很远。

目前,我只有我自己机器的结果。 设置如下:

三个 U2W 磁盘连接到 U2W 控制器,UW 磁盘连接到 UW 控制器。

似乎无法通过此系统上的 SCSI 总线推送超过 30 MB/s 的速度,无论是否使用 RAID。 我猜测,由于系统相当老旧,内存带宽很差,因此限制了可以通过 SCSI 控制器发送的数据量。

9.1 RAID-0

ReadSequential block input(顺序块输入)WriteSequential block output(顺序块输出)。 在所有测试中,文件大小均为 1GB。 测试是在单用户模式下完成的。 SCSI 驱动程序配置为不使用标记命令排队。


Chunk size (块大小)Block size (文件系统块大小)Read kB/s (读取速度 kB/s)Write kB/s (写入速度 kB/s)
4k1k 19712 18035
4k4k 34048 27061
8k1k 19301 18091
8k4k 33920 27118
16k1k 19330 18179
16k2k 28161 23682
16k4k 33990 27229
32k1k 19251 18194
32k4k 34071 26976

从这里可以看出,RAID 的块大小没有太大区别。 但是,ext2fs 文件系统的块大小应该尽可能大,在 IA-32 上为 4kB(例如,页面大小)。

9.2 带 TCQ 的 RAID-0

这次,SCSI 驱动程序配置为使用标记命令排队,队列深度为 8。 否则,一切都和以前一样。


Chunk size (块大小)Block size (文件系统块大小)Read kB/s (读取速度 kB/s)Write kB/s (写入速度 kB/s)
32k4k 33617 27215

没有进行更多的测试。 TCQ 似乎略微提高了写入性能,但实际上并没有太大的区别。

9.3 RAID-5

该阵列配置为在 RAID-5 模式下运行,并进行了类似的测试。


Chunk size (块大小)Block size (文件系统块大小)Read kB/s (读取速度 kB/s)Write kB/s (写入速度 kB/s)
8k1k 11090 6874
8k4k 13474 12229
32k1k 11442 8291
32k2k 16089 10926
32k4k 18724 12627

现在,块大小和文件系统块大小似乎确实有所不同。

9.4 RAID-10

RAID-10 是“镜像条带”,或者说是两个 RAID-0 阵列的 RAID-1 阵列。 块大小是 RAID-1 阵列和两个 RAID-0 阵列的块大小。 我没有进行测试这些块大小不同的情况,尽管这应该是一个完全有效的设置。


Chunk size (块大小)Block size (文件系统块大小)Read kB/s (读取速度 kB/s)Write kB/s (写入速度 kB/s)
32k1k 13753 11580
32k4k 23432 22249

没有进行更多的测试。 文件大小为 900MB,因为所涉及的四个分区每个为 500 MB,在这种设置中没有 1G 文件的大小(在两个 1000MB 阵列上进行 RAID-1)。

9.5 全新的基准测试工具

要检查 RAID 系统的速度和性能,请勿使用 hdparm。 它不会对阵列进行真正的基准测试。

请查看此处描述的工具,而不是 hdparm:IOzone 和 Bonnie++。

IOzone 是一个小型、通用且现代的工具。 它对 read, write, re-read, re-write, read backwards, read strided, fread, fwrite, random read, pread, mmap, aio_readaio_write 操作进行文件 I/O 性能基准测试。 不用担心,它可以在 OSDL STP 中的任何 ext2、ext3、reiserfs、JFS 或 XFS 文件系统上运行。

您还可以使用 IOzone 来显示吞吐量性能,作为进程数和文件系统中使用的磁盘数的函数,这在涉及 RAID 条带化时很有趣。

尽管 IOzone 的文档以 Acrobat/PDF、PostScript、nroff 和 MS Word 格式提供,但我们将在此处介绍一个 IOzone 在操作中的精美示例

iozone -s 4096 
这将运行一个使用 4096KB 文件大小的测试。

这是 IOzone 提供的输出质量的一个例子

        File size set to 4096 KB
        Output is in Kbytes/sec
        Time Resolution = 0.000001 seconds.
        Processor cache size set to 1024 Kbytes.
        Processor cache line size set to 32 bytes.
        File stride size set to 17 * record size.
                                                            random  random    bkwd  record  stride            
              KB  reclen   write rewrite    read    reread    read   write    read rewrite    read   fwrite frewrite   fread  freread
            4096       4   99028  194722   285873   298063  265560  170737  398600  436346  380952    91651   127212  288309   292633
现在您只需要了解使 IOzone 可用于 RAID 基准测试的功能:涉及 RAID 的文件操作是 read strided。 上面的例子显示了 380.952Kb/sec 的 read strided,所以你可以自己去计算。

Bonnie++ 似乎更专注于基准测试单个驱动器,而不是 RAID,但它可以测试 32 位计算机上超过 2Gb 的存储空间,并测试文件 creat, stat, unlink 操作。


10. 相关工具

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

虽然本 HOWTO 中没有描述,但已经开发了一些用于软件 RAID 系统的有用工具。

10.1 RAID 调整大小和转换

向现有阵列添加另一个磁盘并不容易。 已经开发了一种允许进行此操作的工具,可从 http://unthought.net/raidreconf 获得。 该工具允许在 RAID 级别之间进行转换,例如将双磁盘 RAID-1 阵列转换为四磁盘 RAID-5 阵列。 它还允许进行块大小转换和简单的磁盘添加。

请注意,此工具并非真正“可以投入生产”。 到目前为止,它似乎运行良好,但这实际上是一个非常耗时的过程,如果失败,将绝对保证您的数据将无法恢复地分散在您的磁盘上。 在试验此工具之前,您绝对必须保留良好的备份

10.2 备份

请记住,RAID 不能替代良好的备份。 您的 RAID 配置中的任何冗余都无法让您恢复一周或一个月前的数据,RAID 也无法在火灾、地震或其他灾难中幸存。

您必须保护您的数据,不仅使用 RAID,还使用定期的良好备份。 一个出色的备份系统是 Amanda 备份系统。


11. RAID 分区 / RAID 上的 LVM

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

RAID 设备无法像普通磁盘那样进行分区。 这对于想要在 RAID-1 中运行两个磁盘,但将系统划分为多个不同文件系统的系统来说,可能是一个真正的麻烦。 一个可怕的例子可能如下所示

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/md2              3.8G  640M  3.0G  18% /
/dev/md1               97M   11M   81M  12% /boot
/dev/md5              3.8G  1.1G  2.5G  30% /usr
/dev/md6              9.6G  8.5G  722M  93% /var/www
/dev/md7              3.8G  951M  2.7G  26% /var/lib
/dev/md8              3.8G   38M  3.6G   1% /var/spool
/dev/md9              1.9G  231M  1.5G  13% /tmp
/dev/md10             8.7G  329M  7.9G   4% /var/www/html

11.1 RAID 设备分区

如果可以对 RAID 设备进行分区,则管理员可以简单地创建一个 /dev/md0 device 设备,像往常一样对其进行分区,并将文件系统放在那里。 相反,使用今天的软件 RAID,他必须为每个文件系统创建一个 RAID-1 设备,即使系统中只有两个磁盘。

已经有各种内核补丁可以允许对 RAID 设备进行分区,但截至撰写本文时,这些补丁均未进入内核。 简而言之; 目前无法对 RAID 设备进行分区 - 但幸运的是,另一种解决方案可以解决这个问题。

11.2 RAID 上的 LVM

分区问题的解决方案是 LVM,逻辑卷管理。 LVM 已经在稳定的 Linux 内核系列中存在很长时间了 - 2.6 内核系列中的 LVM2 是对 2.4 内核系列中较旧的 LVM 支持的进一步改进。 虽然 LVM 传统上因其复杂性而吓跑了一些人,但如果管理员希望在服务器上使用多个文件系统,那么它确实是应该考虑的事情。

我们不会尝试在本 HOWTO 中描述 LVM 设置,因为已经有一个专门用于此目的的 HOWTO。 但是,将提供一个 RAID + LVM 设置的小例子。 考虑下面 df 的输出,这是一个这样的系统

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/md0              942M  419M  475M  47% /
/dev/vg0/backup        40G  1.3M   39G   1% /backup
/dev/vg0/amdata       496M  237M  233M  51% /var/lib/amanda
/dev/vg0/mirror        62G   56G  2.9G  96% /mnt/mirror
/dev/vg0/webroot       97M  6.5M   85M   8% /var/www
/dev/vg0/local        2.0G  458M  1.4G  24% /usr/local
/dev/vg0/netswap      3.0G  2.1G 1019M  67% /mnt/netswap
你可能会问“有什么区别”…… 好吧,这个系统只有两个 RAID-1 设备 - 一个用于根文件系统,另一个在 df 输出中看不到 - 这是因为 /dev/md1 用作 LVM 的“物理卷”。 这意味着 /dev/md1 充当名为 vg0 的“卷组”中所有“卷”的“后备存储”。

所有这些“卷”术语都在 LVM HOWTO 中进行了解释 - 如果您没有完全理解上述内容,则无需担心 - 这些细节现在并不特别重要(如果您要设置 LVM,无论如何都需要阅读 LVM HOWTO)。 重要的是此设置比多 md 设备设置的优势

总而言之 - 对于具有多个文件系统的服务器,LVM(和 LVM2)绝对是一个相当简单的解决方案,应考虑在软件 RAID 之上使用。 如果您想了解有关 LVM 的更多信息,请继续阅读 LVM HOWTO。


12. 鸣谢

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

以下人员为本文档的创建做出了贡献

请向作者提交更正、建议等。这是改进本 HOWTO 的唯一方法。


13. 更新日志

本 HOWTO 已被弃用;Linux RAID HOWTO 由 linux-raid 社区维护,网址为 http://raid.wiki.kernel.org/

13.1 1.1 版本