mdadm命令是Linux下管理软件RAID的核心工具,支持RAID 0、1、4、5、6、10等多种级别。它用于创建、管理、监控和维护RAID阵列,提供了完整的软件RAID解决方案。
mdadm [模式] [选项] [设备...]
mdadm [选项] --create [设备名] --level=[RAID级别] --raid-devices=[数量] [设备...]
| 模式 | 选项 | 说明 |
|---|---|---|
| 创建模式 | -C, --create |
创建一个新的RAID阵列 |
| 组装模式 | -A, --assemble |
组装已存在的阵列 |
| 管理模式 | --manage |
管理已存在的阵列 |
| 监控模式 | -F, --follow, --monitor |
监控阵列状态 |
| 增长模式 | -G, --grow |
更改阵列大小或形状 |
| 杂项模式 | --misc |
其他操作 |
| 选项 | 说明 |
|---|---|
-l, --level= |
指定RAID级别(0,1,4,5,6,10,linear) |
-n, --raid-devices= |
指定活动设备数量 |
-c, --chunk= |
指定块大小(KB) |
-x, --spare-devices= |
指定热备盘数量 |
-f, --force |
强制操作 |
-v, --verbose |
详细输出 |
-s, --scan |
扫描设备并输出配置 |
-D, --detail |
显示阵列详细信息 |
-S, --stop |
停止运行的阵列 |
-r, --remove |
从阵列中移除设备 |
-a, --add |
向阵列中添加设备 |
| RAID级别 | 最小磁盘数 | 容错性 | 性能 | 存储利用率 | 适用场景 |
|---|---|---|---|---|---|
| RAID 0 | 2 | 无容错 | 读写性能最高 | 100% | 临时数据、高性能需求 |
| RAID 1 | 2 | 镜像,可坏1块盘 | 读性能好,写性能一般 | 50% | 系统盘、重要数据 |
| RAID 5 | 3 | 分布式奇偶校验,可坏1块盘 | 读性能好,写性能一般 | (n-1)/n | 通用存储、数据库 |
| RAID 6 | 4 | 双分布式奇偶校验,可坏2块盘 | 读性能好,写性能较差 | (n-2)/n | 大容量存储、关键数据 |
| RAID 10 | 4 | 镜像+条带化,可坏每组镜像中的1块 | 读写性能都很好 | 50% | 高性能需求、数据库 |
# 使用3块磁盘创建RAID 0
mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
# 输出示例:
# mdadm: Defaulting to version 1.2 metadata
# mdadm: array /dev/md0 started.
# 使用2块磁盘创建RAID 1
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sde /dev/sdf
# 查看创建进度
cat /proc/mdstat
# 添加热备盘
mdadm --create /dev/md1 --level=1 --raid-devices=2 --spare-devices=1 /dev/sde /dev/sdf /dev/sdg
# 使用4块磁盘创建RAID 5,其中1块作为热备
mdadm --create /dev/md2 --level=5 --raid-devices=3 --spare-devices=1 \
/dev/sdh /dev/sdi /dev/sdj /dev/sdk
# 创建文件系统
mkfs.ext4 /dev/md2
# 挂载使用
mkdir /data
mount /dev/md2 /data
echo "/dev/md2 /data ext4 defaults 0 0" >> /etc/fstab
# 使用4块磁盘创建RAID 10
mdadm --create /dev/md3 --level=10 --raid-devices=4 /dev/sdl /dev/sdm /dev/sdn /dev/sdo
# 指定布局模式(near, far, offset)
mdadm --create /dev/md3 --level=10 --raid-devices=4 --layout=f2 /dev/sdl /dev/sdm /dev/sdn /dev/sdo
# 查看所有RAID阵列状态
cat /proc/mdstat
# 查看指定阵列详细信息
mdadm --detail /dev/md0
# 查看设备是否属于某个阵列
mdadm --examine /dev/sdb
# 扫描并输出所有阵列
mdadm --detail --scan
# 停止阵列
mdadm --stop /dev/md0
# 组装已存在的阵列
mdadm --assemble /dev/md0 /dev/sdb /dev/sdc /dev/sdd
# 自动扫描并组装所有阵列
mdadm --assemble --scan
# 添加新设备到阵列
mdadm --add /dev/md0 /dev/sde
# 从阵列中移除设备
mdadm --remove /dev/md0 /dev/sde
# 标记设备为故障
mdadm --fail /dev/md0 /dev/sdb
# 监控阵列状态变化
mdadm --monitor --scan --daemonize
# 监控指定阵列并发送邮件通知
mdadm --monitor --scan --mail=admin@example.com --program=/path/to/script
# 查看邮件日志配置
cat /etc/mdadm.conf | grep MAILADDR
# 保存当前RAID配置
mdadm --detail --scan > /etc/mdadm.conf
# 或
mdadm --detail --scan >> /etc/mdadm.conf
# 更新initramfs(确保启动时能识别)
update-initramfs -u
# 或(对于RHEL/CentOS)
dracut --force
# 分区(每块磁盘执行)
fdisk /dev/sdb
# 创建分区,类型设为fd(Linux RAID)
# 或使用parted
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0% 100%
parted /dev/sdb set 1 raid on
mdadm --create /dev/md0 --level=5 --raid-devices=3 \
/dev/sdb1 /dev/sdc1 /dev/sdd1 --spare-devices=1 /dev/sde1
mkfs.xfs /dev/md0
# 或
mkfs.ext4 /dev/md0
mkdir /raid5
mount /dev/md0 /raid5
echo "/dev/md0 /raid5 xfs defaults 0 0" >> /etc/fstab
mdadm --detail --scan >> /etc/mdadm.conf
update-initramfs -u
# 查看状态
cat /proc/mdstat
mdadm --detail /dev/md0
# 设置监控
echo "MAILADDR admin@example.com" >> /etc/mdadm.conf
原因:配置未保存或未自动装配。
解决方案:
# 1. 保存配置
mdadm --detail --scan >> /etc/mdadm.conf
# 2. 更新initramfs
update-initramfs -u
# 3. 检查mdadm.conf配置
# 确保有类似:
# ARRAY /dev/md0 metadata=1.2 name=server:0 UUID=xxxxxx:xxxxxx:xxxxxx:xxxxxx
# 4. 设置自动装配
# 在/etc/default/mdadm中设置:
# START_DAEMON=true
# 5. 重启mdadm服务
systemctl restart mdadm
# 6. 手动装配
mdadm --assemble --scan
处理流程:
# 1. 标记故障磁盘
mdadm --manage /dev/md0 --fail /dev/sdb1
# 2. 移除故障磁盘
mdadm --manage /dev/md0 --remove /dev/sdb1
# 3. 查看阵列状态
mdadm --detail /dev/md0
cat /proc/mdstat
# 4. 更换物理磁盘后,添加新磁盘
mdadm --manage /dev/md0 --add /dev/sdf1
# 5. 监控重建进度
watch cat /proc/mdstat
# 或
watch -n 1 mdadm --detail /dev/md0 | grep -A1 "Rebuild Status"
警告:删除阵列会丢失所有数据!
# 1. 卸载文件系统
umount /dev/md0
# 2. 停止阵列
mdadm --stop /dev/md0
# 3. 清除超级块信息
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdc1
mdadm --zero-superblock /dev/sdd1
# 4. 从配置文件中移除
sed -i '/md0/d' /etc/mdadm.conf
sed -i '/UUID_对应_md0/d' /etc/mdadm.conf
# 5. 更新initramfs
update-initramfs -u
cat /proc/mdstat查看RAID状态信息
fdisk/parted磁盘分区工具
mkfs创建文件系统
smartctl磁盘健康检测
#!/bin/bash
# RAID健康监控脚本
LOG_FILE="/var/log/raid_monitor.log"
EMAIL="admin@example.com"
# 检查/proc/mdstat是否存在
if [ ! -f /proc/mdstat ]; then
echo "$(date): 错误:/proc/mdstat不存在" >> $LOG_FILE
exit 1
fi
# 检查每个RAID设备
for md in /dev/md*; do
if [ -b "$md" ]; then
STATUS=$(mdadm --detail $md | grep "State :" | awk '{print $3}')
HEALTHY=$(mdadm --detail $md | grep "Healthy :" | awk '{print $3}')
echo "$(date): 检查 $md - 状态: $STATUS, 健康: $HEALTHY" >> $LOG_FILE
# 如果有故障设备
if [ "$STATUS" != "clean" ] && [ "$STATUS" != "active" ]; then
SUBJECT="RAID警报: $md 状态异常"
MESSAGE="RAID设备 $md 状态异常:$STATUS\n\n详细信息:\n$(mdadm --detail $md)"
echo -e "$MESSAGE" | mail -s "$SUBJECT" $EMAIL
echo "$(date): 发送警报邮件" >> $LOG_FILE
fi
fi
done
# 检查重建状态
REBUILD=$(grep -A1 "recovery" /proc/mdstat || grep -A1 "resync" /proc/mdstat)
if [ -n "$REBUILD" ]; then
echo "$(date): 检测到RAID重建:$REBUILD" >> $LOG_FILE
fi
#!/bin/bash
# RAID状态报告脚本
REPORT_FILE="/tmp/raid_report_$(date +%Y%m%d).txt"
echo "=== RAID状态报告 $(date) ===" > $REPORT_FILE
echo "" >> $REPORT_FILE
# 1. 系统信息
echo "系统信息:" >> $REPORT_FILE
echo "主机名: $(hostname)" >> $REPORT_FILE
echo "内核版本: $(uname -r)" >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 2. /proc/mdstat内容
echo "=== /proc/mdstat内容 ===" >> $REPORT_FILE
cat /proc/mdstat >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 3. 每个RAID的详细信息
echo "=== RAID详细信息 ===" >> $REPORT_FILE
for md in /dev/md*; do
if [ -b "$md" ]; then
echo "RAID设备: $md" >> $REPORT_FILE
mdadm --detail $md >> $REPORT_FILE
echo "----------------------------------------" >> $REPORT_FILE
fi
done
# 4. 磁盘SMART信息(需要smartmontools)
echo "=== 磁盘健康状态 ===" >> $REPORT_FILE
for disk in /dev/sd[a-z]; do
if [ -b "$disk" ]; then
if command -v smartctl &> /dev/null; then
HEALTH=$(smartctl -H $disk 2>/dev/null | grep "SMART overall-health" | awk '{print $6}')
if [ -n "$HEALTH" ]; then
echo "$disk: $HEALTH" >> $REPORT_FILE
fi
fi
fi
done
echo "" >> $REPORT_FILE
echo "报告生成完成: $REPORT_FILE"
# 可选:发送报告
# mail -s "RAID状态报告 $(date)" admin@example.com < $REPORT_FILE
/etc/mdadm.conf 配置文件示例# /etc/mdadm.conf
# 默认创建RAID设备时使用的元数据版本
CREATE owner=root group=disk mode=0660 auto=yes
# 邮件通知地址
MAILADDR admin@example.com
MAILFROM root@$(hostname)
# 自动监控
PROGRAM /usr/local/bin/raid-alert.sh
# 自动装配定义
ARRAY /dev/md0 metadata=1.2 name=myserver:0 UUID=ab345678:90123456:78901234:56789012
ARRAY /dev/md1 metadata=1.2 name=myserver:1 UUID=cd789012:34567890:12345678:90123456
# 设备扫描包含/排除规则
DEVICE /dev/sd[b-f]1
DEVICE /dev/sd[g-k]1
DEVICE partitions
# 自动装配选项
AUTO +all