概念

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。比如说我增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上层服务的是以逻辑卷的方式。LVM最大的特点就是可以对磁盘进行动态管理。因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。如果我们新增加了硬盘,其也不会改变现有上层的逻辑卷。作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。

PV(Physical Volume)–物理卷物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备。

VG(Volumne Group)–卷组卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。

LV(Logical Volume)–逻辑卷逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组。

数据写入的两种模式:

  • 线性模式:一个VG内含有sda1和sdb1,数据写入sda1,当sda1的容量用完后,sdb1才会被使用到
  • 交错模式:一个VG内含有sda1和sdb1,数据拆分成两份分别写入sda1和sdb1

LVM管理命令

任务PV 阶段VG 阶段LV 阶段
搜寻(scan)pvscanvgscanlvscan
创建(create)pvcreatevgcreatelvcreate
列出(display)pvdisplayvgdisplaylvdisplay
增加(extend)vgextendlvextend (lvresize)xfs_growfs
减少(reduce)vgreducelvreduce (lvresize)不支持
删除(remove)pvremovevgremovelvremove

基础操作

操作前必须确保磁盘分区系统为Linux LVM

实例不涉及缩小lvm容量操作,因为生产环境中缩小容量会造成数据损失

PV阶段

命令

  • pvcreate :将实体 partition 创建成为 PV ;
    • -f:强制创建物理卷,不需要用户确认;
    • -u:指定设备的UUID;
    • -y:所有的问题都回答“yes”;
    • -Z:是否利用前4个扇区
  • pvscan :搜寻目前系统里面任何具有 PV 的磁盘;
    • -d:调试模式;
    • -e:仅显示属于输出卷组的物理卷;
    • -n:仅显示不属于任何卷组的物理卷;
    • -s:短格式输出; -u:显示UUID。
  • pvdisplay :显示出目前系统上面的 PV 状态;
    • -s:以短格式输出;
    • -m:显示PE到LE的映射。
  • pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。
    • -d:调试模式;
    • -f:强制删除;
    • -y:对提问回答“yes”。

创建pv

# pvcreate /dev/sd[b-e]
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
Physical volume "/dev/sdd" successfully created.
Physical volume "/dev/sde" successfully created.

查看pv

# pvscan
  PV /dev/sda2   VG centos          lvm2 [<119.00 GiB / 4.00 MiB free]
  PV /dev/sdd                       lvm2 [10.00 GiB]
  PV /dev/sdc                       lvm2 [10.00 GiB]
  PV /dev/sde                       lvm2 [10.00 GiB]
  PV /dev/sdb                       lvm2 [10.00 GiB]
  Total: 5 [<159.00 GiB] / in use: 1 [<119.00 GiB] / in no VG: 4 [40.00 GiB]
# pvdisplay /dev/sd[b-e]
  "/dev/sdd" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               7DY4J9-WfXO-3Xy7-hVY5-73se-3XaT-LZ4TD0
   
  "/dev/sdc" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               kPo6FF-KVEm-PIUT-UW6G-pQUL-vHrN-X61EAc
   
  "/dev/sde" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sde
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               wPD6Ug-QMWl-JH1e-QvE3-PsJ8-V34E-dl6nSl
   
  "/dev/sdb" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               tBwxI2-JyFl-1Fsg-R07f-7qT1-yd57-0e756a

VG阶段

命令

  • vgcreate :创建 VG
    • -l:卷组上允许创建的最大逻辑卷数;
    • -p:卷组中允许添加的最大物理卷数;
    • -s:卷组上的物理卷的PE大小。
  • vgscan :搜寻系统上面是否有 VG 存在
    • -d:调试模式;
    • --ignorerlockingfailure:忽略锁定失败的错误。
  • vgdisplay :显示目前系统上面的 VG 状态
    • -A:仅显示活动卷组的属性;
    • -s:使用短格式输出的信息。
  • vgextend :在 VG 内增加额外的 PV
    • -d:调试模式;
    • -t:仅测试。
  • vgreduce :在 VG 内移除 PV
    • -a:如果命令行中没有指定要删除的物理卷,则删除所有的空物理卷;
    • --removemissing:删除卷组中丢失的物理卷,使卷组恢复正常状态。
  • vgchange :设置 VG 是否启动 (active)
    • -a:设置卷组的活动状态。
  • vgremove :删除一个 VG
    • -f:强制删除。

创建vg

# vgcreate wakamizuvg /dev/sd[b-e]
  Volume group "wakamizuvg" successfully created

查看vg

# vgscan 
  Reading volume groups from cache.
  Found volume group "wakamizuvg" using metadata type lvm2
  Found volume group "centos" using metadata type lvm2
