本 HOWTO 已弃用;Linux RAID HOWTO 由 linux-raid 社区维护,以 wiki 形式存在,网址为 http://raid.wiki.kernel.org/
以下是任何 RAID 级别所需的内容
所有这些在今天的大多数 GNU/Linux 发行版中都是标准配置。
如果您的系统支持 RAID,您应该有一个名为 /proc/mdstat
的文件。记住它,这个文件是您的朋友。如果您没有该文件,可能是您的内核不支持 RAID。通过执行 cat
/proc/mdstat
来查看其内容。它应该告诉您,您已注册了正确的 RAID personality(例如,RAID 模式),并且当前没有 RAID 设备处于活动状态。
创建您想要包含在 RAID 集中的分区。
几乎每个主要的 Linux 发行版都包含 RAID 工具。
重要提示: 如果使用 Debian Woody (3.0) 或更高版本,您可以通过运行以下命令安装软件包
apt-get install raidtools2这个
raidtools2
是旧 raidtools
软件包的现代版本,它不支持持久超级块和奇偶校验算法设置。
您可以从 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 mdadmGentoo 在 portage 树中提供了此软件包。在那里您可以运行
emerge mdadm其他发行版也可能提供此软件包。现在,让我们进入特定模式。
好的,假设您有两个或多个分区,它们的大小不一定相同(当然也可以相同),您想将它们彼此附加起来。
设置 /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
。嗯,您完全正确,这很奇怪。只需输入一些 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
中等等。
您有两个或多个大小大致相同的设备,并且您想要结合它们的存储容量,并通过并行访问它们来结合它们的性能。
设置 /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 现在可以格式化、挂载、使用和随意使用了。
您有两个大小大致相同的设备,并且您希望这两个设备互为镜像。最终,您有更多设备,您希望将它们保持为备用磁盘,如果其中一个活动设备损坏,它们将自动成为镜像的一部分。
像这样设置 /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 应该会很好地发光。
重建过程是透明的,因此即使镜像当前正在重建,您也可以实际使用该设备。
尝试在重建运行时格式化设备。它会工作。您也可以在重建运行时挂载并使用它。当然,如果在重建运行时错误的磁盘损坏,您就倒霉了。
注意! 我自己没有测试过这个设置。下面的设置是我最好的猜测,而不是我实际运行过的东西。如果您使用 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 特殊选项的部分。
您有三个或更多大小大致相同的设备,您想将它们组合成一个更大的设备,但仍然保持一定程度的冗余以确保数据安全。最终,您有一些设备可以用作备用磁盘,在另一个设备发生故障之前,这些设备不会参与阵列。
如果您使用 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 的 chunk size 是一个不错的默认值。使用上述 raidtab 的阵列是一个 7 乘以 6 GB = 36 GB(记住 (n-1)*s = (7-1)*6 = 36)的设备。它包含一个块大小为 4 kB 的 ext2 文件系统。如果您的文件系统更大,或者只是包含非常大的文件,您可以提高阵列 chunk-size 和文件系统块大小。
好了,说够了。您设置了 /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 文件并重启无数次以使其工作,不如继续阅读,并使自动检测运行起来。
回到“美好旧时光”(TM),raidtools 会读取您的 /etc/raidtab
文件,然后初始化阵列。但是,这将要求挂载 /etc/raidtab
所在的文件系统。如果您想在 RAID 上启动,这很不方便。
此外,旧方法在 RAID 设备上挂载文件系统时会导致复杂情况。它们不能像往常一样放在 /etc/fstab
文件中,而必须从 init 脚本中挂载。
持久超级块解决了这些问题。当在 /etc/raidtab
文件中使用 persistent-superblock
选项初始化阵列时,特殊的超级块会被写入参与阵列的所有磁盘的开头。这允许内核直接从所涉及的磁盘读取 RAID 设备的配置,而不是从某些可能并非始终可用的配置文件中读取。
但是,您仍然应该维护一致的 /etc/raidtab
文件,因为您可能需要此文件来稍后重建阵列。
如果您想在系统启动时自动检测您的 RAID 设备,则持久超级块是强制性的。这在自动检测部分中描述。
chunk-size 值得解释一下。您永远无法完全并行地写入一组磁盘。如果您有两个磁盘并想写入一个字节,您将不得不在每个磁盘上写入四个位,实际上,每隔一位将转到磁盘 0,其余位转到磁盘 1。硬件不支持这样做。相反,我们选择一些 chunk-size,我们将其定义为可以写入设备的数据的最小“原子”质量。在 chunk size 为 4 kB 的情况下写入 16 kB,将导致第一个和第三个 4 kB chunk 被写入第一个磁盘,第二个和第四个 chunk 被写入第二个磁盘,在具有两个磁盘的 RAID-0 情况下。因此,对于大型写入,通过使用相当大的 chunk,您可能会看到较低的开销,而主要保存小文件的阵列可能会从较小的 chunk size 中获益更多。
chunk size 必须为所有 RAID 级别指定,包括线性模式。但是,chunk-size 对于线性模式没有任何影响。
为了获得最佳性能,您应该试验该值,以及您放在阵列上的文件系统的块大小。
/etc/raidtab
中 chunk-size 选项的参数以千字节为单位指定 chunk-size。因此,“4”表示“4 kB”。
数据“几乎”并行写入阵列中的磁盘。实际上,chunk-size
字节是串行写入每个磁盘的。
如果您指定 4 kB 的 chunk size,并将 16 kB 写入由三个磁盘组成的阵列,则 RAID 系统将并行地将 4 kB 写入磁盘 0、1 和 2,然后将剩余的 4 kB 写入磁盘 0。
对于大多数阵列,32 kB 的 chunk-size 是一个合理的起点。但是,最佳值很大程度上取决于所涉及的驱动器数量、您放在其上的文件系统的内容以及许多其他因素。对其进行试验,以获得最佳性能。
以下提示由 michael@freenet-ag.de 贡献
在 ext2fs 块组的开头有更多的磁盘活动。在单个磁盘上,这无关紧要,但如果所有块组恰好在同一磁盘上开始,则可能会损害 RAID0。例子
使用 4k 条带大小和 4k 块大小,每个块占用一个条带。使用两个磁盘,条带-#磁盘-乘积为 2*4k=8k。默认块组大小为 32768 个块,因此所有块组都在磁盘 0 上开始,这很容易成为热点,从而降低整体性能。不幸的是,块组大小只能以 8 个块(使用 4k 块时为 32k)的步长设置,因此您无法通过使用 mkfs(8) 的 -g 选项调整块组大小来避免此问题。
如果您添加一个磁盘,则条带-#磁盘-乘积为 12,因此第一个块组在磁盘 0 上开始,第二个块组在磁盘 2 上开始,第三个块组在磁盘 1 上开始。块组开头处的磁盘活动引起的负载分布在所有磁盘上。
如果您无法添加磁盘,请尝试 32k 的条带大小。条带-#磁盘-乘积为 64k。由于您可以以 8 个块(32k)的步长更改块组大小,因此使用 32760 的块组大小可以解决问题。
此外,块组边界应落在条带边界上。这在上面的示例中没有问题,但在更大的条带大小下很容易发生。
对于写入,chunk-size 不会影响阵列,因为无论如何所有数据都必须写入所有磁盘。但是,对于读取,chunk-size 指定要从参与磁盘串行读取多少数据。由于阵列中的所有活动磁盘都包含相同的信息,因此 RAID 层可以完全自由地选择从哪个磁盘读取信息 - RAID 代码使用此功能通过选择最适合任何给定读取操作的磁盘来提高平均寻道时间。
当在 RAID-4 阵列上完成写入时,奇偶校验信息也必须在奇偶校验磁盘上更新。
chunk-size 以与 RAID-0 相同的方式影响读取性能,因为 RAID-4 的读取以相同的方式完成。
在 RAID-5 上,chunk size 对于读取的含义与 RAID-0 相同。RAID-5 上的写入稍微复杂一些:当 chunk 写入 RAID-5 阵列时,相应的奇偶校验 chunk 也必须更新。更新奇偶校验 chunk 需要以下任一项
对于 RAID-5,合理的 chunk-size 是 128 kB,但与往常一样,您可能需要对此进行试验。
另请参阅有关 mke2fs 特殊选项的部分。这会影响 RAID-5 性能。
使用 mke2fs 格式化 RAID-4 或 -5 设备时,有一个特殊的选项可用。 -R stride=nn
选项将允许 mke2fs 以更智能的方式在 RAID 设备上更好地放置不同的 ext2 特定数据结构。
如果 chunk-size 为 32 kB,则意味着 32 kB 的连续数据将驻留在一个磁盘上。如果我们想要构建块大小为 4 kB 的 ext2 文件系统,我们意识到一个阵列 chunk 中将有八个文件系统块。我们可以在创建文件系统时将此信息传递给 mke2fs 实用程序
mke2fs -b 4096 -R stride=8 /dev/md0
RAID-{4,5} 性能受此选项的严重影响。我不确定 stride 选项将如何影响其他 RAID 级别。如果有人对此有信息,请发送到我的方向。
ext2fs 块大小严重影响文件系统的性能。您应该始终在任何大于几百兆字节的文件系统上使用 4kB 块大小,除非您在其上存储大量非常小的文件。