一、LVM 是什么

LVM 是 Logical Volume Manager(逻辑卷办理)的简写,它是 Linux 环境下对磁盘分区进⾏办理的⼀种机制。

安装 Linux 操作体系时遇到的⼀个常⻅的难以决定的问题便是如何正确地评价各分区⼤⼩,以分配合适的硬盘空间; 一般的磁盘分区办理⽅式在逻辑分区划分好之后就⽆法改动其⼤⼩; 跟着 Linux 的逻辑卷办理功用的呈现,这些问题都迎刃⽽解,⽤户在⽆需停机的情况下能够⽅便地调整各个分区⼤⼩,即动态调整磁盘容量,从⽽提⾼磁盘办理的灵活性。

相关概念:s

  • PV(Physical Volume):物理卷

处于 LVM 最底层,能够是物理硬盘或者分区,整个硬盘,或使⽤fdisk 等⼯具建⽴的一般分区,包括许多默许 4MB ⼤⼩的 PE(Physical Extent,根本单元)。

  • PE(Physical Extend):物理区域

PV 中能够⽤于分配的最⼩存储单元,能够在创立 PV 的时分拟定(默许为 4MB),如 1M, 2M, 4M, 8M, 32M, 64M… 组成同⼀VG 中所有 PV 的 PE⼤⼩应该相同。

  • VG(Volume Group):卷组

建⽴在 PV 之上,能够含有⼀个到多个 PV,⼀个或多个物理卷组合⽽成的全体。

  • LV(Logical Volume):逻辑卷

建⽴在 VG 之上,相当于本来分区的概念,不过⼤⼩能够动态改动。从卷组平分割出的⼀块空间,⽤于建⽴⽂件
体系。

PV(PE)–>VG–>(PE*n)LV–>⽬录挂载

Lvm 的概念和基本使用详解

1667788386655.jpg

二、根底指令

序号 功用 PV 物理卷指令 VG 卷组指令 LV 逻辑卷指令
01 扫描功用 pvscan vgscan lvscan
02 建⽴功用 pvcreate vgcreate lvcreate
03 查询功用 pvdisplay vgdisplay lvdisplay
04 删去功用 pvremove vgremove lvremove
05 扩容功用 vgextend lvextend
06 缩容功用 vgreduce lvreduce

需求先运用 fdisk 指令进行一个分区设置。
演示这儿运用的是两块磁盘 /dev/sdb 和 /dev/sdc 各设置一个分区。

1、pv 相关指令

  • 创立pv
[root@localhost~]#pvcreate/dev/sdb1/dev/sdc1
Physicalvolume"/dev/sdb1"successfullycreated.
Physicalvolume"/dev/sdc1"successfullycreated.

pvcreate 的作用便是将磁盘打散成一块块同样巨细的 PE。

  • 查询pv
#简略检查
[root@localhost~]#pvs
PVVGFmtAttrPSizePFree
/dev/sda2centoslvm2a--<31.00g4.00m
/dev/sdb1lvm2---<2.00g<2.00g
/dev/sdc1lvm2---<2.00g<2.00g
#具体检查
[root@localhost~]#pvdisplay
---Physicalvolume---
PVName/dev/sda2
VGNamecentos
PVSize<31.00GiB/notusable3.00MiB
Allocatableyes
PESize4.00MiB
TotalPE7935
FreePE1
AllocatedPE7934
PVUUIDEXKt0P-ICEf-iwsx-zZAI-I3G1-JZNX-DdXKxl
"/dev/sdb1"isanewphysicalvolumeof"<2.00GiB"
---NEWPhysicalvolume---
PVName/dev/sdb1
VGName
PVSize<2.00GiB
AllocatableNO
PESize0
TotalPE0
FreePE0
AllocatedPE0
PVUUIDcLIVA5-V3Rg-YOen-TIlu-AanQ-BlRP-92y7Uw
"/dev/sdc1"isanewphysicalvolumeof"<2.00GiB"
---NEWPhysicalvolume---
PVName/dev/sdc1
VGName
PVSize<2.00GiB
AllocatableNO
PESize0
TotalPE0
FreePE0
AllocatedPE0
PVUUIDaKMxlM-XGO1-JnlM-cPS0-8xH6-oyml-AXwUSR

/dev/sda2 是体系本身就存在的 pv。/dev/sdb1/dev/sdc1 都是设置的 2g 巨细的硬盘,这儿提示小于 2g 是因为存本身数据占用了一部分,大约 4M。

  • 扫描pv
[root@localhost~]#pvscan
PV/dev/sda2VGcentoslvm2[<31.00GiB/4.00MiBfree]
PV/dev/sdb1lvm2[<2.00GiB]
PV/dev/sdc1lvm2[<2.00GiB]
Total:3[34.99GiB]/inuse:1[<31.00GiB]/innoVG:2[<4.00GiB]
  • 删去pv
[root@localhost~]#pvremove/dev/sdb1/dev/sdc1
Labelsonphysicalvolume"/dev/sdb1"successfullywiped.
Labelsonphysicalvolume"/dev/sdc1"successfullywiped.

2、vg 相关指令

  • 创立vg

