Linux mdadm命令

mdadm命令 - 管理Linux软件RAID(磁盘阵列)的工具,全称"Multiple Device Admin"。
注意:操作RAID阵列可能涉及数据丢失风险,重要数据请提前备份。

命令简介

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级别 最小磁盘数 容错性 性能 存储利用率 适用场景
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% 高性能需求、数据库

使用示例

示例1:创建RAID 0(条带化)

# 使用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(镜像)

# 使用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

示例3:创建RAID 5并格式化

# 使用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

# 使用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

示例5:查看阵列信息

# 查看所有RAID阵列状态
cat /proc/mdstat

# 查看指定阵列详细信息
mdadm --detail /dev/md0

# 查看设备是否属于某个阵列
mdadm --examine /dev/sdb

# 扫描并输出所有阵列
mdadm --detail --scan

示例6:管理阵列

# 停止阵列
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

示例7:监控阵列

# 监控阵列状态变化
mdadm --monitor --scan --daemonize

# 监控指定阵列并发送邮件通知
mdadm --monitor --scan --mail=admin@example.com --program=/path/to/script

# 查看邮件日志配置
cat /etc/mdadm.conf | grep MAILADDR

示例8:保存配置

# 保存当前RAID配置
mdadm --detail --scan > /etc/mdadm.conf

# 或
mdadm --detail --scan >> /etc/mdadm.conf

# 更新initramfs(确保启动时能识别)
update-initramfs -u

# 或(对于RHEL/CentOS)
dracut --force

完整RAID配置流程

配置RAID 5的完整步骤
  1. 准备磁盘 - 确保磁盘已分区并标记为Linux RAID类型
    # 分区(每块磁盘执行)
    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
  2. 创建RAID阵列
    mdadm --create /dev/md0 --level=5 --raid-devices=3 \
        /dev/sdb1 /dev/sdc1 /dev/sdd1 --spare-devices=1 /dev/sde1
  3. 创建文件系统
    mkfs.xfs /dev/md0
    # 或
    mkfs.ext4 /dev/md0
  4. 挂载使用
    mkdir /raid5
    mount /dev/md0 /raid5
    echo "/dev/md0 /raid5 xfs defaults 0 0" >> /etc/fstab
  5. 保存配置
    mdadm --detail --scan >> /etc/mdadm.conf
    update-initramfs -u
  6. 监控状态
    # 查看状态
    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

磁盘健康检测

监控脚本示例

RAID健康监控脚本
#!/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
RAID状态报告脚本
#!/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