Linux | mdadm 创建软 RAID

注:本文为 “Linux mdadm RAID” 相关文章合辑。

略作重排,未整理去重。
如有内容异常,请看原文。


Linux 下用 mdadm 创建软 RAID 以及避坑

喵ฅ・ﻌ・ฅ Oct 31, 2023

前言

linux 下组软 raid 用 mdadm 命令,multiple devices admin,多设备管理。

大坑

先把大坑写前面。

用来创建 raid 的硬盘,不管是新盘还是旧盘,在 linux 中挂载以后,请先用 wipefs 命令清理硬盘上的分区表信息。

硬盘分区有两种,mbr 和 gpt,mbr 可以直接裸盘不分区就创建 raid,gpt 必须要有分区才能创建 raid。

如果组 raid 的几块硬盘分区表信息不统一,虽然能成功创建 raid,但是系统一重启就会掉 raid,也就是 raid 消失了。

没错,系统一重启 raid 就没了。如果你已经在这个 raid 上导入数据,这个坑肯定能惊出你一头汗。
所以拿到硬盘以后,最好是用 wipefs 直接清空分区表。

也有人说用 fdisk,但实际 fdisk 只能处理 mbr 分区表,需要用升级版 gdisk 才能处理 gpt 分区表。

假定磁盘是 /dev/sdb

查看分区表

\# wipefs /dev/sdb

删除分区表所有信息

\# wipefs -a -f /dev/sdb

分区注意事项

创建 raid 之前,要简单了解一下 mbr 和 gpt 分区,避免后续再踩雷。
mbr:

  • 不支持 2TB 以上容量的硬盘
  • 可以不分区,以裸盘为单位创建 raid
  • fdisk 处理分区
    gpt:
  • 支持 2TB 以上容量的硬盘
  • 必须先分区,以分区为单位创建 raid
  • gdisk 处理分区

创建磁盘阵列

我没有那么大容量的硬盘,而且系统也是 legacy bios 引导,所以这里选择 mbr 裸盘创建阵列。

第一步:查看分区表

先确认前面已经用 wipefs 清空了旧硬盘上的分区表信息。

查看分区表

\# wipefs /dev/sdb

删除分区表

\# wipefs -a -f /dev/sdb

注意:如果是 gpt 分区,注意要用 gdisk 先分区,/dev/sdb1 和 /dev/sdc1,下面创建 raid 的时候也是用 /dev/sdb1 和 /dev/sdc1。

第二步:创建 raid0

mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb/dev/sdc
  • /dev/md0 : 指创建的磁盘阵列的名称,如果有多个 raid,可以按顺序往下编,比如 /dev/md1
  • level=0 :指 raid0,还有 1、5、10 等等,对应 raid1、raid5、raid10
  • raid-devices=2 :指阵列的磁盘数量,2 块盘就是 2
    创建完成后,可以用下面的命令查看 raid 信息。
mdadm --detail /dev/md0

第三步:创建文件系统(格式化)

raid 创建成功以后,需要格式化

\# mkfs.ext4 /dev/md0

注意 ext4 文件格式下,系统会预留 5% 的冗余空间,简单换算就是 1TB 就会保留 50GB 空间。

第四步:保存 raid 信息

注意不同 linux 版本 mdadm 的配置文件路径可能不同,debian 是 /etc/mdadm/mdadm.conf

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

第五步:挂载 raid
创建挂载点

\# mkdir /mnt/raid0

挂载

\# mount /dev/md0 /mnt/raid0

第六步:开机自动挂载

blkid 查看 /dev/md0 的 uuid 编号,然后添加到 /etc/fstab 中即可。
或者用命令自动添加

echo `blkid /dev/md0 | awk '{print $2}' | sed's/\"//g'` /media/raid0 ext4 defaults 0 0 /etc/fstab

如何在 Linux 中清除 / 删除磁盘或者分区中的所有分区表

要清除分区表,可以使用 wipefs 命令。们需要了解的有关分区、分区类型、分区方案的所有信息。

这里有一个磁盘 /dev/sdb, 在这个磁盘中,创建了两个主分区:

\# fdisk -l /dev/sdb
Disk /dev/sdb: 17.2 GB, 17179869184 bytes, 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes/512 bytes
I/O size (minimum/optimal): 512 bytes/512 bytes
Disk label type: dos
Disk identifier: 0x1410600c
Device Boot   Start     End   Blocks  Id System
/dev/sdb1      2048   4196351   2097152  83 Linux
/dev/sdb2     4196352  10487807   3145728  83 Linux

