lvm

基础介绍

The Logical Volume Manager (LVM) provides tools to create virtual block devices from physical devices

LVM是一种单机硬盘虚拟化的技术,在LVM的架构体系中,最关键的三个概念是

  • PV(Physical Volume) ,物理卷,即实际存在的硬盘
  • VG(Volume Group),卷组,是由多个物理卷组合形成的大的整体的卷组
  • LV(Logical Volume),逻辑卷,是从卷组上分割出来的,可以直接mkfs.x格式化挂载使用的

上面这三个概念非常重要,每一个都必须理解,否则谈不上使用LVM(按照本文手动实际执行测试下,基本就理解了)

LVM创建和管理命令

在部署LVM时,要依次配置PV物理卷、VG卷组和LV逻辑卷。常用的LVM部署命令如下表所示:

功能/命令 物理卷管理 卷组管理 逻辑卷管理
扫描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
显示 pvdisplay vgdisplay lvdispaly
删除 pvremote vgremote lvremote
扩展 物理卷不能扩展 vgextend lvextend
缩小 物理卷不能缩小 vgreduce lvreduce

创建一个逻辑卷

目标:格式化挂载一个LVM逻辑卷磁盘以供使用

准备条件:一台测试机器,该机器上有三块无用的测试数据盘如 /dev/sdb、/dev/sdc、/dev/sdd

测试环境可通过VirtualBox等虚拟化环境搭建,不再赘述

操作步骤参考如下

disk1=/dev/sdd
disk2=/dev/sde
disk3=/dev/sdf
vgname=vgname01
lvname=lvname01

#这里是把三块物理磁盘初始化创建为LVM PV
#syntax: pvcreate pvname1 pvname2 pvname3 ...
pvcreate $disk1 $disk2 $disk3
pvs
pvdisplay

# [root@b103-10-210-128-42 ~]# pvs
#   PV         VG Fmt  Attr PSize    PFree
#   /dev/sdd      lvm2 ---  <278.88g <278.88g
#   /dev/sde      lvm2 ---   893.75g  893.75g
#   /dev/sdf      lvm2 ---   893.75g  893.75g
# 注意这里的PVName(Physical Volume Name),即 /dev/sdd、/dev/sde、可以看到磁盘路径即PVName

#syntax: vgcreate vgname pvname1 pvname2 pvname3 ...
vgcreate $vgname $disk1 $disk2 $disk3
vgs
pvs
pvdisplay
vgdisplay
#同样特别注意这里的 VGName(Volume Group Name)
#这里的VGName名称是全局唯一的,不能重复(不绝对,但是你这么理解也这么用,能省很多事)
#一个VGName或者说一个卷组可以对应1块或多块磁盘,我这里是对应3块

# [root@b103-10-210-128-42 ~]# vgs
#   VG       #PV #LV #SN Attr   VSize  VFree
#   vgname01   3   0   0 wz--n- <2.02t <2.02t
# [root@b103-10-210-128-42 ~]# vgdisplay  | less
# [root@b103-10-210-128-42 ~]# pvs
#   PV         VG       Fmt  Attr PSize    PFree
#   /dev/sdd   vgname01 lvm2 a--   278.87g  278.87g
#   /dev/sde   vgname01 lvm2 a--  <893.75g <893.75g
#   /dev/sdf   vgname01 lvm2 a--  <893.75g <893.75g
#vgs显示了这个vg对应三个pv
#pvs显示这三个pv,对应的都是vgname01这个vg

lvcreate --name $vgname/$lvname --size 10G $vgname
pvs
vgs
lvs
pvdisplay
vgdisplay
lvdisplay

# [root@b103-10-210-128-42 ~]# pvs
#   PV         VG       Fmt  Attr PSize    PFree
#   /dev/sdd   vgname01 lvm2 a--   278.87g  268.87g
#   /dev/sde   vgname01 lvm2 a--  <893.75g <893.75g
#   /dev/sdf   vgname01 lvm2 a--  <893.75g <893.75g
# [root@b103-10-210-128-42 ~]# vgs
#   VG       #PV #LV #SN Attr   VSize  VFree
#   vgname01   3   1   0 wz--n- <2.02t <2.01t
# [root@b103-10-210-128-42 ~]# lvs
#   LV       VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
#   lvname01 vgname01 -wi-a----- 10.00g
#同样的特别注意这里的 LVName(Logical Volume)
#把这个Name理解并用好了,这LVM就算入门了
#官方文档有这么一句话 Where commands take VG or LV names as arguments, the full path name is optional
#因此创建逻辑卷,如下三种方法都可以
#1  lvcreate --name $lvname --size 10G $vgname
#2  lvcreate --name $vgname/$lvname --size 10G $vgname
#3  lvcreate --name /dev/$vgname/$lvname --size 10G $vgname
#只要脑中认识到,逻辑卷总是在某个卷组下面,即 /dev/VolumeGroupName/LogicalVolumeName ,就足够了

#以上,我们通过 pv -> vg -> lv 这三套,最终创建出一个可以使用的虚拟盘符,盘符的路径即LVName,可以通过下面的命令查看
#[root@b103-10-210-128-42 ~]# lvdisplay  | grep 'LV Path'
#  LV Path                /dev/vgname01/lvname01

#开始挂载使用
testpath=/lvmtest
mkfs.xfs /dev/$vgname/$lvname
mkdir -p $testpath
mount /dev/$vgname/$lvname $testpath
df -h | grep $testpath
#写入数据测试
dd if=/dev/zero of=$testpath/testfile01 bs=1M count=1000 oflag=direct

删除逻辑卷

#有了上面的概念,及实操理解,我们很容易就能知道
#要彻底删除某个磁盘的LVM使用,需要首先删除所有LV,再删除所有VG,最后删除这个PV(即具体的磁盘)
#下面的测试紧接上文

#目标:清楚一台机器的LVM使用(前提是对应的磁盘其上数据皆不需要或已妥善备份)

# [root@b103-10-210-128-42 ~]# pvs
#   PV         VG       Fmt  Attr PSize    PFree
#   /dev/sdd   vgname01 lvm2 a--   278.87g  268.87g
#   /dev/sde   vgname01 lvm2 a--  <893.75g <893.75g
#   /dev/sdf   vgname01 lvm2 a--  <893.75g <893.75g
# [root@b103-10-210-128-42 ~]# vgs
#   VG       #PV #LV #SN Attr   VSize  VFree
#   vgname01   3   1   0 wz--n- <2.02t <2.01t
# [root@b103-10-210-128-42 ~]# lvs
#   LV       VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
#   lvname01 vgname01 -wi-ao---- 10.00g

#现在我们一下就能看出,机器上有3个PV,这个三个PV都是卷组vgname01使用的
#卷组vgname01只创建了一个LV即 /dev/vgname01/lvname01

disk1=/dev/sdd
disk2=/dev/sde
disk3=/dev/sdf
vgname=vgname01
lvname=lvname01

#如果有任何挂载或使用,则先去掉
#(执行命令时不要在已挂载的路径里待着)
umount /dev/$vgname/$lvname
mount | grep /dev/$vgname/$lvname

lvremove /dev/$vgname/$lvname
vgremove /dev/$vgname
pvremove $disk1 $disk2 $disk3

本文地址

LVM快速使用
http://t.csdn.cn/IGjYD
https://blog.csdn.net/xys2015/article/details/125227719