Linux磁盘管理之LVM与快照

引言:

逻辑卷管理LVM是硬盘的⼀个系统⼯具。⽆论在Linux或者其他类似的系统,都是⾮常的好⽤。传统分区使⽤固定⼤⼩分区,重新调整⼤⼩⼗分麻烦。但是,LVM可以创建和管理“逻辑”卷,⽽不是直接使⽤物理硬盘。可以让管理员弹性的管理逻辑卷的扩⼤缩⼩,操作简单,⽽不损坏已存储的数据。可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。
当刚开始安装Linux系统时,往往不能确定每个分区使用的空间大小,只能凭经验分配不科学。
如果分区设置的过大,就浪费了磁盘空间,
如果分区设置的过小,就会导致空间不够
如何希望分配的空间过大或过小,都能动态调整,则需要使用到 LVM 逻辑卷

一、逻辑卷

1.LVM优缺点

LVM 是 Logical Volume Manager 逻辑卷管理的简写,它是对磁盘分区管理的一种机制
优点:

  1. LVM 可以创建和管理逻辑卷,而不是直接使用物理硬盘
  2. LVM 可以弹性的管理逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据
  3. LVM 可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷
  4. 可以在系统运⾏的状态下动态的扩展⽂件系统的⼤⼩
  5. ⽂件系统可以跨多个磁盘,因此⽂件系统⼤⼩不会受物理磁盘的限制
  6. 可以以镜像的⽅式冗余重要的数据到多个物理磁盘
  7. 可以⽅便的导出整个卷组到另外⼀台机器

缺点:

  1. LVM 如果有一个磁盘损坏,整个 LVM 都坏了,LVM 只有动态扩展作用
  2. 因为加⼊了额外的操作,存取性能受到影响

解决办法:底层用 RAID + 上层用LVM = 既有冗余又有动态扩展;

2. 基本概念

物理卷(PV):(physical volume),把常规的磁盘设备通过pvcreate命令对其进⾏初始化,形成了物理卷。其实就是硬盘或分区。(⾯粉)

卷组(VG):(volume group),把多个物理卷组成⼀个逻辑的整体,这样卷组的⼤⼩就是多个硬盘之和。或者理解就是由⼀个或多个PV组成的整体。(⾯团)

逻辑卷(LV):(logical volume),从卷组中划分需要的空间⼤⼩出来。⽤户仅需对其格式化然后即可挂载使⽤。从VG中切割出的空间⽤于创建⽂件系统。(切成馒头)

基本单元(PE):(physical extend),分配的逻辑大小的最小单元,默认为4MB的基本块。(假设分配100MB逻辑空间,则需要创建25个PE)

Linux磁盘管理之LVM与快照_第1张图片

注意:制作pv,可以对分区做、也可以对整块盘做
二、LVM配置实操
环境与步骤

  1. 这里准备两块物理磁盘(当然也可以准备多块),一块上已经分区。建议在虚拟机关闭状态添加,以便更好的实验
  2. .创建物理卷,将普通磁盘转换为物理卷
  3. 创建卷组, 将物理卷加入到卷组中
  4. 在卷组中划分逻辑卷,然后挂载使用

1、下载安装包

yum install -y lvm2

查看磁盘状态

