1 LVM相关理论
1.1 LVM的作用及构成
想象一个场景,你在安装系统时分配该/home 50GB,随着后续使用导致/home 的文件系统不够大,这时需要怎么去解决?可以选择加装一块硬盘,重新分区格式化,将原来的数据迁移过来。这样的做法十分麻烦,并且重新分配的空间不能灵活地进行调整。我们可以使用LVM来弹性调整文件系统的容量。
LVM可以将多个物理分区整合在一起,像一个整体的硬盘一样使用,并且可以将其中的物理分区从LVM管理的磁盘上面移除。LVM全名 Logical Volume Manager,译作逻辑卷管理器。在实现LVM之前,需要了解几个概念。
- PV 物理卷,通过系统标识符来分辨的最低层的物理卷。实际可通过 fdisk 命令将硬盘分割为不同的物理卷。
- VG 卷用户组,由许多PV整合成一个VG,就是LVM管理的一个大磁盘。
- PE 物理扩展块,LVM中最小的存储块,每个VG最多有65534个PE
- LV 逻辑卷,由PV整合构成的VG最后会被分割层LV,类似于分区的概念。
lVM弹性调整文件系统的容量,实际上就是通过PE来实现的。通过交换PE来使原来LV内的PE转移到其他设备中,以此达到降低LV容量;将其他设备的PE加入到此LV内,实现扩大LV的容量。
1.2 LVM实现流程
2 LVM实现
2.1 硬盘分区
本次实验使用的是8GB的移动U盘,首先通过 fdisk 命令将硬盘分为大小为1.9GB的四个分区。fdisk命令的具体使用不展开。分割后,硬盘的分区情况如下:
Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 3995136 3993089 1.9G 83 Linux /dev/sdb2 3995648 7988224 3992577 1.9G 83 Linux /dev/sdb3 7989248 11982336 3993089 1.9G 83 Linux /dev/sdb4 11982848 15974399 3991552 1.9G 83 Linux
2.2 构建LVM
通过 pvcreate 命令将4个分区构建为PV,然后用 pvscan 查看系统内具有PV的磁盘。
root@lzm-PC:~# pvcreate /dev/sdb{1,2,3,4} Physical volume "/dev/sdb1" successfully created. Physical volume "/dev/sdb2" successfully created. Physical volume "/dev/sdb3" successfully created. Physical volume "/dev/sdb4" successfully created.
root@lzm-PC:~# pvscan PV /dev/sdb4 lvm2 [1.90 GiB] PV /dev/sdb2 lvm2 [1.90 GiB] PV /dev/sdb1 lvm2 [1.90 GiB] PV /dev/sdb3 lvm2 [1.90 GiB]
构建完成PV后,用 vgcreate 命令新建VG卷用户组。vgcreate 命令后的 -s 参数跟的是PE的大小。这里我们只使用3个PV来构建VG,构建完成后可以用 vgdisplay 命令查看卷用户组的状态。
root@lzm-PC:~# vgcreate -s 8MB vg_test /dev/sdb{1,2,3} Volume group "vg_test" successfully created
从VG状态看到,此时VG的容量为1.9*3=5.7GB
root@lzm-PC:~# vgdisplay --- Volume group --- VG Name vg_test System ID Format lvm2 Metadata Areas 3 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 3 Act PV 3 VG Size <5.70 GiB PE Size 8.00 MiB Total PE 729 Alloc PE / Size 0 / 0 Free PE / Size 729 / <5.70 GiB VG UUID Ua7yHh-wL3G-OlWj-bxoF-kzNl-kLSp-QVG4yJ
创造出VG大磁盘后,接下来要进行的就是新建分区。通过 lvcreate 命令将整个VG的容量都分配到vg_test 中去。
root@lzm-PC:~# lvcreate -l 729 -n lv_test vg_test Logical volume "lv_test" created.
通过 lvdisplay 可以看到 LV 的状态
root@lzm-PC:~# lvdisplay --- Logical volume --- LV Path /dev/vg_test/lv_test LV Name lv_test VG Name vg_test LV UUID XG44wY-LOPr-nemh-gcK4-GC1a-Z2Vx-SLXkjX LV Write Access read/write LV Creation host, time lzm-PC, 2019-04-30 10:44:02 +0800 LV Status available # open 0 LV Size <5.70 GiB Current LE 729 Segments 3 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
最后,我们创建文件系统并挂载磁盘。完成以下步骤后就可以使用 /mnt/lvm 内的资源了。
root@lzm-PC:~# mkfs -t ext3 /dev/vg_test/lv_test root@lzm-PC:~# mount /dev/vg_test/lv_test /mnt/lvm root@lzm-PC:~# df 文件系统 1K-块 已用 可用 已用% 挂载点 udev 3915108 0 3915108 0% /dev tmpfs 788172 3168 785004 1% /run /dev/nvme0n1p3 122476144 63709376 52502244 55% / tmpfs 3940848 43640 3897208 2% /dev/shm tmpfs 5120 4 5116 1% /run/lock tmpfs 3940848 0 3940848 0% /sys/fs/cgroup /dev/nvme0n1p1 306008 58560 247448 20% /boot/efi tmpfs 788168 28 788140 1% /run/user/1000 /dev/nvme0n1p2 124787928 41330544 83457384 34% /media/lzm/A0A29841A2981E3A /dev/sda2 234413052 52811968 181601084 23% /media/lzm/新加卷 /dev/mapper/vg_test-lv_test 5812528 11740 5502192 1% /mnt/lvm
总结构建 LV 的大致步骤:
- fdisk 划分硬盘分区
- pvcreate 在分区上创建PV物理卷
- vgcreate 创建卷用户组,同时指定PE大小
- lvcreate 创建LV,该命令可指定 LV 逻辑卷的大小
- mkfs、mount 创建文件系统并挂载磁盘
2.3 扩大LV容量
通过 pvscan 命令,可以看到4个分区中的 /dev/sdb4 还没有使用上。
root@lzm-PC:~# pvscan PV /dev/sdb1 VG vg_test lvm2 [<1.90 GiB / 0 free] PV /dev/sdb2 VG vg_test lvm2 [<1.90 GiB / 0 free] PV /dev/sdb3 VG vg_test lvm2 [<1.90 GiB / 0 free] PV /dev/sdb4 lvm2 [1.90 GiB]
通过 vgextend 命令加大VG容量。VG状态中243个未分配的PE。
root@lzm-PC:~# vgextend vg_test /dev/sdb4 Volume group "vg_test" successfully extended root@lzm-PC:~# vgdisplay --- Volume group --- VG Name vg_test System ID Format lvm2 Metadata Areas 4 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 4 Act PV 4 VG Size 7.59 GiB PE Size 8.00 MiB Total PE 972 Alloc PE / Size 729 / <5.70 GiB Free PE / Size 243 / <1.90 GiB // 剩余未分配的PE VG UUID Ua7yHh-wL3G-OlWj-bxoF-kzNl-kLSp-QVG4yJ
利用 lvresize 命令来增加 LV容量。lvresize 后 LV 的容量增加到7.59GB,此时只是LV的容量扩大了,文件系统并没有相应的增加,因此还需要使用 resize2fs 来更新文件系统的信息。
root@lzm-PC:~# lvresize -l +243 /dev/vg_test/lv_test Size of logical volume vg_test/lv_test changed from <5.70 GiB (729 extents) to 7.59 GiB (972 extents). Logical volume vg_test/lv_test successfully resized. root@lzm-PC:~# lvdisplay --- Logical volume --- LV Path /dev/vg_test/lv_test LV Name lv_test VG Name vg_test LV UUID XG44wY-LOPr-nemh-gcK4-GC1a-Z2Vx-SLXkjX LV Write Access read/write LV Creation host, time lzm-PC, 2019-04-30 10:44:02 +0800 LV Status available # open 1 LV Size 7.59 GiB Current LE 972 Segments 4 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
使用 resize2fs 将 LV 容量扩充到整个文件系统。
root@lzm-PC:~# resize2fs /dev/vg_test/lv_test root@lzm-PC:~# df /mnt/lvm 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/mapper/vg_test-lv_test 7772576 13196 7383492 1% /mnt/lvm
总结扩大 LV 容量的大致步骤:
- vgextend 扩大 VG 的容量
- lvresize 调整 LV 逻辑卷的容量
- resize2fs 将容量扩充到文件系统
2.4 缩小LV容量
首先将LV容量缩小,并且卸载后重新挂载磁盘。
// resize2fs 命令前系统提示需要进行磁盘检查 root@lzm-PC:~# e2fsck -f /dev/vg_test/lv_test root@lzm-PC:~# resize2fs /dev/vg_test/lv_test 5836M root@lzm-PC:~# umount /mnt/lvm // 重新挂载磁盘 root@lzm-PC:~# resize2fs /dev/vg_test/lv_test 5836M root@lzm-PC:~# mount /dev/vg_test/lv_test /mnt.lvm
假设我们需要移除 /dev/sdb3 分区,该分区的PE数量可以通过pvdisplay 获得,此处为243,上述新LV的容量也是这么计算出来的。
root@lzm-PC:~# lvresize -l -243 /dev/vg_test/lv_test
我们通过 lvdisplay 来查看 LV 容量调整后,PV物理卷的状态。
root@lzm-PC:~# lvdisplay--- Physical volume --- PV Name /dev/sdb3 VG Name vg_test PV Size 1.90 GiB / not usable 5.75 MiB Allocatable yes (but full) PE Size 8.00 MiB Total PE 243 Free PE 0 Allocated PE 243 PV UUID 4j09v7-4TT2-KJ0e-INGu-0KUU-fIUH-y1CSg3 --- Physical volume --- PV Name /dev/sdb4 VG Name vg_test PV Size 1.90 GiB / not usable 5.00 MiB Allocatable yes PE Size 8.00 MiB Total PE 243 Free PE 243 Allocated PE 0 PV UUID GMTmEY-lRqq-oa6Y-cf90-i015-voTH-N48R3C
这里移除的243个PE落在了 /dev/sdb4 上,可以使用 pvmove 命令将 /dev/sdb3 内的PE全部移动到 /dev/sdb4。
root@lzm-PC:~# pvmove /dev/sdb3 /dev/sdb4 root@lzm-PC:~# pvdisplay --- Physical volume --- PV Name /dev/sdb3 VG Name vg_test PV Size 1.90 GiB / not usable 5.75 MiB Allocatable yes PE Size 8.00 MiB Total PE 243 Free PE 243 Allocated PE 0 PV UUID 4j09v7-4TT2-KJ0e-INGu-0KUU-fIUH-y1CSg3 --- Physical volume --- PV Name /dev/sdb4 VG Name vg_test PV Size 1.90 GiB / not usable 5.00 MiB Allocatable yes (but full) PE Size 8.00 MiB Total PE 243 Free PE 0 Allocated PE 243 PV UUID GMTmEY-lRqq-oa6Y-cf90-i015-voTH-N48R3C
移动后 /dev/sdb3 中的PE不再被使用,接下来使用 vgreduce 将分区从VG中移除。
root@lzm-PC:~# vgreduce vg_test /dev/sdb3 Removed "/dev/sdb3" from volume group "vg_test"
最后,使用 pvremove 将分区中 PV中移除
root@lzm-PC:~# pvremove /dev/sdb3 Labels on physical volume "/dev/sdb3" successfully wiped.
总结缩小 LV 容量的大致步骤:
- resize2fs 缩小文件系统中 LV 的容量
- umount 卸载磁盘
- resize2fs 、mount重新挂载磁盘
- lvresize 缩小 LV 的容量
- pvmove 使移除分区不被使用中
- vgreduce 将分区移除 VG
- pvremove 将分区移除PV
3 LVM相关命令
阶段 | 命令 | 作用 |
PV阶段 | pvcreate 物理分区名 | 将物理分区新建成PV |
pvscan | 查询系统内具有PV的磁盘 | |
pvdisplay | 显示系统上的PV状态 | |
pvremove | 将物理分区的PV属性删除 | |
VG阶段 | vgcreate -s PE大小 VG名称 PV名称 | 新建VG |
vgscan | 查看系统上是否有VG存在 | |
vgdisplay | 显示系统上的VG状态 | |
vgextend VG名称 PV名称 | 在VG内增加额外的PV | |
vgreduce VG名称 PV名称 | 在VG内删除PV | |
vgremove VG名称 | 删除VG | |
LV阶段 | lvcreate -l PE数 -n LV名称 VG名称 | 新建LV |
lvscan | 查询系统上的LV | |
lvdisplay | 显示系统上的LV状态 | |
lvremove | 删除一个LV | |
lvresize | 对LV进行容量调整 |