27 磁盘管理之LVM介绍

585次阅读
没有评论

共计 5823 个字符,预计需要花费 15 分钟才能阅读完成。

一.LVM 概述

1. 为什么要用 LVM

  • LVM 是 逻辑卷管理 系统工具
  • 使用传统的分区方法, 分完后大小就 固定死
  • 分区过大, 造成空间 浪费 ; 分区过小, 导致空间 不够用
  • 过小需要 从新划分 磁盘分区, 或者以软连接的方式将此分区的目录链接到另一个分区
  • 这样做可以临时解决问题, 但给管理带来了 麻烦

2. 什么是 LVM

  • 逻辑卷管理 系统工具
  • LVM 可以创建和管理 逻辑卷, 不是直接使用磁盘
  • 可以让管理员 弹性的管理逻辑卷的扩大缩小, 操作简单不损坏已有数据
  • 可以 随意 将新磁盘 添加 到 LVM 中, 让其扩展已存在的逻辑卷
  • LVM不需要重启 就可以让内核知道分区的存在

27 磁盘管理之 LVM 介绍

2.LVM 名词含义

  • PV : 物理卷(physical volume) , 把常规的磁盘设备通过 pvcreate 命令对其进行初始化, 形成了物理卷 🔔面粉
  • VG : 卷组(volume group), 把多个物理卷组成一个逻辑的整体, 这样卷组的大小就是多个硬盘之和 🔔面团
  • LV : 逻辑卷(logical volume) , 从卷组中划分需要的空间大小出来, 用户仅需对其格式化然后即可挂载使用 🔔切成馒头
  • PE : 基本单元(physical extend), 分配的逻辑大小的最小单元, 默认为 4MB 的基本块 (假设分配 100MB 逻辑空间,则需要创建 25 个 PE) 🔔小麦

27 磁盘管理之 LVM 介绍

3.LVM 的优缺点

  • 优点
1. 可以在系统运行的状态下动态的扩展文件系统的大小
2. 文件系统可以跨多个磁盘, 因此文件系统大小不会受物理磁盘的限制
3. 可以增加新的磁盘到 "LVM" 的储存池中
4. 可以以镜像的方式冗余重要的数据到多个物理磁盘
5. 可以方便的导出整个卷组到另一态机器
  • 缺点
1. 因为加入了额外的操作, 存取性能受到影响
2. 当卷组中一个磁盘损坏时, 整个卷组都会受到影响
🔰解释: 因为一个 " 逻辑卷 " 可能是由多个不同 " 物理卷 " 里的 "PE" 组成的
🔰解决: 底层使用 "RAID" 做, 上层使用 "LVM", 既有了冗余又有了动态扩容

27 磁盘管理之 LVM 介绍

二.LVM 的使用

1.LVM 基本使用命令

  • 先安装 LVM : yum install lvm2 -y

  • 制作 PV : pvcreate [设备名称]

  • 查看 PV : pvs

  • 制作 VG : vgcreate [vg 名] [多个 pv 路径]

  • 查看 VG : vgs

  • 制作 LV : lvcreate -L [指定大小] -n [指定 lv 名字] [指定从哪个 vg 里分]

  • 查看 LV : lvs

  • 扩容 VG : vgextend [指定要扩容的 vg] [指定要增加的新 pv]

  • 扩容 LV : lvextend -L [+" 指定大小 "] -n [指定要增加的那个 lv 路径]

  • 扩展后更新 xfs 文件系统 : xfs_growfs [扩容了哪个 lv 就更新哪个 lv]

  • 删除 PV : pvremove [要删除的 pv]

  • 删除 VG : vgremove [要删除的 vg 名]

  • 删除 LV : lvremove [要删除的 lv 路径]

  • 创建 LV 快照 : lvcreate -L [指定快照大小] -s -n [快照名字] [需要做快照的那个 lv 路径]

  • 快照合并 : lvconvert --mergesnapshot [快照名字]

2. 制作 PV, VG, LV 演示

  • 制作 PV
🌞我们可以对一个分区做, 也可以对整个磁盘做, 我这先准备 "sdc3, sde" 两个设备
[root@shawn ~]#pvcreate /dev/sdc3 
[root@shawn ~]#pvcreate /dev/sde

🌞使用 "pvs" 查看一下制作好的 "pv"
[root@shawn ~]#pvs
PV         VG Fmt  Attr PSize   PFree  
/dev/sdc3     lvm2 ---  100.00m 100.00m
/dev/sde      lvm2 ---    5.00g   5.00g
  • 制作 VG
🌞将两个 "pv" 合成一个 "vg"
[root@shawn ~]#vgcreate vg1 /dev/sdc3 /dev/sde
Volume group "vg1" successfully created  # success 代表成功

🌞查看 "vg"
[root@shawn ~]#vgs
VG  #PV #LV #SN Attr   VSize  VFree 
vg1   2   0   0 wz--n- <5.09g <5.09g
  • 制作 LV
