我有一台配备 Perc 6i 的 Dell T300,上面连接了 3 个 500Gb 驱动器。它们组装成一个 raid 5 ~1000Gb VD。此设置运行良好,但是系统已满,我想增加容量。
我的想法大致如下:
- 将新的 2Tb 驱动器作为热备用驱动器添加到阵列
- 移除其中一个 500Gb 硬盘,这样 2Tb 硬盘就会替换它
- 重建完成后,重复该过程,直到阵列中只有 2Tb 驱动器
- 扩大阵列大小以填充 2Tb 驱动器,使 VD 约为 4Tb。
但是,查看文档时,我找不到有关第 4 点的任何信息。那么 perc 6i 能够扩展 raid5 阵列吗?如何扩展?
或者我应该采取完全不同的方式来实现我的目标?
答案1
我意识到这个问题现在已经过时了,但它从未得到过真正的回答,当我需要做类似的事情时,我可以使用指南。因此,为了用事实而不是意见来回答 OP 的问题,以下是我使用在 Linux 内核 4.15 上运行的 perccli64 v7.1327 升级 Dell PE R430 上现有的 3 驱动器 RAID5 阵列的方法,该阵列配有 PERC H730P(又名 MegaRAID SAS-3 3108 rev2)。
作为参考,我的拓扑:
- 控制器 0
- 附件 32
- 插槽 1、2、3(插槽 0 容纳 SSD)
- 旧硬盘大小 4TB (3.637TiB) x3
- 卷 0 大小 7.276TiB(扩展前)
- 新硬盘大小:12TB (10.913TiB)
请注意太字节 (TB 或 10^12) 和兆兆字节 (TiB 或 2^40) 大小之间的差异。perccli64 以兆兆字节显示大小,但使用“TB”作为后缀。我知道……我也不喜欢这样。
背景:使用约 8TB 的 RAID5 卷,我们快用完了空间。我计算出需要 20TiB 卷,因此订购了三个 12TB HGST SATA 硬盘。计划:
- 换出 1 个驱动器,让卷重建。
- 对驱动器 2 重复上述操作
- 对驱动器 3 重复上述操作
- 扩展阵列以使用更大的驱动器
- 调整现有文件系统的大小以使用更大的卷
- 在系统运行时执行所有操作,无需访问 iDRAC
在 PERC 上,可以直接拔出一个活动驱动器并弹出替换驱动器,但我通过智能手来指导这一点,并且想要清楚知道要拔出哪个驱动器,因此我首先将单个驱动器脱机,从插槽 1 开始,通过运行
perccli64 /c0/e32/s1 设置离线
重要的提醒:这会使 RAID5 处于降级状态!我建议先查看 SMART 统计数据,如果一个驱动器显示任何错误迹象,请先更换该驱动器。如果两个或更多驱动器显示任何故障前迹象,请不要在没有制定 DR 计划和验证完整备份且可以轻松获得的情况下降级阵列。事实上,聪明人无论如何都会这样做。您可以使用以下命令检查 SMART 统计数据(安装 smartmontools 后):
smartctl -a /dev/sdb -d megaraid,n
(将最后的 n 替换为您想要检查的插槽)。
离线后,为了让智能手轻松识别驱动器,请使用以下方式闪烁定位器 LED:
perccli64 /c0/e32/s1 开始定位
然后,服务器上的任何人都可以拉出闪烁的驱动器并放入新的驱动器。运行:
perccli64 /c0/e32/s1 显示
应该首先显示驱动器的“Ofln”(离线)状态,然后在没有驱动器时显示不可用,然后在插入新驱动器后显示“Rbld”(正在重建)状态,最后在重建完成时显示“Onln”(在线)状态。
perccli64 /c0/e32/s1 显示重建
将显示重建过程中的进度百分比(不要相信时间估算),并且
perccli64 /c0/v0 显示
重建时,卷将显示为“Dgrd”(降级),完成后将显示“Optl”(最佳)。我的驱动器是 SATA,系统负载适中,但它们仍然只花了大约 15 小时在新驱动器上重建卷的 4TB 部分。
等待阵列达到最佳状态,然后对剩余的驱动器重复相同的步骤,在我的示例中,是插槽 /c0/e32/s2 和 /c0/e32/s3。
更换所有驱动器后,您的拓扑应显示由更大的 HDD 组成的最佳阵列卷,但仍然具有原始的较小阵列大小,在我的情况下为 7.276TiB(错误地显示为 TB,而不是 TiB)。下一步是扩展阵列本身,但您需要先做一些计算...
perccli64 expand 命令的文档记录很差。提供的唯一帮助是:
SYNTAX: perccli /cx/vx expand Size=<xx> [expandarray]
DESCRIPTION: Expands VD to the specified size in the array
OPTIONS:
expandarray - expand array if possible to accommodate the given size
Size - If the size format is not mentioned, given size will be processed in MB
从帮助输出中不清楚的是,必需的 Size 参数是要添加到阵列的大小,而不是扩展后的所需大小。我们希望将其设置为新阵列的大小(以 MiB 为单位),减去旧阵列的大小(以 MiB 为单位)。在我的例子中,12TB(实际上是 12,000,138,625,024 字节,如 smartctl 所示)减去 4TB(实际上是 4,000,781,611,008)得到 7,999,357,014,016。三个磁盘的 RAID5 是该值的两倍,为 15,998,714,028,032 字节,除以 2^20 得到 15,257,562 MiB。如果指定太多,它将失败,并显示消息说空间不足。为了避免这种情况,请减少几个 GB,因为它无论如何都会四舍五入到总空间的最接近的百分之一(!!!)...就像我说的那样,expand 命令的记录很差,这就是我在这里分享我所学到的知识的原因。
“expandarray”选项似乎仅在基本磁盘大小发生变化时才需要,就像这里一样,因为尝试在不使用该选项的情况下运行它会返回错误,显示空间不足,但会附加一条注释“扩展阵列以获取额外空间”。最后,一个有用的诊断消息!所以我将它运行为
perccli64 /c0/v0 扩展大小=15250000 扩展数组
它很快就返回成功,因为它启动了后台初始化 (BGI) 任务。BGI 意味着新空间可立即使用,您可以使用以下方式查看初始化进度
perccli64 /c0/v0 显示 bgi
该输出在估计剩余时间方面非常糟糕,因为它显示的百分比从已经存在的部分开始,已经完成。我认为它将第一部分视为已快速初始化,并在估计实际需要写入磁盘的部分的剩余时间时包括这一点。之前 4TB 需要 15 小时,而这是每个磁盘的另外 8TB,我预计它需要大约 30 小时,但由于它在较低的后台优先级下运行,因此可能需要更长时间。我不知道在我的情况下它最终实际花费了多长时间。
虽然控制器通过在后台运行初始化任务神奇地立即使空间可用,但我们仍然需要让操作系统识别新的卷大小。首先重新扫描 scsi 设备,方法是将“1”回显到 /sys/class/block/sdb/device/rescan(如果不是 sdb,请指定正确的设备名称),之后运行时它会显示新的更大大小
blockdev --getsize64 /dev/sdb
这样就完成了最难的部分。剩下的步骤使用标准的 Linux 命令。关于这些步骤的教程还有很多,而且每个系统都不同,所以我就不详细介绍了。这就是对我有用的方法。我使用 parted 修复了 GPT(它在第一次尝试打印表格时提供),然后添加一个新分区,从最后一个正在使用的扇区开始,到扩展磁盘的末尾结束(parted 命令“mkpart pv2 15625877504s 46873438207s”)。同样,您必须进行一些计算才能得出正确的扇区值。然后我将新分区用于
pvcreate /dev/sdb5
vgextend volgrp /dev/sdb5
lvextend -l +95%FREE /dev/volgrp/logvol
resize2fs /dev/volgrp/logvol
此后,df 输出显示大约有 14TB 的额外空间,我的容量问题解决了。请注意,我保留了 5% 的可用空间,以防我也需要扩展其他 LV 之一。
答案2
RAID5 已过时。如果您珍视自己的数据,请不要使用它,尤其是 2TB 驱动器。此外,虽然您的方法可能有效(我不知道 Perc6i 和您的第 4 点),但它将花费大量时间,在此期间您的驱动器将一直处于活动状态。
根据您的生产要求,我建议将数据放在临时驱动器上,移除旧磁盘,在新磁盘上创建新的 RAID(6 或 10),然后将其从临时驱动器放回原处。