本 HOWTO 已弃用;Linux RAID HOWTO 由 linux-raid 社区维护,地址为 http://raid.wiki.kernel.org/
raid-level
和 raidtab
一些 GNU/Linux 发行版,如 RedHat 8.0 以及可能的其他发行版,其 init 脚本中存在一个错误,如果您的 /etc/raidtab
文件在 raid-level
关键字之前有空格或制表符,它们将无法在启动时启动 RAID 阵列。
解决此问题的简单方法是确保 raid-level
关键字出现在行的最开头,前面没有任何类型的空格。
自动检测允许内核在启动时自动识别 RAID 设备,就在完成普通分区检测之后。
这需要满足以下几个条件
注意:在更改分区类型之前,请务必确保您的 RAID 未运行。使用 raidstop /dev/md0
停止设备。
如果您完成了上述 1、2 和 3 的设置,则应已设置好自动检测。尝试重启。当系统启动后,查看 /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 中使用自动检测没有用处。只需删除这些行,一切都会正常。
有几种方法可以设置一个系统,使其根文件系统挂载在 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
命令完成此操作。
为了使系统在 RAID 上启动,根文件系统 (/) 必须挂载在 RAID 设备上。下面提供了实现此目的的两种方法。以下方法假设您安装在普通分区上,然后在安装完成后,将非 RAID 根文件系统的内容移动到新的 RAID 设备上。请注意,这通常不再需要,因为大多数较新的 GNU/Linux 发行版都支持在 RAID 设备上安装(并在安装过程中创建 RAID 设备)。但是,如果您要将现有系统迁移到 RAID,您可能仍然希望使用以下方法。
此方法假定您有一个备用磁盘,可以在其上安装系统,该磁盘不是您将要配置的 RAID 的一部分。
mke2fs
),并将其挂载在 /mnt/newroot 下cd / find . -xdev | cpio -pm /mnt/newroot另一种将所有内容从 / 复制到 /mnt/newroot 的方法可以是
cp -ax / /mnt/newroot
/mnt/newroot/etc/fstab
文件以使用正确的设备(根文件系统的 /dev/md?
根设备)。/boot
文件系统,并将启动设备挂载到 /mnt/newroot/boot
上。这是 LILO 在下一步成功运行所必需的。/mnt/newroot/etc/lilo.conf
以指向正确的设备。启动设备仍然必须是常规磁盘(非 RAID 设备),但根设备应指向您的新 RAID。完成后,运行lilo -r /mnt/newroot此 LILO 运行应无错误完成。
如果您正在使用 IDE 磁盘执行此操作,请务必告知您的 BIOS 所有磁盘都是“自动检测”类型,以便 BIOS 即使在缺少磁盘的情况下也允许您的机器启动。
此方法要求您的内核和 raidtools 理解 /etc/raidtab
文件中的 failed-disk
指令 - 如果您正在使用非常旧的系统,则可能不是这种情况,您将需要首先升级您的工具和/或内核。
您只能在 RAID 级别 1 及以上级别使用此方法,因为该方法使用“降级模式”的阵列,而这仅在 RAID 级别具有冗余时才有可能。其想法是在一个磁盘上安装系统,该磁盘在 RAID 中被有意标记为失败,然后将系统复制到将在降级模式下运行的 RAID,最后使 RAID 使用不再需要的“安装磁盘”,擦除旧安装,但使 RAID 在非降级模式下运行。
/etc/raidtab
文件中的 failed-disk
来设置 RAID。不要将 failed-disk
作为 raidtab
中的第一个磁盘,这会给您启动 RAID 带来问题。创建 RAID,并在其上放置一个文件系统。如果使用 mdadm,您可以通过运行类似 mdadm -C /dev/md0 --level raid1 --raid-disks 2 missing /dev/hdc1
的命令来创建一个降级阵列,请注意 missing
参数。/etc/raidtab
文件以包含之前 failed-disk
作为正常的 raid-disk
。现在,将磁盘 raidhotadd
到您的 RAID。为了使内核能够挂载根文件系统,内核中必须存在对根文件系统所在的设备的所有支持。因此,为了在 RAID 设备上挂载根文件系统,内核必须具有 RAID 支持。
确保内核可以看到 RAID 设备的通常方法是简单地编译一个内核,其中编译了所有必要的 RAID 支持。确保将 RAID 支持编译到内核中,而不是作为可加载模块。内核无法在根文件系统挂载之前(从根文件系统)加载模块。
但是,由于 RedHat-6.0 附带的内核将新式 RAID 支持作为模块,因此我在此描述如何使用标准的 RedHat-6.0 内核,并仍然使系统在 RAID 上启动。
您将必须指示 LILO 使用 RAM 磁盘才能实现此目的。使用 mkinitrd
命令创建一个 ramdisk,其中包含挂载根分区所需的所有内核模块。这可以这样做
mkinitrd --with=<module> <ramdisk name> <kernel>例如
mkinitrd --preload raid5 --with=raid5 raid-ramdisk 2.2.5-22
这将确保指定的 RAID 模块在启动时存在,供内核在挂载根设备时使用。
Debian 用户在尝试使用 initrd 从 RAID 挂载其根文件系统时可能会遇到问题,如果他们已将标准的非 RAID Debian 安装迁移到 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"
本节由 IBM 的 Mark Price 编写和贡献。自他的原始作品以来,文本已经过细微修改。
注意: 以下信息“按原样”提供,不作任何明示或暗示的陈述或保证。您可以自行承担风险自由使用它,对于因这种使用而引起的任何损害,其他任何人概不负责。
本技术说明详细介绍了如何将具有非 RAID 设备的 linux 系统转换为使用 Software RAID 配置运行。
此场景已在 Redhat 7.1 上测试,但应适用于任何支持 Software 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 镜像,只需要两个物理磁盘。
redhat 安装 CD 提供了一种救援模式,该模式从 CD 启动到 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
注意:- 请记住,其他发行版可能会将您的文件系统挂载在不同的挂载点上,或者可能需要您手动挂载它们。
/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/sda1
是 raid-disk 0
而不是 raid-disk 1
。这指示 md 驱动程序从 /dev/sda1
同步,如果反过来,它将从 /dev/sdb1
同步,这将破坏您的文件系统。
现在将 raidtab 文件从您的真实根文件系统复制到当前根文件系统。
(rescue)# cp /mnt/sysimage/etc/raidtab /etc/raidtab
有两种方法可以做到这一点,从 /mnt/sysimage/dev 复制设备文件或使用 mknod 创建它们。md 设备是一个 (b)lock 设备,主设备号为 9。
(rescue)# mknod /dev/md0 b 9 0 (rescue)# mknod /dev/md1 b 9 1 (rescue)# mknod /dev/md2 b 9 2
为了启动 raid 设备并同步驱动器,必须卸载所有临时文件系统。
(rescue)# umount /mnt/sysimage/var (rescue)# umount /mnt/sysimage/boot (rescue)# umount /mnt/sysimage/proc (rescue)# umount /mnt/sysimage请注意,您可能无法卸载
/mnt/sysimage
。此问题可能是由救援系统引起的 - 如果您选择手动挂载您的文件系统,而不是让救援系统自动执行此操作,则此问题应该消失。
由于 /dev/sda1、/dev/sda2 和 /dev/sda3 上有文件系统,因此必须强制启动 raid 设备。
(rescue)# mkraid --really-force /dev/md2
您可以通过查看 /proc/mdstat
文件来检查完成进度。它显示了 raid 设备的状态和剩余同步的百分比。
继续 /boot 和 /
(rescue)# mkraid --really-force /dev/md1 (rescue)# mkraid --really-force /dev/md0
md 驱动程序一次同步一个设备。
将新同步的文件系统重新挂载回 /mnt/sysimage 挂载点。
(rescue)# mount /dev/md0 /mnt/sysimage (rescue)# mount /dev/md1 /mnt/sysimage/boot (rescue)# mount /dev/md2 /mnt/sysimage/var
您现在需要将当前根目录更改为您的真实根文件系统。
(rescue)# chroot /mnt/sysimage
您需要适当地配置 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
在编辑了 /etc/lilo.conf
以反映新的 root=/dev/md0
并且 /dev/md1
挂载为 /boot
的情况下,我们现在可以在 chrooted 文件系统上运行 /sbin/lilo -v
。
md 驱动程序使用的所有驱动器上的所有分区的所有分区类型都必须更改为类型 0xFD。
使用 fdisk 更改分区类型,使用选项 't'。
(rescue)# fdisk /dev/sda (rescue)# fdisk /dev/sdb
在更改所有必需的分区后使用 'w' 选项将分区表保存到磁盘。
当我们创建 raid 设备时,物理分区变得略小,因为第二个超级块存储在分区的末尾。如果您现在重新启动系统,重新启动将失败,并显示错误,指示超级块已损坏。
在重新启动之前调整它们的大小,确保除根目录外,所有基于 md 的文件系统都已卸载,并将根目录重新挂载为只读。
(rescue)# mount / -o remount,ro
您将被要求 fsck 每个 md 设备。这是重新挂载根目录为只读的原因。需要 -f 标志来强制 fsck 检查干净的文件系统。
(rescue)# e2fsck -f /dev/md0
这将生成关于大小不一致和可能损坏的超级块的相同错误。对“中止?”说 N。
(rescue)# resize2fs /dev/md0
对所有 /dev/md
设备重复此操作。
下一步是重新启动系统,在执行此操作之前,请运行以下检查清单并确保所有任务都已完成。
/proc/mdstat
/etc/fstab
已编辑以反映设备名称的更改。/etc/lilo.conf
已编辑以反映根设备更改。/sbin/lilo
以更新引导加载程序。您现在可以安全地重新启动系统,当系统启动时,它将自动发现 md 设备(基于分区类型)。
您的根文件系统现在将被镜像。
在 follow/monitor 模式下运行 mdadm 时,您可以使不同的阵列共享备用磁盘。这肯定会让您节省存储空间,而不会失去后备磁盘的舒适性。
在软件 RAID 的世界中,这是一项全新的前所未有的功能:为了将安全性提升到备用磁盘区域的程度,您只需为一组阵列提供一个空闲磁盘即可。
当 mdadm 作为守护程序运行时,您有一个代理定期轮询阵列。然后,当没有备用磁盘的阵列上的磁盘发生故障时,mdadm 从另一个阵列中删除一个可用的备用磁盘,并将其插入到发生故障磁盘的阵列中。重建过程现在像往常一样在降级阵列中开始。
要声明共享备用磁盘,只需在将 mdadm 作为守护程序调用时使用 spare-group
参数。
永远永远不要重新分区正在运行的 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 控制器才会给您带来额外的性能。如果您使用两个 2940 和两个旧 SCSI 磁盘,而不是仅在一个控制器上运行两个磁盘,则不会看到性能提升。
如果您忘记了 persistent-superblock 选项,您的阵列在停止后可能不会自愿启动。只需使用 raidtab 中正确设置的选项重新创建阵列。请注意,这将破坏阵列上的信息!
如果 RAID-5 在移除并重新插入磁盘后未能重建,这可能是因为 raidtab 中设备的排序。尝试将第一个“device ...”和“raid-disk ...”对移动到 raidtab 文件中阵列描述的底部。