linux入门系列13--磁盘管理之RAID、LVM技术

前一篇文章学习了磁盘分区、格式化、挂载等相关知识,本文将讲解RAID和LVM技术。node

磁盘管理操做主要是运维人员用的较多,若是只是单纯的开发人员,能够先略过本文。可是在不少小公司里每每都是一人多用,运维、开发一般都是同一我的,所以对我的的技能要求更高。即使不是如此,多了解下相关概念也是有利而无害的。mysql

本文将先讲解RAID技术方案相关理论知识并经过案例演示RAID操做,而后演示LVM技术以解决存储资源动态调整问题。linux

1、独立冗余磁盘阵列(RAID)

RAID(Redundant Array of Independent Disk)技术把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不一样的物理硬盘设备上,利用分散读写技术提高磁盘阵列总体的性能,同时把多个重要数据的副本同步到不一样的物理硬盘设备上,从而起到了很是好的数据冗余备份效果。sql

简单说就是经过RAID技术能够提高磁盘读写性能,同时能够冗余备份数据保证数据可靠性。可是性能和可靠性不可能同时知足的很是好,所以在两者之间做出权衡就产生了不一样的RAID方案。apache

1.1 RAID方案及特色

听说目前RAID磁盘阵列的方案至少有十几种,然而万变不离其宗,都是在读写性能和可靠性之间权衡,所以只介绍几种比较有表明性的方案。centos

方案 特色
RAID0 磁盘读写性能高,但数据可靠性低
RAID1 磁盘设备利用率低,但数据可靠性高
RAID5 兼顾成本、读写性能和数据安全的折中方案
RAID10 相对于成本,更看重数据安全可靠
1.1.1 RAID0

把多块物理硬盘设备经过硬件或软件的方式串联在一块儿,组成一个大的卷组,并将数据依次写入到各个物理硬盘中。安全

最理想状况下,磁盘读写性能将提升数倍,但若是其中任意一块磁盘损坏将致使整个系统数据被破坏。也就是说虽然RAID0有效提升磁盘数据的吞吐速度,可是不具有数据备份和错误修复能力。架构

其示意图以下:app

file

1.1.2 RAID1

如上所述,虽然RAID0提高了磁盘读写速度,可是因为它将数据依次写入各个磁盘中,把数据分开存储,若是其中一块磁盘发生故障将会致使整个系统数据损坏。所以若是对数据要求性要求较高,但对磁盘读写速度没有要求的话,这种方案就不合适,须要用到RAID1方案。运维

RAID1示意图以下:

file

RAID1是把多块硬盘绑定,数据同时写入多块磁盘,这样就会有多份数据副本,当其中某一块硬盘发生故障后,当即自动以热交换的方式来恢复数据的正常使用。

虽然经过副本的形式保证了数据的安全性,可是磁盘设备利用率不高,从示意图能够看出,若是是2块磁盘则利用率只有50%,所以增长了成本开销。

1.1.3 RAID5

前面两种方案分别偏向于磁盘速度和数据安全,而RAID5则是在读写性能、数据安全和成本之间的一个相互妥协方案。

示意图以下:

file

RAID5技术是把硬盘设备的数据奇偶校验信息保存到其余硬盘设备中。这样的好处是其中任何一设备损坏后不至于出现致命缺陷,图中的parity部分存放的就是数据的奇偶校验信息。

简单说就是RAID5方案实际上没有备份硬盘中的真实数据信息(数据只有一份),而是当硬盘设备出现问题后经过奇偶校验信息来尝试重建损坏的数据。

这种方案兼顾了了硬盘设备的读写速度、数据安全性与存储成本问题。

1.1.4 RAID10

虽然RAID5看起来在成本问题、磁盘读写以及数据安全性有了一个相互妥协的方案,但实际上不少企业,尤为是金融企业数据自己的价值远比磁盘价格高,所以成本并非第一考虑要素,在这种场景下,通常是采用RAID10技术。

RAID10方案实际就是把RAID0和RAID1两种方案进行组合而来,示意图以下:

file

如图所示,须要至少4块硬盘来组建RAID10,先两两组合制做为RAID1确保数据有副原本保证安全性,而后在将组合后的两个RAID1采用RAID0进行组合,进一步提升设备的读写速度。

