Linux 下的 RAID0 实现
我们这些在家中使用 Linux 的人,与那些将 Linux 视为昂贵且专有的 Unix 系统的经济高效的开放替代方案的企业,需求有所不同。通常,RAID 设备不是家庭用户的必需品,尽管许多运行条带化交换分区的用户报告速度有了很大的提高。由 Marc Zyngier 编写的多设备 (md) 驱动程序将 RAID 带到了 Linux。
md 是一个驱动程序(自 1.3.69 版本以来包含在标准内核发行版中),它允许您将多个磁盘分区组合在一起,使其充当单个块设备。md 与其他驱动程序的不同之处在于,它实际上并不访问构成它的物理设备。md 将来自上层的请求重定向到所涉及的设备,并且与接口无关,从而允许将 IDE、SCSI 和 XT 磁盘分组为单个设备。
md 可以使用其设备的三种模式:线性模式、RAID0 和 RAID1。 在线性模式下,物理设备彼此附加。当第一个设备达到容量时,数据将被发送到组中的下一个设备。此模式允许创建具有更大容量的设备,但不能真正提高性能。 RAID0(或条带化)设备将数据均匀地分布在组中的所有设备上。每次写入都被分成“块”,并且这些块按顺序放置在物理设备上。 RAID0 提供了性能改进,尤其是在并发磁盘访问方面。 RAID1 在 RAID0 的基础上添加了镜像。我认为 RAID0 是这些模式中最重要的;因此,它是本文余下部分的重点。
在规划 RAID0 实现时,需要记住两个注意事项:物理设备布局和设备大小。如果在同一物理设备上使用分区,您将看不到任何实际的好处。我能给出的最佳建议是使用多个 SCSI 磁盘,每个分区具有相同的块数。这似乎能提供最佳性能。md 可以处理不同大小的设备,只要存在显着差异即可。使用 1,000,000 块设备和 1,000,001 块设备可能会导致问题。如果要使用 500MB、1000MB 和 1500MB 分区创建 md 设备,它将可以正常运行;md 会将设备分成 500MB 的“条带区”。一旦向设备写入 1500MB,第一个物理设备将满。然后,将在第二个和第三个设备上使用第二个条带。再写入 1000MB 后,所有数据都将放置在最后一个设备上。在这种安排中,随着磁盘使用率的增加,性能会下降。
一旦设置好要使用的分区,就必须重新编译内核并启用 md 支持。运行 make config (menuconfig 或 xconfig) 并选择 “多设备支持” 以及 “线性” 或 “RAID0” 模式。像往常一样编译。当使用新内核重新启动时,您应该会收到如下消息
md driver 0.35 MAX_MD_DEV=4, MAX_REAL=8 raid0 personality registered
如果它过去太快,并且您认为您可能错过了它,请使用以下命令
dmesg | more以接收启动时记录的消息的重播。消息显示已安装 md 版本 0.35,支持最多四个设备,每个设备最多由八个物理设备组成,并支持 RAID0。如果您认为您需要超过 md0 到 md3,或者将在一个 md 中使用超过八个物理设备,则必须在编译之前编辑 md.h 文件;它通常位于 /usr/src/linux/include/linux 中。更改为 MAX_REAL 或 MAX_MD_DEV 定义的值以满足您的要求。
您现在内核中已支持 md,或者如果您选择模块方式,则作为可加载模块。接下来,您需要获取用于管理 md 设备的工具。尽管内核支持 md,但似乎大多数发行版都不包含这些工具。它们可以从 ftp://sweet-smoke.ufr-info-p7.ibp.fr/public/Linux 或美国的镜像站点 ftp://linux.nrao.edu/pub/linux/packages/MD-driver 获取。Red Hat 软件在 ftp://ftp.redhat.com/pub/contrib/RPMS 提供 RPM 发行版。文件 md-035-3.i386.rpm 包含所需的二进制文件。下载并解压缩源代码后,成为 root 用户并运行 make install。编译很简单,我从未遇到过问题。如果您的 Linux 源代码树不在 /usr/src/linux 中,则需要编辑 Makefile;否则,它应该可以开箱即用。
现在您已准备好实际创建一个 RAID0 设备。编译创建了几个用于此任务的工具:mdadd、mdrun 和 mdstop。mdadd 用于向 md 设备添加块设备。如果要使用 sda1、sdb1 和 sdc1,请发出以下命令
/sbin/mdadd /dev/md0 /dev/sda1 /dev/sdb1 \ /dev/sdc1
此命令将 sda1、sdb1 和 sdc1 添加到 md0。也可以通过给出以下命令来完成相同的操作
/sbin/mdadd /dev/md0 /dev/sda1 /sbin/mdadd /dev/md0 /dev/sdb1 /sbin/mdadd /dev/md0 /dev/sdc1请记住,添加设备的顺序非常重要。如果更改顺序,则先前写入的任何数据都将丢失。我建议以看起来合乎逻辑的顺序添加设备,然后坚持使用它。
现在我们必须启动设备。mdrun 具有以下命令语法
/sbin/mdrun -p
其中 x 指示模式:-l 表示线性模式,0 表示 RAID0,1 表示 RAID1。要启动我们刚刚创建的设备,命令将是
/sbin/mdrun -p0 /dev/md0使用 RAID 设备时,您可以使用的另一个选项是 -cnk 来指定块大小,其中 n 是以 KB 为单位的块大小(n 必须是 2 的幂)。例如,-c6k 表示 6KB 的块大小。默认值是您的 PAGE_SIZE 的值。块大小的最佳值将是平均请求大小,因此两个请求很可能会写入不同的物理磁盘。如果您计划将 md 用于交换空间,请坚持使用默认值。
设备运行后,您可以创建一个文件系统并挂载它。例如
/sbin/mkfs.ext2 /dev/md0 mount /dev/md0 /var/spool/news
这将创建一个 ext2 文件系统,然后将其挂载为新闻假脱机目录。您的 RAID0 设备现在已准备好用于数据。要检查其状态,请键入
cat /proc/mdstat并接收以下输出
Personalities : [2 raid0] read_ahead 120 sectors md0 : active raid0 sda1 sdb1 sdc1 168588 blocks 4k chunks md1 : inactive md2 : inactive md3 : inactive此报告告诉您支持哪些模式、当前的 read_ahead 值、每个 md 设备的状态、其模式、物理部件、总大小和块大小。
此时,我们的 RAID 设备已运行并挂载;一旦机器重新启动,我们将不得不重新运行 mdadd、mdrun 和 mount。所有这些都可以轻松添加到您的 rc.local 文件中,但有一种更好的方法。mdcreate 会自动创建一个 /etc/mdtab 文件。mdtab 文件的功能类似于 /etc/fstab 文件,它通知系统组件设备、模式和挂载点。语法是
mdcreate [-cxk] mode md_dev dev0 dev1 ...
要为我们的示例设备创建 mdtab 文件,我们将使用
/sbin/mdcreate raid0 /dev/md0 /dev/sda1\ /dev/sdb1 /dev/sdc1 cat /etc/mdtab # mdtab entry for /dev/md0: # /dev/md0 raid0,4k,0,fe8a9ffb /dev/sda1 /dev/sdb1 /dev/sdc1有了这个文件,我们可以将 mdadd 命令简化为 mdadd -a 或 mdadd -ar 以自动添加设备并运行它们。这也确保了设备将始终以正确的顺序添加。
如果需要停止设备,请先卸载它,然后使用 mdstop。mdstop 将释放物理设备并刷新缓冲区。对于我们的示例设备,如果新闻服务器正在运行,我们将首先使用以下命令停止它
/sbin/mdstop /dev/md0
然后,我们可以使用以下命令卸载它
umount /var/spool/newsmd0 现在处于非活动状态,物理分区可以在其他地方使用。请记住,如果设备已停止,则无法访问写入 md 设备的任何数据。
使用 md,RAID 设备的实现和管理变得容易。随着开发的继续,我们将看到 RAID1 以及镜像管理和恢复所需的工具。要及时了解开发过程,请加入 Linux-raid 邮件列表。要订阅,请发送电子邮件至 Majordomo@vger.rutgers.edu,邮件正文只有一行内容,内容为
subscribe linux-raid <
请务必查看 md 包附带的文档。正是像这样的工具正在帮助 Linux 在商业领域找到一席之地。
Jay Munsterman 刚从华盛顿特区搬到佐治亚州亚特兰大,他在那里使用各种 Unix 平台工作,Linux 是他最喜欢的平台。在业余时间,他喜欢与即将成为妻子的 Denessa 和他们的狗 Melman 一起度过时光。可以通过 jmunster@mindspring.com 联系到 Jay。