现在想从这个磁盘清除分区表
为此,可以使用以下命令

检查分区表

\# wipefs /dev/sdb
offset               type
---------------------------------------------
0x1fe                dos   [partition table]

这里有一个 dos 分区表

清除分区表

使用以下命令可以擦除 “dos” 分区表

\# wipefs -a -t dos -f /dev/sdb
/dev/sdb: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdb: calling ioclt to re-read partition table: Success

如果有一个 GPT 分区表然后清除相同的

\# wipefs -a -t gpt -f /dev/sdb

清除所有分区表

\# wipefs -a -f /dev/sdb

们还可以使用偏移值删除分区表,如上所示

\# wipefs -o 0x1fe /dev/sdb

上述命令返回成功后,使用 fdisk 查看分区表

\# fdisk -l /dev/sdb
Disk /dev/sdb: 17.2 GB, 17179869184 bytes, 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes/512 bytes
I/O size (minimum/optimal): 512 bytes/512 bytes

可以看到,两个分区都已被清除 / 删除。


记一次采坑经历, mdadm 创建 raid0,重启后自动消失

家里的一台 Linux 主机,加了两块 1T 硬盘,最近打算组成 raid 用来下 PT,由于没有阵列卡主板也不支持 raid,于是就用 mdadm 软 raid,创建过程:

mdadm -Cv /dev/md0 -a yes -n 2 -l 0 /dev/sdb/dev/sdc
mkfs.xfs -f /dev/md0

一切正常,最后把挂载信息写入 /etc/fstab

结果重启就问题了,卡在进度条,几分钟后自动进入了救援模式(显示的什么内容忘记了)

经过多次测试,确定是重启之后,/dev/md0 设备就直接消失了。。。消失了。。。消失了。。。

查了很久的资料,尝试过修改 /etc/mdadm/mdadm.conf 文件,在里面增加 ARRAY /dev/md0… 的方法,但是并没有效果
直到看到了这个,这个问题应该是和 GPT 分区表有关:
https://unix.stackexchange.com/questions/156424/centos-7-created-mdadm-array-disappears-after-reboot

于是先尝试了一个简单的方法,进 PE 把两块硬盘从 GPT 转成 MBR,然后重新创建 raid,重启后就没有消失了,但是这个简单的方法并不完美,因为 MBR 最大只支持 2TB 的硬盘
最后还是使用 GPT,但是在创建 raid 之前要使用 gdisk 命令在两块硬盘上各创建一个分区,/dev/sdb1 和 /dev/sdc1,然后再使用分区创建 raid:

mdadm -Cv /dev/md0 -a yes -n 2 -l 0 /dev/sdb1 /dev/sdc1
mkfs.xfs -f /dev/md0

这次重启之后 /dev/md0 没有消失,最后将挂载信息写入 /etc/fstab,一切正常

给后来者的提示:

这个问题主要原因是用于组阵列的硬盘没有正确清除原始的信息,导致磁盘被首先认作 GPT 磁盘而非 MDADM 成员。

解决方法也很简单,就是清除掉 GPT 分区表,即清除掉头部的数个扇区和尾部的数个扇区,就行了。

也可以先转换成 MBR (转换过程中会自动清除 GPT 分区表),然后再清除 MBR 分区表(第一个扇区)即可。
没有必要先分区再组阵列。

只要知道了问题所在就简单了,就可以得出很有多种解决方法,选择适合自己的就好,很少玩物理机,没想到 UEFI+GPT 会遇到这个问题

mdadm -Cv /dev/md0 -a yes -n 2 -l 0 /dev/sdb/dev/sdc
mkfs.xfs -f /dev/md0

那个,第一次知道还有楼主这种骚操作

按照通常 LINUX 软 RAID 的规范,首先你要创建分区,然后这个分区的 type 代码为 FD,就是 LINUX RAID

然后用这两个 FD 类型的分区去建立软 RAID

问题不大其实。阵列卡做阵列就相当于全盘做。

裸盘做 raid======== 骚操作?

一个合格的 raid 程序,给裸盘建 raid 时,就必须!!!清除头尾 n 个扇区,以免被误认。

然后在裸盘头尾写上自己家的数据。

很显然这个 mdadm 程序不合格,或者 centos 中的 mdadm 版本太老。


linux 中 Raid0 磁盘阵列的搭建

环境:

linux 版本号

img

linux 内核信息

