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阵列健康状况?

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

Sora
Sora

Sora是OpenAI发布的一种文生视频AI大模型,可以根据文本指令创建现实和富有想象力的场景。

下载

最直接的办法,就是查看

/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阵列健康维护的关键。

相关专题

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

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

348

2023.06.29

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

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

2074

2023.08.14

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

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

347

2023.08.31

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

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

255

2023.09.05

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

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

323

2023.10.09

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

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

410

2023.10.16

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

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

397

2023.10.16

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

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

219

2023.10.19

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

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

精品课程

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

共48课时 | 7.4万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

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

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