[TOC]
原文链接:[使用RAID与LVM磁盘阵列技术](https://www.linuxprobe.com/chapter-07.html)
## 1. RAID 磁盘阵列
关于磁盘阵列技术的介绍:[看这里](https://jingyan.baidu.com/article/75ab0bcb8736fcd6864db209.html)
`mdadm`命令用于管理Linux系统中的软件RAID硬盘阵列,常用参数如下:
参数|作用
------|------
-a|检测设备名称
-n|指定设备数量
-l|指定RAID级别
-C|创建
-v|显示过程
-f|模拟设备损坏
-r|移除设备
-Q|查看摘要信息
-D|查看详细信息
-S|停止RAID磁盘阵列
### 1.1 部署 RAID10 磁盘阵列
raid10 至少需要四块磁盘,我们在虚拟机中添加4块硬盘。

接下来,使用mdadm命令创建 RAID10,磁盘阵列名称为“/dev/md0”。其中,-C参数代表创建一个RAID阵列;-v参数显示创建的过程,/dev/md0 本次创建的磁盘阵列名称;-a yes参数代表自动创建设备文件;-n 4参数代表使用4块硬盘来部署这个RAID磁盘阵列;而-l 10参数则代表RAID 10方案;最后再加上4块硬盘设备的名称。
``` bash
# 创建RAID10阵列
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd{b,c,d,e}
# 格式化
[root@localhost ~]# mkfs.ext4 /dev/md0
# 创建目录并挂载
[root@localhost ~]# mkdir /RAID
[root@localhost ~]# mount /dev/md0 /RAID
[root@localhost ~]# df -h
# 查看阵列信息
[root@localhost ~]# mdadm -D /dev/md0
# 挂载信息写入到配置文件
[root@localhost ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
```
### 1.2 损坏磁盘阵列及修复
``` bash
# 模拟磁盘损坏
[root@localhost ~]# mdadm /dev/md0 -f /dev/sdb
# 查看阵列信息,发现磁盘已经 faulty 坏掉了
[root@localhost ~]# mdadm -D /dev/md0
```
在RAID 10级别的磁盘阵列中,当RAID 1磁盘阵列中存在一个故障盘时并不影响RAID 10磁盘阵列的使用。使用mdadm命令替换新的硬盘即可。
``` bash
# 卸载阵列,因为我们是在虚拟机中模拟的,在这之前需要重启下系统。
[root@localhost ~]# umount /RAID
# 添加新的磁盘
[root@localhost ~]# mdadm /dev/md0 -a /dev/sdb
```
### 1.3 部署 RAID5 磁盘阵列+备份盘
RAID 10磁盘阵列中最多允许50%的硬盘设备发生故障,若同一RAID 1磁盘阵列中的硬盘设备若全部损坏,会导致数据丢失。可以使用RAID备份盘技术来预防这类事故。该技术的核心理念就是准备一块足够大的硬盘,这块硬盘平时处于闲置状态,一旦RAID磁盘阵列中有硬盘出现故障后则会马上自动顶替上去。
现在创建一个RAID5磁盘阵列+备份盘。在下面的命令中,参数-n 3代表创建这个RAID 5磁盘阵列所需的硬盘数,参数-l 5代表RAID的级别,而参数-x 1则代表有一块备份盘。
``` bash
# 创建RAID5磁盘阵列+1个备份盘
[root@localhost ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sd{b,c,d,e}
# 查看阵列
[root@localhost ~]# mdadm -D /dev/md0
# 格式化
[root@localhost ~]# mkfs.ext4 /dev/md0
# 挂载
[root@localhost ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
[root@localhost ~]# mkdir /RAID
[root@localhost ~]# mount /dev/md0 /RAID/
```
再次模拟磁盘损坏,然后迅速查看/dev/md0磁盘阵列的状态,就会发现备份盘已经被自动顶替上去并开始了数据同步。
``` bash
# 模拟磁盘损坏
[root@localhost ~]# mdadm /dev/md0 -f /dev/sdb
# 查看阵列
[root@localhost ~]# mdadm -D /dev/md0
```
## 2. LVM 逻辑卷管理器
逻辑卷管理器是Linux系统用于对硬盘分区进行管理的一种机制,为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上讲是可行的。但是却可能造成数据的丢失。LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理设备和底层架构和布局,就可以实现对硬盘分区的动态调整。

物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列。卷组建立在物理卷之上,一个卷组可以包含多个物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是LVM的核心理念。
### 2.1 部署逻辑卷
常用的LVM部署命令
|功能/命令|物理卷管理|卷组管理|逻辑卷管理|
-----|-----|-----|-----|
扫描|pvscan|vgscan|lvscan
建立|pvcreate|vgcreate|lvcreate
显示|pvdisplay|vgdisplay|lvdisplay
删除|pvremove|vgremove|lvremove
扩展||vgextend|lvextend
缩小||vgreduce|lvreduce
在虚拟机中添加两块新硬盘,我们先对这两块新硬盘进行创建物理卷的操作,然后对这两块硬盘进行卷组合并。接下来,把合并后的卷组切割出一个约为150MB的逻辑卷设备,最后把这个逻辑卷设备格式化成EXT4文件系统后挂载使用。
``` bash
# 1. 建立物理卷,然设备支持LVM
[root@localhost ~]# pvcreate /dev/sdb /dev/sdc
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
# 2. 把两块硬盘加入到storage 卷组中
[root@localhost ~]# vgcreate storage /dev/sdb /dev/sdc
Volume group "storage" successfully created
# 然后查看卷组的状态。
[root@localhost ~]# vgdisplay storage
···
# 3. 创建一个名为 testvo 的逻辑卷,对逻辑卷进行切割时有两种计量单位。
# 参数-L,以容量为单位例,如 -L 150M 表示大小为 150MB。
# 参数-l,每个基本单元的大小默认为4MB。如,如 -l 37 表示大小为37×4MB=148MB。
[root@localhost ~]# lvcreate -n testvo -l 37 storage
Logical volume "testvo" created.
# 查看逻辑卷
[root@localhost ~]# lvdisplay
···
# 4. 格式化并挂载(逻辑卷设备存放在/dev设备目录中,/dev/卷组名称/逻辑卷名称)。)
[root@localhost ~]# mkfs.ext4 /dev/storage/testvo
···
# 创建挂载点目录
[root@localhost ~]# mkdir /testvo
# 挂载
[root@localhost ~]# mount /dev/storage/testvo /testvo
# 查看挂载状态
[root@localhost ~]# df -h /testvo
# 5. 挂载写入到配置文件,使其永久生效。
[root@localhost ~]# echo "/dev/storage/testvo /testvo ext4 defaults 0 0" >> /etc/fstab
```
### 2.2 扩容逻辑卷
在前面的实验中,卷组是由两块硬盘设备共同组成的。用户在使用存储设备时感知不到设备底层的架构和布局,更不用关心底层是由多少块硬盘组成的,只要卷组中有足够的资源,就可以一直为逻辑卷扩容。扩展前请一定要记得卸载设备和挂载点的关联。
``` bash
# 卸载
[root@localhost ~]# umount /testvo/
# 把上一步中的逻辑卷扩展至290MB。
[root@localhost ~]# lvextend -L 290M /dev/storage/testvo
···
# 检查硬盘完整性
[root@localhost ~]# e2fsck -f /dev/storage/testvo
# 重置硬盘容量
[root@localhost ~]# resize2fs /dev/storage/testvo
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/testvo to 299008 (1k) blocks.
The filesystem on /dev/storage/testvo is now 299008 blocks long.
# 重新挂载硬盘设备并查看挂载状态。
[root@localhost ~]# mount /dev/storage/testvo /testvo/
[root@localhost ~]# df -h /testvo/
```
### 2.3 缩小逻辑卷
在对逻辑卷进行缩容操作时,其丢失数据的风险更大。所以在生产环境中执行相应操作时,一定要提前备份好数据。另外Linux系统规定,在对LVM逻辑卷进行缩容操作之前,要先检查文件系统的完整性(这也是为了保证数据安全)。
``` bash
# 把文件系统卸载掉
[root@localhost ~]# umount /testvo
# 检查文件系统的完整性
[root@localhost ~]# e2fsck -f /dev/storage/testvo
# 把逻辑卷vo的容量减小到120MB
[root@localhost ~]# resize2fs /dev/storage/testvo 120M
# 重新挂载文件系统并查看系统状态。
[root@localhost ~]# mount /dev/storage/testvo /testvo
[root@localhost ~]# df -h /testvo/
```
### 2.4 逻辑卷快照
LVM还具备有“快照卷”功能。例如,可以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原。LVM的快照卷功能有两个特点:
>快照卷的容量必须等同于逻辑卷的容量;
快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。
``` bash
# 首先查看卷组的信息(卷组中已经使用了120MB的容量,空闲容量还有39.88GB)
[root@localhost ~]# vgdisplay
...
# 往逻辑卷设备所挂载的目录中写入一个文件
[root@localhost ~]# echo "test" > /testvo/readme.txt
[root@localhost ~]# stat /testvo/readme.txt
# 使用-s参数生成一个快照卷,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作
[root@localhost ~]# lvcreate -L 120M -s -n SNAP /dev/storage/testvo
[root@localhost ~]# lvdisplay
# 创建一个100MB的垃圾文件,然后再查看快照卷的状态。可以发现存储空间占的用量上升了。
[root@localhost ~]# dd if=/dev/zero of=/testvo/files count=1 bs=100M
[root@localhost ~]# lvdisplay
# 快照还原操作。先卸载掉逻辑卷。
[root@localhost ~]# umount /testvo/
[root@localhost ~]# lvconvert --merge /dev/storage/SNAP
# 快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来的100MB的垃圾文件也被清除了。
[root@localhost ~]# mount /dev/storage/testvo
[root@localhost ~]# ll /testvo/
```
### 2.5 删除逻辑卷
当生产环境中想要重新部署LVM或者不再需要使用LVM时,则需要执行LVM的删除操作。为此,需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,这个顺序不可颠倒。
``` bash
# 卸载掉逻辑卷
[root@localhost /]# umount /testvo/
# 删除配置文件中永久挂载信息
[root@localhost /]# vim /etc/fstab
# 删除逻辑卷设备,需要输入y来确认操作
[root@localhost /]# lvremove /dev/storage/testvo
# 删除卷组,此处只写卷组名称即可,不需要设备的绝对路径
[root@localhost /]# vgremove storage
# 删除物理卷设备
[root@localhost /]# pvremove /dev/sdb /dev/sdc
```
Linux学习(六)使用RAID与LVM磁盘阵列技术