\# uname -a
\# uname -n
\# uname -r

img

步骤 1:先添加两块 20G 的硬盘

img

步骤 2:(1)mdadm -C -v /dev/md0 -l 0 -n 2 /dev/sdb/dev/sdc

温馨提示:如果系统没有 mdadm 命令,可以 yum 安装,yum install mdadm -y

注:mdadm 是一个用于创建、管理、监控 RAID 设备的工具,有关 mdadm 命令可以自行百度

   (2) 查看是否成功

img

(3)mdadm -Ds

 mdadm -Ds >/etc/mdadm.conf  将输出的信息导入到 /etc/mdadm.conf 中

img

(4)查看 raid 0 属性:mdadm -D /dev/md0

img

表明 raid 0 已经创建好了

步骤 3:给 /dev/md0 分区:fdisk /dev/md0

img

步骤 4:格式化文件系统:mkfs -t xfs /dev/md0p1

img

步骤 5:创建挂载点 mkdir raid0

步骤 5: 把 /dev/md0p1 挂载到 /raid0 中:mount /dev/md0p1 /raid0/

步骤 6:df -h 查看

img

如图显示已经成功挂载

步骤 7:通过 UUID 的方式编辑 /etc/fstab 设置开机自动挂载

img

img

posted @ 2018-09-16 00:01 运维 cainiao


via:

  • Linux 下用 mdadm 创建软 RAID 以及避坑 // 喵ฅ・ﻌ・ฅ Oct 31, 2023
    https://ruohai.wang/202310/mdadm-create-soft-raid-guide/

  • 创建 RAID 阵列(Linux)
    https://help.aliyun.com/zh/ecs/use-cases/create-a-raid-array-for-a-linux-instance

  • 如何在 Linux 中清除 / 删除磁盘或者分区中的所有分区表
    https://www.onitroad.com/jc/linux/faq/how-to-delete-all-the-partition-table-from-a-disk-in-linux.html

  • 记一次采坑经历, mdadm 创建 raid0,重启后自动消失_数据地带 2021-06-19 02:19:59 idczone
    https://www.idczone.net/news/5766.html/

  • linux 中 Raid0 磁盘阵列的搭建
    https://www.cnblogs.com/liuhui-xzz/p/9653123.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/81709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity自定义shader打包SpriteAtlas图集问题

Unity打包图集还是有一些坑的,至于图集SpriteAtlas是什么请参考我之前写的文章:【Sprite Atlas】Unity新图集系统SpriteAtlas超详细使用教程_spriteatlas 使用-CSDN博客 问题: 今天碰到的问题是,shader绘制的时候,因…

如何用 OceanBase 的 LOAD DATA 旁路导入进行大表迁移

前言 在日常工作中,我们时常会遇到需要将某个大数据量的单表进行迁移的情况。在MySQL中,针对这样的大表,我们通常会选择先将原表导出为csv格式,然后利用LOAD DATA语法来导入csv文件,这种方法相较于mysqldump在效率上有…

VR 互动实训的显著优势​

(一)沉浸式学习,提升培训效果​ 在 VR 互动实训中,员工不再是被动的知识接受者,而是主动的参与者。以销售培训为例,员工戴上 VR 设备,就能置身于逼真的销售场景中,与虚拟客户进行面对…

OpenCV 第6课 图像处理之几何变换(重映射)

1. 概述 简单来说,重映射就是把一副图像内的像素点按照规则映射到到另外一幅图像内的对应位置上去,形成一张新的图像。 因为原图像与目标图像的像素坐标不是一一对应的。一般情况下,我们通过重映射来表达每个像素的位置(x,y),像这样: g(x,y)=f(h(x,y)) 在这里g()是目标图…

Java虚拟机 - 程序计数器和虚拟机栈

运行时数据结构 Java运行时数据区程序计数器为什么需要程序计数器执行流程虚拟机栈虚拟机栈作用虚拟机栈核心结构运行机制 Java运行时数据区 首先介绍Java运行时数据之前,我们要了解,对于计算机来说,内存是非常重要的资源,因为内…

MySQL数据库——支持远程IP访问的设置方法总结

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实…

CSS- 4.6 radiu、shadow、animation动画

本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 点…

排序算法之基础排序:冒泡,选择,插入排序详解

排序算法之基础排序:冒泡、选择、插入排序详解 前言一、冒泡排序(Bubble Sort)1.1 算法原理1.2 代码实现(Python)1.3 性能分析 二、选择排序(Selection Sort)2.1 算法原理2.2 代码实现&#xff…