为了演示扩容,先用一个 pv 来创立 vg。

[root@localhost~]#vgcreatevg1/dev/sdb1
Volumegroup"vg1"successfullycreated
  • 查询vg
#简略查询
[root@localhost~]#vgs
VG#PV#LV#SNAttrVSizeVFree
centos120wz--n-<31.00g4.00m
vg1100wz--n-<2.00g<2.00g
#具体查询
[root@localhost~]#vgdisplay
---Volumegroup---
VGNamevg1
SystemID
Formatlvm2
MetadataAreas1
MetadataSequenceNo1
VGAccessread/write
VGStatusresizable
MAXLV0
CurLV0
OpenLV0
MaxPV0
CurPV1
ActPV1
VGSize<2.00GiB
PESize4.00MiB
TotalPE511
AllocPE/Size0/0
FreePE/Size511/<2.00GiB
VGUUIDBOlSmN-nujL-ydgL-LPlP-qLgs-WcDK-VCrf0p
---Volumegroup---
VGNamecentos
SystemID
Formatlvm2
MetadataAreas1
MetadataSequenceNo9
VGAccessread/write
VGStatusresizable
MAXLV0
CurLV2
OpenLV2
MaxPV0
CurPV1
ActPV1
VGSize<31.00GiB
PESize4.00MiB
TotalPE7935
AllocPE/Size7934/30.99GiB
FreePE/Size1/4.00MiB
VGUUIDK2WSC3-MlER-hHUD-t2rZ-SDLE-bJnM-Xq8Wdd
  • 删去vg

vg 在没用运用的情况下能够直接删去。

[root@localhost~]#vgremovevg1
Volumegroup"vg1"successfullyremoved

假如运用 vg 创立了 lv,一起删去 lv。

[root@localhost~]#vgremovevg1
Doyoureallywanttoremovevolumegroup"vg1"containing1logicalvolumes?[y/n]:y
Doyoureallywanttoremoveactivelogicalvolumevg1/lvol0?[y/n]:y
Logicalvolume"lvol0"successfullyremoved
Volumegroup"vg1"successfullyremoved

3、lv 相关指令

  • 创立lv
#1、运用-l参数,运用vg1闲暇100%创立一个新的lv
[root@localhost~]#lvcreate-l+100%FREE/dev/vg1
Logicalvolume"lvol0"created.
#2、通过vgdisplay指令查询到闲暇空间巨细,PE巨细*剩下PE数量
[root@localhost~]#lvcreate-L+2024M/dev/vg1
Logicalvolume"lvol0"created.

这儿直接创立一个新的lv,占用100%的vg,假如想需求再添加空间有必要扩展vg的巨细。

挂载前需求进行格式化

[root@localhost~]#mkfs.ext4/dev/vg1/lvol0

挂载

[root@localhost~]#mount/dev/vg1/lvol0/mnt/
  • 查询 lv
[root@localhost~]#lvs
LVVGAttrLSizePoolOriginData%Meta%MoveLogCpy%SyncConvert
rootcentos-wi-ao----28.99g
swapcentos-wi-ao----2.00g
lvol0vg1-wi-a-----<2.00g
[root@localhost~]#lvdisplay
---Logicalvolume---
LVPath/dev/centos/swap
LVNameswap
VGNamecentos
LVUUIDCa5lMo-NfBk-Ag1C-nKmM-ekFz-1B00-Okm5FC
LVWriteAccessread/write
LVCreationhost,timelocalhost,2022-09-0717:13:31+0800
LVStatusavailable
#open2
LVSize2.00GiB
CurrentLE512
Segments1
Allocationinherit
Readaheadsectorsauto
-currentlysetto8192
Blockdevice253:1
---Logicalvolume---
LVPath/dev/centos/root
LVNameroot
VGNamecentos
LVUUIDG2S2Aw-a22b-fQMc-uj2O-2D0h-VRvn-uUcFA5
LVWriteAccessread/write
LVCreationhost,timelocalhost,2022-09-0717:13:31+0800
LVStatusavailable
#open1
LVSize28.99GiB
CurrentLE7422
Segments1
Allocationinherit
Readaheadsectorsauto
-currentlysetto8192
Blockdevice253:0
---Logicalvolume---
LVPath/dev/vg1/lvol0
LVNamelvol0
VGNamevg1
LVUUID4GiMpd-hVhJ-wHbS-nsVa-ORKT-qq7n-bAlCOg
LVWriteAccessread/write
LVCreationhost,timelocalhost.localdomain,2022-11-0711:14:10+0800
LVStatusavailable
#open0
LVSize<2.00GiB
CurrentLE511
Segments1
Allocationinherit
Readaheadsectorsauto
-currentlysetto8192
Blockdevice253:2
  • 扫描lv
[root@localhost~]#lvscan
ACTIVE'/dev/centos/swap'[2.00GiB]inherit
ACTIVE'/dev/centos/root'[28.99GiB]inherit
ACTIVE'/dev/vg1/lvol0'[<2.00GiB]inherit
  • 删去lv