从理论上讲,只要同一组中的硬盘不全坏掉,那么最多能够损坏50%的硬盘设备而不丢失数据。

因为RAID10方案继承了RAID0的高读写速度和RAID1的数据安全性,在不考虑成本的状况下RAID10的性能都超过了RAID5,所以当前成 为普遍使用的一种存储技术。

说明:因为篇幅所限,其余的方案就不一一列出,须要说明的是应该按照实际需求去考虑成本、磁盘性能、数据安全性等因素,按需选择最合适需求场景的方案。

1.2 mdadm命令

经过上一篇文章“linux入门系列12--磁盘管理之分区、格式化与挂载”的讲解,已经学会了磁盘设备管理以后,再来部署RAID就会很是简单,所以若是还没掌握的话,建议先返回去看上一篇文章。

在正式操做RAID以前,咱们先看一下在linux中RAID磁盘阵列的管理命令mdadm。

语法格式:

​ mdadm [模式参数] RAID名称 [选项] [成员磁盘列表]

参数选项:

参数 做用
-a 检查设备名称
-n 指定设备数量
-l level,指定 RAID 级别
-C 建立RAID
-v 显示详细过程
-f 模拟设备损坏
-r remove,移除设备
-D 查看详细信息

1.3 实例1-RAID10部署

1.3.1 环境准备

咱们直接在虚拟机中模拟添加多块磁盘来演示RAID的操做,生产环境中采用的命令和步骤都是一致的。

为了不实验之间的干扰,咱们先克隆一台新的Centos虚拟机进行演示

file

点击“克隆”后,弹出虚拟机向导

file

点击“下一步”

file

保存默认选择“虚拟机中的当前状态”,点击“下一步”

file

选择“建立完整的克隆”,点击“下一步”

file

按需修改虚拟机名称已经存放的位置,点击“完成”按钮

file

等待克隆完成(根据不一样机器的性能,克隆时间不一样)

file

这样新的虚拟机就准备好了。

1.3.2 建立RAID10

如前所述,RAID10至少须要4块磁盘,所以咱们先添加4块磁盘。

(1)添加磁盘

选择刚才克隆的虚拟机,点击“编辑虚拟机设置”

file

在弹出的“虚拟机设置”窗口中,点击“添加”

file

在弹出的“添加硬件向导”中选择“硬盘”,而后点击“下一步”

file

磁盘类型保存默认“SCSI”,点击“下一步”

file

磁盘类型保持默认的“建立新虚拟机磁盘”,点击“下一步”

file

根据须要设置磁盘大小,此处设置为1G,点击“下一步”

file

选择磁盘文件存放路径,点击“完成”按钮

file

便可看到刚才添加的一块磁盘已经成功。

file

在上边界面中点击“添加”按钮,用相同的方法再添加3块磁盘,总共新添加4块磁盘。

file

(2)建立RAID10磁盘阵列

启动刚才添加磁盘的虚拟机,并用以前讲解的lsblk或fdisk查看磁盘设备

[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0    1G  0 disk 
sdc               8:32   0    1G  0 disk 
sdd               8:48   0    1G  0 disk 
sde               8:64   0    1G  0 disk 
sr0              11:0    1  3.9G  0 rom  /run/media/root/CentOS 7 x86_64
[root@origin ~]# fdisk -l
Disk /dev/sde: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdd: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
...省略部份内容
[root@origin ~]#

能够看到刚才添加的磁盘:sdb、sdc、sdd、sde,设备名称名称分别为:/dev/sdb,/dev/sdc,/dev/sdd,/dev/sde

接下来用mdadm命令建立RAID10

[root@origin ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 1047552K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@origin ~]#

C参数表明建立一个RAID阵列卡;-v参数显示建立的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0就是建立后的RAID 磁盘阵列的名称;-a yes 参数表明自动建立设备文件;-n 4参数表明使用4块硬盘来部署这个RAID磁盘阵列;而-l 10参数则表明RAID10方案。

建立磁盘阵列成功以后,下一步就是格式化

1.3.3 格式化RAID

用mkfs命令格式化RAID磁盘阵列

[root@origin ~]# mkfs.ext4 /dev/md0 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
131072 inodes, 523776 blocks
26188 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]#
1.3.4 挂载磁盘阵列