[root@localhost ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   50G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   49G  0 part 
  ├─centos-root 253:0    0   47G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0   20G  0 disk 
├─sdb1            8:17   0   10G  0 part 
└─sdb2            8:18   0   10G  0 part 
sdc               8:32   0  100G  0 disk 
sr0              11:0    1  4.4G  0 rom  
[root@localhost ~]#

我们用/dev/sdb1分区 和 /dev/sdc整个磁盘做pv
1.制作pv
pvcreate 设备名

root@localhost ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
[root@localhost ~]# pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created.

2.查看pv
pvs

[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/sda2  centos lvm2 a--  <49.00g   4.00m  # 系统自己创建的
  /dev/sdb1         lvm2 ---   10.00g  10.00g  # 我们创建的
  /dev/sdc          lvm2 ---  100.00g 100.00g  # 我们创建的
[root@localhost ~]# 

3.制作卷组vg
vgcreate 卷组名 pv名

[root@localhost ~]# vgcreate test_vg /dev/sdb1 /dev/sdc
  Volume group "test_vg" successfully created

4.查看vg
vgs

[root@localhost ~]# vgs
  VG      #PV #LV #SN Attr   VSize   VFree  
  centos    1   2   0 wz--n- <49.00g   4.00m  # 系统默认创建的
  test_vg   2   0   0 wz--n- 109.99g 109.99g  # 我们自己创建的
[root@localhost ~]# 

5.创建逻辑卷lvm(也可以创建多个逻辑卷)
lvcreate 选项

选项
-L    #逻辑卷⼤⼩
-n    #逻辑卷名字

分配50g大小给lv1_from_test_vg

[root@localhost ~]# lvcreate -L 50G -n lv1_from_test_vg test_vg
  Logical volume "lv1_from_test_vg" created.

6.查看vg
lvs
lvscan

[root@localhost ~]# lvs
  LV               VG      Attr   LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root             centos  -wi-ao---- 46.99g                                                    
  swap             centos  -wi-ao----  2.00g                                                    
  lv1_from_test_vg test_vg -wi-a----- 50.00g                                                    
或者
[root@localhost ~]# lvscan
  ACTIVE            '/dev/test_vg/lv1_from_test_vg' [50.00 GiB] inherit # 自己创建的
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit   # 系统默认
  ACTIVE            '/dev/centos/root' [46.99 GiB] inherit  # 系统默认

7.创建文件系统
mkfs.xfs 逻辑卷名

[root@localhost ~]# mkfs.xfs /dev/test_vg/lv1_from_test_vg

8.创建目录挂载使用

[root@localhost ~]# mkdir /lv1
[root@localhost ~]# mount -t xfs /dev/test_vg/lv1_from_test_vg /lv1

9.查看挂载情况

[root@localhost ~]# df -h
Filesystem                            Size  Used Avail Use% Mounted on
/dev/mapper/centos-root                47G  1.3G   46G   3% /
/dev/sda1                            1014M  138M  877M  14% /boot
tmpfs                                  98M     0   98M   0% /run/user/0
/dev/mapper/test_vg-lv1_from_test_vg   50G   33M   50G   1% /lv1
[root@localhost ~]# 

不要缩容!!!并且xfs⼲脆不⽀持缩容
不要缩容!!!并且xfs⼲脆不⽀持缩容
不要缩容!!!并且xfs⼲脆不⽀持缩容

所以下面的缩容纯属了解

二、卷组的在线扩展与缩容

1. vg扩容

1.准备新的硬盘加入到pv,检查pv大小。
这里我们还有/dev/sdb2,可以将其加入卷组,方法都一样,为了简化就不插入新硬盘了。

[root@localhost ~]# pvcreate /dev/sdb2
  Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]# pvs
  PV         VG      Fmt  Attr PSize    PFree  
  /dev/sda2  centos  lvm2 a--   <49.00g   4.00m
  /dev/sdb1  test_vg lvm2 a--   <10.00g <10.00g
  /dev/sdb2          lvm2 ---   <10.00g <10.00g
  /dev/sdc   test_vg lvm2 a--  <100.00g <50.00g
[root@localhost ~]# 

使用vgextend 扩展卷组 在已经存在的卷组test_vg(上面我们自己创建的)上扩展卷组
vgextend 原卷组名 创建的新pv

[root@localhost ~]# vgextend test_vg /dev/sdb2
  Volume group "test_vg" successfully extended

再次检查卷组,发现已经变大了(之前总大小是110G),说明扩容成功
现在总大小是120G,正好是/dev/sdb 和/dev/sdc大小之和。

[root@localhost ~]# vgs
  VG      #PV #LV #SN Attr   VSize    VFree  
  centos    1   2   0 wz--n-  <49.00g   4.00m
  test_vg   3   1   0 wz--n- <119.99g <69.99g

2. vg缩容

假设想移除 /dev/sdb(/dev/sdb1) 磁盘,建议先将 sdb 磁盘数据先迁移到 sdc 磁盘,然后在移除
注意:同一卷组的磁盘才可以进行在线迁移
1.检查当前逻辑卷 VG 中 PV 使用情况

[root@localhost ~]# pvs
  PV         VG      Fmt  Attr PSize    PFree  
  /dev/sda2  centos  lvm2 a--   <49.00g   4.00m
  /dev/sdb1  test_vg lvm2 a--   <10.00g <10.00g
  /dev/sdb2  test_vg lvm2 a--   <10.00g <10.00g
  /dev/sdc   test_vg lvm2 a--  <100.00g <50.00g

2.pvmove 在线数据迁移,将 sdb1 的数据迁移至 其他盘(可以是sdb2也可以是sdc,随机的)

# 因为我们现在所有的磁盘都是空的,模拟写入点数据方便迁移
否则会报错No data to move for test_vg
[root@localhost ~]# touch /lv1/{a..z}.txt

[root@localhost ~]# pvmove /dev/sdb1 # 实际业务中如果这个磁盘有数据,那它就会执行成功

3.检查是否将 sdb1 数据迁移至 其他盘

[root@localhost ~]# pvs
  PV         VG      Fmt  Attr PSize    PFree  
  /dev/sda2  centos  lvm2 a--   <49.00g   4.00m
  /dev/sdb1  test_vg lvm2 a--   <10.00g <10.00g
  /dev/sdb2  test_vg lvm2 a--   <10.00g <10.00g
  /dev/sdc   test_vg lvm2 a--  <100.00g <50.00g
[root@localhost ~]#

4.从卷组中移除 sdb 磁盘
vgreduce vg名 设备名

[root@localhost ~]# vgreduce test_vg /dev/sdb1
  Removed "/dev/sdb1" from volume group "test_vg"

5.查看

root@localhost ~]# pvs
  PV         VG      Fmt  Attr PSize    PFree  
  /dev/sda2  centos  lvm2 a--   <49.00g   4.00m
  /dev/sdb1          lvm2 ---    10.00g  10.00g
  /dev/sdb2  test_vg lvm2 a--   <10.00g <10.00g
  /dev/sdc   test_vg lvm2 a--  <100.00g <50.00g