第十节第一部分:常见的API:Math、System、Runtime

Math类介绍及常用方法(了解知道即可) System类介绍及常用方法(了解知道即可) Runtime类介绍及常用方法(了解知道即可) 代码: 代码一:Math类 package com.itheima.d14_math;public …

智能体间协作的“巴别塔困境“如何破解?解读Agent通信4大协议:MCP/ACP/A2A/ANP

AI 智能体的兴起触发了AI应用协作的新领域。这些智能体不再局限于被动的聊天机器人或独立的系统,它们现在被设计用于推理、计划和协作ーー跨任务、跨域甚至跨组织。但随着这一愿景成为现实,一个挑战很快浮出水面: 智能体如何以一种安全、可伸…

项目进度延误,如何按时交付?

项目进度延误可以通过加强计划管理、优化资源分配、强化团队沟通、设置关键里程碑和风险管理机制等方式来实现按时交付。加强计划管理、优化资源分配、强化团队沟通、设置关键里程碑、风险管理机制。其中,加强计划管理尤为关键,因为明确而详细的计划能提…

详解ip地址、子网掩码、网关、广播地址

1. IP 地址 定义:IP 地址是网络设备在网络中的唯一标识,用于标识设备的网络位置,类似于现实中的门牌号。它分为 IPv4(如 192.168.1.5)和 IPv6(如 240e:305:3685:8100:a00:27ff:fefb:56b8)。 示…

为 Windows 和 Ubuntu 中设定代理服务器的详细方法

有时下载大模型总是下载不出来,要配置代理才行 一、Windows代理设置 ① 系统全局代理设置 打开【设置】→【网络和Internet】→【代理】。 在【手动设置代理】下,打开开关,输入: 地址:10.10.10.215 端口:…

鸿蒙OSUniApp 实现的表单验证与提交功能#三方框架 #Uniapp

UniApp 实现的表单验证与提交功能 前言 在移动端应用开发中,表单是用户与应用交互的重要媒介。一个好的表单不仅布局合理、使用方便,还应该具备完善的验证与提交功能,以确保用户输入的数据准确无误。本文将分享如何在 UniApp 中实现表单验证…

前端的面试笔记——HTMLJavaScript篇(二)前端页面性能检测

前端页面性能检测和判定是优化用户体验的核心环节,需要结合实验室数据(Lab Data)、现场数据(Field Data)和行业标准综合评估。以下是主流方法、工具及判定标准的详细解析: 一、性能检测的核心维度与指标 …

再来1章linux系列-19 防火墙 iptables 双网卡主机的内核 firewall-cmd firewalld的高级规则

学习目标: 实验实验需求实验配置内容和分析 (每一个设备的每一步操作)实验结果验证其他 学习内容: 实验实验需求实验配置内容和分析 (每一个设备的每一步操作)实验结果验证其他 1.实验 2.实验需求 图…

LLM-Based Agent综述及其框架学习(五)

文章目录 摘要Abstract1. 引言2. 文本输出3. 工具的使用3.1 理解工具3.2 学会使用工具3.3 制作自给自足的工具3.4 工具可以扩展LLM-Based Agent的行动空间3.5 总结 4. 具身动作5. 学习智能体框架5.1 CrewAI学习进度5.2 LangGraph学习进度5.3 MCP学习进度 参考总结 摘要 本文围绕…

游戏引擎学习第298天:改进排序键 - 第1部分

关于向玩家展示多个房间层所需的两种 Z 值 我们在前一天基本完成了为渲染系统引入分层 Z 值的工作,但还没有完全完成所有细节。我们开始引入图形渲染中的分层概念,即在 Z 轴方向上拥有多个独立图层,每个图层内部再使用一个单独的 Z 值来实现…

一些C++入门基础

关键字 图引自 C 关键词 - cppreference.com 命名空间 命名空间解决了C没办法解决的各类命名冲突问题 C的标准命名空间:std 命名空间中可以定义变量、函数、类型: namespace CS {//变量char cs408[] "DS,OS,JW,JZ";int cs 408;//函数vo…

学习笔记:黑马程序员JavaWeb开发教程(2025.4.6)

12.4 登录校验-JWT令牌-介绍 JWT(JSON Web Token) 简洁是指JWT是一个简单字符串,自包含指的是JWT令牌,看似是一个随机字符串,但是可以根据需要,自定义存储内容 Header是JSON数据格式,原始JSO…