建立目录并挂载磁盘阵列

[root@origin ~]# mkdir /raid
[root@origin ~]# mount /dev/md0 /raid
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]#

咦,细心的朋友可能就有疑问了,甚至开始怀疑是否是本身操做错了,前面明明添加了4块磁盘,每一个磁盘为1G,总量应该为4G,但此处却看到/dev/md0大小为2G?

是的,你没看错,根据前面讲解的RAID10方案,容量会减小。此处能够看到4块磁盘的状况下,可用容量会减小一半。

咱们还须要把挂载信息写入到配置文件中,使其永久生效

[root@origin ~]# echo "/dev/md0 /raid ext4 defaults 0 0">>/etc/fstab
[root@origin ~]# cat /etc/fstab 
...省略部份内容
/dev/md0 /raid ext4 defaults 0 0
[root@origin ~]#

这样就把磁盘阵列挂载到了raid目录。

1.3.5 查看磁盘阵列信息

查看磁盘阵列信息

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份内容
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
[root@origin ~]#

能够看到4块磁盘阵列中的4块磁盘均已正常工做。

至此,RAID10方案部署完成。因而可知,整个操做流程给添加硬盘一致,都是须要建立、格式化、挂载等步骤,很是简单。

1.4 实例2-修复RAID10中坏掉的磁盘

此实验模拟刚才的磁盘阵列中某块硬盘坏掉后的替换操做,所以在前边的环境中继续执行如下操做。

1.4.1 模拟设备损坏

使用mdadm命令的-f参数模拟设备损坏

