使用 mdadm 管理 RAID 阵列
RAID mdadm
![](/data/attachment/album/201904/27/154508lru2xrh3mxba2vra.jpg)


mdadm 是<ruby> 多磁盘和设备管理 <rt>  Multiple Disk and Device Administration </rt></ruby> 的缩写。它是一个命令行工具，可用于管理 Linux 上的软件 [RAID](https://en.wikipedia.org/wiki/RAID) 阵列。本文概述了使用它的基础知识。


以下 5 个命令是你使用 mdadm 的基础功能：


1. **创建 RAID 阵列**：`mdadm --create /dev/md/test --homehost=any --metadata=1.0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1`
2. **组合（并启动）RAID 阵列**：`mdadm --assemble /dev/md/test /dev/sda1 /dev/sdb1`
3. **停止 RAID 阵列**：`mdadm --stop /dev/md/test`
4. **删除 RAID 阵列**：`mdadm --zero-superblock /dev/sda1 /dev/sdb1`
5. **检查所有已组合的 RAID 阵列的状态**：`cat /proc/mdstat`


### 功能说明


#### mdadm –create


上面的创建命令除了 `-create` 参数自身和设备名之外，还包括了四个参数：


1、`–homehost`：


默认情况下，`mdadm` 将你的计算机名保存为 RAID 阵列的属性。如果你的计算机名与存储的名称不匹配，则阵列将不会自动组合。此功能在共享硬盘的服务器群集中很有用，因为如果多个服务器同时尝试访问同一驱动器，通常会发生文件系统损坏。名称 `any` 是保留字段，并禁用 `-homehost` 限制。


2、 `–metadata`：


`-mdadm` 保留每个 RAID 设备的一小部分空间，以存储有关 RAID 阵列本身的信息。 `-metadata` 参数指定信息的格式和位置。`1.0` 表示使用版本 1 格式，并将元数据存储在设备的末尾。


3、`–level`：


`-level` 参数指定数据应如何在底层设备之间分布。级别 `1` 表示每个设备应包含所有数据的完整副本。此级别也称为[磁盘镜像](https://en.wikipedia.org/wiki/Disk_mirroring)。


4、`–raid-devices`：


`-raid-devices` 参数指定将用于创建 RAID 阵列的设备数。


通过将 `-level=1`（镜像）与 `-metadata=1.0` （将元数据存储在设备末尾）结合使用，可以创建一个 RAID1 阵列，如果不通过 mdadm 驱动访问，那么它的底层设备会正常显示。这在灾难恢复的情况下很有用，因为即使新系统不支持 mdadm 阵列，你也可以访问该设备。如果程序需要在 mdadm 可用之前以*只读*访问底层设备时也很有用。例如，计算机中的 [UEFI](https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface) 固件可能需要在启动 mdadm 之前从 [ESP](https://en.wikipedia.org/wiki/EFI_system_partition) 读取引导加载程序。


#### mdadm –assemble


如果成员设备丢失或损坏，上面的组合命令将会失败。要强制 RAID 阵列在其中一个成员丢失时进行组合并启动，请使用以下命令：



```
# mdadm --assemble --run /dev/md/test /dev/sda1
```

### 其他重要说明


避免直接写入底层是 RAID1 的设备。这导致设备不同步，并且 mdadm 不会知道它们不同步。如果你访问了在其他地方被修改了设备的某个 RAID1 阵列，则可能导致文件系统损坏。如果你在其他地方修改 RAID1 设备并需要强制阵列重新同步，请从要覆盖的设备中删除 mdadm 元数据，然后将其重新添加到阵列，如下所示：



```
# mdadm --zero-superblock /dev/sdb1
# mdadm --assemble --run /dev/md/test /dev/sda1
# mdadm /dev/md/test --add /dev/sdb1
```

以上用 sda1 的内容完全覆盖 sdb1 的内容。


要指定在计算机启动时自动激活的 RAID 阵列，请创建 `/etc/mdadm.conf` 配置。


有关最新和详细信息，请查看手册页：



```
$ man mdadm
$ man mdadm.conf
```

本系列的下一篇文章将展示如何将现有的单磁盘 Linux 系统变为镜像磁盘安装，这意味着即使其中一个硬盘突然停止工作，系统仍将继续运行！




---


via: <https://fedoramagazine.org/managing-raid-arrays-with-mdadm/>


作者：[Gregory Bartholomew](https://fedoramagazine.org/author/glb/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


OK
Mdadm stands for __M__ultiple __D__isk and Device __Adm__inistration. It is a command line tool that can be used to manage software [RAID](https://en.wikipedia.org/wiki/RAID) arrays on your Linux PC. This article outlines the basics you need to get started with it.

The following five commands allow you to make use of mdadm’s most basic features:

**Create a RAID array**:

# mdadm --create /dev/md/test --homehost=any --metadata=1.0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1**Assemble (and start) a RAID array**:

# mdadm --assemble /dev/md/test /dev/sda1 /dev/sdb1**Stop a RAID array**:

# mdadm --stop /dev/md/test**Delete a RAID array**:

# mdadm --zero-superblock /dev/sda1 /dev/sdb1**Check the status of all assembled RAID arrays**:

# cat /proc/mdstat

## Notes on features

`mdadm --create`

The *create* command shown above includes the following four parameters in addition to the create parameter itself and the device names:

**–homehost**:

By default, mdadm stores your computer’s name as an attribute of the RAID array. If your computer name does not match the stored name, the array will not automatically assemble. This feature is useful in server clusters that share hard drives because file system corruption usually occurs if multiple servers attempt to access the same drive at the same time. The name*any*is reserved and disables the*homehost*restriction.**–metadata**:*mdadm*reserves a small portion of each RAID device to store information about the RAID array itself. The*metadata*parameter specifies the format and location of the information. The value*1.0*indicates to use version-1 formatting and store the metadata at the end of the device.**–level**:

The*level*parameter specifies how the data should be distributed among the underlying devices. Level*1*indicates each device should contain a complete copy of all the data. This level is also known as[disk mirroring](https://en.wikipedia.org/wiki/Disk_mirroring).**–raid-devices**:

The*raid-devices*parameter specifies the number of devices that will be used to create the RAID array.

By using *level=1* (mirroring) in combination with *metadata=1.0* (store the metadata at the end of the device), you create a RAID1 array whose underlying devices appear normal if accessed without the aid of the mdadm driver. This is useful in the case of disaster recovery, because you can access the device even if the new system doesn’t support mdadm arrays. It’s also useful in case a program needs *read-only* access to the underlying device before mdadm is available. For example, the [UEFI](https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface) firmware in a computer may need to read the bootloader from the [ESP](https://en.wikipedia.org/wiki/EFI_system_partition) before mdadm is started.

`mdadm --assemble`

The *assemble* command above fails if a member device is missing or corrupt. To force the RAID array to assemble and start when one of its members is missing, use the following command:

# mdadm --assemble --run /dev/md/test /dev/sda1

## Other important notes

Avoid writing directly to any devices that underlay a mdadm RAID1 array. That causes the devices to become out-of-sync and mdadm won’t know that they are out-of-sync. If you access a RAID1 array with a device that’s been modified out-of-band, you can cause file system corruption. If you modify a RAID1 device out-of-band and need to force the array to re-synchronize, delete the mdadm metadata from the device to be overwritten and then re-add it to the array as demonstrated below:

# mdadm --zero-superblock /dev/sdb1

# mdadm --assemble --run /dev/md/test /dev/sda1

# mdadm /dev/md/test --add /dev/sdb1

These commands completely overwrite the contents of sdb1 with the contents of sda1.

To specify any RAID arrays to automatically activate when your computer starts, create an */etc/mdadm.conf* configuration file.

For the most up-to-date and detailed information, check the man pages:

$ man mdadm

$ man mdadm.conf

The next article of this series will show a step-by-step guide on how to convert an existing single-disk Linux installation to a mirrored-disk installation, that will continue running even if one of its hard drives suddenly stops working!

## Norbert J.

Great idea to shed some light on this quite complex matter, thanks!

I have been using MD RAIDs on 2 desktop computers for some years and always wondered what “homehost” is good for. It took me also some time to figure out that a kernel parameter “rd.md.uuid=…” is needed if the root fs resides on a MD RAID and a generic (not host-only) initramfs is used; maybe you want to mention this in a later article.

## Gregory Bartholomew

Interesting. I didn’t know that an initramfs compiled with “hostonly=no” will exclude the /etc/mdadm.conf file. I just checked with the current version of dracut (049-26.git20181204), and indeed /etc/mdadm.conf does get excluded. So, your options with a “hostonly=no” initramfs are to specify the UUID on the kernel command line, manually include the /etc/mdadm.conf file when you build the initramfs, or specify the rd.auto kernel command line option to have all RAID arrays automatically assembled. The latter probably makes the most sense if you are really going for a “generic” system.

I’m adding a note about this problem to the upcoming article right now. Thanks!

## Göran Uddeborg

You hint this will become a series. It would be very much appreciated if you could include one post on debugging. I have tried to create a RAID-1 setup quite similar to what you describe above. It seems to work functionally, but a lot of the time it feels like it goes VERY slowly. When running on only one of the disks, I don’t see the issue. I would expect to see a slight speedup for reads and a slight slowdown for writes, but not as much as this.

Note: I’m not asking you to help debugging my system! I’m only suggesting debugging as a topic for one of the parts in the series, and just gave the description above to explain what I mean.

## Gregory Bartholomew

Sure. I’ll see what I can put together. Thanks for the idea! ????

## Mark

Thanks for this, the other important notes section is what I will find most useful as at some point a disk will need to be replaced; so jotted that down as a starting point for the day I need it.

I found the article at https://www.tecmint.com/create-raid1-in-linux/ an easy how-to in setting up software raid1 on two additional disks and using mdadm to create the contents needed for mdadm.conf.

Looking forward on the upcoming article on how to convert a single disk system to mirrored, if it can be done without losing data.

## Stuart D Gathman

I like to use raid10 (which is different from raid1+0) because you can mirror and stripe with any number of devices, including 3. The stripes are arranged in a pattern to get performance like striping (raid0), but with mirroring. Raid 1+0 also does that, but only with more drives (starting with 4).

I use raid1, when I need to mirror boot partitions.

## Gregory Bartholomew

Sure. I’ve heard that the answer to the problem “I need more disk speed” is to “throw more spindles” (i.e. disk drives in RAID arrays) at the problem; even for big companies and datacenters.

One thing to beware of though is how hard it will be to recover from the situation if your computer were to fail. Which is yet another advantage of software RAID — it is a bit more “portable” than a proprietary hardware RAID controller (and I have seen hardware RAID controllers fail). If you have a more complicated software RAID configuration, it may be difficult to reconstruct in the event that your computer dies. So there are trade-offs.

## Stuart D Gathman

One huge advantage of software RAID, is that you don’t need to match drive size or waste space. E.g., suppose you have 2 1T drives, with raid1 (for simplicity). Now you add a 3rd 2T drive. How do you use the space while maintaining mirroring? Simple:

o allocate 2 1T partitions on the 2T drive

o migrate one of the 1T mirror legs to the first 1T partition.

o create a new RAID array from the 2nd 1T partition and the vacated 1T drive

o add the new RAID array to your Volume Group

## Gregory Bartholomew

Indeed. Another thing that I like about it is that it is easy to configure email notifications to be sent in case a drive fails. You can even configure an arbitrary program to be run if, for example, you wanted a text message instead of an email. The possibilities are endless. ????

## Stuart D Gathman

I’ve also seen some benchmarks indicating that software RAID is faster than hardware for raid0, raid1 (and presumably raid10 if that were an option on hardware) with comparable controllers. The hardware is mainly for raid5 and 6, where handling the checksums and read, modify, write cycles is expensive.

## Gregory Bartholomew

Makes sense. The OS knows a lot more about the processes that are running and their access patterns than the hard drive or RAID controller ever could. It has a lot more memory with which to hold and reorder read and write operations too.

## Daniel Letai

Can a CPU extension such as AES-NI be used for the checksum calculations as well? I would imagine that would speed up raid5/6 considerably, if possible.

Also see https://lkml.org/lkml/2013/5/1/449

## Gregory Bartholomew

Oops, my below reply was meant to be in reply to this comment.

## Gregory Bartholomew

I think RAID5/6 normally uses XOR for the parity calculations that allow it to reconstruct data when blocks are missing or corrupt. AES (Advanced Encryption Standard) is something a little different. It is used to encrypt data. But, yes, some common algorithms for encryption and checksums (like AES and CRC32, respectively) are hardware accelerated.