# pvscan
  PV /dev/sdb    VG wakamizuvg      lvm2 [9.00 GiB / 9.00 GiB free]
  PV /dev/sdc    VG wakamizuvg      lvm2 [9.00 GiB / 9.00 GiB free]
  PV /dev/sdd    VG wakamizuvg      lvm2 [9.00 GiB / 9.00 GiB free]
  PV /dev/sde    VG wakamizuvg      lvm2 [9.00 GiB / 9.00 GiB free]
  PV /dev/sda2   VG centos          lvm2 [<119.00 GiB / 4.00 MiB free]
  Total: 5 [<155.00 GiB] / in use: 5 [<155.00 GiB] / in no VG: 0 [0   ]
# vgdisplay wakamizuvg
  --- Volume group ---
  VG Name               wakamizuvg
  System ID             
  Format                lvm2
  Metadata Areas        4
  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                4
  Act PV                4
  VG Size               36.00 GiB
  PE Size               1.00 GiB
  Total PE              36
  Alloc PE / Size       0 / 0   
  Free  PE / Size       36 / 36.00 GiB
  VG UUID               WmRALB-yWeR-TGg3-hjNY-31JI-EOji-Wwfj1x

增加VG容量

#vgextend wakamizuvg /dev/sdf

LV阶段

命令

  • lvcreate :创建 LV
    • -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
    • -l:指定逻辑卷的大小(LE数)。
  • lvscan :查询系统上面的 LV
    • -b:显示逻辑卷的主设备和次设备号。
  • lvdisplay :显示系统上面的 LV 状态
  • lvextend :在 LV 里面增加容量
    • -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
    • -l:指定逻辑卷的大小(LE数)。
  • lvreduce :在 LV 里面减少容量
    • -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
    • -l:指定逻辑卷的大小(LE数)。
  • lvremove :删除一个 LV
    • -f:强制删除。
  • lvresize :对 LV 进行容量大小的调整
    • -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
    • -l:指定逻辑卷的大小(LE数)。

创建LV

# lvcreate -L 2G -n wakamizulv wakamizuvg   
Logical volume "wakamizulv" created.

查看LV

# lvscan
  ACTIVE            '/dev/wakamizuvg/wakamizulv' [2.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [3.75 GiB] inherit
  ACTIVE            '/dev/centos/home' [65.24 GiB] inherit
  ACTIVE            '/dev/centos/root' [50.00 GiB] inherit
# lvdisplay /dev/wakamizuvg/wakamizulv 
  --- Logical volume ---
  LV Path                /dev/wakamizuvg/wakamizulv
  LV Name                wakamizulv
  VG Name                wakamizuvg
  LV UUID                S5RzRp-xiee-sc6K-LfLx-PkwH-qV28-t1N1aw
  LV Write Access        read/write
  LV Creation host, time server01, 2020-07-08 20:10:00 +0800
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Current LE             2
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3

4.初始化文件系统并挂载

# mkfs.xfs /dev/wakamizuvg/wakamizulv 
meta-data=/dev/wakamizuvg/wakamizulv isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=524288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
# mount /dev/wakamizuvg/wakamizulv /tmp/test
# df -Th /tmp/test
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/wakamizuvg-wakamizulv xfs   2.0G   33M  2.0G   2% /tmp/test

5.扩大LV容量(要先看VG剩余容量是否足够,不够的话添加硬盘加入PV)

# lvresize -L +1G /dev/wakamizuvg/wakamizulv 
  Size of logical volume wakamizuvg/wakamizulv changed from 2.00 GiB (2 extents) to 3.00 GiB (3 extents).
  Logical volume wakamizuvg/wakamizulv successfully resized.
# lvscan
  ACTIVE            '/dev/wakamizuvg/wakamizulv' [3.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [3.75 GiB] inherit
  ACTIVE            '/dev/centos/home' [65.24 GiB] inherit
  ACTIVE            '/dev/centos/root' [50.00 GiB] inherit
# xfs_info /tmp/test
meta-data=/dev/mapper/wakamizuvg-wakamizulv isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=524288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
# xfs_growfs /tmp/test
meta-data=/dev/mapper/wakamizuvg-wakamizulv isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=524288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 524288 to 786432
# df -Th /tmp/test
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/wakamizuvg-wakamizulv xfs   3.0G   33M  3.0G   2% /tmp/test

6.卸载

# umount /tmp/test
# lvremove /dev/wakamizuvg/wakamizulv
# vgremove wakamizuvg
# pvremove /dev/sd[b-e]

LVM快照

1.创建快照

# mount /dev/wakamizuvg/wakamizulv /test
# dd if=/dev/zero of=test.log bs=1M count=1024
# lvcreate -s -L 20G -n wakamizusnap1 /dev/wakamizuvg/wakamizulv 

2.还原

# rm /test/test.log
# umount /test
# lvconvert --merge /dev/wakamizuvg/wakamizusnap1

快照还原后会被删除