[root@origin ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份内容
    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
       0       8       16        -      faulty   /dev/sdb
[root@origin ~]#

在确认有一块物理硬盘设备出现损坏而不能继续正常使用后,使用mdadm命令将其移除,而后查看RAID磁盘阵列的状态,发现/dev/sdb磁盘的状态已经改变。

在RAID10级别的磁盘阵列中,当RAID1磁盘阵列中存在一个故障盘时并不影响RAID10 磁盘阵列的使用。当购买了新的硬盘设备后再使用 mdadm 命令来予以替换便可,在此期间咱们能够在/RAID目录中正常地建立或删除文件。

因为咱们是在虚拟机中模拟的,为了更真实,先重启系统,以后再继续后边的操做。

重启以后发现损坏的盘已经再也不磁盘阵列中了

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份内容
    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINT
sda               8:0    0   20G  0 disk   
├─sda1            8:1    0  500M  0 part   /boot
└─sda2            8:2    0 19.5G  0 part   
  ├─centos-swap 253:0    0    2G  0 lvm    [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm    /
sdb               8:16   0    1G  0 disk   
sdc               8:32   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sdd               8:48   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sde               8:64   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sr0              11:0    1  3.9G  0 rom
1.4.2 取消磁盘阵列目录挂载
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
/dev/sda1                497M  134M  363M  27% /boot
[root@origin ~]# umount /raid/
[root@origin ~]# df -h        
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  134M  363M  27% /boot
[root@origin ~]#

添加磁盘,须要先取消挂载

1.4.3 添加磁盘并加入磁盘阵列

取消挂载以后,咱们再用mdadm命令的-a参数添加磁盘

[root@origin ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份内容
    Number   Major   Minor   RaidDevice State
       4       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
[root@origin ~]#

能够看到/dev/sdb设备加入磁盘阵列成功

1.4.4 从新挂载磁盘阵列
[root@origin ~]# mount -a
[root@origin ~]# df -h   
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/md0                 2.0G  6.0M  1.9G   1% /raid

能够看到磁盘阵列/dev/md0又成功挂载到/raid目录了。

因为以前/etc/fstab文件以及添加了记录,所以此处就无须再添加了。

至此就模拟出设备坏掉以后,从新用新磁盘修复的过程。

1.5 实例3-RAID5+备份盘方案

按上边的RAID10部署方案,最多容许 50%的硬盘设备发生故障。同一组中的磁盘只要不全坏均可以正常工做,可是在极端状况下若是同一个RAID1中的磁盘设备所有损坏,也会致使数据丢失。这种状况咱们采用采用多加一块备份盘来解决,这块硬盘平时处于闲置状态,一旦RAID磁盘阵列中有硬盘出现故障后则会立刻自动顶替上去。

一样为了不干扰,从新克隆一个虚拟机,并采用RAID5方案来进行演示。

采用RAID5并无什么特别之处,目的只是为了演示下RAID5的用法,由于前面示例1和2都是用的RAID10。

因为RAID5至少须要3块磁盘,另外此方案还须要一块备份盘,所以在虚拟机中克隆新机器后,添加4块硬盘。

1.5.1 建立RAID5

采用mdadm命令建立RAID5

[root@origin ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 1047552K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@origin ~]#

参数-n 3表明建立这个RAID5磁盘阵列所需的硬盘数,参数-l 5表明RAID的级别,而参数-x 1则表明有一块备份盘。

[root@origin ~]# mdadm -D /dev/md0 
/dev/md0:
...省略部份内容
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
       3       8       64        -      spare   /dev/sde

查看/dev/md0磁盘阵列看到有一块备份盘在等待中了(spare)。

1.5.2 格式RAID5磁盘阵列

用mkfs命令将磁盘阵列格式化为ext4文件格式

[root@origin ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
131072 inodes, 523776 blocks
26188 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]#
1.5.3 挂载磁盘阵列到目录
[root@origin ~]# echo "/dev/md0 /raid ext4 defaults 0 0" >> /etc/fstab
[root@origin ~]# mkdir /raid
[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部份内容
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]#
1.5.4 模拟磁盘损坏

咱们再次模拟把硬盘设备/dev/sdb 移出磁盘阵列

[root@origin ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@origin ~]# mdadm -D /dev/md0 
/dev/md0:
...省略部份内容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
       0       8       16        -      faulty   /dev/sdb
[root@origin ~]#

迅速查看/dev/md0 磁盘阵列的状态,发现备份盘/dev/sde已经被自动顶替上去并开始了数据同步。

1.5.5 恢复损坏的磁盘

真实场景下,咱们要保证随时有一块空闲的备份盘以防不测,所以须要替换或修复刚才坏掉的盘/dev/sdb,恢复后它又自动变为空闲的备份盘,一旦有设备坏掉又会自动顶上去,从而保证数据的安全性。

因为咱们上边一个步骤是模拟的/dev/sdb设备坏点,虽然坏了可是仍是在占用中,所以重启虚拟机(重启后发现/dev/sdb就没有了,不重启会提示/dev/sdd设备繁忙没法成功执行如下步骤),而后执行如下操做:

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份内容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
[root@origin ~]# umount /raid/
[root@origin ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  134M  363M  27% /boot
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份内容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       5       8       16        -      spare   /dev/sdb
[root@origin ~]#

能够看到,添加后/dev/sdb设备又自动变为备份盘了。这样就保证了数据的安全。

2、逻辑卷管理器(LVM)

前面讲解的用RAID磁盘阵列技术来管理磁盘设备,虽然能有效提供磁盘设备的读写性能以及数据的安全性,可是硬盘设备分区或部署RAID磁盘阵列后,硬盘分区大小就难以调整,而LVM(逻辑卷管理器)技术能够容许用户对硬盘资源进行动态调整。

2.1 LVM概述

LVM(Logical Volume Manager)是Linux系统用于对硬盘分区进行管理的一种机制,建立初衷是为了解决硬盘设备在建立分区后不易修改分区大小的缺陷。

尽管对传统的硬盘分区进 行强制扩容或缩容从理论上来说是可行的,可是却可能形成数据的丢失。

LVM架构图以下:

LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,能够把多块硬盘进行卷组合并。这样一来,用户没必要关心物理硬盘设备的底层架构和布局,就能够实现对硬盘分区的动态调整。

物理卷处于LVM中的最底层,能够理解为物理硬盘、硬盘分区或者RAID磁盘阵列。卷组创建在物理卷之上,一个卷组能够包含多个物理卷,并且在卷组建立以后也能够继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源创建的,而且逻辑卷在创建后能够动态地扩展或缩小空间。

在生产环境中没法精确地评估每一个硬盘分区在往后的使用状况,所以会致使 原先分配的硬盘分区不够用。随着业务的增长磁盘不够用了须要扩容,或者业务缩减咱们须要对磁盘分区进行精简缩容等等,这些均可以经过LVM来解决。

部署LVM时,须要逐个配置物理卷、卷组和逻辑卷。经常使用命令以下:

功能 物理卷管理 卷组管理 逻辑卷管理
扫描 pvscan vgscan lvscan
创建 pvcreate vgcreate lvcreate
显示 pvdisplay vgdisplay lvdisplay
删除 pvremove vgremove lvremove
扩展 vgextend lvextend
缩小 vgreduce lvreduce

2.2 案例实操

为了不干扰,从新克隆一个虚拟机,并添加2块磁盘(添加2块的目的是为了演示将磁盘添加到LVM的卷组中,实际状况可能会有更多的磁盘)。

大概步骤为:先对这两块新硬盘进行建立物理卷的操做,而后对这两块硬盘进行卷组合并,接下来根据需求把合并后的卷组切割出一个约为 150MB 的逻辑卷设备,最后把这个逻辑卷设备格式化成 EXT4 文件系统后挂载使用。

2.2.1 部署LVM

(1)让磁盘设备支持LVM

[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0    1G  0 disk 
sdc               8:32   0    1G  0 disk 
sr0              11:0    1  3.9G  0 rom  /run/media/root/CentOS 7 x86_64
[root@origin ~]# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created
[root@origin ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [19.51 GiB / 0    free]
  PV /dev/sdc                       lvm2 [1.00 GiB]
  PV /dev/sdb                       lvm2 [1.00 GiB]
  Total: 3 [21.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 2 [2.00 GiB]
[root@origin ~]#

查看刚才新家的2块设备为:sdb、sdc。将其建立物理卷,并经过pvscan命令查看以建立物理卷。

(2)磁盘设备加入卷组

[root@origin ~]# vgcreate storage /dev/sdb /dev/sdc
  Volume group "storage" successfully created
[root@origin ~]# vgdisplay 
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       0 / 0   
  Free  PE / Size       510 / 1.99 GiB
  VG UUID               EKcctk-C1nM-Y2W8-s7pS-1bq8-W9ie-UTJM8Z
...省略部份内容
[root@origin ~]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "storage" using metadata type lvm2
  Found volume group "centos" using metadata type lvm2
[root@origin ~]#

用vgcreate建立名称为storage的卷组,并经过vgdisplay或vgscan能够查看。

(3)建立逻辑卷

切割出一个约为 150MB 的逻辑卷设备。这里须要注意切割单位的问题,在对逻辑卷进行切割时有两种计量单位。第一种是以容 量为单位,所使用的参数为-L。例如,使用-L 150M生成一个大小为 150MB 的逻辑卷。另一种是以基本单元的个数为单位,所使用的参数为-l。每一个基本单元的大小默认为 4MB。例如,使用-l 37 能够生成一个大小为 37×4MB=148MB 的逻辑卷。

[root@origin ~]# lvcreate -n vo -l 37 storage
  Logical volume "vo" created
[root@origin ~]# lvscan 
  ACTIVE            '/dev/storage/vo' [148.00 MiB] inherit
  ACTIVE            '/dev/centos/root' [17.51 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV Status              available
  '#' open                 0
  LV Size                148.00 MiB
  Current LE             37
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
...省略部份内容
[root@origin ~]#

经过lvcreate建立名称为vo的逻辑卷后,经过lvdisplay能够查看/dev/storage/vo大小为刚设置的148M(LV Size 148.00 MiB)。

(4)格式化逻辑卷并挂载

[root@origin ~]# mkfs.ext4 /dev/storage/vo
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
38000 inodes, 151552 blocks
7577 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33816576
19 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks: 
        8193, 24577, 40961, 57345, 73729
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]# mkdir /lvm
[root@origin ~]# mount /dev/storage/vo /lvm
[root@origin ~]# echo "/dev/storage/vo /lvm ext4 defaults 0 0" >> /etc/fstab
[root@origin ~]#

格式化逻辑卷后挂载到lvm目录,并把挂载信息写入fstab文件使其开机自动生效。

(5)查看挂载状态

[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo   140M  1.6M  128M   2% /lvm
[root@origin ~]# echo "test">/lvm/test.txt
[root@origin ~]# ls /lvm/
lost+found  test.txt
[root@origin ~]#

经过df命令就能够查看挂载成功,并能够成功写入文件到lvm目录下。

2.2.2 LVM扩容

上一步建立的容量为148M,下面将演示将其扩展到300M

(1)卸载设备与挂载点的关联

[root@origin ~]# umount /lvm
[root@origin ~]#

(2)扩展逻辑卷

把上一个实验中的逻辑卷 vo 扩展至 300MB

[root@origin ~]# lvextend -L 300M /dev/storage/vo
  Extending logical volume vo to 300.00 MiB
  Logical volume vo successfully resized
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV Status              available
  '#' open                 0
  LV Size                300.00 MiB
 ...省略部份内容

能够看到扩展后/dev/storage/vo逻辑卷大小为300M。

(3)检查硬盘完整性并重置硬盘容量

[root@origin ~]# e2fsck -f /dev/storage/vo
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo: 12/38000 files (0.0% non-contiguous), 10455/151552 blocks
[root@origin ~]# resize2fs /dev/storage/vo
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 307200 (1k) blocks.
The filesystem on /dev/storage/vo is now 307200 blocks long.
[root@origin ~]#

(4)从新挂载设备

[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo   287M  2.1M  266M   1% /lvm
[root@origin ~]#

能够看到扩容后,lvm目录的大小为300M(上图实际显示为287M)。

这样就完成了逻辑卷的扩容。

2.2.3 LVM缩小容

相较于扩容逻辑卷,在对逻辑卷进行缩容操做时,其丢失数据的风险更大,因此在生产环境中必定要提早备份数据。

为了保证数据安全性,Linux系统规定,在对LVM逻辑卷进行缩容操做以前,要先检查文件系统的完整性。

上一步扩容后lvm容量为300M,本次演示将其缩容到100M,步骤以下:

(1)卸载文件系统

[root@origin ~]# umount /lvm
[root@origin ~]#

(2)检查文件系统完整性

[root@origin ~]#  e2fsck -f /dev/storage/vo
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo: 12/76000 files (0.0% non-contiguous), 15761/307200 blocks
[root@origin ~]#

(3)缩容逻辑卷

把逻辑卷 vo 的容量减少到 100MB

[root@origin ~]# resize2fs /dev/storage/vo 100M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 102400 (1k) blocks.
The filesystem on /dev/storage/vo is now 102400 blocks long.
[root@origin ~]# lvreduce -L 100M /dev/storage/vo
  WARNING: Reducing active logical volume to 100.00 MiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vo? [y/n]: y  
  Reducing logical volume vo to 100.00 MiB
  Logical volume vo successfully resized
[root@origin ~]#

(4)从新挂载文件系统

[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo    93M  1.6M   85M   2% /lvm
[root@origin ~]#

能够看到lvm目录已经缩小到93M,这样就完成了逻辑卷的缩容操做。

2.2.4 LVM快照功能

逻辑卷快照功能就相似于还原操做系统,能够将逻辑卷状态还原到指定时间点。

LVM快照功能有2个特色:快照卷只能使用一次,一旦执行还原操做后当即自动删除;快照卷的容量必须等同于逻辑卷的容量防止数据丢失。

(1)查看当前卷组信息

[root@origin ~]# vgdisplay 
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       25 / 100.00 MiB
  Free  PE / Size       485 / 1.89 GiB
  ...省略部份内容

能够看到卷组中已经使用了100M,空闲容量还有1.89G。(Alloc PE / Size 25 / 100.00 MiB, Free PE / Size 485 / 1.89 GiB)

(2)生成快照卷

[root@origin ~]# lvcreate -L 100M -s -n SNAP /dev/storage/vo
  Logical volume "SNAP" created
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV snapshot status     source of
                         SNAP [active]
  LV Status              available
  '#' open                 1
  LV Size                100.00 MiB
  Current LE             25
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
   
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                TVfDRL-LnYd-z76K-fOuS-AD3C-Sw49-7jPgPo
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:40:10 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  '#' open                 0
  LV Size                100.00 MiB
  Current LE             25
  COW-table size         100.00 MiB
  COW-table LE           25
  Allocated to snapshot  0.01%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
 ...省略部份内容

经过lvcreate命令生成一个名为SNAP的快照逻辑卷。此时逻辑卷的存储空间占用量为0.01%。(Allocated to snapshot 0.01%)

(3)逻辑卷中添加文件,查看快照卷空间使用量

[root@origin ~]# dd if=/dev/zero of=/lvm/files count=1 bs=50M
1+0 records in
1+0 records out
52428800 bytes (52 MB) copied, 0.289668 s, 181 MB/s
[root@origin ~]# ls /lvm/
files  lost+found  test.txt
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部份内容
/dev/mapper/storage-vo    93M   52M   35M  61% /lvm
[root@origin ~]# lvdisplay 
...省略部份内容
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                TVfDRL-LnYd-z76K-fOuS-AD3C-Sw49-7jPgPo
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:40:10 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  '#' open                 0
  LV Size                100.00 MiB
  Current LE             25
  COW-table size         100.00 MiB
  COW-table LE           25
  Allocated to snapshot  50.29%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
...省略部份内容

在逻辑卷所挂载的目录中建立一个50MB 的垃圾文件,而后再查看快照卷/dev/storage/SNAP和逻辑卷/dev/storage/vo的状态。能够发现存储空间的占用量都上升了,快照卷占用量为:Allocated to snapshot 50.29%。

(4)经过快照卷还原逻辑卷

经过刚才建立的/dev/storage/SNAP快照卷,还原逻辑卷/dev/storage/vo的状态。

还原以前先取消目录挂载

[root@origin ~]# umount /lvm/
[root@origin ~]# lvconvert --merge /dev/storage/SNAP 
  Merging of volume SNAP started.
  vo: Merged: 72.9%
  vo: Merged: 100.0%
  Merge of snapshot into logical volume vo has finished.
  Logical volume "SNAP" successfully removed
[root@origin ~]#

能够看到还原逻辑卷后,快照卷自动删除了,经过lvdisplay命令查看也不会再有/dev/storage/SNAP 。

(5)从新挂载逻辑卷并查看文件

[root@origin ~]# mount -a
[root@origin ~]# ls /lvm/
lost+found  test.txt
[root@origin ~]#

能够看到,还原以后刚才建立files文件不见了,这样就把逻辑卷还原到了建立快照时的状态。

2.2.5 删除逻辑卷

当生产环境中想要从新部署LVM或者再也不须要使用 LVM 时,能够删除LVM。

须要提早备份好重要的数据信息,而后依次删除逻辑卷、卷组、物理卷设备,顺序不可颠倒。

(1)取消挂载

[root@origin ~]# umount /lvm/

取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数,找到以前添加在/etc/fstab文件中的一行“/dev/storage/vo /lvm ext4 defaults 0 0”并删除。

(2)删除逻辑卷

[root@origin ~]# lvremove /dev/storage/vo
Do you really want to remove active logical volume vo? [y/n]: y
  Logical volume "vo" successfully removed
[root@origin ~]#

(3)删除卷组

[root@origin ~]# vgremove storage
  Volume group "storage" successfully removed
[root@origin ~]#

只写卷组名称便可,不须要设备的绝对路径。

(4)删除物理卷

[root@origin ~]# pvremove /dev/sdb /dev/sdc
  Labels on physical volume "/dev/sdb" successfully wiped
  Labels on physical volume "/dev/sdc" successfully wiped
[root@origin ~]#

在上述操做执行完毕以后,再执行 lvdisplay、vgdisplay、pvdisplay 命令来查看 LVM 的信 息时就不会再看到信息了,说明删除成功。

经过上文和本文的演示,基本掌握了centos7下磁盘管理相关操做,若是非运维人员不必定要掌握的很是深入,理解便可。

本文讲了不少磁盘相关的命令,须要多敲几篇天然就熟悉了。下一篇文章再补充讲解下SSH服务相关的知识,而后就开始讲解应用服务的部署和使用了(如apache、邮件系统、mysql、动态网站部署等)。

相关文章
相关标签/搜索