Linux | mdadm 创建软 RAID

发布于:2025-05-18 ⋅ 阅读:(26) ⋅ 点赞:(0)

注:本文为 “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: