PVE重建 LVM-Thin 精简池:缩小默认 local-lvm 存储

背景

ProxmoxVE 的默认安装会创建 local 和 local-lvm 两个存储。其中local大约磁盘容量的10%,存储类别为目录。 大部分容量都给到了 local-lvm,也就是存储类别为 lvm-thin 的LVM精简卷。

前置知识: LVM逻辑卷管理器中,lv逻辑卷中还存在thin pool精简池模式,相当于 ESXI 的精简制备(Thin provisioning); thin pool精简池就是一个存储池,可以在池子的基础再新建lv逻辑卷,也就是thin volume精简卷。

因为考虑空间回收问题,我不想像大多数网上教程一样,把全部存储空间改成目录,下面介绍如何将默认的 local-lvm 存储重建(缩小)。

一条龙命令

#假设你已经有了一个名为 pve 的 LVM 卷组

lvcreate -L 100G -T pve/thinpool

lvcreate -V 99G --thin -n thinvolume pve/thinpool


#剩下的空间给到目录
lvresize --extents +100%FREE --resizefs pve/root  #+100%FREE也可以换成+多少G这种形式。

vim /etc/pve/storage.cfg

lvmthin: thinvolume
        thinpool thinpool
        vgname pve
        content images,rootdir

参考我的命令历史: image.png

一、删除默认thinpool精简池

  • 失败操作
root@pve:~# lvremove /dev/pve/data
Removing pool "data" will remove 3 dependent volume(s). Proceed? [y/n]: y
  Logical volume pve/vm-150-disk-0 in use.
  
root@pve:~# lvremove /dev/pve/data
Removing pool "data" will remove 3 dependent volume(s). Proceed? [y/n]: y
Do you really want to remove active logical volume pve/vm-150-disk-0? [y/n]: n
  Logical volume pve/vm-150-disk-0 not removed.
  • 成功
root@pve:~# lvremove /dev/pve/data
Removing pool "data" will remove 3 dependent volume(s). Proceed? [y/n]: y
Do you really want to remove active logical volume pve/vm-150-disk-0? [y/n]: y
  Logical volume "vm-150-disk-0" successfully removed
Do you really want to remove active logical volume pve/vm-150-state-test-lvm-thin? [y/n]: y
  Logical volume "vm-150-state-test-lvm-thin" successfully removed
  Logical volume "snap_vm-150-disk-0_test-lvm-thin" successfully removed
Do you really want to remove active logical volume pve/data? [y/n]: y
  Logical volume "data" successfully removed

删除后检查

LV
root@pve:~# lvscan
  ACTIVE            '/dev/pve/swap' [8.00 GiB] inherit
  ACTIVE            '/dev/pve/root' [96.00 GiB] inherit
root@pve:~# lvs
  LV   VG  Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root pve -wi-ao---- 96.00g
  swap pve -wi-ao----  8.00g
root@pve:~# lvdisplay
  --- Logical volume ---
  LV Path                /dev/pve/swap
  LV Name                swap
  VG Name                pve
  LV UUID                33LoWc-yYZH-VGZe-2tfz-WSZ0-a9V5-u4bdFr
  LV Write Access        read/write
  LV Creation host, time proxmox, 2024-01-12 02:55:36 +0800
  LV Status              available
  # open                 2
  LV Size                8.00 GiB
  Current LE             2048
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/pve/root
  LV Name                root
  VG Name                pve
  LV UUID                qy6z0m-FQ3z-uf3r-MX1y-83F8-fMK5-8yGt3T
  LV Write Access        read/write
  LV Creation host, time proxmox, 2024-01-12 02:55:36 +0800
  LV Status              available
  # open                 1
  LV Size                96.00 GiB
  Current LE             24576
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

lsblk

root@pve:~# lsblk
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
nvme0n1      259:0    0 476.9G  0 disk
├─nvme0n1p1  259:1    0  1007K  0 part
├─nvme0n1p2  259:2    0     1G  0 part /boot/efi
└─nvme0n1p3  259:3    0 475.9G  0 part
  ├─pve-swap 253:0    0     8G  0 lvm  [SWAP]
  └─pve-root 253:1    0    96G  0 lvm  /
VG(腾出来的容量在这)
root@pve:~# vgscan
  Found volume group "pve" using metadata type lvm2
root@pve:~# vgs
  VG  #PV #LV #SN Attr   VSize    VFree
  pve   1   2   0 wz--n- <475.94g <371.94g
root@pve:~# vgdisplay
  --- Volume group ---
  VG Name               pve
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  21
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <475.94 GiB
  PE Size               4.00 MiB
  Total PE              121840
  Alloc PE / Size       26624 / 104.00 GiB
  Free  PE / Size       95216 / <371.94 GiB
  VG UUID               8G6toh-RMyr-x1c7-sQ5O-eSve-ICQp-rw5Idx

lvextend -l 18111 /dev/pve/root

Web管理界面
已启用 是
活动 否
内容 磁盘映像, 容器
类别 LVM-Thin
使用率 N/A
没有移除虚拟机,导致无法还原原来ID

qm destroy 150 storage ’local-lvm’ does not exist

解决

 rm /etc/pve/qemu-server/150.conf 

二、创建精简池 + 创建精简卷LVM-Thin

1、创建thinpool精简池

必须在卷组之上创建精简池。

#创建
lvcreate [-L size(M/G) | -l PEnum] -n lv_name vg_name

lvcreate -L 100G -T pve/thinpool

lvcreate -L 80G --thin -n vmstore vmdata
  • lvcreate 是用于创建逻辑卷的命令。
  • -L | –size:根据大小创建 LV逻辑卷,即分配多少空间给此 LV
  • (-l |–extents :根据 PE 的数量来创建 LV,即分配多少个 PE 给此 LV)
  • -T | –thin:表示要创建一个精简配置的逻辑卷(thin volume),即一个用于存储 thin 卷的特殊逻辑卷。Thin pool 可以通过共享空闲空间来优化存储利用率。
  • -n:可以指定 LV 名称
  • 最后参数:pve/thinpool 是要创建的 thin pool 的名称,其中 pve 是逻辑卷组的名称。

2、在精简池中,创建thinvolume精简卷

必须在精简池之上创建精简卷。

lvcreate -V | --virtualsize 大小[m|UNIT] --thinpool LV VG
#例子
lvcreate -V 50G --thin -n thinvolume pve/thinpool

lvcreate -V 50G --thin -n thinvolume pve/thinpool

-V | –virtualsize:(-V看man说明指virtual size,这里-V就不能使用-L或者-l来代替指明容量了)

  • 实际占用空间与-V设置的大小可能不同,它不会立即占用这30GB空间
  • 空间的真正分配是动态的,随着数据的写入而逐渐增加
  • 所占用的存储来源于依附的thin pool池

PVE官方手册: 假设你已经有了 一个名为 pve 的 LVM 卷组,以下命令创建一个新的 LVM 精简池(大小 100G)

报错:WARNING: gpt signature detected on /dev/pve/local-thinpool at offset 512. Wipe it? [y/n]

lvcreate -L 100G -n local-thinpool pve
lvconvert --type thin-pool pve/local-thinpool

调整精简池的大小

调整 LV 和元数据池的大小可以通过以下命令方式实现。

# lvresize --size +<size[\M,G,T]> --poolmetadatasize +<size[\M,G]> <VG>/<LVThin_pool>

扩容数据池时,元数据池也必须扩容。

三、将空闲空间分配给目录

删除local-lvm给local扩容

lvremove pve/data     #移除local-lvm

vgdisplay pve | grep Free  #显示存在的卷组

lvextend -l +100%FREE -f pve/root     #将卷组中的空闲空间扩展到根目录

resize2fs /dev/mapper/pve-root     #刷新扩容根分区

Web控制台:添加存储

登陆WEB界面,打开宿主机“磁盘”管理,已经创建好了

去数据中心- 存储:添加 LVM-Thin类别

最终效果

image.png