0

0

如何在Linux中配置磁盘阵列 Linux mdadm管理RAID指南

P粉602998670

P粉602998670

发布时间:2025-08-19 09:00:03

|

412人浏览过

|

来源于php中文网

原创

答案:使用mdadm工具可创建和管理Linux软件RAID阵列,以RAID 5为例,需准备至少三块硬盘,清除分区并创建类型为fd的RAID分区,通过mdadm --create命令创建阵列,格式化为ext4等文件系统后挂载使用,并将配置写入/etc/mdadm/mdadm.conf和/etc/fstab以实现开机自动挂载,其中nofail选项防止因RAID问题导致系统无法启动;RAID级别选择需根据需求权衡性能与安全,RAID 0提升性能但无冗余,RAID 1提供镜像保护但容量利用率低,RAID 5兼顾性能、冗余和容量,允许单盘故障,RAID 6支持双盘冗余但写性能较低,RAID 10结合RAID 1和RAID 0的优点,性能好且支持多盘故障但至少需四块盘且容量利用率50%;日常维护中可通过cat /proc/mdstat和mdadm --detail查看阵列状态,配置MAILADDR实现邮件告警,并通过echo "check" > /sys/block/md0/md/sync_action定期进行完整性检查;当成员盘损坏时,应先确认故障盘,使用--fail和--remove将其从阵列中移除,更换新盘并创建相同类型分区后,使用--add加入阵列,系统将自动重建

如何在linux中配置磁盘阵列 linux mdadm管理raid指南

在Linux里折腾磁盘阵列,说白了,就是用

mdadm
这个工具来把几块独立的硬盘“捆绑”起来,让它们作为一个逻辑整体工作。无论是为了数据冗余、性能提升,还是两者兼顾,
mdadm
都是我们实现这一切的核心。它提供了一套相当成熟且灵活的机制,来创建、管理乃至恢复软件RAID。

解决方案

要配置一个基本的Linux软件RAID阵列,比如一个RAID 5,通常会经历以下几个步骤。这并非一蹴而就,需要一点耐心和细致。

首先,你得识别出那些准备用来组建阵列的裸盘。通常它们会是

/dev/sdb
,
/dev/sdc
,
/dev/sdd
之类的。在动手之前,强烈建议你把这些盘上的所有分区都清掉,确保它们是“干净”的。
fdisk
或者
parted
都可以做到这一点,比如
sudo fdisk /dev/sdb
,然后用
d
命令删除所有分区。

接着,为这些盘创建RAID分区。这步其实是可选的,直接用整块盘也可以,但为了管理方便,通常还是会创建类型为

fd
(Linux raid autodetect)的分区。同样是
fdisk
,进入盘符后,
n
新建分区,然后
t
改变分区类型,输入
fd
。对所有参与阵列的盘都这么操作。

现在,核心来了,使用

mdadm
命令创建阵列。假设我们要用
/dev/sdb1
,
/dev/sdc1
,
/dev/sdd1
三块盘来创建一个RAID 5阵列,并指定其设备名为
/dev/md0

sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

执行这条命令后,阵列就开始同步了。这个过程可能需要一段时间,具体取决于磁盘大小和系统负载。你可以通过

cat /proc/mdstat
来查看同步进度。

阵列创建完成后,它现在只是一个“裸”的块设备,需要格式化才能使用。你可以选择你喜欢的任何文件系统,比如

ext4
XFS

sudo mkfs.ext4 /dev/md0

格式化完毕,就可以挂载它了。先创建一个挂载点:

sudo mkdir /mnt/raid5_data
sudo mount /dev/md0 /mnt/raid5_data

为了让阵列在系统重启后也能自动挂载,你需要做两件事。一是把阵列的配置信息保存到

mdadm.conf
文件里,二是把挂载信息添加到
/etc/fstab

保存阵列配置:

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

更新initramfs以确保系统启动时能识别RAID:

sudo update-initramfs -u

编辑

/etc/fstab
,添加一行:

/dev/md0 /mnt/raid5_data ext4 defaults,nofail 0 0

这里的

