别再怕数据丢了!手把手教你用mdadm在Ubuntu 22.04上组RAID5(附硬盘同步与性能监控指南)
别再怕数据丢了!手把手教你用mdadm在Ubuntu 22.04上组RAID5(附硬盘同步与性能监控指南)
当你的项目代码、家庭照片或设计稿分散在多块硬盘中时,最怕听到的就是硬盘"咔嗒"一声停止转动。我曾经历过一次两块硬盘同时故障的灾难,直到学会用RAID5构建低成本的数据安全方案——它不仅能容忍单块硬盘损坏,还能在重建阵列时保持服务在线。本文将用真实运维经验,教你如何用闲置硬盘搭建兼顾安全与性能的存储系统。
1. 硬件准备与系统环境配置
在开始前需要准备至少三块相同容量的硬盘(建议同品牌同型号)。我用的是一台淘汰的NUC迷你主机加四块4TB西数蓝盘,总成本不到2000元。机械硬盘更适合RAID5,因为重建过程中需要持续读写,SSD的写入寿命可能成为瓶颈。
安装Ubuntu 22.04时注意:
- 系统盘单独使用一块SSD(不加入RAID阵列)
- 勾选"安装OpenSSH服务器"方便远程管理
- 更新软件源:
sudo apt update && sudo apt upgrade -y
检查硬盘识别情况:
lsblk -o NAME,SIZE,MODEL,ROTA输出示例:
sda 3.7T WDC_WD40EZAZ-00SF3B0 1 sdb 3.7T WDC_WD40EZAZ-00SF3B0 1 nvme0n1 500G Samsung SSD 980 0ROTA=1表示机械硬盘,0为SSD
2. 创建RAID5阵列的完整流程
2.1 硬盘分区最佳实践
传统教程会让每块盘创建一个分区,但更安全的做法是:
for disk in /dev/sd{a..d}; do echo "n\np\n1\n\n\nt\nfd\nw" | sudo fdisk $disk done这里使用了Linux的fd(Linux RAID自动检测)类型分区,比普通分区更易识别。重要提醒:操作前务必用lsblk确认设备号,错误的磁盘操作会导致数据永久丢失。
2.2 阵列创建与参数优化
使用mdadm创建阵列时,这些参数能提升性能:
sudo mdadm --create /dev/md0 \ --level=5 \ --raid-devices=4 \ --chunk=256 \ --bitmap=internal \ --assume-clean \ /dev/sd{a..d}1参数解析:
--chunk=256:适合大文件(视频/镜像)的256KB条带大小--bitmap=internal:记录同步进度,意外断电后可续传--assume-clean:跳过初始同步(需手动开始)
查看阵列状态:
watch -n 60 cat /proc/mdstat同步进度会显示类似resync = 12.3%的进度信息,16TB阵列约需20-30小时。
3. 实时监控与性能调优
3.1 同步期间资源监控
新建raid_monitor.sh脚本:
#!/bin/bash while true; do clear echo "==== $(date) ====" echo -e "\n[RAID状态]" cat /proc/mdstat | grep -A1 md0 echo -e "\n[IO负载]" iostat -xmd 1 3 | grep -A4 Device echo -e "\n[CPU温度]" sensors | grep Core sleep 30 done用chmod +x raid_monitor.sh赋予执行权限后,通过./raid_monitor.sh实时查看:
- 重建进度和速度
- 磁盘I/O等待时间(await>50ms需关注)
- CPU使用率和温度
3.2 长期使用优化建议
编辑/etc/mdadm/mdadm.conf添加:
ARRAY /dev/md0 metadata=1.2 spares=1这会在阵列降级时自动邮件报警(需配置mailutils)。日常维护命令:
# 检查坏块 sudo badblocks -sv /dev/md0 # 手动触发数据校验 echo check > /sys/block/md0/md/sync_action # 查看详细健康状态 sudo mdadm --detail /dev/md0 | grep -E 'State|Faulty'4. 高级维护与故障处理
4.1 硬盘更换实操
当mdadm --detail显示Faulty设备时:
- 标记故障盘:
sudo mdadm /dev/md0 --fail /dev/sdd1 - 移除设备:
sudo mdadm /dev/md0 --remove /dev/sdd1 - 物理更换硬盘后重新分区
- 添加新盘:
sudo mdadm /dev/md0 --add /dev/sdd1
关键技巧:重建期间保持系统通电,暂停大文件传输:
echo idle > /sys/block/md0/md/sync_action4.2 性能对比测试
使用fio测试不同场景下的IOPS:
# 随机读写测试 fio --name=randwrite --ioengine=libaio --rw=randwrite \ --bs=4k --numjobs=4 --size=1G --runtime=60 \ --filename=/mnt/raid/test --direct=1 --group_reporting典型结果对比(4块HDD RAID5):
| 测试类型 | 单盘性能 | RAID5性能 | 提升幅度 |
|---|---|---|---|
| 顺序读 | 180MB/s | 520MB/s | 289% |
| 随机4K写 | 0.8MB/s | 3.2MB/s | 400% |
实际使用中发现,RAID5在小文件随机写入时CPU占用可能达到70%,这时可以:
echo 2048 > /sys/block/md0/md/stripe_cache_size5. 文件系统选择与自动化运维
ext4虽稳定但XFS更适合大文件场景。格式化建议:
sudo mkfs.xfs -f -d su=256k,sw=4 -l version=2 /dev/md0挂载参数优化:
/dev/md0 /mnt/raid xfs defaults,noatime,nodiratime,logbsize=256k 0 2设置每周自动巡检:
# 加入crontab 0 3 * * 0 root echo check > /sys/block/md0/md/sync_action最后分享一个血泪教训:曾经因为没配置UPS,停电导致阵列崩溃。现在我的设备必接APC BR550GI后备电源,同时定期执行:
sudo mdadm --examine --scan > /etc/mdadm/mdadm.conf