这篇文章整理华为阵列卡使用 hiraidadm 配置 7 块硬盘组成 RAID5、另外 1 块作为专用热备 的命令,包含单机操作与 Ansible ad-hoc 批量操作。

案例中有 8 块 16TB HDD,槽位为 0:2~0:9;另外两块 SSD 位于 0:0、0:1,保留原有系统阵列。

一、目标布局与操作前提

物理盘槽位用途
0:0、0:1原有 SSD 系统阵列,保留
0:2~0:87 块 HDD,创建 RAID5
0:91 块 HDD,作为该 RAID Group 的专用热备

本文以控制器 c0 为例。控制器号、槽位号、VD 编号、RG 编号以及程序路径都需要以实际查询结果为准。

删除 VD 会破坏原阵列配置,可能造成原数据无法访问。只有确认旧数据不再需要、相关业务已停止,并且已经核实目标盘身份时,才执行删除。本文是配置记录整理,具体语法支持情况以当前控制器及 hiraidadm 版本为准。

容量怎么算?

7 块 16TB 硬盘组成 RAID5,理论数据容量为:

(7 - 1) × 16TB = 96TB ≈ 87.31TiB

第 8 块盘作为热备,不贡献可用容量。

厂家标称的 16TB 是十进制容量,换算约为 14.55TiB。案例中工具显示的单盘数值约为 14.553,因此需要注意其单位显示口径,不能把约 87.3TiB 写成厂家口径的 87.3TB。实际容量以阵列输出为准。

RAID5 加热备仍然只能容忍一块成员盘故障。 热备盘可以在满足控制器策略和条件时接替故障盘进行重建,但不会增加 RAID5 的校验级别;重建完成前再损坏一块成员盘仍可能导致阵列失效。

二、确认 hiraidadm 程序位置

如果程序在当前目录:

./hiraidadm c0 show pdlist

如果已经加入 PATH:

command -v hiraidadm
hiraidadm c0 show pdlist

以下单机命令统一使用 ./hiraidadm,请在程序所在目录执行。Ansible 示例统一使用 /root/hiraidadm,这是示例路径,必须替换成远端实际路径。

三、查看物理盘、虚拟盘与后台任务

# 查看物理盘:核对槽位、容量、状态和成员关系
./hiraidadm c0 show pdlist

# 查看虚拟盘:核对现有阵列及其用途
./hiraidadm c0 show vdlist

# 查看后台任务
./hiraidadm c0 show bgtask

先确认:

  • 0:0、0:1 确实属于要保留的系统阵列。
  • 0:2~0:9 确实是准备重新配置的 8 块数据 HDD。
  • 这些 HDD 是否已经属于现有 VD。
  • 需要删除的旧 VD 与成员盘之间的对应关系。

物理盘显示 online 通常表示它正在作为阵列成员使用,不表示它是可以直接重新分配的空盘。

同样,不能默认 vd0 一定是系统盘,也不能默认 vd1~vd8 一定是数据盘。必须根据当前输出核实;若列表信息不足,应结合该版本工具支持的详细查询和现有配置记录继续确认。

四、按需删除旧数据 VD

如果目标 HDD 已经空闲,可以跳过删除步骤。

原案例准备释放 8 块 HDD,但旧 VD 编号不应直接复制到其他机器。建议按已核实的编号逐个处理:

# 留空时会停止;填写查询确认的旧数据 VD 编号后再执行
VD_ID=''
: "${VD_ID:?请先填写已经核实的旧数据 VD 编号}"

printf 'y\n' | ./hiraidadm "c0:vd${VD_ID}" delete

例如,只有当你确认 vd1 就是应删除的旧数据虚拟盘时,才使用:

printf 'y\n' | ./hiraidadm c0:vd1 delete

这里的 printf 'y\n' 会自动回答删除确认提示,所以执行前的对象核对尤其重要。多块物理盘不一定对应同样数量的 VD,应删除的是核实后的虚拟盘,而不是按槽位号推测 VD 号。

删除完成后重新查询:

./hiraidadm c0 show pdlist
./hiraidadm c0 show vdlist

确认预定的数据 HDD 已经释放,保留的系统阵列没有变化。空闲盘状态的具体名称以当前工具输出为准。

五、创建 7 盘 RAID5

使用 0:2~0:8 共 7 块 HDD:

./hiraidadm c0 create vd raid5 name=data_raid5 size=max_left drives=0:2,0:3,0:4,0:5,0:6,0:7,0:8

参数含义:

参数含义
c0本例的目标控制器
create vd raid5创建 RAID5 虚拟盘
name=data_raid5虚拟盘名称
size=max_left使用所选配置可分配的最大剩余容量
drives=0:2,...,0:8指定参与 RAID5 的 7 块物理盘

0:9 不包含在成员列表中,它留给下一步作为热备。

命令中的 name=data_raid5、size=max_left、drives=... 应保持为完整参数,不要在等号两边添加空格。

创建后查询:

./hiraidadm c0 show vdlist

确认新虚拟盘名称、RAID 级别、容量与成员配置正确,并记录其实际 RAID Group(RG)编号。不要根据旧配置或 VD 编号推断 RG。

六、设置专用热备

只有当查询确认新建 RAID5 对应的 RG 为 1 时,执行:

./hiraidadm c0:e0:s9 set hotspare rg=1

这里:

  • c0:控制器 0。
  • e0:enclosure 0。
  • s9:slot 9,即前面保留的 0:9。
  • rg=1:将热备关联到已经核实的 RAID Group 1。

如果实际 RG 不是 1,需要替换为查询得到的编号。热备盘还应符合控制器对容量、介质类型和兼容性的要求。