#没有进行挂载能够直接删去
[root@localhost~]#lvremove/dev/vg1/lvol0
Doyoureallywanttoremoveactivelogicalvolumevg1/lvol0?[y/n]:y
Logicalvolume"lvol0"successfullyremoved
#现已挂载的,需求先umount
[root@localhost~]#lvremove/dev/vg1/lvol0
Logicalvolumevg1/lvol0containsafilesysteminuse.
[root@localhost~]#umount/dev/vg1/lvol0
[root@localhost~]#lvremove/dev/vg1/lvol0
Doyoureallywanttoremoveactivelogicalvolumevg1/lvol0?[y/n]:y
Logicalvolume"lvol0"successfullyremoved

三、扩容

前面都是最根底的创立、删去、检查等操作,接下来看看扩容怎样操作。

之前创立 lv 运用了 vg1 的悉数空间,能够运用 vgdisplay 指令检查。

[root@localhost~]#pvdisplay
---Physicalvolume---
PVName/dev/sda2
VGNamecentos
PVSize<31.00GiB/notusable3.00MiB
Allocatableyes
PESize4.00MiB
TotalPE7935
FreePE1
AllocatedPE7934
PVUUIDEXKt0P-ICEf-iwsx-zZAI-I3G1-JZNX-DdXKxl
---Physicalvolume---
PVName/dev/sdb1
VGNamevg1
PVSize<2.00GiB/notusable3.00MiB
Allocatableyes(butfull)
PESize4.00MiB
TotalPE511
FreePE0
AllocatedPE511
PVUUID5QwCbX-mNJb-Gfe3-hQju-sTiR-TP1t-i1EofG
"/dev/sdc1"isanewphysicalvolumeof"<2.00GiB"
---NEWPhysicalvolume---
PVName/dev/sdc1
VGName
PVSize<2.00GiB
AllocatableNO
PESize0
TotalPE0
FreePE0
AllocatedPE0
PVUUIDqFAJ34-6Ef7-0PEw-letM-4Asq-sp0j-sKNuFn

能够看见 vg1 没有闲暇的 PE。

此时假如直接对 lv 进行扩容,则会呈现如下提示:

[root@localhost~]#lvextend-L+2000M/dev/vg1/lvol0
Insufficientfreespace:500extentsneeded,butonly0available

提示扩容需求 500 数量的 PE,但是0个可用。(1个PE巨细为4M)

假如 vg 的空间巨细足够,则不需求扩容 vg,直接运用 resize2fs

  1. 扩容 vg
[root@localhost~]#vgextendvg1/dev/sdc1
Volumegroup"vg1"successfullyextended
  1. 扩容 lv
[root@localhost~]#lvextend-L+2000M/dev/vg1/lvol0
Sizeoflogicalvolumevg1/lvol0changedfrom<2.00GiB(511extents)to<3.95GiB(1011extents).
Logicalvolumevg1/lvol0successfullyresized.

检查磁盘空间。

[root@localhost~]#df-h
文件体系容量已用可用已用%挂载点
devtmpfs908M0908M0%/dev
tmpfs919M0919M0%/dev/shm
tmpfs919M8.6M911M1%/run
tmpfs919M0919M0%/sys/fs/cgroup
/dev/mapper/centos-root29G1.5G28G6%/
/dev/sda11014M189M826M19%/boot
tmpfs184M0184M0%/run/user/0
/dev/mapper/vg1-lvol02.0G6.0M1.9G1%/mnt

发现 /dev/mapper/vg1-lvol0的空间还是2g。

此时不能运用 mkfs.ext4 指令,不然本来的文件会丢掉。

  1. resize2fs
[root@localhost~]#resize2fs/dev/vg1/lvol0
resize2fs1.42.9(28-Dec-2013)
Filesystemat/dev/vg1/lvol0ismountedon/mnt;on-lineresizingrequired
old_desc_blocks=1,new_desc_blocks=1
Thefilesystemon/dev/vg1/lvol0isnow1035264blockslong.
[root@localhost~]#df-h
文件体系容量已用可用已用%挂载点
devtmpfs908M0908M0%/dev
tmpfs919M0919M0%/dev/shm
tmpfs919M8.6M911M1%/run
tmpfs919M0919M0%/sys/fs/cgroup
/dev/mapper/centos-root29G1.5G28G6%/
/dev/sda11014M189M826M19%/boot
tmpfs184M0184M0%/run/user/0
/dev/mapper/vg1-lvol03.9G8.0M3.7G1%/mnt

注意:

假如是 xfs 文件体系,需求运用 xfs_growfs

[root@localhost/]#xfs_growfs/dev/centos/root
meta-data=/dev/mapper/centos-rootisize=512agcount=4,agsize=1900032blks
=sectsz=512attr=2,projid32bit=1
=crc=1finobt=0spinodes=0
data=bsize=4096blocks=7600128,imaxpct=25
=sunit=0swidth=0blks
naming=version2bsize=4096ascii-ci=0ftype=1
log=internalbsize=4096blocks=3711,version=2
=sectsz=512sunit=0blks,lazy-count=1
realtime=noneextsz=4096blocks=0,rtextents=0
datablockschangedfrom7600128to8124416