RAID | mdadm

2019 09 26, Thu

我被MBP的小硬盘逼急了。一个笔记本只有256G存储,把常用的软件装一遍基本上就占了一半的空间。

没办法了,在路由器上配一个RAID吧。

ABC | 基础知识

我们的硬盘:块设备

Linux下的所有东西都是文件,而磁盘是一种块设备,以块设备文件的形式展示在/dev下

[guochao@router-centos ~]$ lsblk
NAME          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sdd             8:48   0   2.7T  0 disk
└─md127         9:127  0   5.5T  0 raid5
  └─md127p1   259:0    0   5.5T  0 md    /data
sdb             8:16   0   2.7T  0 disk
└─data-docker 253:0    0 838.4G  0 lvm
sde             8:64   0   2.7T  0 disk
└─md127         9:127  0   5.5T  0 raid5
  └─md127p1   259:0    0   5.5T  0 md    /data
sdc             8:32   0   2.7T  0 disk
└─md127         9:127  0   5.5T  0 raid5
  └─md127p1   259:0    0   5.5T  0 md    /data
sda             8:0    0  29.8G  0 disk
├─sda4          8:4    0  25.7G  0 part  /
├─sda2          8:2    0     1G  0 part  /boot
├─sda3          8:3    0     3G  0 part  [SWAP]
└─sda1          8:1    0   200M  0 part  /boot/efi
[guochao@router-centos ~]$ ls /dev/ -lh
总用量 0
...
crw-------. 1 root root     10, 227 9月  20 09:06 mcelog
drwxr-xr-x. 2 root root          80 9月  20 09:06 md
brw-rw----. 1 root disk      9, 127 9月  20 09:06 md127
brw-rw----. 1 root disk    259,   0 9月  20 09:06 md127p1
crw-r-----. 1 root kmem      1,   1 9月  20 09:06 mem
...
brw-rw----. 1 root disk      8,   0 9月  20 09:06 sda
brw-rw----. 1 root disk      8,   1 9月  20 09:06 sda1
brw-rw----. 1 root disk      8,   2 9月  20 09:06 sda2
brw-rw----. 1 root disk      8,   3 9月  20 09:06 sda3
brw-rw----. 1 root disk      8,   4 9月  20 09:06 sda4
brw-rw----. 1 root disk      8,  16 9月  20 09:06 sdb
brw-rw----. 1 root disk      8,  32 9月  20 09:06 sdc
brw-rw----. 1 root disk      8,  48 9月  20 09:06 sdd
brw-rw----. 1 root disk      8,  64 9月  20 09:06 sde
crw-rw----. 1 root disk     21,   0 9月  20 09:06 sg0
crw-rw----. 1 root disk     21,   1 9月  20 09:06 sg1
...
lrwxrwxrwx. 1 root root          15 9月  20 09:06 stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root          15 9月  20 09:06 stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root          15 9月  20 09:06 stdout -> /proc/self/fd/1
crw-rw-rw-. 1 root tty       5,   0 9月  20 09:06 tty
crw--w----. 1 root tty       4,   0 9月  20 09:06 tty0
...
crw-rw-rw-. 1 root root      1,   5 9月  20 09:06 zero
[guochao@router-centos ~]$ ls /dev/mapper/ -lh
总用量 0
crw-------. 1 root root 10, 236 9月  20 09:06 control
lrwxrwxrwx. 1 root root       7 9月  20 09:06 data-docker -> ../dm-0

lsblk是输出一个系统里面所有块设备的命令。可以看到块设备在/dev下都有一个设备文件。具体使用嘛,无非就是格式化、挂载卸载。

参考

多个硬盘拼起来:LVM

LVM中文名叫逻辑卷管理器。特点就是可以把几块块设备拼起来拼成一个大的块设备。

比如说我有一个1T硬盘做home,但是后来发现不大够。那怎么办呢?拓展。

但是块设备本身是不能扩展的,怎么办?

Linux提供了一个工具叫lvm,在其他块设备基础上,增加一层逻辑并且模拟出来一个新的块设备。分为pv、vg、lv三层逻辑,其中pv是作为底层的存储设备,而lv是模拟出来的新的块设备。lv可以动态、实时、在线调整大小,可伸可缩非常方便。

但是LVM并不能提供冗余。你的一块盘有数据坏了,整个lv就作废了,怎么办呢?

为存储增加冗余:

工程师们设计出了RAID这种东西。

和LVM类似,RAID也是在块设备上模拟出新的块设备。不一样的是,RAID要么可以提高冗余程度,要么可以提高读写速度,但是不能随时增减空间。

RAID分为不同的等级(其实叫类型更合适些),比如说有RAID0/1/5/6/10(读一零)。有不同的特性,根据自己选择就好。

一般RAID只有两层逻辑: member partition 和 array。member partitions 作为底层的存储设备,array是新模拟出的设备。

差别和组合

参考: https://wiki.archlinux.org/index.php/Software_RAID_and_LVM

在CentOS上配置一个RAID5 Array

硬件需求

后面的内容需要有几个块设备来完成,用fallocate生成三个文件也可以

[guochao@router-centos ~]$ for i in {1..3}; do fallocate -l 1000000000 test$i; done
[guochao@router-centos ~]$ ls -lh
总用量 2.9G
-rw-rw-r--. 1 guochao guochao 954M 9月  26 23:22 test1
-rw-rw-r--. 1 guochao guochao 954M 9月  26 23:22 test2
-rw-rw-r--. 1 guochao guochao 954M 9月  26 23:22 test3
[guochao@router-centos ~]$ ls -l
总用量 2936488
-rw-rw-r--. 1 guochao guochao 1000000000 9月  26 23:22 test1
-rw-rw-r--. 1 guochao guochao 1000000000 9月  26 23:22 test2
-rw-rw-r--. 1 guochao guochao 1000000000 9月  26 23:22 test3

不过还是建议挂几块硬盘,或者买一个带供电的硬盘座,我从京东买的一个可以热插拔硬盘、Type-C的大约是350RMB。

mdadm

Linux下组建软RAID需要mdadm,这是一个各个发行版都有的工具。抄起你手里的apt/yum/dnf/pacman,装上就行。

建立array一把梭

先选出来你要用来建立array的几块硬盘,比如说sdX sdY sdZ,我们在这里要建一个RAID5阵列md127,所以至少需要三个硬盘

# mdadm create /dev/Array名 --level=RAID等级 --raid-devices=磁盘的数量 磁盘文件A 文件B 文件C ……
mdadm create /dev/md127 --level=5 --raid-devices=3 /dev/sd{X,Y,Z}

(可选)再次分区

parted /dev/dm127
# 跟着提示走就ok

格式化和挂载

https://wiki.archlinux.org/index.php/File_systems

配置别的网络存储的服务

未完待续

附录

假设有N块性能相同的盘做RAID,用N做单位衡量的数值

RAID level 别名 最少磁盘数 最大容错量 写入速度/IOPS
0 Stripe 2 0 N
1 Mirror/Redundant 2 N-1 1
5 - 3 N-2 N-1
6 - 4 N-2 N-2
10 Nested 4 N/2(不在同一个RAID1 Array中) N/2