Lenovo SR660 RAID 940-8i 使用 StorCLI 删除 RAID5 并配置 JBOD 实战
脱敏说明:本文中出现的控制器序列号、SAS 地址、主机名等均替换为脱敏占位符;分区 UUID 为本次格式化后系统自动生成的新标识,仅用于本机内部,无历史数据残留含义。其他环境请以自己
blkid的输出为准。
1. 背景与目标
某 Doris 分布式存储集群单节点的硬件配置:
- 服务器:Lenovo ThinkSystem SR660
- RAID 卡:Lenovo ThinkSystem RAID 940-8i 8GB Flash
- 系统盘:2 × 2.2 TB SAS HDD(出厂 RAID1)
- 数据盘:20 × 2.2 TB SAS HDD(出厂 4 个 RAID5)
Doris 的 BE 节点对数据盘的诉求是「OS 直控单盘」——不要在硬件层做 RAID0/RAID5 抽象,而是让每块 SAS 盘独立暴露给操作系统,再由 Doris 自身的多副本 / EC 机制处理副本与冗余。因此需要把数据盘从 RAID5 转为 JBOD。
操作目标:
- 保留 RAID1 系统盘(VD
os-raid1) - 删除全部 4 个 RAID5 VD
- 把 20 块数据盘以 JBOD 形式暴露给 Linux
- 为每块盘建一个 ext4 文件系统并写入
/etc/fstab
2. 控制器与磁盘初始态
查看控制器总览:
./storcli64 /c0 show
关键信息:
Product Name = RAID 940-8i 8GB Flash
FW Package Build = 52.27.0-5215
FW Version = 5.270.02-3950
Driver Name = megaraid_sas
Driver Version = 07.727.03.00-rc1
Current Personality = RAID-Mode
Drive Groups = 5
Virtual Drives = 5
查看当前 RAID Personality:
./storcli64 /c0 show personality
Current Personality RAID
Supported Personalities JBOD
Behavior mode JBOD
Supported Auto Configure Behaviors NONE R0 JBOD
⚠️ 关键细节:虽然
Behavior mode = JBOD,但Current Personality = RAID。Personality决定整卡运行形态,只有在「不存在任何 VD 配置」时才能切换;而Behavior mode跟当前差分开关有关,并非实际生效模式。
确认硬件能力:
./storcli64 /c0 show all | grep -i -E "JBOD|Personality|RAID"
输出节选:
Current Personality = RAID-Mode
Support JBOD = No # 关键:不能 /c0 set personality=JBOD
Support Force Personality Change = Yes
Enable JBOD = No
RAID Level Supported = RAID0, RAID1(2 or more drives), RAID5, RAID6,
RAID00, RAID10(2 or more drives per span), RAID50, RAID60
Support JBOD = No + Enable JBOD = No 表示:在保留现有 RAID 配置的前提下,无法整卡切换到 JBOD Personality。但 RAID 940-8i 仍支持针对单盘的 set jbod,这就是本文采用的方式。
3. 当前阵列与磁盘清单
VD 列表(./storcli64 /c0/vall show):
DG/VD TYPE State Access Consist Cache Cac sCC Size Name
4/235 RAID5 Optl RW Yes NRWTD - ON 8.727 TB data-raid5
2/236 RAID5 Optl RW Yes NRWTD - ON 8.727 TB data-raid5
1/237 RAID5 Optl RW Yes NRWTD - ON 8.727 TB data-raid5
3/238 RAID5 Optl RW Yes NRWTD - ON 8.727 TB data-raid5
0/239 RAID1 Optl RW Yes NRWBD - ON 2.181 TB os-raid1
总共 5 个 VD:1 个 RAID1(VD239,系统盘,保留)+ 4 个 RAID5(VD235/236/237/238,数据盘,删除)。
磁盘拓扑节选(./storcli64 /c0/eall/sall show):
EID:Slt DID State DG Size Model Sp Type
251:0 24 Onln 0 2.181 TB AL15SEB24EQ U -
251:1 19 Onln 0 2.181 TB AL15SEB24EQ U -
251:2 25 Onln 1 2.181 TB AL15SEB24EQ U - # RAID5-1
251:3 9 Onln 1 2.181 TB AL15SEB24EQ U -
...
251:21 5 Onln 4 2.181 TB AL15SEB24EQ U - # RAID5-4
Enclosure ID = 251,磁盘分布在插槽 0~21,共 22 块,统一型号 AL15SEB24EQ(2.2 TB SAS 12G HDD)。
阵列归属汇总:
| VD | 类型 | 容量 | 成员 Slot | 处置 |
|---|---|---|---|---|
| 0/239 | RAID1 | 2.181 TB | 0, 1 | 保留(系统盘) |
| 1/237 | RAID5 | 8.727 TB | 2, 3, 4, 5, 6 | 删除 |
| 2/236 | RAID5 | 8.727 TB | 7, 8, 9, 10, 11 | 删除 |
| 3/238 | RAID5 | 8.727 TB | 12, 13, 14, 15, 16 | 删除 |
| 4/235 | RAID5 | 8.727 TB | 17, 18, 19, 20, 21 | 删除 |
⚠️ 再次强调:
v239(os-raid1)一口都不要碰。一旦把系统盘删了,宿主机直接失联。
4. 删除 4 个 RAID5
storcli 删 VD 的语法:
./storcli64 /c0/v<VD号> delete force
依次执行:
./storcli64 /c0/v235 delete force
./storcli64 /c0/v236 delete force
./storcli64 /c0/v237 delete force
./storcli64 /c0/v238 delete force
每条都会返回 Status = Success / Delete VD succeeded。删除后对应 RAID5 成员盘的状态会从 Onln 变为 UGood(Unconfigured Good),进入「未配置」状态。
☢️ 真实的坑:本次环境中 4 个 RAID5 曾经被聚合成一个 LVM 卷组
vg--es--warm01。删除 VD 时lsblk会显示残留 PV 映射:
text sdc → vg--es--warm01-lv--es--warm01 (34.9T) sdd → vg--es--warm01-lv--es--warm01 (34.9T)删 VD 之前务必先处理 LVM:
vgs/lvs/pvs检查卷组与 PV 归属lvchange -an停用 LV →vgremove删卷组 →pvremove清 PV 元数据- 否则 LVM 元数据残留会让后续
set jbod后部分盘仍带LVM2_membermagic,wipefs -a才能去除本案例数据盘 VG 在前置流程已清空,所以可直接删除 VD。
5. 删除后磁盘状态
./storcli64 /c0/eall/sall show
251:0 Onln 0 2.181 TB ... - # 系统盘保留 RAID1
251:1 Onln 0 2.181 TB ... -
251:2 UGood - 2.181 TB ... - # UGood = 未配置
251:3 UGood - 2.181 TB ... -
...
251:21 UGood - 2.181 TB ... -
20 块盘全部转为 UGood,符合预期。
6. 尝试整体切换 JBOD Personality(失败)
理论上整卡切到 JBOD Personality 后,所有 UGood 盘自动以裸盘形式暴露。试一下:
./storcli64 /c0 set personality=JBOD
返回:
Status = Failure
ErrMsg: Requested operation cannot be performed because of existing configuration
ErrCd = 152
原因:RAID1 系统盘仍存活。RAID 940-8i 不允许「存在任何 VD 的同时切换 Personality」。
可行路径有两条:
- 整卡切 JBOD:把 RAID1 也删掉,全卡切 JBOD,再把系统盘也用 JBOD 方式跑——风险大,本环境不选
- 单盘
set jbod:保留 RAID1 VD,对每块 UGood 盘显式打 JBOD 标记——保系统 + 改数据,本案例采用
7. 单盘转 JBOD
storcli 对单盘设置 JBOD 的语法:
./storcli64 /c0/e<ENCLOSURE_ID>/s<SLOT> set jbod
本环境的 Enclosure ID = 251,需要对 Slot 2 ~ 21 共 20 块盘批量操作:
for slot in {2..21}; do
state=$(./storcli64 /c0/e251/s${slot} show | grep -E "UGood|JBOD")
echo "Slot ${slot} current: ${state}"
./storcli64 /c0/e251/s${slot} set jbod
done
每条会返回 Set Drive JBOD Succeeded。每块盘状态从 UGood 变为 Onln,Type 列从 - 变成 JBOD,容量也从 2.181 TB 变成 2.183 TB——RAID 元数据占用的那点空间还回来了。
这是逐盘显式启用 JBOD,与「整卡 Personality = JBOD」是两条路:
- 整卡 Personality 切换:要求配置清零,OS 视 RAID 卡为 HBA;
- 单盘
set jbod:在 RAID Personality 下也能对 UGood 盘操作,把该盘标记为「直通」并直接暴露给 OS。
8. 验证 JBOD 与 Linux 磁盘映射
验证控制器侧:
./storcli64 /c0/eall/sall show
预期:
251:0 Onln 0 2.181 TB ... - # RAID1
251:1 Onln 0 2.181 TB ... -
251:2 Onln - 2.183 TB ... JBOD
251:3 Onln - 2.183 TB ... JBOD
...
251:21 Onln - 2.183 TB ... JBOD
验证 OS 侧:
lsblk
预期输出(节选):
sde 8:64 0 2.2T 0 disk # RAID1 (os-raid1) 暴露的系统盘
├─sde1 ...
├─sde2 /boot
└─sde3 → vg_root/lv_root /
sdf 8:80 0 2.2T 0 disk # JBOD 盘,每块独立 /dev/sdX
sdg 8:96 0 2.2T 0 disk
sdh 8:112 0 2.2T 0 disk
...
sdy 65:128 0 2.2T 0 disk
sde是 RAID1 系统盘(含/boot与根 LV)sdf~sdy共 20 块独立 JBOD 盘,每块约 2.2 TB
设备号从 8:80 递增到 65:128——主设备号从 8 翻到 65,因为单个 major 最多容纳 16 个 minor,符合预期。
9. 文件系统与 fstab 落地
接下来让 20 块盘在重启后自动挂载到 /data/hdd1 ~ /data/hdd20。
单盘统一流程:
wipefs -a清掉残留 magic(防 LVM/RAID 元数据误识别)parted建 GPT + 全盘分区mkfs.ext4格式化blkid取 UUID- 写入
/etc/fstab:UUID=... /data/hddN ext4 defaults 0 2 mount -a测试
参考批量脚本(保存为 format_disk.sh,逐盘确认):
#!/bin/bash
# format_disk.sh —— 统一格式化 JBOD 盘 + 写入 fstab
set -e
# 手工列出更稳妥,避免误伤系统盘
DEVS="/dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm \
/dev/sdn /dev/sdo /dev/sdp /dev/sdq /dev/sdr /dev/sds /dev/sdt /dev/sdu \
/dev/sdv /dev/sdw /dev/sdx /dev/sdy"
echo "WARNING: The following disks will be formatted:"
echo "$DEVS" | tr ' ' '\n'
read -p "Continue? (yes/no): " ans
[ "$ans" = "yes" ] || { echo "Abort."; exit 1; }
i=1
for dev in $DEVS; do
mnt="/data/hdd${i}"
echo "================================"
echo "Processing ${dev} -> ${mnt}"
echo "================================"
wipefs -a "$dev"
parted -s "$dev" mklabel gpt
parted -s "$dev" mkpart primary 0% 100%
udevadm settle
mkfs.ext4 -F "${dev}1"
mkdir -p "$mnt"
uuid=$(blkid -s UUID -o value "${dev}1")
echo "UUID=${uuid} ${mnt} ext4 defaults 0 2" >> /etc/fstab
i=$((i+1))
sleep 1
done
echo "Mounting..."
systemctl daemon-reload
mount -a
df -Th | grep '/data/hdd'
echo "Done."
执行后 /etc/fstab 末尾追加 20 行:
UUID=9a63ead7-115c-47f5-8bda-b513d4b5196b /data/hdd1 ext4 defaults 0 2
UUID=07360e75-e58f-4e86-876a-9260e3253107 /data/hdd2 ext4 defaults 0 2
UUID=0f8f2ccf-a3b5-4789-b96b-820adc482de2 /data/hdd3 ext4 defaults 0 2
...
UUID=ccc1fb6e-8495-4db8-a3ea-a0d09a23e7ee /data/hdd20 ext4 defaults 0 2
说明:上面出现的 UUID 是本次格式化产生的全新文件系统标识,仅作示例,其他环境请以自己
blkid的输出为准。ext4 vs xfs 选型:Doris BE 在大并发随机写场景下与 ext4 的
delalloc+data=ordered配合更稳定;如果偏写密集顺序大文件场景,xfs 也是合理选择。
10. 重启验证
sync
reboot
重启后确认:
lsblk
df -Th
20 块盘全部按 fstab 自动挂载到 /data/hdd1 ~ /data/hdd20。用 fio / dd 跑基准时单盘吞吐约 200~230 MB/s,2.2 TB SAS 12G HDD 的正常水平。
11. 关键经验复盘
11.1 为什么不直接 set personality=JBOD
整卡 Personality 切换要求配置清零:任何残留 VD(哪怕是系统盘 RAID1)都会触发 ErrCd 152。
如果非要走整卡 JBOD 这条路:必须先把 RAID1 删掉 → 切 JBOD → 再用 JBOD 方式跑系统盘。但开机节点的系统盘走 RAID1 安全性更合适,因此保留 RAID1 + 数据盘 JBOD 才是稳妥的组合。本案例最终采用「单盘 set jbod」。
11.2 Personality 与 Drive JBOD 的差异
| 操作粒度 | 命令 | 前提 | 适用 |
|---|---|---|---|
| 整卡 | /c0 set personality=JBOD |
无任何 VD | 全卡纯直通,OS 视 RAID 卡为 HBA |
| 单盘 | /c0/eE/sS set jbod |
盘处于 UGood | 混合模式:保留 RAID + 部分单盘直通 |
对 Doris 这类需要 OS 直控单盘的分布式存储,单盘 JBOD 比「整卡转 HBA」更灵活——可以同时在一张卡上既保护系统盘(RAID1),又把数据盘裸给上层使用。
11.3 数据安全 checklist
执行前必须确认:
- [ ] 数据已备份或已迁出
- [ ] 应用层服务已停(Doris BE 已 decommission 或停掉当前节点)
- [ ] LVM 卷组已
vgremove(避免 VD 删除后 LVM 残留映射) - [ ]
/etc/fstab中老的数据盘挂载已注释或删除 - [ ] 系统盘 RAID1 VD(本文为
v239)不会被误删
11.4 这是 Doris 推荐的部署姿势
Doris 官方对 BE 节点磁盘的建议:
- 用 JBOD 或 HBA 模式把数据盘独立暴露给 OS
- Doris 自身通过
storage_root_path在 BE 内部管理多盘 + 副本 - 不要再用 RAID0/RAID5 在硬件层做聚合——会干扰 Doris 自身负载均衡,且一次坏盘会触及整组
12. 最终架构
RAID 940-8i
├── RAID1 (VD239 os-raid1) - Slot 0,1 - 系统盘
│ └── / + /boot
└── JBOD × 20 - Slot 2 ~ 21
├── /dev/sdf → /data/hdd1 (ext4)
├── /dev/sdg → /data/hdd2 (ext4)
│ ...
└── /dev/sdy → /data/hdd20 (ext4)
Doris BE
└── storage_root_path = /data/hdd{1..20}
└── Doris 自身负责副本与 EC
13. 命令速查
# 查看控制器
./storcli64 /c0 show
./storcli64 /c0 show personality
./storcli64 /c0 show all | grep -iE 'JBOD|Personality|RAID'
# 查看阵列
./storcli64 /c0/vall show
./storcli64 /c0/eall/sall show
# 删除 RAID5 VD(保留 v239!)
./storcli64 /c0/v235 delete force
./storcli64 /c0/v236 delete force
./storcli64 /c0/v237 delete force
./storcli64 /c0/v238 delete force
# 单盘转 JBOD
for slot in {2..21}; do
./storcli64 /c0/e251/s${slot} set jbod
done
# 验证
./storcli64 /c0/eall/sall show
lsblk
df -Th
本文基于一次真实环境改造操作整理,主机名、控制器序列号、SAS 地址均已脱敏。命令在不同 FW 版本(本文 FW Package Build
52.27.0-5215)下输出细节略有差异,执行前请对照本机storcli64 /c0 show实际输出。