🌞制作一个 "1G" 的 "lv", 一个 "2G" 的 "lv"
[root@shawn ~]#lvcreate -L 1G -n lv1_from_vg1 vg1
[root@shawn ~]#lvcreate -L 2G -n lv2_from_vg1 vg1

🌞查看 "lv"
[root@shawn ~]#lvs
LV   VG  Attr LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
lv1_from_vg1 vg1 -wi-a----- 1.00g                  
lv2_from_vg1 vg1 -wi-a----- 2.00g   
  • 将其制作文件系统并挂载
🌞先创建两个文件
[root@shawn ~]#mkdir /test3
[root@shawn ~]#mkdir /test4

🌞将两个 "lv" 制作文件系统
[root@shawn ~]#mkfs.xfs /dev/vg1/lv1_from_vg1 
[root@shawn ~]#mkfs.xfs /dev/vg1/lv2_from_vg1 

🌞将其挂载
[root@shawn ~]#mount /dev/vg1/lv1_from_vg1  /test3
[root@shawn ~]#mount /dev/vg1/lv2_from_vg1  /test4
  • df -h命令查看一下

27 磁盘管理之 LVM 介绍

3. 动态扩容演示

  • 演示场景
🌞假设我们的 "lv1" 也就是 "/test3" 不够用了
🌞我们可以从 "vg1" 里面动态的获取空间
🌞那么假设 "vg1" 能提供的空间也不够了
🌞那我们就只能加入新的 "pv"
  • 新增 PV
🌞我们准备了一个新的分区 "/dev/sdd1"
[root@shawn ~]#pvcreate /dev/sdd1

🌞查看一下
[root@shawn ~]#pvs
PV         VG  Fmt  Attr PSize  PFree 
/dev/sdc3  vg1 lvm2 a--  96.00m 96.00m
/dev/sdd1      lvm2 ---   5.00g  5.00g   #新增了这一块
/dev/sde   vg1 lvm2 a--  <5.00g <2.00g
  • 将 PV 加入到 vg1 中
🌞使用 "vgcreate"
[root@shawn ~]#vgextend vg1 /dev/sdd1

🌞查看一下 "vg1" 的空间
[root@shawn ~]#vgs
VG  #PV #LV #SN Attr   VSize   VFree 
vg1   3   2   0 wz--n- <10.09g <7.09g  #对比之前可以发现增加了 "5G"
  • 将 lv1 扩充 4G 的空间
🌞使用 "lvextend" 命令
[root@shawn ~]#lvextend -L +4G -n /dev/vg1/lv1_from_vg1 

🌞更新 "xfs" 系统文件
[root@shawn ~]#xfs_growfs /dev/vg1/lv1_from_vg1 

🌞查看一下 "lv1" 空间
[root@shawn ~]#lvs
LV VG  Attr LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
lv1_from_vg1 vg1 -wi-ao---- 5.00g   #发现大了 4G           
lv2_from_vg1 vg1 -wi-ao---- 2.00g 

4. 动态缩容和删除

  • 缩容
🌞提示: 企业一般不会缩容, 而是直接删除, 并且 "xfs" 文件系统不支持缩容

🌞命令: lvreduce -L [-]MGT /dev/VG_NAME/LV_NAME
  • 删除 LV
🌞删除之前需要先卸载挂载点
[root@shawn ~]#umount /test4
[root@shawn ~]#lvremove /dev/vg1/lv2_from_vg1 
🌞后面有提示输入 "y"
  • 删除 VG
[root@shawn ~]#vgremove vg1
  • 删除 PV
🌞能删除的只能是不属于任何 "vg" 的 "pv"
[root@shawn ~]#pvremove /dev/sde

5. 快照演示

  • LVM 提供了快照功能, 也就是给 文件系统做一个备份

  • 采用的是 写时复制 , 就是创建时 仅创建 实际数据的 inode 的 硬链接

  • 一旦 改变 了快照对应的 原文件 , 这时原始卷上将要改变的数据会在 改变之前拷贝到快照里去

  • 快照 实际上也是创建了一个 逻辑卷 , 只是该卷与普通逻辑卷 属性有些不一样

  • LVM 快照底层原理图

27 磁盘管理之 LVM 介绍

  • 强调点
1. "VG" 中需要存放快照本身的空间, 不能被占满, 快照一般设置与源 "lv" 大小相等
2. 因为快照与源 "LV" 共享许多 "PE", 所以快照所在的 "VG" 必须与备份的 "LV" 相同, 否则快照会失效
  • 制作快照并回复单个 (少量) 文件演示
🌞我们清理一下之前的环境, 然后制作新的 "PV,VG,LV", 让实验看起来更明显
[root@shawn ~]#pvs
PV         VG Fmt  Attr PSize   PFree  
/dev/sdc3     lvm2 ---  100.00m 100.00m
/dev/sdd1     lvm2 ---    5.00g   5.00g
/dev/sde      lvm2 ---    5.00g   5.00g