nofail
参数挺重要的,它能防止在RAID阵列出现问题时导致系统无法启动。

到这里,一个基本的RAID 5阵列就算配置完成了。

RAID级别选择:哪种RAID模式最适合我的需求?

这真的是个老生常谈,但又不得不深入思考的问题。我个人在选择RAID级别时,往往会先问自己几个问题:最看重什么?是极致的性能,还是绝对的数据安全?抑或是两者之间的平衡点?

比如,如果你只是想把几块小容量硬盘合并成一个大卷,或者追求纯粹的读写速度,对数据丢失几乎零容忍,那RAID 0可能听起来很诱人。它把数据条带化分布在所有磁盘上,理论上读写性能是单盘的N倍(N为磁盘数量)。但请注意,RAID 0没有冗余,任何一块盘挂掉,整个阵列的数据就全毁了,这是它的致命伤。我一般只在对性能有极端要求,且数据可以随时重建,或者有其他完善备份方案的场景下考虑它。比如,一些临时的高速缓存区。

RAID 1,也就是镜像,它把数据完整地复制到两块或多块盘上。这意味着你需要至少两块盘,且可用容量只有其中一块盘的大小。它的好处是,只要有一块盘还活着,数据就在。读性能会有提升,写性能则可能受限于最慢的那块盘。对于我来说,存放重要文档、照片,或者关键系统盘,RAID 1是首选,它提供了最直接、最可靠的数据保护。缺点是存储效率低,一半的容量都用来做冗余了。

而RAID 5,是我在兼顾性能、冗余和存储效率时最常用的一个选项。它需要至少三块盘,通过奇偶校验(parity)来实现数据冗余。这意味着即使其中一块盘损坏,数据依然可以通过剩余的盘和奇偶校验信息重建出来。它的可用容量是(N-1)块盘的总和。读写性能比RAID 0差,但比RAID 1好,尤其是在读操作上。写操作因为要计算奇偶校验,会略有开销。对于多数文件服务器、NAS或者个人数据中心,RAID 5是个非常平衡的选择。不过,当阵列中出现第二块盘损坏时(在第一块盘还没来得及替换重建完成之前),整个阵列的数据也会丢失。这也就是为什么很多人现在倾向于RAID 6,或者RAID 10。

RAID 6是RAID 5的升级版,它使用了双重奇偶校验,允许同时损坏两块盘而数据不丢失。当然,这需要更多的磁盘(至少4块),并且会牺牲更多的容量(两块盘的容量用于奇偶校验)。性能上,写性能会比RAID 5稍差,但数据安全性大大提高。对于存储极其重要,且对可用性有高要求的场景,RAID 6是个不错的选择。

RAID 10(或者RAID 1+0)则是RAID 1和RAID 0的结合体。它首先创建多个RAID 1对,然后再将这些RAID 1对组成一个RAID 0。这意味着它同时拥有RAID 0的性能和RAID 1的冗余。至少需要四块盘,并且磁盘利用率只有50%。但它的读写性能非常出色,同时可以容忍每个RAID 1对中一块盘的故障。对于数据库、虚拟机存储等对性能和可靠性都有高要求的应用,RAID 10往往是最佳实践。

所以,没有绝对“最好”的RAID级别,只有“最适合”你当前需求的。

如何监控和维护Linux中的RAID阵列健康状况?

阵列搭起来了,这只是第一步。更重要的是,你得知道它是不是健康地运行着,别等真出问题了才发现。监控和维护,其实就是日常的“体检”和“保养”。

灵机语音
灵机语音

灵机语音

下载

最直接的办法,就是查看

/proc/mdstat
。这个文件是内核提供的一个虚拟文件,实时反映着所有
md
设备的状态。

cat /proc/mdstat

你会看到每个阵列的名称、RAID级别、参与的设备、状态(如

active
recovering
resync
),以及是否有故障盘(
[U_]
表示有故障盘,
[_U]
表示备用盘)。如果看到
[U_]
或者
[__]
这种非
[UUU]
(假设是三块盘的RAID 5)的状态,那就要警惕了。