不要把“创建 RAID5”和“设置 rg=1 热备”直接拼成一条命令执行。先查询新 RG,再设置热备,才能确认热备关联到了目标阵列。

最终布局:

0:0、0:1        原系统阵列,保留

0:2 ┐
0:3 │
0:4 │
0:5 ├── RAID5:data_raid5
0:6 │
0:7 │
0:8 ┘

0:9 ─── 该 RAID Group 的专用热备

七、检查配置结果

./hiraidadm c0 show pdlist
./hiraidadm c0 show vdlist
./hiraidadm c0 show bgtask

重点检查:

  1. 原系统阵列仍然存在,成员盘没有变化。
  2. 新虚拟盘为 RAID5,容量符合 7 盘 RAID5 的预期。
  3. 0:2~0:8 属于目标 RAID5。
  4. 0:9 已成为正确 RG 的热备。
  5. 虚拟盘和物理盘状态正常,后台任务没有异常。

创建命令返回成功,不等于初始化等后台任务已经完成。任务状态应以 show bgtask 的实际输出为准。

八、Ansible ad-hoc 批量操作

以下示例假设:

  • inventory 文件为 inventory.ini。
  • 华为阵列卡主机组为 huawei_raid_hosts。
  • 首台验证机器的 inventory 别名为 raid01。
  • 远端程序路径为 /root/hiraidadm。

请按实际环境替换这些值。建议先用 --limit raid01 完成单台操作,再逐台核对其他服务器布局并调整执行范围。

1. 核对目标主机

ansible huawei_raid_hosts -i inventory.ini --list-hosts

不要为了方便直接改成 all,以免包含不属于本次操作范围的机器。

2. 批量查询

ansible huawei_raid_hosts -i inventory.ini -b -m ansible.builtin.command -a '/root/hiraidadm c0 show pdlist'

ansible huawei_raid_hosts -i inventory.ini -b -m ansible.builtin.command -a '/root/hiraidadm c0 show vdlist'

ansible huawei_raid_hosts -i inventory.ini -b -m ansible.builtin.command -a '/root/hiraidadm c0 show bgtask'

即使服务器型号相同,也要逐台核实 VD、RG 和成员盘,不能用一台的输出代表整个主机组。

3. 按需删除已核实的旧 VD

下面只演示在 raid01 上删除 已确认可删除的 vd1。请替换成实际核实的主机与 VD:

ansible huawei_raid_hosts -i inventory.ini --limit raid01 -b -m ansible.builtin.shell -a 'printf "y\n" | /root/hiraidadm c0:vd1 delete'

删除后立即查询:

ansible huawei_raid_hosts -i inventory.ini --limit raid01 -b -m ansible.builtin.command -a '/root/hiraidadm c0 show pdlist'

ansible huawei_raid_hosts -i inventory.ini --limit raid01 -b -m ansible.builtin.command -a '/root/hiraidadm c0 show vdlist'

这里使用 shell 是因为命令需要管道。不要把历史记录里的 1 2 3 4 5 6 7 8 直接写成所有机器通用的删除循环。

4. 创建 RAID5

ansible huawei_raid_hosts -i inventory.ini --limit raid01 -b -m ansible.builtin.command -a '/root/hiraidadm c0 create vd raid5 name=data_raid5 size=max_left drives=0:2,0:3,0:4,0:5,0:6,0:7,0:8'

接着查询新 RG:

ansible huawei_raid_hosts -i inventory.ini --limit raid01 -b -m ansible.builtin.command -a '/root/hiraidadm c0 show vdlist'

5. 设置热备

确认这台机器的新 RG 确实为 1 后:

ansible huawei_raid_hosts -i inventory.ini --limit raid01 -b -m ansible.builtin.command -a '/root/hiraidadm c0:e0:s9 set hotspare rg=1'

如果不同机器的 RG 不同,应分别使用对应的参数执行。

6. 最终复查

ansible huawei_raid_hosts -i inventory.ini --limit raid01 -b -m ansible.builtin.command -a '/root/hiraidadm c0 show pdlist'

ansible huawei_raid_hosts -i inventory.ini --limit raid01 -b -m ansible.builtin.command -a '/root/hiraidadm c0 show vdlist'

ansible huawei_raid_hosts -i inventory.ini --limit raid01 -b -m ansible.builtin.command -a '/root/hiraidadm c0 show bgtask'

上述创建、删除命令不是幂等配置。连接中断、超时或返回异常后,先查询实际状态,再决定是否重试。

九、常见问题

硬盘显示 online,为什么不能直接组新阵列?

它可能已经属于现有 VD。先查看 pdlist、vdlist,确认成员关系和旧阵列用途;只有准备清空重建时才删除对应旧 VD。

热备为什么不能直接写死 rg=1?

新建阵列的 RG 编号取决于当前控制器配置,不保证总是 1。必须在创建后查询,并使用目标 RAID5 的实际 RG。

Ansible 提示 Unable to parse argument string

检查 -a 后的引号是否闭合、复制时是否破坏了换行、是否混入中文引号或其他字符。上面的单行写法便于复制;多行参数本身不一定有错。

无管道、重定向和 shell 变量展开时使用 command;需要这些功能时使用 shell。远程执行最好使用实际绝对路径,避免依赖交互式登录时的当前目录或 PATH。

配置完成后,最少保留哪几条巡检命令?

./hiraidadm c0 show pdlist
./hiraidadm c0 show vdlist
./hiraidadm c0 show bgtask

这三条分别用于查看物理盘、虚拟盘和后台任务。后续巡检时应关注成员盘状态、热备关联、阵列健康状态以及重建或初始化任务进度。

最后修改:2026 年 09 月 16 日
感谢您的支持