[root@localhost ~]# 

三、逻辑卷的在线扩容与缩容

1. lv扩容

扩展逻辑卷:取决于 vg 卷中是否还有剩余的容量
注意扩展逻辑卷不能超过卷组 VG 的总大小

[root@localhost ~]# vgs
  VG      #PV #LV #SN Attr   VSize   VFree 
  centos    1   2   0 wz--n- <49.00g  4.00m
  test_vg   2   1   0 wz--n- 109.99g 59.99g
[root@localhost ~]# 

可以看到vg还有60G剩余

再看看lv

[root@localhost ~]# lvscan
  ACTIVE            '/dev/test_vg/lv1_from_test_vg' [50.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
  ACTIVE            '/dev/centos/root' [46.99 GiB] inherit
[root@localhost ~]# 

给lv1_from_test_vg逻辑卷扩容+10G

[root@localhost ~]# lvextend -L +10G /dev/test_vg/lv1_from_test_vg
  Size of logical volume test_vg/lv1_from_test_vg changed from 50.00 GiB (12800 extents) to 60.00 GiB (15360 extents).
  Logical volume test_vg/lv1_from_test_vg successfully resized.
[root@localhost ~]# 


#也可以选择分配卷组中多少百分比给逻辑卷
[root@localhost ~]# lvextend -l +50%FREE /dev/test_vg/lv1_from_test_vg

查看扩展后lv

[root@localhost ~]# lvscan
  ACTIVE            '/dev/test_vg/lv1_from_test_vg' [60.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
  ACTIVE            '/dev/centos/root' [46.99 GiB] inherit
[root@localhost ~]# 

可以看到,/dev/test_vg/lv1_from_test_vg 确实增大了10G

扩展逻辑卷后需要更新fs文件系统
xfs_growfs 具体的lv名称 # xfs文件格式扩容
resize2fs 具体的lv名称 # ext文件格式扩容

[root@localhost ~]# xfs_growfs /dev/test_vg/lv1_from_test_vg

2. 删除lv

  1. 先卸载挂载点,然后在移除逻辑卷
[root@localhost ~]# umount /dev/test_vg/lv1_from_test_vg

  1. 删除lv
    lvremove
[root@localhost ~]# lvremove /dev/test_vg/lv1_from_test_vg
Do you really want to remove active logical volume test_vg/lv1_from_test_vg? [y/n]: y
  Logical volume "lv1_from_test_vg" successfully removed
[root@localhost ~]# 

3.删除 vg
vgremove vg名称

[root@localhost ~]# vgremove test_vg
  Volume group "test_vg" successfully removed
[root@localhost ~]#

4.删除pv
pvremove

[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/sda2  centos lvm2 a--  <49.00g   4.00m
  /dev/sdb1         lvm2 ---   10.00g  10.00g
  /dev/sdb2         lvm2 ---  <10.00g <10.00g
  /dev/sdc          lvm2 ---  100.00g 100.00g

[root@localhost ~]# pvremove /dev/sdb1
  Labels on physical volume "/dev/sdb1" successfully wiped.
[root@localhost ~]# pvremove /dev/sdb2
  Labels on physical volume "/dev/sdb2" successfully wiped.
[root@localhost ~]# pvremove /dev/sdc
  Labels on physical volume "/dev/sdc" successfully wiped.
[root@localhost ~]#

四、快照

LVM 机制还提供了对 LV 做快照的功能,也就是说可以给⽂件系统做⼀个备份,这也是设计 LVM 快照的主要⽬的。LVM 的快照功能采⽤写时复制技术(Copy-On-Write,COW),这⽐传统的备份技术的效率要⾼很多。创建快照时不⽤停⽌服务,就可以对数据进⾏备份。说明:LVM 还⽀持 thin 类型的快照,但是本⽂中的快照都是指 COW 类型的快照。

LVM 采⽤的写时复制,是指当 LVM 快照创建的时候,仅创建到实际数据的 inode 的硬链接(hark-link)⽽已。只要实际的数据没有改变,快照就只包含指向数据的 inode 的指针,⽽⾮数据本身。快照会跟踪原始卷中块的改变,⼀旦你更改了快照对应的⽂件或⽬录,这个时候原始卷上将要改变的数据会在改变之前拷⻉到快照预留的空间
lvm快照的原理:
Linux磁盘管理之LVM与快照_第2张图片

创建快照实际上也是创建了⼀个逻辑卷,只不过该卷的属性与普通逻辑卷的属性有些不⼀样。我们可以通过上图来理解快照数据卷(图中的实线框表示快照区域,虚线框表示⽂件系统):#
左图为最初创建的快照数据卷状况,LVM 会预留⼀个区域 (⽐如左图的左侧三个 PE 区块) 作为数据存放处。
此时快照数据卷内并没有任何数据,⽽快照数据卷与源数据卷共享所有的 PE 数据, 因此你会看到快照数据卷的内容与源数据卷中的内容是⼀模⼀样的。
等到系统运⾏⼀阵⼦后,假设 A 区域的数据被更新了(上⾯右图所示),则更新前系统会将该区域的数据移动到快照数据卷中,
所以在右图的快照数据卷中被占⽤了⼀块 PE 成为 A,⽽其他 B 到 I 的区块则还是与源数据卷共享!

由于快照区与原本的 LV 共享很多 PE 区块,因此快照区与被快照的 LV 必须要在同⼀个 VG 上头,

下⾯两点⾮常重要:

1、VG中需要预留存放快照本身的空间,不能全部被占满。
2、快照所在的 VG 必须与被备份的 LV 相同,否则创建快照会失败。

总结:
快照的本质就是⼀个特殊的lv,创建快照后,如果源数据卷中的⽂件被更新了,会将⽼数据赋给快照的

你可能感兴趣的:(Linux运维,linux,运维,磁盘管理,LVM,逻辑卷)