经历昨天一天的奋战,在一边装的同时也把上一章文章写好了。今天的话继续为大家带来如何在纯命令行环境下继续折腾我们的星际蜗牛并为硬盘们组装上冗余磁盘阵列(Redundant Array of Independent Disks,又称 RAID)。

简介

还是经由朋友的推介,我从某宝店家中以 400 块单个的价格搞来了两块 HGST(原日立,据说比较靠谱,就数字来讲的话 故障 (fān chē) 率 相较其他品牌依旧最低) 的 4T 监控盘(非 SMR 叠瓦式,这灵车我还真不敢上),而年产日期有点久远,是 2014 年的,疑似翻新盘,因此买回来之后也跑完了对硬盘的各项检测,确保质量没问题并对这两块硬盘组上 软件RAID1(较为注重数据安全性,但储存容量只有一半),硬件 RAID 需要另行购置 RAID 卡。

硬盘信息

  • 型号: HGST HMS5C4040BLE640
  • 容量: 4TB(格式化后大约 3.6TB 左右)
  • 类型:监控盘(连续写入较好,随即读取性能较差)

详细数据请点这里查询。

准备工作

备份

如果硬盘之前存放有重要数据,切记切记要先备份,这个很关键。

检测硬盘

在组装前请检测硬盘是否存在损坏,坏道,以及对其进行性能测试,确认没有问题之后再开始组装。

组装 RAID

擦除硬盘数据

若果在组装无论是新旧磁盘都必须先格式化,再进行组装。而如果本身硬盘已在之前组装了 RAID 的话,请使用以下步骤将硬盘内数据(包括 RAID 配置数据)擦除掉:

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

或者指定硬盘上的其中一个分区:

1
# mdadm --misc --zero-superblock /dev/<partition>

为硬盘建立分区

建立分区前,这里我使用了 parted -l(或 fdisk -l,选择 parted 无疑是因为较直观一点)命令查询当前硬盘情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[[email protected] /]# parted -l
Model: ATA C3M-16G (scsi)
Disk /dev/sda: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 538MB 537MB fat32 boot, esp
2 538MB 16.0GB 15.5GB ext4


Model: ATA HGST HMS5C4040BL (scsi)
Disk /dev/sdb: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: loop
Disk Flags:

Number Start End Size File system Name Flags


Model: ATA HGST HMS5C4040BL (scsi)
Disk /dev/sdc: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: loop
Disk Flags:

Number Start End Size File system Flags

从上面看出,我们现在有两块 HGST 4TB 的 HDD 在这,分别是 /dev/sdb 以及 /dev/sdc,现在我们使用 fdisk /dev/sdb 以及 fdisk /dev/sdc 对它们建立 RAID 分区:

在建立分区之前首先要更改硬盘的 disklabel 为 GPT 格式,因此先输入 g

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[[email protected] /]# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

The old ext4 signature will be removed by a write command.

Device does not contain a recognized partition table.
The size of this disk is 3.7 TiB (4000787030016 bytes). DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT).

Created a new DOS disklabel with disk identifier 0xfe1551f9.

Command (m for help): g
Created a new GPT disklabel (GUID: 3171CF65-B466-9347-A082-3AACDD9B9721).

在更改完成之后,现在使用 n 创建新的分区,然后输入 t 更改刚刚创建的新分区类型为 Linux RAID(序号为 29,GUID为 A19D880F-05FC-4D3B-A006-743F0F84911E),最后输入 i 查询创建结果,在确认无误后输入 w 保存并且退出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-7814037134, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-7814037134, default 7814037134):

Created a new partition 1 of type 'Linux filesystem' and of size 3.7 TiB.

Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 29
Changed type of partition 'Linux filesystem' to 'Linux RAID'.

Command (m for help): i
Selected partition 1
Device: /dev/sdb1
Start: 2048
End: 7814037134
Sectors: 7814035087
Size: 3.7T
Type: Linux RAID
Type-UUID: A19D880F-05FC-4D3B-A006-743F0F84911E
UUID: 6885A106-3022-FA4F-966F-EDBA96B4A9D9

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[[email protected] /]#

然后重复上述步骤为 /dev/sdc 也创建一遍分区表,保存退出并输入 parted -l 查询最终分区表结果(已省略其他硬盘):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Model: ATA HGST HMS5C4040BL (scsi)
Disk /dev/sdb: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 4001GB 4001GB raid


Model: ATA HGST HMS5C4040BL (scsi)
Disk /dev/sdc: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 4001GB 4001GB raid

