Proxmox VE基于Debian Linux操作系统,也就是说Linux操作系统的逻辑卷管理LVM在Proxmox VE也是适用的。当我们在使用Proxmox VE的时候,如果发现某个分区的容量不够用了,想扩容了,怎么办?我们可以使用LVM工具,可以在磁盘不用重新分区的情况下,动态调整磁盘容量的大小。
逻辑卷管理(Logical Volume Manager,LVM)是Linux系统中比较重要的一种磁盘管理机制, LVM可以在磁盘不用重新分区的情况下动态调整文件系统的大小,实现文件系统跨越不同磁盘和分区。
1. LVM的基本概念
如果要了解LVM,则需要了解LVM中的一些基本概念,如下所列:
PD:物理磁盘(Physical Disk),如硬盘,或RAID硬盘。
PP:物理分区(Physical Partition),如硬盘的分区,或RAID硬盘的分区。
PV:物理卷(Physical Volume),是物理分区的LVM 抽象,是组成卷组的基本逻辑单元,一般一个PV对应一个PP。
VG:卷组(Volume Group,VG),是物理卷的一个集合,至少包含一个物理卷。卷组的大小取决于物理卷的容量和个数。
LV:逻辑卷(Logical Volume),在卷组的基础之上创建的逻辑磁盘。
PE:物理扩展单元(Physical Extends),每个PV都会以PE为基本单元划分,即逻辑意义上磁盘的最小存储单元。PE的大小是可以配置的,默认为4MB。
2. Proxmox VE的LVM逻辑架构
在了解了LVM的基本概念之后,我们再来了解一下Proxmox VE的LVM逻辑架构是什么样的,Proxmox VE的LVM逻辑架构如图1所示。
请大家务必熟悉这个Proxmox VE的LVM逻辑架构图,我下面关于Proxmox VE的LVM的内容都是围绕着这个图来展开。
根据图1可以看出,Proxmox VE的LVM逻辑架构就非常清晰了,LVM层是建立在物理层之上文件系统之下的一个逻辑层,通过LVM可以将物理层转换为物理卷组,若干个物理卷集合成卷组,在卷组中可以任何创建逻辑卷,并进一步在逻辑卷上创建文件系统,最后将逻辑卷挂载到某个挂载点目录上就可以使用逻辑卷了。逻辑卷的使用方法与普通的磁盘分区完全一样。
图1中的系统盘的LVM特性是Proxmox VE安装时自动生成的,可以说是默认LVM配置,下面我就来讲一下这个Proxmox VE的LVM逻辑架构:
-
物理磁盘层(PD)
磁盘/dev/sda是Proxmox VE的系统盘,磁盘/dev/sdb、/dev/sdc和/dev/sdd是数据盘。 -
物理分区层(PP)
针对系统盘,在Proxmox VE安装时,Proxmox VE对/dev/sda磁盘进行分区,划分为/dev/sda1分区、/dev/sda2分区和/dev/sda3分区等三个分区;其中/dev/sda1分区是BIOS boot分区,不能应用LVM机制。/dev/sda2分区是EFI系统分区,也不能应用LVM机制。/dev/sda3应用LVM机制。针对数据盘,可根据实际情况对数据盘进行分区或不分区,我在/dev/sdb划分了/dev/sdb1和/dev/sdb2两个分区,/dev/sdc划分了/dev/sdc1和/dev/sdc2两个分区,/dev/sdd则不划分区。
-
物理卷层(PV)
针对系统盘,在Proxmox VE安装时,Proxmox VE把第三个分区/dev/sda3进行LVM格式化,也就是将磁盘分区/dev/sda3转化为物理卷/dev/sda3,物理卷的名称为“/dev/sda3”。针对数据盘,可根据实际情况对数据盘进行物理卷转化,我将磁盘分区/dev/sdb1转化为物理卷/dev/sdb1,将磁盘分区/dev/sdb2转化为物理卷/dev/sdb2,将磁盘分区/dev/sdc1转化为物理卷/dev/sdc1,将磁盘分区/dev/sdc2转化为物理卷/dev/sdc2,将磁盘/dev/sdd转化为物理卷/dev/sdd。
-
卷组层(VG)
针对系统盘,在Proxmox VE安装时,Proxmox VE创建了一个名称为“pve”的卷组,同时将物理卷/dev/sda3加入到卷组pve中,也就是说pve卷组中只有一个物理卷。针对数据盘,可根据实际情况创建卷组,我创建了一个名称为“lisq”的卷组,然后将物理卷/dev/sdb1和物理卷/dev/sdc1加入到卷组lisq中。创建了一个名称为“cdy”的卷组,然后将物理卷/dev/sdb2和物理卷/dev/sdc2加入到卷组cdy中。创了一个名称为“lixs”的卷组,然后将物理卷/dev/sdd加入到卷组lixs中。
-
逻辑卷层(LV)
针对系统盘,在Proxmox VE安装时,Proxmox VE在卷组pve之上创建了三个名称分别为“root”、“data”和“swap”的逻辑卷。其中逻辑卷data主要用于虚拟机磁盘,在创建虚拟机的时候,通过对逻辑卷data划分空间,作为虚拟机磁盘,所以虚拟机磁盘也属于逻辑卷。另外逻辑卷data还需要划分一定的空间,作为元数据池和元数据池备份。针对数据盘,可根据实际情况创建逻辑卷,我在lisq卷组之上创建了一个名称分别为“mydata”的逻辑卷,在cdy卷组之上不创建逻辑卷,在lixs卷组之上创建一个名称为“mydir”的逻辑卷。
-
文件系统层(FS)
针对系统盘,磁盘分区/dev/sda1是BIOS boot分区,磁盘分区/dev/sda2是EFI分区,都不能应用LVM机制,在Proxmox VE安装时,Proxmox VE在磁盘分区/dev/sda1之上创建BIOS boot文件系统,在磁盘分区/dev/sda2之上创建vfat文件系统,在逻辑卷root之上创建ext4文件系统,在逻辑卷虚拟机磁盘之上创建ext3文件系统,在逻辑卷swap之上创建swap文件系统。针对数据盘,可根据实际情况创建逻辑卷,我在逻辑卷mydata之上创建ext4文件系统,在卷组cdy之上创建ext4文件系统,在逻辑卷mydir之上创建ext4文件系统。
-
挂载层(ML)
针对系统盘,磁盘分区/dev/sda1挂载到“/boot”目录上,磁盘分区/dev/sda2属于EFI系统分区,无需挂载。逻辑卷root挂载到“/”上,具体是挂载到“/var/lib/vz”目录上(下文内容会有说明)。逻辑卷虚拟机磁盘无需挂载(下文内容会有说明)。逻辑卷swap是交换分区,不用指定挂载点,或者以[SWAP]表示挂载点。针对数据盘,可根据实际情况选择目录进行挂载,我将逻辑卷mydata挂载到Proxmox VE的LVM-Thin存储点,将卷组cdy挂载到Proxmox VE的LVM存储点,将逻辑卷mydir挂载到Proxmox VE的目录存储点。
3. Proxmox VE的默认LVM设置
以Proxmox VE 7.0为例,如果选择使用ext4或xfs文件系统进行安装,那么除了EFI系统分区和BIOS boot分区之外,目标硬盘剩余的磁盘空间被格式化为LVM卷组,并且可通过“Optinos”按钮进一步设置LVM的空间大小。
选择默认的文件系统“ext4”进行系统安装,如图2所示。
关于更具体的EXT4/XFS文件系统安装方式,请参加《Proxmox VE 7.0的高级安装及系统盘分区-EXT4(上)》文章内容。
3.1. Proxmox VE默认磁盘分区
Proxmox VE 7.0安装完成之后,我们来看一下Proxmox VE的磁盘分区情况,可以通过WEB UI界面可查看,如图3所示。
更详细的磁盘分区情况,需要通过命令行CLI进行查看,如下列所示:
root@pve:~# fdisk -l
Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors #/dev/sda是系统盘,有3个分区
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: E1A3BA78-BE83-4FC0-8F2C-004A670AB19B
Device Start End Sectors Size Type
/dev/sda1 34 2047 2014 1007K BIOS boot #/dev/sda1分区,BIOS boot类型分区
/dev/sda2 2048 1050623 1048576 512M EFI System #/dev/sda2分区,EFI系统类型分区
/dev/sda3 1050624 83886046 82835423 39.5G Linux LVM #/dev/sda3分区,LVM类型分区
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors #/dev/sdb磁盘,未分区
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdc: 100 GiB, 107374182400 bytes, 209715200 sectors #/dev/sdc磁盘,未分区
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdd: 100 GiB, 107374182400 bytes, 209715200 sectors #/dev/sdd磁盘,未分区
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/pve-swap: 4 GiB, 4294967296 bytes, 8388608 sectors #swap逻辑卷设备
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/pve-root: 9.75 GiB, 10468982784 bytes, 20447232 sectors #root逻辑卷设备
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
3.2. Proxmox VE默认LVM
Proxmox VE 7.0安装完成之后,我们来看一下Proxmox VE的LVM情况,可以通过第三方WEB UI界面可查看。
3.2.1. Proxmox VE默认物理卷(PV)
结合图1,我们可以看到,Proxmox VE将磁盘分区/dev/sda3转化为物理卷/dev/sda3,物理卷的名称为“/dev/sda3”,如图4和图5所示。
在图5中,是物理卷/dev/sda3的配置信息,磁盘大小为39.5GB,PE分配块大小为4MB。其中物理卷/dev/sda3分配了4GB空间给逻辑卷swap,分配了9.75GB空间给逻辑卷root,分配了18.87空间给逻辑卷data_tdata(数据池,用于虚拟机磁盘),分配了1GB空间给逻辑卷data_tmeta(元数据池,用于管理与检索数据池),分配了1GB空间给逻辑卷lvol0_pmspare(元数据池备份)。也就是说:
在Proxmox VE 7.0的界面上,我们也可以看到逻辑卷data、逻辑卷data_tdata和逻辑卷data_tmeta的一些简单信息,逻辑卷lvol0_pmspare在界面上没有显示,如图6所示。
上面是使用WEB UI进行查看,也可以使用命令行CLI进行查看,会有更详细的物理卷信息,如下所列:
root@pve:~# pvs
PV VG Fmt Attr PSize PFree #物理卷PV的名称:/dev/sda3
/dev/sda3 pve lvm2 a-- <39.50g <4.88g
root@pve:~# pvdisplay
--- Physical volume ---
PV Name /dev/sda3 #物理卷PV的名称:/dev/sda3
VG Name pve #卷组VG的名称:pve,指/dev/sda3所在的卷组
PV Size <39.50 GiB / not usable 2.98 MiB #物理卷的容量:39.50GB
Allocatable yes #是否可分配:是
PE Size 4.00 MiB #物理区块大小:4MB
Total PE 10111 #物理区块总量:10111个
Free PE 1248 #已分配的物理区块:8863个
Allocated PE 8863 #空闲的物理区块:1248个
PV UUID Ny0mtE-hiIR-IVRB-33aA-dKZe-uKyL-gtbWkM #物理卷PV的UUID
root@pve:~# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
├─sda1
├─sda2 vfat FAT32 F92A-97E4
└─sda3 LVM2_member LVM2 001 Ny0mtE-hiIR-IVRB-33aA-dKZe-uKyL-gtbWkM
├─pve-swap swap 1 d971d023-1e21-4db4-b083-35581f2fc965 [SWAP]
├─pve-root ext4 1.0 9cbd71dd-b8a4-473e-a503-48c8c0c0928b 6.1G 30% /
├─pve-data_tmeta #逻辑卷data_tmeta,元数据池
│ └─pve-data
└─pve-data_tdata #逻辑卷data_tdata,元数据池
└─pve-data
3.2.2. Proxmox VE默认卷组(VG)
结合图1,我们可以看到,Proxmox VE创建了一个名称为“pve”的卷组,同时将物理卷/dev/sda3加入到卷组pve中,也就是说pve卷组中只有一个物理卷,如图7和图8所示。
图8中,卷组pve的空间是39.5GB,这个空间大小等于物理卷/dev/sda3空间大小,因为卷组pve有一个物理卷/dev/sda3组成。
上面是使用WEB UI进行查看,也可以使用命令行CLI进行查看,会有更详细的卷组信息,如下所列:
root@pve:~# vgs
VG #PV #LV #SN Attr VSize VFree #卷组VG的名称:pve
pve 1 5 0 wz--n- <39.50g <4.88g
root@pve:~# vgdisplay
--- Volume group ---
VG Name pve #卷组VG的名称:pve
System ID
Format lvm2 #格式化类型:lvm2
Metadata Areas 1 #元数据区域:1
Metadata Sequence No 7
VG Access read/write #VG访问权限:读写
VG Status resizable #VG状态:可改变大小
MAX LV 0 #最大逻辑卷数量,Proxmox VE没有给出数值
Cur LV 3 #当前逻辑卷:3个
Open LV 2 #可打开的逻辑卷:2个,data逻辑卷是无法打开的
Max PV 0 #最大物理卷数量,Proxmox VE没有给出数值
Cur PV 1 #当前物理卷数量:1个,指pve卷组中的物理卷数量
Act PV 1 #当前激活的物理卷:1个,指pve卷组中的激活物理卷数量
VG Size <39.50 GiB #卷组VG的容量:39.5OGB
PE Size 4.00 MiB #物理区块大小:4MB
Total PE 10111 #物理区块总量:10111个
Alloc PE / Size 8863 / 34.62 GiB #已分配的物理区块:8863个
Free PE / Size 1248 / <4.88 GiB #空闲的物理区块:1248个
VG UUID H60lKU-9yzf-4t64-NvQK-MQkU-PFp9-Vg3Xds #卷组VG的UUID
3.2.3. Proxmox VE默认逻辑卷(LV)
结合图1,Proxmox VE在卷组pve之上创建了三个名称分别为“root”、“data”和“swap”的逻辑卷。其中逻辑卷data主要用于虚拟机磁盘,在创建虚拟机的时候,通过对逻辑卷data划分空间,作为虚拟机磁盘,所以虚拟机磁盘也属于逻辑卷。另外逻辑卷data还需要划分一定的空间,作为元数据池和元数据池备份,如图9、图10、图11和图12所示。
图10中,我们可以看到,逻辑卷swap的设备文件是/dev/pve/swap,以虚拟内存形式加载,从物理卷/dev/sda3分配了4GB空间给swap。
图11中,我们可以看到,逻辑卷root的设备文件是/dev/pve/root,以ext4文件系统加载,从物理卷/dev/sda3分配了9.75GB空间给root。注意,从图11中我们发现,默认情况下,逻辑卷/dev/pve/root空间已使用36%。
默认情况下,逻辑卷data的设备文件是/dev/pve/data,我们根据图5和图6知道,逻辑卷data还继续细分为data_tmeta、data_tdata以及lvol0_pmspare元数据池备份,其中虚拟机磁盘存放在data_tdata,所以当我们创建虚拟机之后,设备文件/dev/pve/data就会被系统自动删除,取而代之的是虚拟机磁盘,如下所列:
在创建虚拟机之前:
root@pve:~# ls /dev/pve/
data root swap #卷组pve中有逻辑卷data
在创建虚拟机之后:
root@pve:~# ls /dev/pve/
root swap vm-100-disk-0 #卷组pve中自动删除逻辑卷data,出现虚拟机磁盘(也是逻辑卷)
root@pve:~# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
├─sda1
├─sda2 vfat FAT32 F92A-97E4
└─sda3 LVM2_member LVM2 001 Ny0mtE-hiIR-IVRB-33aA-dKZe-uKyL-gtbWkM
├─pve-swap swap 1 d971d023-1e21-4db4-b083-35581f2fc965 [SWAP]
├─pve-root ext4 1.0 9cbd71dd-b8a4-473e-a503-48c8c0c0928b 3.2G 61% /
├─pve-data_tmeta
│ └─pve-data-tpool
│ ├─pve-data
│ └─pve-vm--100--disk--0 #管理与检索虚拟机磁盘逻辑卷的数据
└─pve-data_tdata
└─pve-data-tpool
├─pve-data
└─pve-vm--100--disk--0 #虚拟机磁盘逻辑卷
在Proxmox VE 7.0 界面中,我们可以看到逻辑卷root的配置信息,如图13所示。
结合图11和图13,Proxmox VE 7.0安装完成之后,我没有备份数据、也没有上传ISO镜像和容器模板,但是默认情况下逻辑卷root却使用了3GB空间,这3GB是什么数据,来源于哪里,目前不清楚,官方文档也没有相关说明。
上面是使用WEB UI进行查看,也可以使用命令行CLI进行查看,会有更详细的卷组信息,如下所列:
root@pve:~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data pve twi-aotz-- 18.87g 0.00 1.58
root pve -wi-ao---- 9.75g
swap pve -wi-ao---- 4.00g
vm-100-disk-0 pve Vwi-a-tz-- 32.00g data 0.00
root@pve:~# lvdisplay
--- Logical volume ---
LV Path /dev/pve/swap #逻辑卷LV路径,有访问路径说明逻辑卷可以找到
LV Name swap #逻辑卷LV名称:swap
VG Name pve #卷组VG名称:pve
LV UUID 6wn1yh-aNdA-cy3j-A3tL-dvw3-80lF-oJ3UbH #逻辑卷LV的UUID
LV Write Access read/write #逻辑卷访问权限:读写
LV Creation host, time proxmox, 2021-09-27 15:15:28 +0800 #逻辑卷建立时间
LV Status available #逻辑卷状态:有效
# open 2
LV Size 4.00 GiB #逻辑卷容量:4.0GB
Current LE 1024 #逻辑区块:1024个
Segments 1
Allocation inherit #分配属性:继承
Read ahead sectors auto
- currently set to 256
Block device 253:0
--- Logical volume ---
LV Path /dev/pve/root #逻辑卷LV路径,有访问路径说明逻辑卷可以找到
LV Name root #逻辑卷LV名称:root
VG Name pve #卷组VG名称:pve
LV UUID Mk60AC-IDpp-uJa0-Q69h-lovS-52tX-1dafq1
LV Write Access read/write
LV Creation host, time proxmox, 2021-09-27 15:15:28 +0800
LV Status available
# open 1
LV Size 9.75 GiB
Current LE 2496
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
--- Logical volume ---
LV Name data #逻辑卷LV名称:data,没有访问路径,无法通过路径找到
VG Name pve #卷组VG名称:pve
LV UUID 5bTP6h-etm2-5VjW-QwaA-Kp46-aMHv-MjW82u
LV Write Access read/write
LV Creation host, time proxmox, 2021-09-27 15:15:29 +0800
LV Pool metadata data_tmeta #卷组池元数据,这也是逻辑卷
LV Pool data data_tdata #卷组池数据,这也是逻辑卷
LV Status available
# open 0
LV Size 18.87 GiB #逻辑卷容量:18.87GB
Allocated pool data 0.00% #数据使用空间:0%,说明数据池还没有数据
Allocated metadata 1.58% #元数据使用空间:1.58%,元数据池已经有数据
Current LE 4831
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:4
3.2.4. Proxmox VE默认挂载层(ML)
磁盘分区/dev/sda1挂载点:/boot
根据图1和图3,Proxmox VE的磁盘分区/dev/sda1属于BIOS boot分区,挂载到“/boot”目录上,/boot中主要存放系统启动所必需的文件,不能应用LVM机制。
磁盘分区/dev/sda2挂载点:无
根据图1和图3,Proxmox VE的磁盘分区/dev/sda2属于EFI系统分区,也不能应用LVM机制,无需挂载。
逻辑卷root挂载点:/ 或 /var/lib/vz
根据Proxmox官方文档,Proxmox VE的逻辑卷挂载点是根目录“/”,从Proxmox VE 4.2版本以后,“/var/lib/vz”目录被包含到逻辑卷root中,如图14所示。
也就是说,根据图14,我们可以知道逻辑卷root的存储路径是“/var/lib/vz”目录,这一点也可以从图15来验证。
我们都知道,Proxmox VE是一个虚拟化平台,是基于KVM虚拟化技术,所以肯定具备KVM虚拟化特性。KVM的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的,KVM将宿主机目录/var/lib/libvirt/images作为默认的存储池,存储池定义在宿主机的/etc/libvirt/storage目录下。Proxmox VE通过对KVM进行优化,将宿主机目录/var/lib/vz作为默认的存储池,存储池定义在宿主机的/etc/pve/storage.cfg。
root@pve:/etc/pve# cat storage.cfg
dir: local
path /var/lib/vz
content iso,vztmpl,backup
lvmthin: local-lvm
thinpool data
vgname pve
content rootdir,images
逻辑卷data挂载点:无
根据图1可以知道,逻辑卷data由逻辑卷data_tmeta、逻辑卷data_tdata以及逻辑卷lvol0_pmspare元数据池备份组成,逻辑卷data无需挂载。
没有挂载到目录上去,我们就无法从挂载点去访问逻辑卷data的内容,比方说我们创建了虚拟机磁盘之后,这个虚拟机磁盘存放在data_tdata中,由于没挂载点,我们无法去读写虚拟机磁盘的内容,从这个角度来说,逻辑卷data确实需要一个挂载点好一些,方便读写虚拟机磁盘内容。但是,我们都知道虚拟机磁盘多的话可能有成千上万,那是不是得需要搞成千上万个挂载点呢,所以,从这个角度讲,逻辑卷data确实没有必要搞挂载点。
一切都没关系,我们有一种更优的方法去读写虚拟机磁盘,我们可以通过虚拟机图形界面去操作,就可以读写虚拟机磁盘了,所以没有必须要给虚拟机磁盘挂载,通过挂载点访问只不过是其中一种读取方式而已,尤其是,成千上万的虚拟机磁盘呢,挂载就不具备可行性了,如图16所示。
逻辑卷swap挂载点:无
逻辑卷swap是交换分区,不用指定挂载点,或者以[SWAP]表示挂载点。