🌞选 "sdd1,sde" 做 "vg"
[root@shawn ~]#vgcreate vg1 /dev/sde /dev/sdd1
[root@shawn ~]#vgs
VG  #PV #LV #SN Attr   VSize VFree
vg1   2   0   0 wz--n- 9.99g 9.99g

🌞制作一个 "lv1", 并格式化与挂载, 查看
[root@shawn ~]#lvcreate -L 1G -n lv1_from_vg1 vg1
[root@shawn ~]#mkfs.xfs /dev/vg1/lv1_from_vg1
[root@shawn ~]#mount /dev/vg1/lv1_from_vg1 /test3
[root@shawn ~]#df -h
/dev/mapper/vg1-lv1_from_vg1 1014M   33M  982M    4% /test3

🌞在里面写一些文件, 并查看
[root@shawn ~]#echo 333 > /test3/1.txt
[root@shawn ~]#echo 222 > /test3/2.txt
[root@shawn ~]#echo 111 > /test3/3.txt
[root@shawn ~]#cat /test3/1.txt /test3/2.txt /test3/3.txt 
333
222
111

🌞开始制作这时的一个快照(快照需要在同一个 "vg" 里面), 并查看
[root@shawn ~]#lvcreate -L 1G -s -n lv1_from_vg1_bak /dev/vg1/lv1_from_vg1 
[root@shawn ~]#lvs
LV   VG  Attr   LSize Pool Origin  Data%  Meta%  Move Log Cpy%Sync Convert
lv1_from_vg1     vg1 owi-aos--- 1.00g                            
lv1_from_vg1_bak vg1 swi-a-s--- 1.00g   lv1_from_vg1 0.00  #发现快照创建成功

🌞修改文件来模拟数据被篡改, 并查看
[root@shawn ~]#echo "This is change file" >> /test3/3.txt 
[root@shawn ~]#cat /test3/3.txt 
111
This is change file

🌞恢复数据
⛅挂载快照: 快照在挂载的时候由于和原来的 "LVM" 是同一个 "UUID"
⛅而 "XFS" 是不允许相同 "UUID" 的文件系统挂载,所以需要加选项 "-0 nouuid" 不使用 uuid 做识别
[root@shawn ~]#mount -o nouuid /dev/vg1/lv1_from_vg1_bak /test4
[root@shawn ~]#ls /test4
1.txt  2.txt  3.txt
[root@shawn ~]#cat /test4/3.txt 
111           #确认是最初的那个亚子

🌞将其拷贝覆盖回去
[root@shawn ~]#cp -rf /test4/3.txt /test3/3.txt 
cp:是否覆盖 "/test3/3.txt"?y
[root@shawn ~]#cat /test3/3.txt 
111           #回到了最初的亚子
  • 恢复文件的个数过多可以直接进行合并
🌞先查看原数据
[root@shawn ~]#cat /test3/1.txt /test3/2.txt /test3/3.txt 
333
222
111

🌞创建快照 "bak2", 并查看
[root@shawn ~]#lvcreate -L 1G -s -n lv1_from_vg1_bak2 /dev/vg1/lv1_from_vg1
[root@shawn ~]#lvs
LV   VG  Attr  LSize Pool Origin   Data%  Meta%  Move Log Cpy%Sync Convert
lv1_from_vg1      vg1 owi-aos--- 1.00g                         
lv1_from_vg1_bak  vg1 swi-aos--- 1.00g      lv1_from_vg1 0.20 
lv1_from_vg1_bak2 vg1 swi-a-s--- 1.00g      lv1_from_vg1 0.00

🌞修改原文件, 并查看
[root@shawn ~]#echo aaaaa >> /test3/1.txt 
[root@shawn ~]#echo aaaaa >> /test3/2.txt 
[root@shawn ~]#echo aaaaa >> /test3/3.txt
[root@shawn ~]#cat /test3/1.txt /test3/2.txt /test3/3.txt 
333
aaaaa
222
aaaaa
111
aaaaa

🌞先卸载原数据设备和快照, 然后进行合并, 快照会自动删除(一次性的合并)
[root@shawn ~]#umount /test3
[root@shawn ~]#umount /test4
[root@shawn ~]#lvconvert --mergesnapshot /dev/vg1/lv1_from_vg1_bak2 
[root@shawn ~]#mount /dev/vg1/lv1_from_vg1 /test3
[root@shawn ~]#ls /test3
1.txt  2.txt  3.txt
[root@shawn ~]#cat /test3/1.txt /test3/2.txt /test3/3.txt 
333
222
111           #发现回到了最初的亚子

🌞在看看 "bak2" 文件
[root@shawn ~]#lvs
LV  VG  Att LSize Pool Origin  Data%  Meta%  Move Log Cpy%Sync Convert
lv1_from_vg1     vg1 owi-aos--- 1.00g    
lv1_from_vg1_bak vg1 swi-a-s--- 1.00g      lv1_from_vg1 0.20   #惊奇的发现 2 消失了
正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计5823字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)