Difference between revisions of "RAID (简体中文)"

From ArchWiki
Jump to: navigation, search
(Add Translateme)
(Full sync with English Version.)
 
Line 1: Line 1:
[[Category:File systems (简体中文)]]
+
[[Category:Storage virtualization (简体中文)]]
 
[[en:RAID]]
 
[[en:RAID]]
 
[[es:RAID]]
 
[[es:RAID]]
Line 5: Line 5:
 
[[ja:RAID]]
 
[[ja:RAID]]
 
[[ru:RAID]]
 
[[ru:RAID]]
{{Related articles start}}
+
{{Related articles start (简体中文)}}
 
{{Related|Software RAID and LVM}}
 
{{Related|Software RAID and LVM}}
 +
{{Related|LVM#RAID}}
 
{{Related|Installing with Fake RAID}}
 
{{Related|Installing with Fake RAID}}
 
{{Related|Convert a single drive system to RAID}}
 
{{Related|Convert a single drive system to RAID}}
 
{{Related|ZFS}}
 
{{Related|ZFS}}
{{Related|Experimenting with ZFS}}
+
{{Related|ZFS/Virtual disks}}
 
{{Related|Swap#Striping}}
 
{{Related|Swap#Striping}}
{{Related|Btrfs#RAID}}
+
{{Related|Btrfs (简体中文)#RAID}}
 
{{Related articles end}}
 
{{Related articles end}}
{{Translateme (简体中文)|这篇文章后半部分没有翻译。}}
+
{{TranslationStatus (简体中文)|RAID|2018-05-16|518803}}
{{TranslationStatus (简体中文)|RAID|2017-02-07|466889}}
+
{{Style|Non-standard headers, other [[Help:Style]] issues}}
本文主要叙述了RAID的意义与基本形式,以及如何配置软/硬RAID。
 
  
== 简介 ==
+
独立磁盘冗余阵列 (Redundant Array of Independent Disks, [[Wikipedia:RAID|RAID]]) 是一种将多个磁盘驱动器组件(通常是多块硬盘或多个分区)组合为一个逻辑单元的存储技术。根据 RAID 的部署情况,这个逻辑单元可以是单个的文件系统,也可以是一个能在其上建立多个分区的透明中间层。根据所需的冗余量和性能要求,数据按照 [[#RAID 级别]] 中的某一种方式分布在驱动器中。所选的 RAID 级别决定了是否可以防止数据丢失(硬盘故障时)、是否提高性能或结合两者优势。
  
参见 [[Wikipedia:RAID]].
+
本文介绍如何使用 mdadm 创建并管理一个软件磁盘阵列。
  
磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。
+
{{警告|确保在操作前 [[Backup programs|备份]] 所有数据。}}
磁盘阵列是由很多价格较便宜的磁盘,以硬件(RAID卡)或软件(例如[[ZFS (简体中文)]] )形式组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。
 
磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。
 
  
{{Warning|尽管RAID可以预防数据丢失,但并不完全保证数据不会丢失,请在使用RAID的同时注意备份重要数据}}}
+
== RAID 级别 ==
  
===基本RAID级别===
+
尽管大部分 RAID 级别都或多或少地包含了数据冗余,RAID 并不能完全保证数据安全。如果遇到火灾、计算机被盗或者多块硬盘同时损坏,RAID 将无法保护数据。此外,配置一个带有 RAID 的系统是一个复杂的过程,可能会破坏现有数据。
这里有许多不同的 [[Wikipedia:Standard RAID levels|RAID级别]],请你选择最合适于您的。
+
 
 +
=== 基本 RAID 级别 ===
 +
 
 +
有多种不同的 [[Wikipedia:Standard RAID levels|基本 RAID 级别]],下面列出了最常用的几种。
  
 
; [[Wikipedia:Standard RAID levels#RAID 0|RAID 0]]
 
; [[Wikipedia:Standard RAID levels#RAID 0|RAID 0]]
: RAID 0 并不是真正的RAID结构,没有数据冗余,没有数据校验的磁盘陈列。实现RAID 0至少需要两块以上的硬盘,它将两块以上的硬盘合并成一块,数据连续地分割在每块盘上。 因为带宽加倍,所以读/写速度加倍, 但RAID 0在提高性能的同时,并没有提供数据保护功能,只要任何一块硬盘损坏就会丢失所有数据。因此RAID 0 不可应用于需要数据高可用性的关键领域。
+
: 将多块硬盘组合为一个带区卷,尽管它 ''并不提供数据冗余'',它仍可以被当做是 RAID,而且它确实提供了 ''巨幅的速度提升''。如果提高速度比数据安全更重要(比如作为 [[swap]] 分区),可以选择这种 RAID 级别。在服务器上,RAID 1 和 RAID 5 阵列更加合适。在 RAID 0 阵列中,块设备的大小是最小组成分区的大小乘以组成分区的数量。
 +
 
 
; [[Wikipedia:Standard RAID levels#RAID 1|RAID 1]]
 
; [[Wikipedia:Standard RAID levels#RAID 1|RAID 1]]
: RAID1是将一个两块硬盘所构成RAID磁盘阵列,其容量仅等于一块硬盘的容量,因为另一块只是当作数据“镜像”。RAID 1磁盘阵列显然是最可靠的一种阵列,因为它总是保持一份完整的数据备份。它的性能自然没有RAID 0磁盘阵列那样好,但其数据读取确实较单一硬盘来的快,因为数据会从两块硬盘中较快的一块中读出。RAID 1磁盘阵列的写入速度通常较慢,因为数据得分别写入两块硬盘中并做比较。RAID 1磁盘阵列一般支持“热交换”,就是说阵列中硬盘的移除或替换可以在系统运行时进行,无须中断退出系统。RAID 1磁盘阵列是十分安全的,不过也是较贵一种RAID磁盘阵列解决方案,因为两块硬盘仅能提供一块硬盘的容量。RAID 1磁盘阵列主要用在数据安全性很高,而且要求能够快速恢复被破坏的数据的场合。
+
: 这是最直接的 RAID 级别:完全镜像。与其他 RAID 级别一样,它只在分区位于不同物理硬盘上才有效。如果某一块硬盘损坏,由 RAID 阵列提供的块设备将不受影响。可以使用 RAID 1 的情境包括了除 [[swap]] 和临时文件外的其他所有情境。请注意,如果使用由软件实现的 RAID,引导分区只能选择 RAID 1,因为读取引导分区的引导器通常无法辨识 RAID,但一个 RAID 1 的组成分区可以像常规分区一样读取。RAID 1 阵列块设备的大小是最小组成分区的大小。
 +
 
 
; [[Wikipedia:Standard RAID levels#RAID 5|RAID 5]]
 
; [[Wikipedia:Standard RAID levels#RAID 5|RAID 5]]
: RAID 5 是一种存储性能、数据安全和存储成本兼顾的存储解决方案。 RAID 5可以理解为是RAID 0和RAID 1的折中方案。RAID 5可以为系统提供数据安全保障,但保障程度要比Mirror低而磁盘空间利用率要比Mirror高。RAID 5具有和RAID 0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比对单个磁盘进行写入操作稍慢。同时由于多个数据对应一个奇偶校验信息,RAID 5的磁盘空间利用率要比RAID 1高,存储成本相对较低,是目前运用较多的一种解决方案。
+
: 需要至少 3 块物理硬盘,并结合了 RAID 1 的数据冗余和 RAID 0 的速度与可用空间上的优势。RAID 5 使用了类似 RAID 0 的条带化技术,同时也将奇偶校验块''分布式地存储在每一块磁盘上''。如果遭遇硬盘损坏,这些奇偶校验块就可以用来在替代的新磁盘上重建损坏的数据。RAID 5 仅可弥补一个组成磁盘损坏带来的损失。
: {{Note|尽管RAID 5是数据安全与I/O速度的权衡,但是由于其工作方式,在大于4Tb的场合下,磁盘故障发生后,数据重建的难度将大大增加。所以存储行业并不建议使用RAID5 }}
+
: {{注意|RAID 5 是结合了速度与数据冗余优势的常用选择。但值得注意的是,当一块硬盘损坏而没有及时更换,此时若再有硬盘损坏,则所有数据都将丢失。此外,考虑到现代磁盘的超大容量和消费级硬盘无法恢复的读取错误率 (Unrecoverable read error, URE),超过 4TiB 的阵列在重建数据时出现至少一处读取错误 (URE) 的概率几乎在'''预料之中'''(概率大于 50%)。因此,存储行业不再推荐使用 RAID 5。}}
 +
 
 
; [[Wikipedia:Standard RAID levels#RAID 6|RAID 6]]
 
; [[Wikipedia:Standard RAID levels#RAID 6|RAID 6]]
: RAID6技术是在RAID 5基础上,为了进一步加强数据保护而设计的一种RAID方式,实际上是一种扩展RAID 5等级。与RAID 5的不同之处于除了每个硬盘上都有同级数据XOR校验区外,还有一个针对每个数据块的XOR校验区。当然,当前盘数据块的校验数据不可能存在当前盘而是交错存储的,具体形式见图。这样一来,等于每个数据块有了两个校验保护屏障(一个分层校验,一个是总体校验),因此RAID 6的数据冗余性能相当好。但是,由于增加了一个校验,所以写入的效率较RAID 5还差,而且控制系统的设计也更为复杂,第二块的校验区也减少了有效存储空间。
+
: 需要至少 4 块物理硬盘,提供了和 RAID 5 一样的优势并且在两块硬盘损坏时仍能保证数据安全。RAID 6 使用了和 RAID 5 类似的条带化技术,但是把两个不同的奇偶校验块 ''分布式地存储在每一块磁盘上''。如果磁盘发生故障,这些奇偶校验块将用于重建替换磁盘上的数据。RAID 6 可以承担两个组成磁盘的损失。在抵御无法恢复的读取错误 (Unrecoverable read error, URE) 时也某种程度上更加可靠,因为磁盘阵列在重建某一块损坏硬盘的数据时仍然有奇偶校验块可以校验数据。但是,总体而言,RAID 6 开销较大,大多数时候 far2 布局的 RAID 10(参见下文)提供了更快的速度和更强的可靠性,因此更倾向于采用 RAID 10。
: {{Note|组成RAID 6阵列需要至少四块磁盘。 }}
+
 
===嵌套 RAID 级别===
+
=== 嵌套 RAID 级别 ===
: RAID 10/01
+
 
; RAID 10是先镜射再分区数据,再将所有硬盘分为两组,视为是RAID 0的最低组合,然后将这两组各自视为RAID 1运作。RAID 01则是跟RAID 10的程序相反,是先分区再将数据镜射到两组硬盘。它将所有的硬盘分为两组,变成RAID 1的最低组合,而将两组硬盘各自视为RAID 0运作。
+
; [[Wikipedia:Nested RAID levels#RAID 10 (RAID 1+0)|RAID 1+0]]
当RAID 10有一个硬盘受损,其余硬盘会继续运作。RAID 01只要有一个硬盘受损,同组RAID 0的所有硬盘都会停止运作,只剩下其他组的硬盘运作,可靠性较低。如果以六个硬盘建RAID 01,镜射再用三个建RAID 0,那么坏一个硬盘便会有三个硬盘离线。因此,RAID 10远较RAID 01常用,零售主板绝大部分支持RAID 0/1/5/10,但不支持RAID 01。
+
: RAID1+0 是一种结合了两种基本 RAID 级别的嵌套级别,它相对基本级别提高了性能且增加了冗余量。它通常被称为 ''RAID10'',但是,Linux MD(内核自带的 RAID 实现)支持的 RAID10 不是简单的两层 RAID 重叠,请看下文。
 +
 
 +
; [[Wikipedia:Non-standard RAID levels#Linux MD RAID 10|RAID 10]]
 +
: Linux 下的 RAID10 建立在 RAID1+0 的概念上,但它将其实现为单一的一层,这一层可以有多种不同的布局。可参考 [https://www.suse.com/zh-cn/documentation/sles11/stor_admin/data/raidmdadmr10cpx.html 创建复杂 RAID 10]。
 +
: 在 Y 块硬盘上的 ''近 X 布局'' 在不同硬盘上重复储存每个数据块 X 次,但不需要 Y 可以被 X 整除。数据块放在所镜像的磁盘上几乎相同的位置,这就是 ''近布局'' 名字的来源。它可以工作在任意数量的磁盘上,最少是 2 块。在 2 块硬盘上的近 2 布局相当于 RAID1,4 块硬盘上的近 2 布局相当于 RAID1+0。
 +
: 在 Y 块硬盘上的 ''远 X 布局'' 设计用于在镜像阵列中提供与条带化技术一样快的读取速度。它通过把每块硬盘分成前后两部分来实现这一点,写入第一块硬盘前半部分数据也会写入第二块硬盘的后半部分,反之亦然。这样可以达到一个效果,那就是把对连续数据的读取条带化,而这正是 RAID0 和 RAID5 读取性能高的原因。它的缺点在于写入连续数据时有轻微性能损失,因为硬盘磁头要运动到另一片区域来写入镜像。当数据读取性能和可用性/冗余性一样重要时,比起 RAID1+0 '''和''' RAID5,更应该优先考虑远 2 布局的 RAID10。需注意这种方式仍无法代替备份。详情请阅读维基百科相关页面。
  
 
=== RAID 级别对比 ===
 
=== RAID 级别对比 ===
{| class="wikitable sortable"
+
 
 +
{| class="wikitable"
 +
! RAID 级别!!数据冗余!!物理设备利用率!!读取性能!!写入性能!!最少磁盘数量
 +
|-
 +
| '''0'''||{{No}}||100%||n 倍
 +
 
 +
'''最优'''
 +
||n 倍
 +
 
 +
'''最优'''
 +
||2
 
|-
 
|-
! RAID等級    !! 最少磁盘    !! 最大容错        !! 可用容量    !! 读取效能  !! 写入效能    !! 安全性                                !! 目的                                !! 应用场合
+
| '''1'''||{{Yes}}||50%||如果有多个进程同时读取,最多 n 倍,否则 1
|- 
+
||1 ||2
| 单一硬盘        || (參考)        || 0              || 1          || 1    || 1   || 无                          ||                        ||
 
|- 
 
| JBOD        || 1        || 0              || n           || 1     || 1   || 无(同RAID 0)                          || 增加容量                        || 个人(暂时)存储备份
 
|-
 
| 0          || 2         || 0              || n          || n    || n  || 一块硬盘故障,整个阵列损坏      || 追求最大容量、速度                  || 影片剪接快取用途
 
 
|-
 
|-
| 1          || 2        ||n-1              ||1            || n    ||1  || 最高,一个正常即可                                  || 追求最大安全性                      || 个人,企业备份
+
| '''5'''||{{Yes}}||67% - 94%||(n−1) 倍
 +
 
 +
'''较优'''
 +
||(n−1) 倍
 +
 
 +
'''较优'''
 +
||3
 
|-
 
|-
| 5          || 3        || 1              || n-1        || n-1  || n-|| 高                                    || 追求最大容量、最小预算              || 个人,企业备份
+
| '''6'''||{{Yes}}||50% - 88%||(n−2) 倍||(n−2) 倍||4
 
|-
 
|-
| 6          || 4        || 2              || n-2        || n-2|| n-2|| 安全性較RAID 5高                      || 同RAID 5,但较安全                  || 個人、企業備份
+
| '''10,far2'''||{{Yes}}||50%||n
|-   
+
'''最优;''' 与 RAID0 相当但加入了数据冗余
| 10          || 4        || n/2     || n/2|| n    || n/2      || 安全性高                            || 綜合RAID 0/1优点,理论速度較快      || 大型服务器 
+
||(n/2) 倍||2
 
|-
 
|-
 +
| '''10,near2'''||{{Yes}}||50%||如果有多个进程同时读取,最多 n 倍,否则 1 倍||(n/2) 倍||2
 
|}
 
|}
  
== 实施方法 ==
+
<nowiki>*</nowiki> 其中 ''n'' 表示用于组成阵列的磁盘数量。
RAID可由以下方法实施:
+
 
 +
== 实现方式 ==
 +
 
 +
RAID 设备可以用不同方式来管理:
  
; 软RAID
+
; 软件 RAID
: 对于软RAID阵列,有以下途径可以实施阵列:
+
: 这是最简单的实现方式,因为它不依赖于专用固件或专有软件。这种阵列由操作系统通过以下方式进行管理:
:* 抽象层实现 (例如 [[#Installation|mdadm]]); {{Note|我们会在接下来引导你安装}}
+
:* 通过抽象层管理(比如 [[#安装|mdadm]]); {{注意|这是在本指南下文将要使用的方法。}}
:* 逻辑卷实现 (例如 [[LVM (简体中文)]]);
+
:* 通过逻辑卷管理器来管理(比如 [[LVM#RAID|LVM]]);
:* 文件系统实现 (例如 [[ZFS (简体中文)]], [[Btrfs (简体中文)]]).
+
:* 通过文件系统的某个组件来管理(比如 [[ZFS (简体中文)|ZFS]][[Btrfs#RAID|Btrfs]])。
  
; 硬RAID
+
; 硬件 RAID
: 硬RAID由硬件(可以使芯片组內建也可以是单独设备)直接连接磁盘实现。RAID 逻辑一般由一块板载I/O芯片实现。RAID 的配置可以由直接更改RAID卡的设置实现,也可以由其他厂商指定的方法。操作系统不直接与硬盘联系。在一些情况下可能需要安装厂商专有驱动。
+
: 这种阵列由安装在计算机上的专用硬件卡直接管理,硬盘直接连接在该计算机上。RAID 的处理逻辑由板载的处理器完成,它独立于 [[Wikipedia:Central processing unit|主处理器 (CPU)]]。尽管这种方案独立于任何操作系统,但却需要驱动程序来使硬件 RAID 控制器正常工作。取决于不同的制造商,硬件 RAID 阵列可以在 option ROM 里设置或者操作系统安装完成后另行安装配套软件来设置。这种设置是独立于 Linux 内核的:内核并不能看到单独的每块硬盘。
  
 
; [[Fakeraid|FakeRAID]]
 
; [[Fakeraid|FakeRAID]]
: This type of RAID is properly called BIOS or Onboard RAID, but is falsely advertised as hardware RAID. The array is managed by pseudo-RAID controllers where the RAID logic is implemented in an option rom or in the firmware itself [http://www.win-raid.com/t19f13-Intel-EFI-RAID-quot-SataDriver-quot-BIOS-Modules.html with a EFI SataDriver] (in case of [[UEFI]]), but are not full hardware RAID controllers with ''all'' RAID features implemented. Therefore, this type of RAID is sometimes called FakeRAID. {{Pkg|dmraid}} from the [[official repositories]], will be used to deal with these controllers. Here are some examples of FakeRAID controllers: [[Wikipedia:Intel Rapid Storage Technology|Intel Rapid Storage]], JMicron JMB36x RAID ROM, AMD RAID, ASMedia 106x, and NVIDIA MediaShield.
+
: 这种类型的 RAID 应当称为 BIOS 或板载 RAID,却常被错误地当做硬件 RAID 来宣传。这种阵列由伪 RAID 控制器来管理,RAID 逻辑由 option ROM 或[http://www.win-raid.com/t19f13-Intel-EFI-RAID-quot-SataDriver-quot-BIOS-Modules.html 安装了 EFI Sata 驱动程序的] 固件本身([[Unified Extensible Firmware Interface (简体中文)|UEFI]] 情况下)来完成,但并不是实现了 ''所有'' RAID 功能的完整硬件 RAID 控制器。因此,这种 RAID 有时被称为 FakeRAID。来自 [[official repositories (简体中文)|官方仓库]] 的 {{Pkg|dmraid}} 用于处理这种控制器。这里列出一些 FakeRAID 控制器:[[Wikipedia:Intel Rapid Storage Technology|Intel Rapid Storage]],JMicron JMB36x RAID ROM,AMD RAID,ASMedia 106x NVIDIA MediaShield。
 +
 
 +
=== 我正在使用哪一种 RAID? ===
 +
 
 +
由于软件 RAID 是由用户部署的,因此用户很容易就知道 RAID 的类型。
 +
 
 +
但是,辨别 FakeRAID 和真正的硬件 RAID 是很困难的。如上所述,制造商经常错误地混淆这两种类型的 RAID,还可能进行虚假宣传。这种情况下应该采取的最好方式是运行 {{ic|lspci}} 命令并在输出信息中找到你的 RAID 控制器,然后根据这些信息进行更进一步的搜索。硬件 RAID 控制器会在这一列表中出现,但 FakeRAID 不会。同时,真正的硬件 RAID 控制器通常价格很高,如果这个系统是自行组装的,那么很可能安装一个硬件 RAID 会使电脑的价格显著提高。
  
===Which type of RAID do I have?===
+
== 安装 ==
  
Since software RAID is implemented by the user, the type of RAID is easily known to the user.
+
[[Install|安装]] {{Pkg|mdadm}}。''mdadm'' 用于管理在纯块设备上建立起来的纯软件 RAID:底层硬件不提供任何 RAID 逻辑,只是一些磁盘而已。''mdadm'' 可以在任何块设备集合上工作,甚至是那些非常规的设备。比如,你可以用一堆 U 盘来建立 RAID 阵列。
  
However, discerning between FakeRAID and true hardware RAID can be more difficult. As stated, manufacturers often incorrectly distinguish these two types of RAID and false advertising is always possible. The best solution in this instance is to run the {{ic|lspci}} command and looking through the output to find the RAID controller. Then do a search to see what information can be located about the RAID controller. Hardware RAID controllers appear in this list, but FakeRAID implementations do not. Also, true hardware RAID controller are often rather expensive (~$400+), so if someone customized the system, then it is very likely that choosing a hardware RAID setup made a very noticeable change in the computer's price.
+
=== 准备设备 ===
  
== Installation ==
+
{{警告|这些步骤会擦除指定设备上的所有数据,输入命令请小心!}}
  
Install {{Pkg|mdadm}} from the [[official repositories]]. ''mdadm'' is used for administering pure software RAID using plain block devices: the underlying hardware does not provide any RAID logic, just a supply of disks. ''mdadm'' will work with any collection of block devices. Even if unusual. For example, one can thus make a RAID array from a collection of thumb drives.
+
如果设备是旧设备重用或刚从一个现有的阵列上拆下来,请擦除所有旧的 RAID 配置信息:
  
===Prepare the Devices===
+
# mdadm --misc --zero-superblock /dev/<drive>
  
{{Warning|These steps erase everything on a device, so type carefully!}}
+
或者是删除设备上的某个特定的分区:
  
If the device is being reused or re-purposed from an existing array, erase any old RAID configuration information:
+
  # mdadm --misc --zero-superblock /dev/<partition>
  # mdadm --zero-superblock /dev/<drive>
 
  
or if a particular partition on a drive is to be deleted:
+
{{注意|
# mdadm --zero-superblock /dev/<partition>
+
* 清除一个分区的 superblock 不会影响到磁盘上的其他分区。
 +
* 考虑到 RAID 本身的功能特点,在运行中的磁盘阵列中完全地 [[securely wipe disk|安全擦除磁盘]] 是很困难的。请在创建阵列前考虑要不要安全擦除磁盘。
 +
}}
  
{{Note|
+
=== 对磁盘进行分区 ===
* Zapping a partition's superblock should not affect the other partitions on the disk.
 
* Due to the nature of RAID functionality it is very difficult to [[Securely wipe disk]]s fully on a running array. Consider whether it is useful to do so before creating it.}}
 
  
===Create the Partition Table (GPT)===
+
强烈推荐对用于阵列的硬盘进行分区。考虑到大多数 RAID 用户会用到超过 2 TiB 的硬盘,因此推荐并要求使用 GPT。参阅 [[Partitioning (简体中文)]] 获取关于磁盘分区的更多信息以及可供使用的 [[Partitioning (简体中文)#分区工具|分区工具]]。
  
It is highly recommended to pre-partition the disks to be used in the array.  Since most RAID users are selecting HDDs >2 TB, GPT partition tables are required and recommended.  Disks are easily partitioned using {{Pkg|gptfdisk}}.
+
{{注意|也可以在裸磁盘(没有分区的磁盘)上直接创建 RAID,但不推荐这么做,因为这样可能会导致更换损坏硬盘时出现问题}}
  
* After created, the partition type should be assigned hex code FD00.
+
{{注意|当更换 RAID 中的某块损坏的硬盘时,新硬盘的大小必须恰好等于或大于损坏的硬盘,否则无法完成阵列重建过程。即使是同一厂商相同型号的硬盘也可能有容量上的细微差别。通过在磁盘末尾保留一些未分配的空间可以消除磁盘容量上的细微差异,这样可以使替代磁盘的型号选择更加容易。因此,最好在磁盘末尾留出大约 100 MiB 的未分配空间。}}
* If a larger disk array is employed, consider assigning [[Persistent_block_device_naming#by-label|disk labels]] or [[Persistent_block_device_naming#by-partlabel|partition labels]] to make it easier to identify an individual disk later.
 
* Creating partitions that are of the same size on each of the devices is preferred.
 
* A good tip is to leave approx 100 MB at the end of the device when partitioning.  See below for rationale.
 
  
====Partitions Types for MBR====
+
==== GUID 分区表 ====
  
For those creating partitions on HDDs with a MBR partition table, the partition types available for use are:
+
* 创建分区以后,这些分区的 [[Wikipedia:GUID Partition Table#Partition type GUIDs|类型标识符 (GUID)]] 应该是 {{ic|A19D880F-05FC-4D3B-A006-743F0F84911E}}(在 ''fdisk'' 里将分区类型改为 {{ic|Linux RAID}} 或在 ''gdisk'' 里改为 {{ic|FD00}} 可以给所选分区分配这个标识符)。
 +
* 如果使用了一个更大的磁盘阵列,可以考虑分配 [[Persistent block device naming (简体中文)#by-label|文件系统标签]] 或 [[Persistent block device naming (简体中文)#by-partlabel|分区标签]] 用于以后区分每块单独的硬盘。
 +
* 建议在每个设备上创建大小相同的分区。
  
* 0xDA (for non-fs data -- current recommendation by [https://raid.wiki.kernel.org/index.php/Partition_Types kernel.org])
+
==== 主引导记录 (MBR) ====
* 0xFD (for raid autodetect arrays -- was useful before booting an initrd to load kernel modules)
 
  
{{Note|It is also possible to create a RAID directly on the raw disks (without partitions), but not recommended because it can cause problems when swapping a failed disk.}}
+
对于在使用 MBR 的硬盘上创建分区的用户,可用的 [[Wikipedia:Partition type|分区类型 ID]] 包括:
  
When replacing a failed disk of a RAID, the new disk has to be exactly the same size as the failed disk or bigger — otherwise the array recreation process will not work. Even hard drives of the same manufacturer and model can have small size differences. By leaving a little space at the end of the disk unallocated one can compensate for the size differences between drives, which makes choosing a replacement drive model easier. Therefore, '''it is good practice to leave about 100 MB of unallocated space at the end of the disk.'''
+
* {{ic|0xFD}}: 自动检测的 RAID(''fdisk'' 中称为 {{ic|Linux raid autodetect}})
 +
* {{ic|0xDA}}: 无文件系统(''fdisk'' 中称为 {{ic|Non-FS data}})
  
=== Build the Array ===
+
更多信息请参阅 [https://raid.wiki.kernel.org/index.php/Partition_Types Linux Raid Wiki:Partition Types]。
  
{{Warning|Kernel versions 4.2.x and 4.3.x currently have an active bug that prevents them from assembling a RAID10 array; users needing this layout are encouraged to use kernel version 4.1.x series provided by {{pkg|linux-lts}} until this bug is fixed. References are provided in the [[#See also]] section.}}
+
=== 创建阵列 ===
  
Use {{ic|mdadm}} to build the array.  Several examples are given below.
+
使用 {{ic|mdadm}} 来创建阵列。参阅 {{man|8|mdadm}} 获取支持的选项。下面列出部分使用范例。
  
{{Warning|Do not simply copy/paste the examples below; use your brain and substitute the correct options/drive letters!}}
+
{{警告|不要简单地复制/粘贴下面的示例,确保你已经使用正确的选项和设备名称替代了示例中相应的内容。}}
  
{{Note|If this is a RAID1 array which is intended to boot from [[Syslinux]] a limitation in syslinux v4.07 requires the metadata value to be 1.0 rather than the default of 1.2.}}
+
{{注意|
 +
* 如果有一个从 [[Syslinux (简体中文)|Syslinux]] 启动的 RAID1 阵列,在 syslinux v4.07 中要求元数据值为 1.0,而不是默认的 1.2。
 +
* 当用 [[Archiso (简体中文)|Arch 安装镜像]] 创建磁盘阵列时,请使用 {{ic|1=--homehost=''myhostname''}} 选项设置 [[hostname|主机名]](或者 {{ic|1=--homehost=any}} 选项无论在什么主机上都用相同的主机名),否则主机名称 {{ic|archiso}} 会被写入阵列的元数据中。
 +
}}
  
The following example shows building a 2-device RAID1 array:
+
{{提示|要为 RAID 设备指定一个自定义的名称,可以使用 {{ic|1=--name=''MyRAIDName''}} 选项或将 RAID 设备路径改为 {{ic|/dev/md/''MyRAIDName''}}。Udev 会使用该名称创建指向 {{ic|/dev/md/}} 内 RAID 阵列的符号链接。如果 {{ic|homehost}} 与当前 [[hostname|主机名]] 匹配(或者 homehost 设为了 {{ic|any}})则链接将会是 {{ic|/dev/md/''name''}},如果 homehost 不匹配那么链接将会是 {{ic|/dev/md/''homehost'':''name''}}。}}
  
# mdadm --create --verbose --level=1 --metadata=1.2 --raid-devices=2 /dev/md0 /dev/sdb1 /dev/sdc1
+
下面这个例子展示了在 2 个设备上建立 RAID1 阵列:
  
The following example shows building a RAID5 array with 4 active devices and 1 spare device:
+
# mdadm --create --verbose --level=1 --metadata=1.2 --raid-devices=2 /dev/md/MyRAID1Array /dev/sdb1 /dev/sdc1
  
# mdadm --create --verbose --level=5 --metadata=1.2 --chunk=256 --raid-devices=4 /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 --spare-devices=1 /dev/sdf1
+
下面这个例子展示了使用 4 块磁盘作为工作 (active) 磁盘,1 块作为备用 (spare) 磁盘建立 RAID5 阵列:
  
:{{Tip|{{ic|--chunk}} was used in the previous example to change the chunk size from the default  value. See [http://www.zdnet.com/article/chunks-the-hidden-key-to-raid-performance/ Chunks: the hidden key to RAID performance] for more on chunk size optimisation.}}
+
# mdadm --create --verbose --level=5 --metadata=1.2 --chunk=256 --raid-devices=4 /dev/md/MyRAID5Array /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 --spare-devices=1 /dev/sdf1
  
The following example shows building a RAID10,far2 array with 2 devices:
+
{{提示|{{ic|--chunk}} 可用于修改默认的区块大小。更多关于优化区块大小的内容请参阅 [http://www.zdnet.com/article/chunks-the-hidden-key-to-raid-performance/ Chunks: the hidden key to RAID performance]。}}
  
# mdadm --create --verbose --level=10 --metadata=1.2 --chunk=512 --raid-devices=2 --layout=f2 /dev/md0 /dev/sdb1 /dev/sdc1
+
下面这个例子展示了在 2 个设备上建立远 2 布局的 RAID10 阵列 (RAID10, far2):
  
{{Tip| The {{ic|--homehost}} and {{ic|--name}} options can be used for a custom raid device name. They are delimited by a colon in the resulting name.}}
+
# mdadm --create --verbose --level=10 --metadata=1.2 --chunk=512 --raid-devices=2 --layout=f2 /dev/md/MyRAID10Array /dev/sdb1 /dev/sdc1
  
The array is created under the virtual device {{ic|/dev/mdX}}, assembled and ready to use (in degraded mode). One can directly start using it while mdadm resyncs the array in the background. It can take a long time to restore parity. Check the progress with:
+
这样,阵列就会在虚拟设备 {{ic|/dev/mdX}} 下建立起来,容量已经合并且可以使用(但处于降级模式)。mdadm 在后台同步数据时你已经可以直接开始使用这个阵列了。储存奇偶校验位可能要花很长时间,可以用这个命令查看进度:
  
 
  $ cat /proc/mdstat
 
  $ cat /proc/mdstat
  
=== Update configuration file ===
+
=== 更新配置文件 ===
 +
 
 +
默认情况下,{{ic|mdadm.conf}} 中的大部分内容都被注释掉了,它应该只包含如下内容:
  
By default, most of {{ic|mdadm.conf}} is commented out, and it contains just the following:
+
{{hc|/etc/mdadm.conf|
 +
...
 +
DEVICE partitions
 +
...
 +
}}
  
{{hc|/etc/mdadm.conf|DEVICE partitions}}
+
这一指令告诉 mdadm 检查由 {{ic|/proc/partitions}} 引用的所有设备并尽可能将其中的阵列组合起来。如果你确实想启动所有可用的阵列并且确信不存在意料之外的超级块(比如安装了新的存储设备),那么这样的配置就很好。当然有一种更精准的控制方法,就是显式地将阵列添加到 {{ic|/etc/mdadm.conf}}
  
This directive tells mdadm to examine the devices referenced by {{ic|/proc/partitions}} and assemble as many arrays as possible. This is fine if you really do want to start all available arrays and are confident that no unexpected superblocks will be found (such as after installing a new storage device). A more precise approach is as follows:
 
# echo 'DEVICE partitions' > /etc/mdadm.conf
 
 
  # mdadm --detail --scan >> /etc/mdadm.conf
 
  # mdadm --detail --scan >> /etc/mdadm.conf
  
This results in something like the following:
+
这将会在配置中添加类似这样的内容:
 +
 
 
{{hc|/etc/mdadm.conf|2=
 
{{hc|/etc/mdadm.conf|2=
 +
...
 
DEVICE partitions
 
DEVICE partitions
ARRAY /dev/md/0 metadata=1.2 name=pine:0 UUID=27664f0d:111e493d:4d810213:9f291abe
+
...
 +
ARRAY /dev/md/MyRAID1Array metadata=1.2 name=pine:MyRAID1Array UUID=27664f0d:111e493d:4d810213:9f291abe
 
}}
 
}}
  
This also causes mdadm to examine the devices referenced by {{ic|/proc/partitions}}. However, only devices that have superblocks with a UUID of {{ic|27664…}} are assembled in to active arrays.
+
这也会使 mdadm 检查由 {{ic|/proc/partitions}} 引用的设备。但是,只有超级块的 UUID {{ic|27664…}} 的设备才会被组合成激活的阵列。
  
See {{ic|mdadm.conf(5)}} for more information.
+
更多信息请参阅 {{man|5|mdadm.conf}}
  
===Assemble the Array===
+
=== 组合成磁盘阵列 ===
  
Once the configuration file has been updated the array can be assembled using mdadm:
+
更新配置文件后即可用 mdadm 组合磁盘阵列:
  
 
  # mdadm --assemble --scan
 
  # mdadm --assemble --scan
  
===Format the RAID Filesystem===
+
=== 格式化 RAID 上的文件系统 ===
  
The array can now be formatted like any other disk, just keep in mind that:
+
现在磁盘阵列已经可以像普通分区一样被格式化成某个 [[File systems (简体中文)|文件系统]],但要记住:
* Due to the large volume size not all filesystems are suited (see: [[Wikipedia:Comparison of file systems#Limits|File system limits]]).
 
* The filesystem should support growing and shrinking while online (see: [[Wikipedia:Comparison of file systems#Features|File system features]]).
 
* One should calculate the correct stride and stripe-width for optimal performance.
 
  
==== Calculating the Stride and Stripe Width ====
+
* 不是所有文件系统都支持超大分区(参阅 [[Wikipedia:Comparison of file systems#Limits]])。
 +
* 文件系统需要支持在线增大和收缩(参阅 [[Wikipedia:Comparison of file systems#Features]])。
 +
* 应合理计算跨度大小和带区宽度来获得最佳性能。
  
Two parameters are required to optimise the filesystem structure to fit optimally within the underlying RAID structure: the ''stride'' and ''stripe width''. These are derived from the RAID ''chunk size'', the filesystem ''block size'', and the ''number of "data disks"''.
+
==== 计算 stride(跨度大小)和 stripe width(带区宽度) ====
  
The chunk size is a property of the RAID array, decided at the time of its creation. {{ic|mdadm}}'s current default is 512 KiB. It can be found with {{ic|mdadm}}:
+
优化文件系统结构以适应底层 RAID 结构需要 2 个参数:''stride'' 和 ''stripe width''。它们对应于 RAID 的 ''chunk size(区块大小)'' 、文件系统的 ''block size(块大小)'' 以及 ''"data disks"(数据盘)的数量''。
 +
 
 +
Chunk size(RAID 区块大小)是 RAID 阵列的一个属性,在阵列创建时就已经定好了。目前 {{ic|mdadm}} 默认该值为 512 KiB。这个参数可以用 {{ic|mdadm}} 读取:
  
 
  # mdadm --detail /dev/mdX | grep 'Chunk Size'
 
  # mdadm --detail /dev/mdX | grep 'Chunk Size'
  
The block size is a property of the filesystem, decided at ''its'' creation. The default for many filesystems, including ext4, is 4 KiB. See {{ic|/etc/mke2fs.conf}} for details on ext4.
+
Block size(块大小)是文件系统的一个属性,在文件系统创建时就已经定好了。在大部分文件系统上(包括 ext4)默认是 4 KiB。更多关于当前系统 ext4 的信息可以查看 {{ic|/etc/mke2fs.conf}} 文件。
  
The number of "data disks" is the minimum number of devices in the array required to completely rebuild it without data loss. For example, this is N for a raid0 array of N devices and N-1 for raid5.
+
"Data disks"(数据盘)的数量指的是阵列能够完全重建数据所要求的最少可用设备。例如,对于 N 个设备的 raid0 来说这个数量是 N,对于 raid5 来说是 N-1。
  
Once you have these three quantities, the stride and the stripe width can be calculated using the following formulas:
+
当你获得了这三个参数时,stride 和 stripe width 可以用下列公式来计算:
  
 
  stride = chunk size / block size
 
  stride = chunk size / block size
 
  stripe width = number of data disks * stride
 
  stripe width = number of data disks * stride
  
 +
===== 范例 1. RAID0 =====
  
===== Example 1. RAID0 =====
+
本范例使用了正确的 stride 和 stripe width 将合并后的分区格式化成了 ext4:
  
Example formatting to ext4 with the correct stripe width and stride:
+
* 假设这一 RAID0 阵列是由 2 块物理硬盘组成的。
* Hypothetical RAID0 array is composed of 2 physical disks.
+
* Chunk size(RAID 区块大小)是 64 KiB。
* Chunk size is 64 KiB.
+
* Block size(文件系统块大小)是 4 KiB。
* Block size is 4 KiB.
 
  
stride = chunk size / block size.
+
因为 stride = chunk size / block size。在这个例子中,stride 大小是 64/4 = 16。
In this example, the math is 64/4 so the stride = 16.
 
  
stripe width = # of physical '''data''' disks * stride.
+
因为 stripe width = # of physical '''data''' disks * stride。在这个例子中,stripe width 的大小是 2*16 = 32。
In this example, the math is 2*16 so the stripe width = 32.
 
  
 
  # mkfs.ext4 -v -L myarray -m 0.5 -b 4096 -E stride=16,stripe-width=32 /dev/md0
 
  # mkfs.ext4 -v -L myarray -m 0.5 -b 4096 -E stride=16,stripe-width=32 /dev/md0
  
===== Example 2. RAID5 =====
+
===== 范例 2. RAID5 =====
 +
 
 +
本范例使用了正确的 stride 和 stripe width 将合并后的分区格式化成了 ext4:
  
Example formatting to ext4 with the correct stripe width and stride:
+
* 假设这一 RAID5 阵列由 4 块物理硬盘组成,3 块是数据盘,1 块是奇偶校验盘。
* Hypothetical RAID5 array is composed of 4 physical disks; 3 data discs and 1 parity disc.
+
* Chunk size(RAID 区块大小)是 512 KiB。
* Chunk size is 512 KiB.
+
* Block size(文件系统块大小)是 4 KiB。
* Block size is 4 KiB.
 
  
stride = chunk size / block size.
+
因为 stride = chunk size / block size。在这个例子中,stride 大小是 512/4 = 128。
In this example, the math is 512/4 so the stride = 128.
 
  
stripe width = # of physical '''data''' disks * stride.
+
因为 stripe width = # of physical '''data''' disks * stride。在这个例子中,stripe width 的大小是 3*128 = 384.
In this example, the math is 3*128 so the stripe width = 384.
 
  
 
  # mkfs.ext4 -v -L myarray -m 0.01 -b 4096 -E stride=128,stripe-width=384 /dev/md0
 
  # mkfs.ext4 -v -L myarray -m 0.01 -b 4096 -E stride=128,stripe-width=384 /dev/md0
  
For more on stride and stripe width, see: [http://wiki.centos.org/HowTos/Disk_Optimization RAID Math].
+
关于 stride stripe width 的更多信息,请参阅:[http://wiki.centos.org/HowTos/Disk_Optimization RAID Math]
 +
 
 +
===== 范例 3. RAID10,far2 =====
 +
 
 +
本范例使用了正确的 stride 和 stripe width 将合并后的分区格式化成了 ext4:
 +
 
 +
* 假设这一 RAID10 阵列由 2 块物理硬盘组成。考虑到远 2 布局的 RAID10 的自身特性,两块硬盘都是数据盘。
 +
* Chunk size(RAID 区块大小)是 512 KiB。
  
===== Example 3. RAID10,far2 =====
+
{{hc|# mdadm --detail /dev/md0 {{!}} grep 'Chunk Size'|
 +
    Chunk Size : 512K
 +
}}
  
Example formatting to ext4 with the correct stripe width and stride:
+
* Block size(文件系统块大小)是 4 KiB。
* Hypothetical RAID10 array is composed of 2 physical disks. Because of the properties of RAID10 in far2 layout, both count as data disks.
 
* Chunk size is 512 KiB.
 
# mdadm --detail /dev/md0 | grep 'Chunk Size'
 
    Chunk Size : 512K
 
* Block size is 4 KiB.
 
  
stride = chunk size / block size.
+
因为 stride = chunk size / block size。
In this example, the math is 512/4 so the stride = 128.
+
在这个例子中,stride 大小是 512/4 = 128。
  
stripe width = # of physical '''data''' disks * stride.
+
因为 stripe width = # of physical '''data''' disks * stride。
In this example, the math is 2*128 so the stripe width = 256.
+
在这个例子中,stripe width 的大小是 2*128 = 256。
  
 
  # mkfs.ext4 -v -L myarray -m 0.01 -b 4096 -E stride=128,stripe-width=256 /dev/md0
 
  # mkfs.ext4 -v -L myarray -m 0.01 -b 4096 -E stride=128,stripe-width=256 /dev/md0
  
== Mounting from a Live CD ==
+
== Live CD 中挂载 RAID ==
  
Users wanting to mount the RAID partition from a Live CD, use:
+
如果你需要在 Live CD 中挂载 RAID 分区,用这个命令:
  
 
  # mdadm --assemble /dev/<disk1> /dev/<disk2> /dev/<disk3> /dev/<disk4>
 
  # mdadm --assemble /dev/<disk1> /dev/<disk2> /dev/<disk3> /dev/<disk4>
  
If your RAID 1 that's missing a disk array was wrongly auto-detected as RAID 1 (as per {{ic|mdadm --detail /dev/md<number>}}) and reported as inactive (as per {{ic|cat /proc/mdstat}}), stop the array first:
+
如果缺一块盘的 RAID 1 被错误地识别为了 RAID 1(参照 {{ic|mdadm --detail /dev/md<number>}})并报告为非活动状态(参照 {{ic|cat /proc/mdstat}}),需要先停止磁盘阵列:
  
 
  # mdadm --stop /dev/md<number>
 
  # mdadm --stop /dev/md<number>
  
== Installing Arch Linux on RAID ==
+
== 在 RAID 上安装 Arch Linux ==
{{Note|The following section is applicable only if the root filesystem resides on the array.  Users may skip this section if the array holds a data partition(s).}}
+
 
You should create the RAID array between the [[Partitioning]] and [[File systems#Format a device|formatting]]{{Broken section link}} steps of the Installation Procedure. Instead of directly formatting a partition to be your root file system, it will be created on a RAID array.
+
{{注意|本节仅适用于根文件系统在磁盘阵列上的情况。如果你的磁盘阵列上只是一个数据分区,那么可以跳过本节。}}
Follow the section [[#Setup]]{{Broken section link}} to create the RAID array. Then continue with the installation procedure until the pacstrap step is completed.
+
 
When using [[Unified Extensible Firmware Interface|UEFI boot]], also read [[EFI System Partition#ESP on RAID|ESP on RAID]].
+
你应该在安装过程中的 [[Partitioning (简体中文)|分区]] [[File systems (简体中文)#创建文件系统|格式化]] 步骤之间创建 RAID 阵列。这将会把一个位于 RAID 阵列上的分区格式化成根文件系统,而不是直接格式化一个分区。
 +
按照 [[#安装]] 一节的步骤创建 RAID 阵列。,然后继续安装过程,直到 pacstrap 步骤完成。
 +
当使用 [[Unified Extensible Firmware Interface (简体中文)|UEFI 启动]] 时,还需要阅读 [[EFI System Partition (简体中文)#RAID 上的 ESP]]
 +
 
 +
=== 更新配置文件 ===
 +
 
 +
{{注意|这些操作应该在 chroot 以外完成,因此要在文件路径前加上 {{ic|/mnt}}。}}
 +
 
 +
在基本系统安装完成以后,RAID 的默认配置文件 {{ic|mdadm.conf}} 需要这样来更新:
  
=== Update configuration file ===
 
{{Note|This should be done outside of the chroot, hence the prefix /mnt to the filepath.}}
 
After the base system is installed the default configuration file, {{ic|mdadm.conf}}, must be updated like so:
 
 
  # mdadm --detail --scan >> /mnt/etc/mdadm.conf
 
  # mdadm --detail --scan >> /mnt/etc/mdadm.conf
  
Always check the mdadm.conf configuration file using a text editor after running this command to ensure that its contents look reasonable.
+
在运行这个命令以后一定要用文本编辑器检查 {{ic|mdadm.conf}} 配置文件来确保它的内容看起来是合理的。
{{Note|To prevent failure of '''mdmonitor''' at boot (enabled by default), you will need to uncomment '''MAILADDR''' and provide an e-mail address and/or application to handle notification of problems with your array at the bottom of mdadm.conf.}}
+
 
Continue with the installation procedure until you reach the step “Create initial ramdisk environment”, then follow the next section.
+
{{注意|为防止系统启动时 {{ic|mdmonitor.service}} 启动失败(默认设为自动启动),你需要取消 {{ic|MAILADDR}} 的注释,并且在 {{ic|mdadm.conf}} 结尾留下可处理磁盘阵列出错通知的邮件地址和/或应用程序。参阅 [[#启用事件邮件通知]]。}}
 +
 
 +
现在继续安装过程直到 [[Installation guide (简体中文)#Initramfs]] 步骤之前为止,然后按照下一节的步骤做。
 +
 
 +
=== 配置 mkinitcpio ===
 +
 
 +
{{注意|这些操作应该在 chroot 时完成。}}
  
=== Add mdadm hook to mkinitcpio.conf ===
+
向 {{ic|mkinitcpio.conf}} 中的 [[mkinitcpio (简体中文)#钩子(HOOKS)|HOOKS]] 部分添加 {{ic|mdadm_udev}} 来为初始化内存盘添加 mdadm 支持:
  
{{Accuracy|1=[[Mkinitcpio#Common hooks]] also suggests adding {{ic|mdmon}} to the {{ic|BINARIES}} section. See also [https://bbs.archlinux.org/viewtopic.php?id=148947] and [http://unix.stackexchange.com/questions/57440/cant-remount-local-file-systems-for-read-write-raid1].}}
+
{{hc|/etc/mkinitcpio.conf|2=
 +
...
 +
HOOKS=(base udev autodetect keyboard modconf block '''mdadm_udev''' filesystems fsck)
 +
...
 +
}}
  
{{Note|This should be done whilst chrooted.}}
+
如果在一个 FakeRAID 阵列上使用 {{ic|mdadm_udev}} 钩子,建议在 [[mkinitcpio (简体中文)#附加文件(BINARIES、FILES)|BINARIES]] 列表中添加 ''mdmon'':
  
Add {{ic|mdadm_udev}} to the [[Mkinitcpio#HOOKS|HOOKS]] section of the {{ic|mkinitcpio.conf}} to add support for mdadm directly into the init image:
+
{{hc|/etc/mkinitcpio.conf|2=
 +
...
 +
BINARIES=('''mdmon''')
 +
...
 +
}}
  
HOOKS="base udev autodetect block '''mdadm_udev''' filesystems usbinput fsck"
+
然后 [[mkinitcpio (简体中文)#创建和启用镜像|重新生成初始化内存盘]]。
  
Then [[Mkinitcpio#Image creation and activation|Regenerate the initramfs image]].
+
参考 [[mkinitcpio (简体中文)#使用 RAID 磁盘阵列]]
  
=== Configure the boot loader ===
+
=== 配置 boot loader ===
  
Add an {{ic|md}} [[kernel parameter]] for each RAID array; also point the {{ic|root}} parameter to the correct mapped device. The following example accommodates three RAID 1 arrays and sets the second one as root:
+
{{ic|root}} 参数指向映射的磁盘,例如:
  
  root=/dev/md1 md=0,/dev/sda2,/dev/sdb2 md=1,/dev/sda3,/dev/sdb3 md=2,/dev/sda4,/dev/sdb4
+
  root=/dev/md/''MyRAIDArray''
  
If booting from a software raid partition fails using the kernel device node method above, an alternative and more reliable way is to use [[Persistent block device naming]], for example:
+
如果按上述用内核设备节点来指定映射磁盘的方法之后,从软件 RAID 分区启动失败了,那就用 [[Persistent block device naming (简体中文)|持久化命名块设备]] 中的某种方法来指定映射的磁盘,例如:
  
 
  root=LABEL=Root_Label
 
  root=LABEL=Root_Label
  
See also [[GRUB#RAID]].
+
参考 [[GRUB#RAID]]
 +
 
 +
== 维护 RAID ==
 +
 
 +
=== 数据清扫 (Scrubbing) ===
 +
 
 +
定期运行数据 [[wikipedia:Data_scrubbing|清扫 (Scrubbing)]] 来检查并修复错误是一种很好的做法。一次完整数据清扫可能会花费数个小时,具体取决于磁盘阵列的大小和配置。
  
== RAID Maintenance ==
+
启动数据清扫:
=== Scrubbing ===
 
It is good practice to regularly run data [[wikipedia:Data_scrubbing|scrubbing]] to check for and fix errors.  Depending on the size/configuration of the array, a scrub may take multiple hours to complete.
 
  
To initiate a data scrub:
 
 
  # echo check > /sys/block/md0/md/sync_action
 
  # echo check > /sys/block/md0/md/sync_action
  
The check operation scans the drives for bad sectors and automatically repairs them.  If it finds good sectors that contain bad data (the data in a sector does not agree with what the data from another disk indicates that it should be, for example the parity block + the other data blocks would cause us to think that this data block is incorrect), then no action is taken, but the event is logged (see below).  This "do nothing" allows admins to inspect the data in the sector and the data that would be produced by rebuilding the sectors from redundant information and pick the correct data to keep.
+
数据检查操作会扫描驱动器来检查坏扇区并自动修复它们。如果找到了包含损坏数据的好扇区(本扇区中的数据与另一块硬盘中记录本扇区应有的数据不符,例如奇偶校验块和另一块数据块相结合可以证明本数据块是错误的),那就不动作,但记录下这一事件(见下文)。这种“不动作”允许管理员自行检查坏扇区中原本的数据和从冗余数据中重建的数据,然后决定保留哪个。
 +
 
 +
与许多 mdadm 相关的任务/事项一样,数据清扫的进度也可以通过查看 {{ic|/proc/mdstat}} 文件来查询。
  
As with many tasks/items relating to mdadm, the status of the scrub can be queried by reading {{ic|/proc/mdstat}}.
+
例如:
  
Example:
 
 
{{hc|$ cat /proc/mdstat|<nowiki>
 
{{hc|$ cat /proc/mdstat|<nowiki>
Personalities : [raid6] [raid5] [raid4] [raid1]  
+
Personalities : [raid6] [raid5] [raid4] [raid1]
 
md0 : active raid1 sdb1[0] sdc1[1]
 
md0 : active raid1 sdb1[0] sdc1[1]
 
       3906778112 blocks super 1.2 [2/2] [UU]
 
       3906778112 blocks super 1.2 [2/2] [UU]
Line 325: Line 388:
 
</nowiki>}}
 
</nowiki>}}
  
To stop a currently running data scrub safely:
+
安全地停止当前的数据清扫操作:
 +
 
 
  # echo idle > /sys/block/md0/md/sync_action
 
  # echo idle > /sys/block/md0/md/sync_action
  
{{Note|If the system is rebooted after a partial scrub has been suspended, the scrub will start over.}}
+
{{注意|如果在数据清扫暂停时重启了系统,将继续进行清扫。}}
 +
 
 +
数据清扫完成后,管理员可以检查有多少数据块(如果有的话)被标记为坏块:
  
When the scrub is complete, admins may check how many blocks (if any) have been flagged as bad:
 
 
  # cat /sys/block/md0/md/mismatch_cnt
 
  # cat /sys/block/md0/md/mismatch_cnt
  
==== General Notes on Scrubbing ====
+
==== 关于数据清扫的一般说明 ====
{{Note|Users may alternatively echo '''repair''' to /sys/block/md0/md/sync_action but this is ill-advised since if a mismatch in the data is encountered, it would be automatically updated to be consistent. The danger is that we really don't know whether it's the parity or the data block that's correct (or which data block in case of RAID1). It's luck-of-the-draw whether or not the operation gets the right data instead of the bad data.}}
+
 
 +
{{注意|用户也可以 echo '''repair''' 到 {{ic|/sys/block/md0/md/sync_action}} 里面,但是这是不明智的,因为一旦遇到数据不一致就被自动改写为一致。危险之处在于我们实际并不知道奇偶校验块和数据块哪个是对的(在 RAID1 中是不知道哪个数据块是对的)。因此自动清扫操作能不能用正确数据替换错误数据取决于运气。}}
 +
 
 +
以 root 身份设定一个 cron 任务来定期执行清扫是很好的。{{AUR|raid-check}} 会对此有所帮助。如果要用 systemd 定时器而不是 cron 来执行定期清扫,{{AUR|raid-check-systemd}} 中包含了相同的脚本和配套的 systemd 定时器单元文件。
 +
 
 +
{{注意|对于常规的大容量驱动器,清扫工作耗时大约 '''6 秒每 GB'''(即每 TB 大约需要 1 小时 45 分钟),因此应合理确定 cron 任务或定时器的开始时间。}}
 +
 
 +
==== 对清扫 RAID1 和 RAID10 的说明 ====
  
It is a good idea to set up a cron job as root to schedule a periodic scrub. See {{AUR|raid-check}} which can assist with this. To perform a periodic scrub using systemd timers instead of cron, See {{AUR|raid-check-systemd}} which contains the same script along with associated systemd timer unit files. (note: for typical platter drives, scrubbing can take approximately '''six seconds per gigabyte''' [that's one hour forty-five minutes per terabyte] so plan the start of your cron job or timer appropriately)
+
由于 RAID1 和 RAID10 本质上就是没有数据缓冲的,所以即使阵列工作正常,它的不匹配计数仍然可能是个非零值。这些不匹配计数只存在于正在写入数据的区域,且它们不反映任何问题。但是,我们无法区分非零的不匹配计数到底代表正在写入数据还是确实存在问题。这是造成 RAID1 和 RAID10 阵列误报错误的根源。即使如此,仍然建议定期清扫以发现并纠正驱动器上可能出现的坏扇区。
  
==== RAID1 and RAID10 Notes on Scrubbing ====
+
=== 从阵列中移除设备 ===
Due to the fact that RAID1 and RAID10 writes in the kernel are unbuffered, an array can have non-0 mismatch counts even when the array is healthy.  These non-0 counts will only exist in transient data areas where they don't pose a problem.  However, we can't tell the difference between a non-0 count that is just in transient data or a non-0 count that signifies a real problem.  This fact is a source of false positives for RAID1 and RAID10 arrays.  It is however still recommended to scrub regularly in order to catch and correct any bad sectors that might be present in the devices.
+
 
 +
要从阵列中移除一个设备,先将这个设备标记为 faulty(故障):
  
===Removing Devices from an Array===
 
One can remove a device from the array after marking it as faulty:
 
 
  # mdadm --fail /dev/md0 /dev/sdxx
 
  # mdadm --fail /dev/md0 /dev/sdxx
  
Now remove it from the array:
+
现在从阵列中移除这个设备:
 +
 
 
  # mdadm --remove /dev/md0 /dev/sdxx
 
  # mdadm --remove /dev/md0 /dev/sdxx
  
Remove device permanently (for example, to use it individually from now on):
+
永久移除设备(比如想把一个设备拿出来单独使用):
Issue the two commands described above then:
+
先使用上述两个命令,然后:
  
 
  # mdadm --zero-superblock /dev/sdxx
 
  # mdadm --zero-superblock /dev/sdxx
  
{{Warning | '''DO NOT''' issue this command on linear or RAID0 arrays or data '''LOSS''' will occur!}}
+
{{警告|
{{Warning | Reusing the removed disk without zeroing the superblock '''WILL CAUSE LOSS OF ALL DATA''' on the next boot. (After mdadm will try to use it as the part of the raid array).}}
+
* 不要在 RAID0 阵列或者其他线性存放数据的阵列中进行这个操作!否则数据会丢失!
 +
* 重新使用已经移除的硬盘却不清除它的超级块将会导致下次启动时丢失所有数据。(因为 mdadm 将会把它当做磁盘阵列的一部分来使用)。
 +
}}
 +
 
 +
停止使用某个阵列:
 +
 
 +
# 卸载 (umount) 目标阵列
 +
# 用这个命令停止磁盘阵列运行:{{ic|mdadm --stop /dev/md0}}
 +
# 将本节开头的三个命令在每块硬盘上都运行一遍。
 +
# 将 {{ic|/etc/mdadm.conf}} 中的相关行移除。
 +
 
 +
=== 向阵列中添加设备 ===
  
Stop using an array:
+
可以在系统正在运行且设备已经挂载的情况下使用 mdadm 添加新设备。
# Umount target array
+
按照前文所述的方法,使用现有阵列中相同的布局对新设备进行分区。
# Stop the array with: {{ic|mdadm --stop /dev/md0}}
 
# Repeat the three command described in the beginning of this section on each device.
 
# Remove the corresponding line from /etc/mdadm.conf
 
  
=== Adding a New Device to an Array ===
+
如果 RAID 阵列尚未组合,先组合它们:
Adding new devices with mdadm can be done on a running system with the devices mounted.
 
Partition the new device using the same layout as one of those already in the arrays as discussed above.
 
  
Assemble the RAID array if it is not already assembled:
 
 
  # mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1
 
  # mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1
  
Add the new device the array:
+
向阵列中添加新设备:
 +
 
 
  # mdadm --add /dev/md0 /dev/sdc1
 
  # mdadm --add /dev/md0 /dev/sdc1
  
This should not take long for mdadm to do. Again, check the progress with:
+
这一步 mdadm 不会花费很长时间。再次说明,可以这样检查进度:
 +
 
 
  # cat /proc/mdstat
 
  # cat /proc/mdstat
  
Check that the device has been added with the command:
+
用这个命令检查已经添加的设备:
 +
 
 
  # mdadm --misc --detail /dev/md0
 
  # mdadm --misc --detail /dev/md0
  
{{Note|For RAID0 arrays you may get the following error message:
+
{{注意|对于 RAID0 设备可能会收到以下错误信息:
 +
 
 
  mdadm: add new device failed for /dev/sdc1 as 2: Invalid argument
 
  mdadm: add new device failed for /dev/sdc1 as 2: Invalid argument
This is because the above commands will add the new disk as a "spare" but RAID0 doesn't have spares. If you want to add a device to a RAID0 array, you need to "grow" and "add" in the same command. This is demonstrated below:
+
 
 +
这是由于上述命令会将新磁盘添加为 "spare"(备用)盘,但是 RAID0 中不存在备用盘。如果想往 RAID0 阵列中添加磁盘,你需要同时使用 "grow" "add" 参数。如下所示:
 +
 
 
  # mdadm --grow /dev/md0 --raid-devices<nowiki>=</nowiki>3 --add /dev/sdc1
 
  # mdadm --grow /dev/md0 --raid-devices<nowiki>=</nowiki>3 --add /dev/sdc1
 +
 
}}
 
}}
  
=== Increasing Size of a RAID Volume ===
+
=== 增大 RAID 卷的大小 ===
 +
 
 +
如果给阵列安装了更大的磁盘,或者增大了分区大小,可能就需要增大 RAID 卷的大小以适应更大的可用空间。这一过程可用首先按照上文中关于更换磁盘的步骤来做。当 RAID 卷在更大的磁盘上重建完成后,这个卷需要 "grow" 来填充多出来的空间。
  
If larger disks are installed in a RAID array or partition size has been increased, it may be desirable to increase the size of the RAID volume to fill the larger available space. This process may be begun by first following the above sections pertaining to replacing disks. Once the RAID volume has been rebuilt onto the larger disks it must be "grown" to fill the space.
 
 
  # mdadm --grow /dev/md0 --size=max
 
  # mdadm --grow /dev/md0 --size=max
Next, partitions present on the RAID volume {{ic|/dev/md0}} may need to be resized. See [[Partitioning]] for details. Finally, the filesystem on the above mentioned partition will need to be resized. If partitioning was performed with {{ic|gparted}} this will be done automatically. If other tools were used, unmount and then resize the filesystem manually.
 
{{bc|
 
# umount /storage
 
# fsck.ext4 -f /dev/md0p1
 
# resize2fs /dev/md0p1
 
}}
 
  
=== Change sync speed limits ===
+
接着,在 RAID 卷 {{ic|/dev/md0}} 上的现有分区可能需要调整大小。参阅 [[Partitioning (简体中文)]] 获取更多信息。最后,上述分区上的文件系统也需要重新调整大小。如果用 {{ic|gparted}} 来完成分区操作,这些都会自动完成。如果用的是其他工具,请手动卸载 (unmount) 文件系统并调整其大小。
 +
 
 +
# umount /storage
 +
# fsck.ext4 -f /dev/md0p1
 +
# resize2fs /dev/md0p1
 +
 
 +
=== 修改同步速度限制 ===
  
Syncing can take a while.  If the machine is not needed for other tasks the speed limit can be increased.
+
同步工作需要一定的时间。如果本机不需要完成其他任务,可以提高速度限制值。
  
 
{{hc|# cat /proc/mdstat|<nowiki>
 
{{hc|# cat /proc/mdstat|<nowiki>
  Personalities : [raid1]  
+
  Personalities : [raid1]
 
  md0 : active raid1 sda3[2] sdb3[1]
 
  md0 : active raid1 sda3[2] sdb3[1]
 
       155042219 blocks super 1.2 [2/1] [_U]
 
       155042219 blocks super 1.2 [2/1] [_U]
 
       [>....................]  recovery =  0.0% (77696/155042219) finish=265.8min speed=9712K/sec
 
       [>....................]  recovery =  0.0% (77696/155042219) finish=265.8min speed=9712K/sec
     
+
 
 
  unused devices: <none>
 
  unused devices: <none>
 
</nowiki>}}
 
</nowiki>}}
  
Check the current speed limit.
+
查看当前速度限制:
  
 
{{hc|# cat /proc/sys/dev/raid/speed_limit_min|
 
{{hc|# cat /proc/sys/dev/raid/speed_limit_min|
 
1000
 
1000
 
}}
 
}}
 +
 
{{hc|# cat /proc/sys/dev/raid/speed_limit_max|
 
{{hc|# cat /proc/sys/dev/raid/speed_limit_max|
 
200000
 
200000
 
}}
 
}}
  
Increase the limits.
+
提高限制值:
  
 
  # echo 400000 >/proc/sys/dev/raid/speed_limit_min
 
  # echo 400000 >/proc/sys/dev/raid/speed_limit_min
 
  # echo 400000 >/proc/sys/dev/raid/speed_limit_max
 
  # echo 400000 >/proc/sys/dev/raid/speed_limit_max
  
Then check out the syncing speed and estimated finish time.
+
然后查看同步速度和预计完成时间:
  
 
{{hc|# cat /proc/mdstat|<nowiki>
 
{{hc|# cat /proc/mdstat|<nowiki>
  Personalities : [raid1]  
+
  Personalities : [raid1]
 
  md0 : active raid1 sda3[2] sdb3[1]
 
  md0 : active raid1 sda3[2] sdb3[1]
 
       155042219 blocks super 1.2 [2/1] [_U]
 
       155042219 blocks super 1.2 [2/1] [_U]
 
       [>....................]  recovery =  1.3% (2136640/155042219) finish=158.2min speed=16102K/sec
 
       [>....................]  recovery =  1.3% (2136640/155042219) finish=158.2min speed=16102K/sec
     
+
 
 
  unused devices: <none>
 
  unused devices: <none>
 
</nowiki>}}
 
</nowiki>}}
  
 +
更多信息可参阅 [[sysctl#MDADM]]。
 +
 +
== 监视运行情况 ==
  
See also [[sysctl#MDADM]].
+
可以显示当前 RAID 设备状态的一行简单命令:
  
== Monitoring ==
+
{{hc|# awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' </proc/mdstat
A simple one-liner that prints out the status of the RAID devices:
 
{{hc|awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' </proc/mdstat
 
 
|md1: [UU]
 
|md1: [UU]
 
md0: [UU]
 
md0: [UU]
 
}}
 
}}
  
===Watch mdstat===
+
=== 用 watch 监视 mdstat ===
{{bc|watch -t 'cat /proc/mdstat'}}
+
 
Or preferably using {{pkg|tmux}}
+
# watch -t 'cat /proc/mdstat'
{{bc|tmux split-window -l 12 "watch -t 'cat /proc/mdstat'"}}
+
 
 +
或者最好用 {{pkg|tmux}}
 +
 
 +
# tmux split-window -l 12 "watch -t 'cat /proc/mdstat'"
 +
 
 +
=== 用 iotop 追踪 IO ===
 +
 
 +
{{pkg|iotop}} 可以显示各个进程的输入输出状态。请用这个命令来查看 RAID 线程的输入输出。
 +
 
 +
# iotop -a -p $(sed 's, , -p ,g' <<<`pgrep "_raid|_resync|jbd2"`)
  
===Track IO with iotop===
+
=== 用 iostat 追踪 IO ===
The {{pkg|iotop}} package displays the input/output stats for processes.  Use this command to view the IO for raid threads.
 
  
{{bc|<nowiki>iotop -a -p $(sed 's, , -p ,g' <<<`pgrep "_raid|_resync|jbd2"`)</nowiki>}}
+
{{Pkg|sysstat}} 包中的 ''iostat'' 实用程序可以显示各个设备和分区的输入输出统计。
  
===Track IO with iostat===
+
# iostat -dmy 1 /dev/md0
 +
# iostat -dmy 1 # all
  
The ''iostat'' utility from {{Pkg|sysstat}} package displays the input/output statistics for devices and partitions.
+
=== 启用事件邮件通知 ===
  
  iostat -dmy 1 /dev/md0
+
要完成发送邮件的任务需要一个 smtp 邮件服务器或至少需要一个 ssmtp/msmtp 邮件转发器。大概最简单的解决方案是使用 {{AUR|dma}},它非常小巧(安装完只占用 0.08 MiB)且不需要设置。
  iostat -dmy 1 # all
 
  
===Mailing on events===
+
编辑 {{ic|/etc/mdadm.conf}} 来添加用于接收通知的邮件地址。
A smtp mail server (sendmail) or at least an email forwarder (ssmtp/msmtp) is required to accomplish this.  Perhaps the most simplistic solution is to use {{AUR|dma}} which is very tiny (installs to 0.08 MiB) and requires no setup.
 
  
Edit {{ic|/etc/mdadm.conf}} defining the email address to which notifications will be received. 
+
{{注意|如果用的是上文提到的 dma,用户可以直接将邮件发送到本机 (localhost) 的某个用户名 (username) 中,不一定非要发到外部邮件地址。}}
{{Note|If using dma as mentioned above, users may simply mail directly to the username on the localhost rather than to an external email address.}}
+
 
 +
测试配置是否正确:
  
To test the configuration:
 
 
  # mdadm --monitor --scan --oneshot --test
 
  # mdadm --monitor --scan --oneshot --test
  
[[mdadm]] includes a systemd service (mdmonitor.service) to perform the monitoring task, so at this point, you have nothing left to do. If you do not set a mail address in {{ic|/etc/mdadm.conf}}, that service will fail. If you do not want to receive mail on mdadm events, the failure can be ignored; if you don't want notifications and are sensitive about failure messages, you can mask the unit.
+
mdadm 使用 {{ic|mdmonitor.service}} 来完成监控任务,所以现在你无需进行更多设置了。如果你没有在 {{ic|/etc/mdadm.conf}} 设置邮件地址,那么这个 service 就会出错。如果你不想接收 mdadm 一般事件通知,可以忽略这个错误;如果不想接收一般事件通知但是需要接收故障信息,可以 [[Systemd (简体中文)#使用单元|mask(屏蔽)]] 这个 unit。
 +
 
 +
==== 其他实现方式 ====
  
==== Alternative method ====
+
为避免安装 smtp 邮件服务器或邮件转发器的麻烦,可以使用系统上已经安装的 [[S-nail]] 工具(不要忘了设置它)。
  
To avoid the installation of a smtp mail server or an email forwarder you can use the [[S-nail]] tool (don't forget to setup) already on your system.
+
创建 {{ic|/etc/mdadm_warning.sh}} 文件:
  
Create a file named {{ic|/etc/mdadm_warning.sh}} with:
+
{{hc|/etc/mdadm_warning.sh|2=
 +
#!/bin/bash
 +
event=$1
 +
device=$2
  
#!/bin/bash
+
echo " " | /usr/bin/mailx -s "$event on $device" '''destination@email.com'''
event=$1
+
}}
device=$2
 
 
echo " " | /usr/bin/mailx -s "$event on $device" '''destination@email.com'''
 
  
And give it execution permissions {{ic|chmod +x /etc/mdadm_warning.sh}}
+
然后给它执行权限:{{ic|chmod +x /etc/mdadm_warning.sh}}
  
Then add this to the mdadm.conf
+
然后在 mdadm.conf 中添加这一行:
  
 
  PROGRAM /etc/mdadm_warning.sh
 
  PROGRAM /etc/mdadm_warning.sh
  
To test and enable use the same as in the previous method.
+
用前述的方法测试并启用它。
 +
 
 +
== 故障排除 ==
 +
 
 +
如果你在重启计算机时遇到类似 "invalid raid superblock magic" 的错误,并且除了已经配置好的硬盘外又接了其他硬盘,请检查硬盘顺序是不是正确的。在安装 RAID 时,硬盘编号可能是 hdd、hde 和 hdf,但是重启后它们的编号可能变成了 hda、hdb 和 hdc。请相应地调整你的内核参数。这种情况经常发生。
  
==Troubleshooting==
+
=== Error: "kernel: ataX.00: revalidation failed" ===
If you are getting error when you reboot about "invalid raid superblock magic" and you have additional hard drives other than the ones you installed to, check that your hard drive order is correct. During installation, your RAID devices may be hdd, hde and hdf, but during boot they may be hda, hdb and hdc. Adjust your kernel line accordingly. This is what happened to me anyway.
 
  
===Error: "kernel: ataX.00: revalidation failed"===
+
如果你突然(在重启、修改 BIOS 设置后)遇到类似错误信息:
If you suddenly (after reboot, changed BIOS settings) experience Error messages like:
 
  
 
  Feb  9 08:15:46 hostserver kernel: ata8.00: revalidation failed (errno=-5)
 
  Feb  9 08:15:46 hostserver kernel: ata8.00: revalidation failed (errno=-5)
  
Is doesn't necessarily mean that a drive is broken. You often find panic links on the web which go for the worst. In a word, No Panic. Maybe you just changed APIC or ACPI settings within your BIOS or Kernel parameters somehow. Change them back and you should be fine. Ordinarily, turning ACPI and/orACPI off should help.
+
这并不意味着设备已经损坏。尽管你可能会在网上看到一些讲内核崩溃的链接指向最坏的结果,但总而言之,并不是内核崩溃。可能你不知怎么的在 BIOS 里或内核参数里修改了 APIC ACPI 设置。把它改回来就好了。通常关闭 APIC 和/或 ACPI 就好了。
 +
 
 +
=== 磁盘阵列以只读模式启动 ===
 +
 
 +
当由 md 启动磁盘阵列时,超级块将被改写,数据同步可能已经开始了。要以只读模式启动,可以向内核模块 {{ic|md_mod}} 传递参数 {{ic|start_ro}}。设置了这个参数以后,新的磁盘阵列进入 'auto-ro' 模式,该模式停止了所有内部读写操作(更新超级块、再同步、数据恢复),并且会在第一个写入请求到来时自动切换至 'rw' (读写)模式。
 +
 
 +
{{注意|在第一个写入请求到来前使用 {{ic|mdadm --readonly}} 命令可以将阵列设置为真正的 'ro' (只读)模式,还可以用 {{ic|mdadm --readwrite}} 命令直接开始再同步而不用等待写入请求。}}
 +
 
 +
要在启动时设置该参数,在内核启动参数中添加 {{ic|1=md_mod.start_ro=1}}。
  
===Start arrays read-only===
+
也可以在模块加载时传递该参数,可以从 {{ic|/etc/modprobe.d/}} 下的文件中传递,也可以直接从 {{ic|/sys/}} 传递:
When an md array is started, the superblock will be written, and resync may begin.  To start read-only set the kernel module {{ic|md_mod}} parameter {{ic|start_ro}}.  When this is set, new arrays get an 'auto-ro' mode, which disables all internal io (superblock updates, resync, recovery) and is automatically switched to 'rw' when the first write request arrives.
 
  
{{Note|The array can be set to true 'ro' mode using {{ic|mdadm --readonly}} before the first write request, or resync can be started without a write using {{ic|mdadm --readwrite}}.}}
+
# echo 1 > /sys/module/md_mod/parameters/start_ro
  
To set the parameter at boot, add {{ic|<nowiki>md_mod.start_ro=1</nowiki>}} to your kernel line.
+
=== 在损坏或缺失磁盘的情况下恢复 RAID ===
  
Or set it at module load time from {{ic|/etc/modprobe.d/}} file or from directly from {{ic|/sys/}}.
+
当磁盘阵列中的一个驱动器由于任何原因损坏时,也可能会发生上述错误。如果在缺失一块硬盘的情况下你仍需要强制启动磁盘阵列,输入以下命令(根据实际修改):
{{bc|echo 1 > /sys/module/md_mod/parameters/start_ro}}
 
  
===Recovering from a broken or missing drive in the raid===
 
You might get the above mentioned error also when one of the drives breaks for whatever reason. In that case you will have to force the raid to still turn on even with one disk short. Type this (change where needed):
 
 
  # mdadm --manage /dev/md0 --run
 
  # mdadm --manage /dev/md0 --run
  
Now you should be able to mount it again with something like this (if you had it in fstab):
+
现在你应该可以用类似下面的命令来挂载它(如果在 fstab 里有它的话):
 +
 
 
  # mount /dev/md0
 
  # mount /dev/md0
  
Now the raid should be working again and available to use, however with one disk short! So, to add that one disc partition it the way like described above in [[#Prepare the Devices|Prepare the device]]. Once that is done you can add the new disk to the raid by doing:
+
现在磁盘阵列应该已经工作并且可以使用,但仍旧是缺一块盘的状态。因此需要按照上文 [[#准备设备]] 所述再添加一个磁盘分区,然后就可以将新磁盘分区加入到磁盘阵列中:
 +
 
 
  # mdadm --manage --add /dev/md0 /dev/sdd1
 
  # mdadm --manage --add /dev/md0 /dev/sdd1
  
If you type:
+
如果输入:
 +
 
 
  # cat /proc/mdstat
 
  # cat /proc/mdstat
you probably see that the raid is now active and rebuilding.
 
  
You also might want to update your configuration (see: [[#Update configuration file]]).
+
你就能看到磁盘阵列已经激活并正在重建。
 +
 
 +
你可能还需要更新你的配置文件(参阅:[[#更新配置文件]])。
 +
 
 +
== 基准测试 ==
 +
 
 +
用于 RAID 基准测试的工具有很多种。不同 RAID 最显著的不同是多个线程在读取 RAID 卷时的速度提升程度。
  
== Benchmarking ==
+
{{AUR|tiobench}} 通过测量磁盘的全线程读写 (fully-threaded I/O) 来专门测试多线程性能提升程度。
There are several tools for benchmarking a RAID. The most notable improvement is the speed increase when multiple threads are reading from the same RAID volume.
 
  
{{AUR|tiobench}} specifically benchmarks these performance improvements by measuring fully-threaded I/O on the disk.
+
{{Pkg|bonnie++}} 测试对一个或多个数据库类型文件的读写,以及对小文件的创建、读取、删除,这样可以模拟 Squid、INN 和 Maildir format e-mail 等程序的文件读写。其附带的 [http://www.coker.com.au/bonnie++/zcav/ ZCAV] 程序可以测试硬盘不同区域的性能,且不用向硬盘写入任何数据。
  
{{Pkg|bonnie++}} tests database type access to one or more files, and creation, reading, and deleting of small files which can simulate the usage of programs such as Squid, INN, or Maildir format e-mail. The enclosed [http://www.coker.com.au/bonnie++/zcav/ ZCAV] program tests the performance of different zones of a hard drive without writing any data to the disk.
+
'''不应该''' 使用 {{ic|hdparm}} 来对 RAID 进行基准测试,因为它多次返回的结果会非常不一致。
  
{{ic|hdparm}} should '''NOT''' be used to benchmark a RAID, because it provides very inconsistent results.
+
== 参考资料 ==
  
== See also ==
+
{{Out of date|许多链接太旧且无效。}}
* [http://www.gentoo.org/doc/en/articles/software-raid-p1.xml Software RAID in the new Linux 2.4 kernel, Part 1] and [http://www.gentoo.org/doc/en/articles/software-raid-p2.xml Part 2] in the Gentoo Linux Docs
+
 
 +
* [http://www.gentoo.org/doc/en/articles/software-raid-p1.xml Software RAID in the new Linux 2.4 kernel, Part 1]{{Dead link|2018|03|10}} and [http://www.gentoo.org/doc/en/articles/software-raid-p2.xml Part 2]{{Dead link|2018|03|10}} in the Gentoo Linux Docs
 
* [http://raid.wiki.kernel.org/index.php/Linux_Raid Linux RAID wiki entry] on The Linux Kernel Archives
 
* [http://raid.wiki.kernel.org/index.php/Linux_Raid Linux RAID wiki entry] on The Linux Kernel Archives
 
* [https://raid.wiki.kernel.org/index.php/Write-intent_bitmap How Bitmaps Work]
 
* [https://raid.wiki.kernel.org/index.php/Write-intent_bitmap How Bitmaps Work]
 
* [http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/ch-raid.html Chapter 15: Redundant Array of Independent Disks (RAID)] of Red Hat Enterprise Linux 6 Documentation
 
* [http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/ch-raid.html Chapter 15: Redundant Array of Independent Disks (RAID)] of Red Hat Enterprise Linux 6 Documentation
 
* [http://tldp.org/FAQ/Linux-RAID-FAQ/x37.html Linux-RAID FAQ] on the Linux Documentation Project
 
* [http://tldp.org/FAQ/Linux-RAID-FAQ/x37.html Linux-RAID FAQ] on the Linux Documentation Project
* [http://support.dell.com/support/topics/global.aspx/support/entvideos/raid?c=us&l=en&s=gen Dell.com Raid Tutorial] - Interactive Walkthrough of Raid
+
* [http://support.dell.com/support/topics/global.aspx/support/entvideos/raid?c=us&l=en&s=gen Dell.com Raid Tutorial]{{Dead link|2018|03|10}} - Interactive Walkthrough of Raid
* [http://www.miracleas.com/BAARF/ BAARF] including ''[http://www.miracleas.com/BAARF/RAID5_versus_RAID10.txt Why should I not use RAID 5?]'' by Art S. Kagel
+
* [http://www.miracleas.com/BAARF/ BAARF]{{Dead link|2018|03|10}} including ''[http://www.miracleas.com/BAARF/RAID5_versus_RAID10.txt Why should I not use RAID 5?]''{{Dead link|2018|03|10}} by Art S. Kagel
 
* [http://www.linux-mag.com/id/7924/ Introduction to RAID], [http://www.linux-mag.com/id/7931/ Nested-RAID: RAID-5 and RAID-6 Based Configurations], [http://www.linux-mag.com/id/7928/ Intro to Nested-RAID: RAID-01 and RAID-10], and [http://www.linux-mag.com/id/7932/ Nested-RAID: The Triple Lindy] in Linux Magazine
 
* [http://www.linux-mag.com/id/7924/ Introduction to RAID], [http://www.linux-mag.com/id/7931/ Nested-RAID: RAID-5 and RAID-6 Based Configurations], [http://www.linux-mag.com/id/7928/ Intro to Nested-RAID: RAID-01 and RAID-10], and [http://www.linux-mag.com/id/7932/ Nested-RAID: The Triple Lindy] in Linux Magazine
 
* [http://www.cyberciti.biz/tips/linux-raid-increase-resync-rebuild-speed.html HowTo: Speed Up Linux Software Raid Building And Re-syncing]
 
* [http://www.cyberciti.biz/tips/linux-raid-increase-resync-rebuild-speed.html HowTo: Speed Up Linux Software Raid Building And Re-syncing]
 
* [http://fomori.org/blog/?p=94 RAID5-Server to hold all your data]
 
* [http://fomori.org/blog/?p=94 RAID5-Server to hold all your data]
 
+
* [[Wikipedia:Non-RAID drive architectures]]
'''Active bugs'''
 
* [http://marc.info/?l=linux-raid&m=144960710718870&w=2 linux-raid ML #1]
 
* [http://marc.info/?l=linux-raid&m=144830809503689&w=2 linux-raid ML #2]
 
  
 
'''mdadm'''
 
'''mdadm'''
Line 556: Line 663:
 
* [http://www.kernel.org/pub/linux/utils/raid/mdadm/ mdadm source code]
 
* [http://www.kernel.org/pub/linux/utils/raid/mdadm/ mdadm source code]
 
* [http://www.linux-mag.com/id/7939/ Software RAID on Linux with mdadm] in Linux Magazine
 
* [http://www.linux-mag.com/id/7939/ Software RAID on Linux with mdadm] in Linux Magazine
 +
* [[Wikipedia:mdadm|Wikipedia - mdadm]]
  
 
'''Forum threads'''
 
'''Forum threads'''

Latest revision as of 07:03, 16 May 2018

翻译状态: 本文是英文页面 RAID翻译,最后翻译时间:2018-05-16,点击这里可以查看翻译后英文页面的改动。

Tango-edit-clear.pngThis article or section needs language, wiki syntax or style improvements.Tango-edit-clear.png

Reason: Non-standard headers, other Help:Style issues (Discuss in Talk:RAID (简体中文)#)

独立磁盘冗余阵列 (Redundant Array of Independent Disks, RAID) 是一种将多个磁盘驱动器组件(通常是多块硬盘或多个分区)组合为一个逻辑单元的存储技术。根据 RAID 的部署情况,这个逻辑单元可以是单个的文件系统,也可以是一个能在其上建立多个分区的透明中间层。根据所需的冗余量和性能要求,数据按照 #RAID 级别 中的某一种方式分布在驱动器中。所选的 RAID 级别决定了是否可以防止数据丢失(硬盘故障时)、是否提高性能或结合两者优势。

本文介绍如何使用 mdadm 创建并管理一个软件磁盘阵列。

警告: 确保在操作前 备份 所有数据。

RAID 级别

尽管大部分 RAID 级别都或多或少地包含了数据冗余,RAID 并不能完全保证数据安全。如果遇到火灾、计算机被盗或者多块硬盘同时损坏,RAID 将无法保护数据。此外,配置一个带有 RAID 的系统是一个复杂的过程,可能会破坏现有数据。

基本 RAID 级别

有多种不同的 基本 RAID 级别,下面列出了最常用的几种。

RAID 0
将多块硬盘组合为一个带区卷,尽管它 并不提供数据冗余,它仍可以被当做是 RAID,而且它确实提供了 巨幅的速度提升。如果提高速度比数据安全更重要(比如作为 swap 分区),可以选择这种 RAID 级别。在服务器上,RAID 1 和 RAID 5 阵列更加合适。在 RAID 0 阵列中,块设备的大小是最小组成分区的大小乘以组成分区的数量。
RAID 1
这是最直接的 RAID 级别:完全镜像。与其他 RAID 级别一样,它只在分区位于不同物理硬盘上才有效。如果某一块硬盘损坏,由 RAID 阵列提供的块设备将不受影响。可以使用 RAID 1 的情境包括了除 swap 和临时文件外的其他所有情境。请注意,如果使用由软件实现的 RAID,引导分区只能选择 RAID 1,因为读取引导分区的引导器通常无法辨识 RAID,但一个 RAID 1 的组成分区可以像常规分区一样读取。RAID 1 阵列块设备的大小是最小组成分区的大小。
RAID 5
需要至少 3 块物理硬盘,并结合了 RAID 1 的数据冗余和 RAID 0 的速度与可用空间上的优势。RAID 5 使用了类似 RAID 0 的条带化技术,同时也将奇偶校验块分布式地存储在每一块磁盘上。如果遭遇硬盘损坏,这些奇偶校验块就可以用来在替代的新磁盘上重建损坏的数据。RAID 5 仅可弥补一个组成磁盘损坏带来的损失。
注意: RAID 5 是结合了速度与数据冗余优势的常用选择。但值得注意的是,当一块硬盘损坏而没有及时更换,此时若再有硬盘损坏,则所有数据都将丢失。此外,考虑到现代磁盘的超大容量和消费级硬盘无法恢复的读取错误率 (Unrecoverable read error, URE),超过 4TiB 的阵列在重建数据时出现至少一处读取错误 (URE) 的概率几乎在预料之中(概率大于 50%)。因此,存储行业不再推荐使用 RAID 5。
RAID 6
需要至少 4 块物理硬盘,提供了和 RAID 5 一样的优势并且在两块硬盘损坏时仍能保证数据安全。RAID 6 使用了和 RAID 5 类似的条带化技术,但是把两个不同的奇偶校验块 分布式地存储在每一块磁盘上。如果磁盘发生故障,这些奇偶校验块将用于重建替换磁盘上的数据。RAID 6 可以承担两个组成磁盘的损失。在抵御无法恢复的读取错误 (Unrecoverable read error, URE) 时也某种程度上更加可靠,因为磁盘阵列在重建某一块损坏硬盘的数据时仍然有奇偶校验块可以校验数据。但是,总体而言,RAID 6 开销较大,大多数时候 far2 布局的 RAID 10(参见下文)提供了更快的速度和更强的可靠性,因此更倾向于采用 RAID 10。

嵌套 RAID 级别

RAID 1+0
RAID1+0 是一种结合了两种基本 RAID 级别的嵌套级别,它相对基本级别提高了性能且增加了冗余量。它通常被称为 RAID10,但是,Linux MD(内核自带的 RAID 实现)支持的 RAID10 不是简单的两层 RAID 重叠,请看下文。
RAID 10
Linux 下的 RAID10 建立在 RAID1+0 的概念上,但它将其实现为单一的一层,这一层可以有多种不同的布局。可参考 创建复杂 RAID 10
在 Y 块硬盘上的 近 X 布局 在不同硬盘上重复储存每个数据块 X 次,但不需要 Y 可以被 X 整除。数据块放在所镜像的磁盘上几乎相同的位置,这就是 近布局 名字的来源。它可以工作在任意数量的磁盘上,最少是 2 块。在 2 块硬盘上的近 2 布局相当于 RAID1,4 块硬盘上的近 2 布局相当于 RAID1+0。
在 Y 块硬盘上的 远 X 布局 设计用于在镜像阵列中提供与条带化技术一样快的读取速度。它通过把每块硬盘分成前后两部分来实现这一点,写入第一块硬盘前半部分数据也会写入第二块硬盘的后半部分,反之亦然。这样可以达到一个效果,那就是把对连续数据的读取条带化,而这正是 RAID0 和 RAID5 读取性能高的原因。它的缺点在于写入连续数据时有轻微性能损失,因为硬盘磁头要运动到另一片区域来写入镜像。当数据读取性能和可用性/冗余性一样重要时,比起 RAID1+0 RAID5,更应该优先考虑远 2 布局的 RAID10。需注意这种方式仍无法代替备份。详情请阅读维基百科相关页面。

RAID 级别对比

RAID 级别 数据冗余 物理设备利用率 读取性能 写入性能 最少磁盘数量
0 No 100% n 倍

最优

n 倍

最优

2
1 Yes 50% 如果有多个进程同时读取,最多 n 倍,否则 1 倍 1 倍 2
5 Yes 67% - 94% (n−1) 倍

较优

(n−1) 倍

较优

3
6 Yes 50% - 88% (n−2) 倍 (n−2) 倍 4
10,far2 Yes 50% n 倍

最优; 与 RAID0 相当但加入了数据冗余

(n/2) 倍 2
10,near2 Yes 50% 如果有多个进程同时读取,最多 n 倍,否则 1 倍 (n/2) 倍 2

* 其中 n 表示用于组成阵列的磁盘数量。

实现方式

RAID 设备可以用不同方式来管理:

软件 RAID
这是最简单的实现方式,因为它不依赖于专用固件或专有软件。这种阵列由操作系统通过以下方式进行管理:
  • 通过抽象层管理(比如 mdadm);
    注意: 这是在本指南下文将要使用的方法。
  • 通过逻辑卷管理器来管理(比如 LVM);
  • 通过文件系统的某个组件来管理(比如 ZFSBtrfs)。
硬件 RAID
这种阵列由安装在计算机上的专用硬件卡直接管理,硬盘直接连接在该计算机上。RAID 的处理逻辑由板载的处理器完成,它独立于 主处理器 (CPU)。尽管这种方案独立于任何操作系统,但却需要驱动程序来使硬件 RAID 控制器正常工作。取决于不同的制造商,硬件 RAID 阵列可以在 option ROM 里设置或者操作系统安装完成后另行安装配套软件来设置。这种设置是独立于 Linux 内核的:内核并不能看到单独的每块硬盘。
FakeRAID
这种类型的 RAID 应当称为 BIOS 或板载 RAID,却常被错误地当做硬件 RAID 来宣传。这种阵列由伪 RAID 控制器来管理,RAID 逻辑由 option ROM 或安装了 EFI Sata 驱动程序的 固件本身(UEFI 情况下)来完成,但并不是实现了 所有 RAID 功能的完整硬件 RAID 控制器。因此,这种 RAID 有时被称为 FakeRAID。来自 官方仓库dmraid 用于处理这种控制器。这里列出一些 FakeRAID 控制器:Intel Rapid Storage,JMicron JMB36x RAID ROM,AMD RAID,ASMedia 106x 和 NVIDIA MediaShield。

我正在使用哪一种 RAID?

由于软件 RAID 是由用户部署的,因此用户很容易就知道 RAID 的类型。

但是,辨别 FakeRAID 和真正的硬件 RAID 是很困难的。如上所述,制造商经常错误地混淆这两种类型的 RAID,还可能进行虚假宣传。这种情况下应该采取的最好方式是运行 lspci 命令并在输出信息中找到你的 RAID 控制器,然后根据这些信息进行更进一步的搜索。硬件 RAID 控制器会在这一列表中出现,但 FakeRAID 不会。同时,真正的硬件 RAID 控制器通常价格很高,如果这个系统是自行组装的,那么很可能安装一个硬件 RAID 会使电脑的价格显著提高。

安装

安装 mdadmmdadm 用于管理在纯块设备上建立起来的纯软件 RAID:底层硬件不提供任何 RAID 逻辑,只是一些磁盘而已。mdadm 可以在任何块设备集合上工作,甚至是那些非常规的设备。比如,你可以用一堆 U 盘来建立 RAID 阵列。

准备设备

警告: 这些步骤会擦除指定设备上的所有数据,输入命令请小心!

如果设备是旧设备重用或刚从一个现有的阵列上拆下来,请擦除所有旧的 RAID 配置信息:

# mdadm --misc --zero-superblock /dev/<drive>

或者是删除设备上的某个特定的分区:

# mdadm --misc --zero-superblock /dev/<partition>
注意:
  • 清除一个分区的 superblock 不会影响到磁盘上的其他分区。
  • 考虑到 RAID 本身的功能特点,在运行中的磁盘阵列中完全地 安全擦除磁盘 是很困难的。请在创建阵列前考虑要不要安全擦除磁盘。

对磁盘进行分区

强烈推荐对用于阵列的硬盘进行分区。考虑到大多数 RAID 用户会用到超过 2 TiB 的硬盘,因此推荐并要求使用 GPT。参阅 Partitioning (简体中文) 获取关于磁盘分区的更多信息以及可供使用的 分区工具

注意: 也可以在裸磁盘(没有分区的磁盘)上直接创建 RAID,但不推荐这么做,因为这样可能会导致更换损坏硬盘时出现问题
注意: 当更换 RAID 中的某块损坏的硬盘时,新硬盘的大小必须恰好等于或大于损坏的硬盘,否则无法完成阵列重建过程。即使是同一厂商相同型号的硬盘也可能有容量上的细微差别。通过在磁盘末尾保留一些未分配的空间可以消除磁盘容量上的细微差异,这样可以使替代磁盘的型号选择更加容易。因此,最好在磁盘末尾留出大约 100 MiB 的未分配空间。

GUID 分区表

  • 创建分区以后,这些分区的 类型标识符 (GUID) 应该是 A19D880F-05FC-4D3B-A006-743F0F84911E(在 fdisk 里将分区类型改为 Linux RAID 或在 gdisk 里改为 FD00 可以给所选分区分配这个标识符)。
  • 如果使用了一个更大的磁盘阵列,可以考虑分配 文件系统标签分区标签 用于以后区分每块单独的硬盘。
  • 建议在每个设备上创建大小相同的分区。

主引导记录 (MBR)

对于在使用 MBR 的硬盘上创建分区的用户,可用的 分区类型 ID 包括:

  • 0xFD: 自动检测的 RAID(fdisk 中称为 Linux raid autodetect
  • 0xDA: 无文件系统(fdisk 中称为 Non-FS data

更多信息请参阅 Linux Raid Wiki:Partition Types

创建阵列

使用 mdadm 来创建阵列。参阅 mdadm(8) 获取支持的选项。下面列出部分使用范例。

警告: 不要简单地复制/粘贴下面的示例,确保你已经使用正确的选项和设备名称替代了示例中相应的内容。
注意:
  • 如果有一个从 Syslinux 启动的 RAID1 阵列,在 syslinux v4.07 中要求元数据值为 1.0,而不是默认的 1.2。
  • 当用 Arch 安装镜像 创建磁盘阵列时,请使用 --homehost=myhostname 选项设置 主机名(或者 --homehost=any 选项无论在什么主机上都用相同的主机名),否则主机名称 archiso 会被写入阵列的元数据中。
提示: 要为 RAID 设备指定一个自定义的名称,可以使用 --name=MyRAIDName 选项或将 RAID 设备路径改为 /dev/md/MyRAIDName。Udev 会使用该名称创建指向 /dev/md/ 内 RAID 阵列的符号链接。如果 homehost 与当前 主机名 匹配(或者 homehost 设为了 any)则链接将会是 /dev/md/name,如果 homehost 不匹配那么链接将会是 /dev/md/homehost:name

下面这个例子展示了在 2 个设备上建立 RAID1 阵列:

# mdadm --create --verbose --level=1 --metadata=1.2 --raid-devices=2 /dev/md/MyRAID1Array /dev/sdb1 /dev/sdc1

下面这个例子展示了使用 4 块磁盘作为工作 (active) 磁盘,1 块作为备用 (spare) 磁盘建立 RAID5 阵列:

# mdadm --create --verbose --level=5 --metadata=1.2 --chunk=256 --raid-devices=4 /dev/md/MyRAID5Array /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 --spare-devices=1 /dev/sdf1
提示: --chunk 可用于修改默认的区块大小。更多关于优化区块大小的内容请参阅 Chunks: the hidden key to RAID performance

下面这个例子展示了在 2 个设备上建立远 2 布局的 RAID10 阵列 (RAID10, far2):

# mdadm --create --verbose --level=10 --metadata=1.2 --chunk=512 --raid-devices=2 --layout=f2 /dev/md/MyRAID10Array /dev/sdb1 /dev/sdc1

这样,阵列就会在虚拟设备 /dev/mdX 下建立起来,容量已经合并且可以使用(但处于降级模式)。mdadm 在后台同步数据时你已经可以直接开始使用这个阵列了。储存奇偶校验位可能要花很长时间,可以用这个命令查看进度:

$ cat /proc/mdstat

更新配置文件

默认情况下,mdadm.conf 中的大部分内容都被注释掉了,它应该只包含如下内容:

/etc/mdadm.conf
...
DEVICE partitions
...

这一指令告诉 mdadm 检查由 /proc/partitions 引用的所有设备并尽可能将其中的阵列组合起来。如果你确实想启动所有可用的阵列并且确信不存在意料之外的超级块(比如安装了新的存储设备),那么这样的配置就很好。当然有一种更精准的控制方法,就是显式地将阵列添加到 /etc/mdadm.conf

# mdadm --detail --scan >> /etc/mdadm.conf

这将会在配置中添加类似这样的内容:

/etc/mdadm.conf
...
DEVICE partitions
...
ARRAY /dev/md/MyRAID1Array metadata=1.2 name=pine:MyRAID1Array UUID=27664f0d:111e493d:4d810213:9f291abe

这也会使 mdadm 检查由 /proc/partitions 引用的设备。但是,只有超级块的 UUID 是 27664… 的设备才会被组合成激活的阵列。

更多信息请参阅 mdadm.conf(5)

组合成磁盘阵列

更新配置文件后即可用 mdadm 组合磁盘阵列:

# mdadm --assemble --scan

格式化 RAID 上的文件系统

现在磁盘阵列已经可以像普通分区一样被格式化成某个 文件系统,但要记住:

计算 stride(跨度大小)和 stripe width(带区宽度)

优化文件系统结构以适应底层 RAID 结构需要 2 个参数:stridestripe width。它们对应于 RAID 的 chunk size(区块大小) 、文件系统的 block size(块大小) 以及 "data disks"(数据盘)的数量

Chunk size(RAID 区块大小)是 RAID 阵列的一个属性,在阵列创建时就已经定好了。目前 mdadm 默认该值为 512 KiB。这个参数可以用 mdadm 读取:

# mdadm --detail /dev/mdX | grep 'Chunk Size'

Block size(块大小)是文件系统的一个属性,在文件系统创建时就已经定好了。在大部分文件系统上(包括 ext4)默认是 4 KiB。更多关于当前系统 ext4 的信息可以查看 /etc/mke2fs.conf 文件。

"Data disks"(数据盘)的数量指的是阵列能够完全重建数据所要求的最少可用设备。例如,对于 N 个设备的 raid0 来说这个数量是 N,对于 raid5 来说是 N-1。

当你获得了这三个参数时,stride 和 stripe width 可以用下列公式来计算:

stride = chunk size / block size
stripe width = number of data disks * stride
范例 1. RAID0

本范例使用了正确的 stride 和 stripe width 将合并后的分区格式化成了 ext4:

  • 假设这一 RAID0 阵列是由 2 块物理硬盘组成的。
  • Chunk size(RAID 区块大小)是 64 KiB。
  • Block size(文件系统块大小)是 4 KiB。

因为 stride = chunk size / block size。在这个例子中,stride 大小是 64/4 = 16。

因为 stripe width = # of physical data disks * stride。在这个例子中,stripe width 的大小是 2*16 = 32。

# mkfs.ext4 -v -L myarray -m 0.5 -b 4096 -E stride=16,stripe-width=32 /dev/md0
范例 2. RAID5

本范例使用了正确的 stride 和 stripe width 将合并后的分区格式化成了 ext4:

  • 假设这一 RAID5 阵列由 4 块物理硬盘组成,3 块是数据盘,1 块是奇偶校验盘。
  • Chunk size(RAID 区块大小)是 512 KiB。
  • Block size(文件系统块大小)是 4 KiB。

因为 stride = chunk size / block size。在这个例子中,stride 大小是 512/4 = 128。

因为 stripe width = # of physical data disks * stride。在这个例子中,stripe width 的大小是 3*128 = 384.

# mkfs.ext4 -v -L myarray -m 0.01 -b 4096 -E stride=128,stripe-width=384 /dev/md0

关于 stride 和 stripe width 的更多信息,请参阅:RAID Math

范例 3. RAID10,far2

本范例使用了正确的 stride 和 stripe width 将合并后的分区格式化成了 ext4:

  • 假设这一 RAID10 阵列由 2 块物理硬盘组成。考虑到远 2 布局的 RAID10 的自身特性,两块硬盘都是数据盘。
  • Chunk size(RAID 区块大小)是 512 KiB。
# mdadm --detail /dev/md0 | grep 'Chunk Size'
    Chunk Size : 512K
  • Block size(文件系统块大小)是 4 KiB。

因为 stride = chunk size / block size。 在这个例子中,stride 大小是 512/4 = 128。

因为 stripe width = # of physical data disks * stride。 在这个例子中,stripe width 的大小是 2*128 = 256。

# mkfs.ext4 -v -L myarray -m 0.01 -b 4096 -E stride=128,stripe-width=256 /dev/md0

在 Live CD 中挂载 RAID

如果你需要在 Live CD 中挂载 RAID 分区,用这个命令:

# mdadm --assemble /dev/<disk1> /dev/<disk2> /dev/<disk3> /dev/<disk4>

如果缺一块盘的 RAID 1 被错误地识别为了 RAID 1(参照 mdadm --detail /dev/md<number>)并报告为非活动状态(参照 cat /proc/mdstat),需要先停止磁盘阵列:

# mdadm --stop /dev/md<number>

在 RAID 上安装 Arch Linux

注意: 本节仅适用于根文件系统在磁盘阵列上的情况。如果你的磁盘阵列上只是一个数据分区,那么可以跳过本节。

你应该在安装过程中的 分区格式化 步骤之间创建 RAID 阵列。这将会把一个位于 RAID 阵列上的分区格式化成根文件系统,而不是直接格式化一个分区。 按照 #安装 一节的步骤创建 RAID 阵列。,然后继续安装过程,直到 pacstrap 步骤完成。 当使用 UEFI 启动 时,还需要阅读 EFI System Partition (简体中文)#RAID 上的 ESP

更新配置文件

注意: 这些操作应该在 chroot 以外完成,因此要在文件路径前加上 /mnt

在基本系统安装完成以后,RAID 的默认配置文件 mdadm.conf 需要这样来更新:

# mdadm --detail --scan >> /mnt/etc/mdadm.conf

在运行这个命令以后一定要用文本编辑器检查 mdadm.conf 配置文件来确保它的内容看起来是合理的。

注意: 为防止系统启动时 mdmonitor.service 启动失败(默认设为自动启动),你需要取消 MAILADDR 的注释,并且在 mdadm.conf 结尾留下可处理磁盘阵列出错通知的邮件地址和/或应用程序。参阅 #启用事件邮件通知

现在继续安装过程直到 Installation guide (简体中文)#Initramfs 步骤之前为止,然后按照下一节的步骤做。

配置 mkinitcpio

注意: 这些操作应该在 chroot 时完成。

mkinitcpio.conf 中的 HOOKS 部分添加 mdadm_udev 来为初始化内存盘添加 mdadm 支持:

/etc/mkinitcpio.conf
...
 HOOKS=(base udev autodetect keyboard modconf block mdadm_udev filesystems fsck)
...

如果在一个 FakeRAID 阵列上使用 mdadm_udev 钩子,建议在 BINARIES 列表中添加 mdmon

/etc/mkinitcpio.conf
...
BINARIES=(mdmon)
...

然后 重新生成初始化内存盘

参考 mkinitcpio (简体中文)#使用 RAID 磁盘阵列

配置 boot loader

root 参数指向映射的磁盘,例如:

root=/dev/md/MyRAIDArray

如果按上述用内核设备节点来指定映射磁盘的方法之后,从软件 RAID 分区启动失败了,那就用 持久化命名块设备 中的某种方法来指定映射的磁盘,例如:

root=LABEL=Root_Label

参考 GRUB#RAID

维护 RAID

数据清扫 (Scrubbing)

定期运行数据 清扫 (Scrubbing) 来检查并修复错误是一种很好的做法。一次完整数据清扫可能会花费数个小时,具体取决于磁盘阵列的大小和配置。

启动数据清扫:

# echo check > /sys/block/md0/md/sync_action

数据检查操作会扫描驱动器来检查坏扇区并自动修复它们。如果找到了包含损坏数据的好扇区(本扇区中的数据与另一块硬盘中记录本扇区应有的数据不符,例如奇偶校验块和另一块数据块相结合可以证明本数据块是错误的),那就不动作,但记录下这一事件(见下文)。这种“不动作”允许管理员自行检查坏扇区中原本的数据和从冗余数据中重建的数据,然后决定保留哪个。

与许多 mdadm 相关的任务/事项一样,数据清扫的进度也可以通过查看 /proc/mdstat 文件来查询。

例如:

$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid1 sdb1[0] sdc1[1]
      3906778112 blocks super 1.2 [2/2] [UU]
      [>....................]  check =  4.0% (158288320/3906778112) finish=386.5min speed=161604K/sec
      bitmap: 0/30 pages [0KB], 65536KB chunk

安全地停止当前的数据清扫操作:

# echo idle > /sys/block/md0/md/sync_action
注意: 如果在数据清扫暂停时重启了系统,将继续进行清扫。

数据清扫完成后,管理员可以检查有多少数据块(如果有的话)被标记为坏块:

# cat /sys/block/md0/md/mismatch_cnt

关于数据清扫的一般说明

注意: 用户也可以 echo repair/sys/block/md0/md/sync_action 里面,但是这是不明智的,因为一旦遇到数据不一致就被自动改写为一致。危险之处在于我们实际并不知道奇偶校验块和数据块哪个是对的(在 RAID1 中是不知道哪个数据块是对的)。因此自动清扫操作能不能用正确数据替换错误数据取决于运气。

以 root 身份设定一个 cron 任务来定期执行清扫是很好的。raid-checkAUR 会对此有所帮助。如果要用 systemd 定时器而不是 cron 来执行定期清扫,raid-check-systemdAUR 中包含了相同的脚本和配套的 systemd 定时器单元文件。

注意: 对于常规的大容量驱动器,清扫工作耗时大约 6 秒每 GB(即每 TB 大约需要 1 小时 45 分钟),因此应合理确定 cron 任务或定时器的开始时间。

对清扫 RAID1 和 RAID10 的说明

由于 RAID1 和 RAID10 本质上就是没有数据缓冲的,所以即使阵列工作正常,它的不匹配计数仍然可能是个非零值。这些不匹配计数只存在于正在写入数据的区域,且它们不反映任何问题。但是,我们无法区分非零的不匹配计数到底代表正在写入数据还是确实存在问题。这是造成 RAID1 和 RAID10 阵列误报错误的根源。即使如此,仍然建议定期清扫以发现并纠正驱动器上可能出现的坏扇区。

从阵列中移除设备

要从阵列中移除一个设备,先将这个设备标记为 faulty(故障):

# mdadm --fail /dev/md0 /dev/sdxx

现在从阵列中移除这个设备:

# mdadm --remove /dev/md0 /dev/sdxx

永久移除设备(比如想把一个设备拿出来单独使用): 先使用上述两个命令,然后:

# mdadm --zero-superblock /dev/sdxx
警告:
  • 不要在 RAID0 阵列或者其他线性存放数据的阵列中进行这个操作!否则数据会丢失!
  • 重新使用已经移除的硬盘却不清除它的超级块将会导致下次启动时丢失所有数据。(因为 mdadm 将会把它当做磁盘阵列的一部分来使用)。

停止使用某个阵列:

  1. 卸载 (umount) 目标阵列
  2. 用这个命令停止磁盘阵列运行:mdadm --stop /dev/md0
  3. 将本节开头的三个命令在每块硬盘上都运行一遍。
  4. /etc/mdadm.conf 中的相关行移除。

向阵列中添加设备

可以在系统正在运行且设备已经挂载的情况下使用 mdadm 添加新设备。 按照前文所述的方法,使用现有阵列中相同的布局对新设备进行分区。

如果 RAID 阵列尚未组合,先组合它们:

# mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1

向阵列中添加新设备:

# mdadm --add /dev/md0 /dev/sdc1

这一步 mdadm 不会花费很长时间。再次说明,可以这样检查进度:

# cat /proc/mdstat

用这个命令检查已经添加的设备:

# mdadm --misc --detail /dev/md0
注意: 对于 RAID0 设备可能会收到以下错误信息:
mdadm: add new device failed for /dev/sdc1 as 2: Invalid argument

这是由于上述命令会将新磁盘添加为 "spare"(备用)盘,但是 RAID0 中不存在备用盘。如果想往 RAID0 阵列中添加磁盘,你需要同时使用 "grow" 和 "add" 参数。如下所示:

# mdadm --grow /dev/md0 --raid-devices=3 --add /dev/sdc1

增大 RAID 卷的大小

如果给阵列安装了更大的磁盘,或者增大了分区大小,可能就需要增大 RAID 卷的大小以适应更大的可用空间。这一过程可用首先按照上文中关于更换磁盘的步骤来做。当 RAID 卷在更大的磁盘上重建完成后,这个卷需要 "grow" 来填充多出来的空间。

# mdadm --grow /dev/md0 --size=max

接着,在 RAID 卷 /dev/md0 上的现有分区可能需要调整大小。参阅 Partitioning (简体中文) 获取更多信息。最后,上述分区上的文件系统也需要重新调整大小。如果用 gparted 来完成分区操作,这些都会自动完成。如果用的是其他工具,请手动卸载 (unmount) 文件系统并调整其大小。

# umount /storage
# fsck.ext4 -f /dev/md0p1
# resize2fs /dev/md0p1

修改同步速度限制

同步工作需要一定的时间。如果本机不需要完成其他任务,可以提高速度限制值。

# cat /proc/mdstat
 Personalities : [raid1]
 md0 : active raid1 sda3[2] sdb3[1]
       155042219 blocks super 1.2 [2/1] [_U]
       [>....................]  recovery =  0.0% (77696/155042219) finish=265.8min speed=9712K/sec

 unused devices: <none>

查看当前速度限制:

# cat /proc/sys/dev/raid/speed_limit_min
1000
# cat /proc/sys/dev/raid/speed_limit_max
200000

提高限制值:

# echo 400000 >/proc/sys/dev/raid/speed_limit_min
# echo 400000 >/proc/sys/dev/raid/speed_limit_max

然后查看同步速度和预计完成时间:

# cat /proc/mdstat
 Personalities : [raid1]
 md0 : active raid1 sda3[2] sdb3[1]
       155042219 blocks super 1.2 [2/1] [_U]
       [>....................]  recovery =  1.3% (2136640/155042219) finish=158.2min speed=16102K/sec

 unused devices: <none>

更多信息可参阅 sysctl#MDADM

监视运行情况

可以显示当前 RAID 设备状态的一行简单命令:

# awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' </proc/mdstat
md1: [UU]
md0: [UU]

用 watch 监视 mdstat

# watch -t 'cat /proc/mdstat'

或者最好用 tmux

# tmux split-window -l 12 "watch -t 'cat /proc/mdstat'"

用 iotop 追踪 IO

iotop 可以显示各个进程的输入输出状态。请用这个命令来查看 RAID 线程的输入输出。

# iotop -a -p $(sed 's, , -p ,g' <<<`pgrep "_raid|_resync|jbd2"`)

用 iostat 追踪 IO

sysstat 包中的 iostat 实用程序可以显示各个设备和分区的输入输出统计。

# iostat -dmy 1 /dev/md0
# iostat -dmy 1 # all

启用事件邮件通知

要完成发送邮件的任务需要一个 smtp 邮件服务器或至少需要一个 ssmtp/msmtp 邮件转发器。大概最简单的解决方案是使用 dmaAUR,它非常小巧(安装完只占用 0.08 MiB)且不需要设置。

编辑 /etc/mdadm.conf 来添加用于接收通知的邮件地址。

注意: 如果用的是上文提到的 dma,用户可以直接将邮件发送到本机 (localhost) 的某个用户名 (username) 中,不一定非要发到外部邮件地址。

测试配置是否正确:

# mdadm --monitor --scan --oneshot --test

mdadm 使用 mdmonitor.service 来完成监控任务,所以现在你无需进行更多设置了。如果你没有在 /etc/mdadm.conf 设置邮件地址,那么这个 service 就会出错。如果你不想接收 mdadm 一般事件通知,可以忽略这个错误;如果不想接收一般事件通知但是需要接收故障信息,可以 mask(屏蔽) 这个 unit。

其他实现方式

为避免安装 smtp 邮件服务器或邮件转发器的麻烦,可以使用系统上已经安装的 S-nail 工具(不要忘了设置它)。

创建 /etc/mdadm_warning.sh 文件:

/etc/mdadm_warning.sh
 /usr/bin/mailx -s "$event on $device" destination@email.com

然后给它执行权限:chmod +x /etc/mdadm_warning.sh

然后在 mdadm.conf 中添加这一行:

PROGRAM /etc/mdadm_warning.sh

用前述的方法测试并启用它。

故障排除

如果你在重启计算机时遇到类似 "invalid raid superblock magic" 的错误,并且除了已经配置好的硬盘外又接了其他硬盘,请检查硬盘顺序是不是正确的。在安装 RAID 时,硬盘编号可能是 hdd、hde 和 hdf,但是重启后它们的编号可能变成了 hda、hdb 和 hdc。请相应地调整你的内核参数。这种情况经常发生。

Error: "kernel: ataX.00: revalidation failed"

如果你突然(在重启、修改 BIOS 设置后)遇到类似错误信息:

Feb  9 08:15:46 hostserver kernel: ata8.00: revalidation failed (errno=-5)

这并不意味着设备已经损坏。尽管你可能会在网上看到一些讲内核崩溃的链接指向最坏的结果,但总而言之,并不是内核崩溃。可能你不知怎么的在 BIOS 里或内核参数里修改了 APIC 或 ACPI 设置。把它改回来就好了。通常关闭 APIC 和/或 ACPI 就好了。

磁盘阵列以只读模式启动

当由 md 启动磁盘阵列时,超级块将被改写,数据同步可能已经开始了。要以只读模式启动,可以向内核模块 md_mod 传递参数 start_ro。设置了这个参数以后,新的磁盘阵列进入 'auto-ro' 模式,该模式停止了所有内部读写操作(更新超级块、再同步、数据恢复),并且会在第一个写入请求到来时自动切换至 'rw' (读写)模式。

注意: 在第一个写入请求到来前使用 mdadm --readonly 命令可以将阵列设置为真正的 'ro' (只读)模式,还可以用 mdadm --readwrite 命令直接开始再同步而不用等待写入请求。

要在启动时设置该参数,在内核启动参数中添加 md_mod.start_ro=1

也可以在模块加载时传递该参数,可以从 /etc/modprobe.d/ 下的文件中传递,也可以直接从 /sys/ 传递:

# echo 1 > /sys/module/md_mod/parameters/start_ro

在损坏或缺失磁盘的情况下恢复 RAID

当磁盘阵列中的一个驱动器由于任何原因损坏时,也可能会发生上述错误。如果在缺失一块硬盘的情况下你仍需要强制启动磁盘阵列,输入以下命令(根据实际修改):

# mdadm --manage /dev/md0 --run

现在你应该可以用类似下面的命令来挂载它(如果在 fstab 里有它的话):

# mount /dev/md0

现在磁盘阵列应该已经工作并且可以使用,但仍旧是缺一块盘的状态。因此需要按照上文 #准备设备 所述再添加一个磁盘分区,然后就可以将新磁盘分区加入到磁盘阵列中:

# mdadm --manage --add /dev/md0 /dev/sdd1

如果输入:

# cat /proc/mdstat

你就能看到磁盘阵列已经激活并正在重建。

你可能还需要更新你的配置文件(参阅:#更新配置文件)。

基准测试

用于 RAID 基准测试的工具有很多种。不同 RAID 最显著的不同是多个线程在读取 RAID 卷时的速度提升程度。

tiobenchAUR 通过测量磁盘的全线程读写 (fully-threaded I/O) 来专门测试多线程性能提升程度。

bonnie++ 测试对一个或多个数据库类型文件的读写,以及对小文件的创建、读取、删除,这样可以模拟 Squid、INN 和 Maildir format e-mail 等程序的文件读写。其附带的 ZCAV 程序可以测试硬盘不同区域的性能,且不用向硬盘写入任何数据。

不应该 使用 hdparm 来对 RAID 进行基准测试,因为它多次返回的结果会非常不一致。

参考资料

Tango-view-refresh-red.pngThis article or section is out of date.Tango-view-refresh-red.png

Reason: 许多链接太旧且无效。 (Discuss in Talk:RAID (简体中文)#)

mdadm

Forum threads

RAID with encryption