mdadm
本身也提供了强大的监控功能。
mdadm --detail /dev/md0
可以显示阵列的详细信息,包括成员盘状态、最后一次构建时间、事件计数等。

sudo mdadm --detail /dev/md0

输出中

State : clean
通常表示阵列健康,
State : clean, degraded
则表示有盘故障了。

为了实现自动化监控,

mdadm
可以配置为发送邮件通知。你需要在
/etc/mdadm/mdadm.conf
中添加一个
MAILADDR
行,指定接收邮件的地址。然后确保系统安装并配置了邮件发送服务(如
postfix
ssmtp
)。

# 在mdadm.conf中添加
MAILADDR your_email@example.com

mdadm
的守护进程
mdadm --monitor
会持续监控阵列状态,一旦发现问题(比如磁盘故障),就会通过邮件通知你。这个服务通常会在系统启动时自动运行。

此外,定期进行RAID阵列的完整性检查(

check
repair
模式)也是个好习惯。虽然这会带来一定的I/O负载,但能确保数据的一致性。

echo "check" | sudo tee /sys/block/md0/md/sync_action

这个操作会在后台进行,你可以在

/proc/mdstat
中看到
[check]
的进度。如果发现错误,
mdadm
会自动尝试修复。

总的来说,主动查看状态、配置邮件告警,并定期进行完整性检查,是保证RAID阵列长期稳定运行的关键。

当RAID阵列成员盘损坏时,我该如何进行恢复操作?

这是每个RAID使用者都可能遇到的噩梦,但有了RAID的冗余特性,它往往只是个小插曲,而不是灾难。关键在于你如何冷静且正确地处理。

假设你的RAID 5阵列

/dev/md0
中的
/dev/sdb1
不幸挂掉了。你首先会通过
cat /proc/mdstat
mdadm --detail /dev/md0
看到它的状态变成了
degraded
,并且
/dev/sdb1
旁边会显示
[F]
(failed)或者
[U_]
中的下划线。

第一步,确认故障盘。通常,系统日志(

dmesg
journalctl -xe
)会记录磁盘的I/O错误信息。物理上,你可能需要检查硬盘指示灯,或者听听有没有异常噪音。

第二步,将故障盘从阵列中标记为

failed
并移除。虽然
mdadm
通常会自动标记,但手动执行一遍更保险。

sudo mdadm --manage /dev/md0 --fail /dev/sdb1
sudo mdadm --manage /dev/md0 --remove /dev/sdb1

执行

remove
后,
mdadm
会把这个盘从阵列的配置中彻底移除。此时,阵列仍然处于
degraded
状态,但已经没有那个故障盘了。

第三步,更换物理硬盘。关机,拔掉坏盘,插上新盘。启动系统后,新盘可能会被识别为

/dev/sde
或其他新的设备名。记住,新盘的容量必须等于或大于原阵列中最小的磁盘容量。

第四步,将新盘添加到阵列中。假设新盘是

/dev/sde
,并且你已经像之前一样为它创建了
fd
类型的分区
/dev/sde1

sudo mdadm --manage /dev/md0 --add /dev/sde1

一旦新盘被添加进去,

mdadm
会自动开始重建(rebuild)过程。你可以再次通过
cat /proc/mdstat
来查看重建进度。它会显示
[UU_]
,并且后面跟着重建的百分比。这个过程会比较漫长,具体取决于阵列的大小和系统负载。在此期间,阵列的性能可能会有所下降。

重建完成后,

/proc/mdstat
会显示
[UUU]
(对于三盘RAID 5),并且状态会恢复为
clean
。至此,RAID阵列的恢复操作就完成了。

需要注意的是,在重建过程中,如果再有另一块盘发生故障,那么整个阵列的数据就可能彻底丢失了。这就是为什么在RAID 5中,一旦有盘损坏,应该尽快更换并重建。这也是RAID 6和RAID 10在应对多盘故障时更具优势的原因。

所以,保持警惕,及时响应,是RAID阵列健康维护的关键。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

390

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2112

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

359

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

420

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

480

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

231

2023.10.19

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.7万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号