建立硬盘阵列

这里我们需要使用到一系列的 mdadm 命令(请使用 pacman -S mdadm 进行安装)创建硬盘阵列:

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

用法:mdadm [选项] 设备 分区…
选项:

  • --level 是你要组合的 RAID 类型,这里我们是 RAID1 所以就直接填写 1 即可。
  • --metadata 默认为 1.2,但若你的启动引导器(Bootloader)使用的是 Syslinux 且版本为 v4.07 的话请将这个变量改为 1.0。
  • --raid-devices 指的是你要组成阵列的硬盘数量,我们这里只有两个那就填写 2。- /dev/md/YOUR_RAID_NAME 为命令 mdadm 的第一个必填参数,系统会根据这个路径去创建软链接并指向你创建的 RAID 阵列上(这里我使用 ls -l /dev/md 查询出来的结果是:RAID1 -> ../md127)。
  • /dev/sdX1 /dev/sdX1 ... 后续的参数则是你 RAID 的具体分区位置。

查询 RAID 状态

在创建完毕之后,我们可以使用 cat /proc/mdstat 查询 RAID 当前的状态:

1
2
3
4
5
6
[[email protected] /]# cat /proc/mdstat
Personalities : [raid1]
md127 : active raid1 sdc1[1] sdb1[0]
3906885440 blocks super 1.2 [2/2] [UU]
[>....................] resync = 0.1% (5158656/3906885440) finish=513.5min speed=126616K/sec
bitmap: 30/30 pages [120KB], 65536KB chunk

可以发现我们刚组的 RAID 已经在开始在后台同步数据了,这时我们耐心等待同步完毕即可。

格式化 RAID 阵列

在等待同步数据的同时,我们可以先对 RAID1 进行格式化(但要注意的是 RAID1 是完全由一个硬盘的所有内容镜像地复制到另外一个硬盘中,因此 RAID1 并没有采用到硬盘条带化(Stripe)技术,所以我们在格式化的时候并不需要手动计算 stripe size stripe width 这些东西,而类似 RAID5 / RAID6 这些则需要特别小心):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[[email protected] md]# mkfs.ext4 /dev/md127
mke2fs 1.45.3 (14-Jul-2019)
Creating filesystem with 976721360 4k blocks and 244187136 inodes
Filesystem UUID: cce6ae47-1d89-4293-a259-318c3b765a0b
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks):
done
Writing superblocks and filesystem accounting information:
done

挂载 RAID 阵列

在上述步骤都完成了之后,那现在当然就是挂载 RAID 阵列啦,我们现在使用 mkdir /raid1 创建了一个 raid1 文件夹,并把 /dev/md127 挂载到其上:

1
2
[[email protected] md]# mkdir /raid1
[[email protected] md]# mount /dev/md127 /raid1

使用 df -h | grep '/dev/md127' 验证我们是否挂载成功:

1
2
[[email protected] raid1]# df -h | grep 'dev/md127'
/dev/md127 3.6T 89M 3.4T 1% /raid1

设置开机挂载

在使用 mount 挂载完后并不意味着 RAID 阵列开机就会启动 RAID 以及自动挂载,因此我们可以使用 mdadm 的指令把现行扫描出来的 RAID 阵列自动加到 /etc/mdadm.conf 上,好让系统在开机时自启 RAID 设备:

1
mdadm -D --scan >> /etc/mdadm.conf

或手动编辑 /etc/mdadm.conf 并设定:

1
2
3
4
5
DEVICE partitions
...
...
...
ARRAY /dev/md/RAID1 metadata=1.2 name=archlinux:RAID1 UUID=72326a38:db8867f1:6d3c072e:2c1a5d06

把你的 RAID 阵列配置加到末尾即可(UUID 可使用 mdadm --detail /dev/mdX 查询)。

然后编辑 /etc/fstab 并把配置添加到末尾,好让系统开机自动挂载:

1
2
3
4
5
...
...
...
# /dev/md127
/dev/md127 /raid1 ext4 defaults 0 0

重启并验证

最后一步就是输入 reboot 重启并使用 df -h | grep raid1 重新验证自动挂载是否成功。

总结

这篇折腾的东西与上一篇其实也差不多,目前的话就差一些作为应有的基础配套与应用集群管理体系了,不然单纯作为存储用也就太浪费了,所以下一篇会集中讲述关于在 ArchLinux 部署 Docker 的安装流程与一些事宜。