简介
大多数朋友用了很久的Proxmox VE却还是不理解Proxmox VE的存储。可想而知,对于新入门且没有虚拟化基础的朋友应该很难理解。由于之前的教程过于零散,叙述可能也有些问题,所以诞生了本文。
本文旨在能够让读者理解Proxmox VE存储是什么样的,怎么使用,
怎么维护。偏向原理,所以需要读者去多去理解它。
为了码字方便,下面将Proxmox VE简称为PVE。
PVE支持的存储类型
下表是PVE支持的后端存储类型。
名称 | PVE名称 | 级别 | 支持共享 | 支持快照 | 是否稳定 |
---|---|---|---|---|---|
ZFS(本地) | zfspool | 块 | 否 | 是 | 是 |
目录 | dir | 文件 | 否 | 否1 | 是 |
BTRFS | btrfs | 文件 | 否 | 是 | 实验性 |
Proxmox Backup | pbs | 均是 | 是 | n/a | 是 |
NFS | nfs | 文件 | 是 | 否1 | 是 |
CIFS | cifs | 文件 | 是 | 否1 | 否 |
GlusterFS | glusterfs | 文件 | 是 | 否1 | 是 |
CephFS | cephfs | 文件 | 是 | 是 | 是 |
LVM | lvm | 块 | 否2 | 否 | 是 |
LVM-thin | lvmthin | 块 | 否 | 是 | 是 |
iSCSI/kernel | iscsi | 块 | 是 | 否 | 是 |
iSCSI/libiscsi | iscsidir ect | 块 | 是 | 否 | 是 |
Ceph/RBD | rbd | 块 | 是 | 是 | 是 |
ZFS over iSCSi | zsf | 块 | 是 | 是 | 是 |
注:
- 在基于文件系统的存储上,可通过使用 qcow2 格式虚拟磁盘来实现快照。
- 可以在 iSCSI 存储上配置 LVM,从而获得共享 存储。
我们可以通过上表看到有很多的存储。从类别上,我们可以看到主要有2种:
- 块
虚拟机磁盘是类似于磁盘分区的形式,他不能进行文件操作。代表后端lvm/lvm-thin,ceph,zfs。新手可以理解他直接使用的是E盘,而不是E盘里的一个文件。 - 文件
文件存储是虚拟机作为一种文件存在,如qcow2,raw,vmdk文件,可以像普通文件一样操作。
现在我们一起来了解一下这些存储后端是什么。
在这个环节中,我们需要带着一个疑问,这些存储他们为什么是块存储或者为什么文件存储。
目录
目录是最基本的后端存储方式,PVE支持将系统上的某一个目录作为存储后端(前提是有读写权限)。
你可以随意创建一个文件夹,
如mkdir /data
随后去PVE面板上添加这个目录即可
此种方式,是将虚拟机磁盘作为文件方式存储,如qcow2,raw,vmdk格式。也得注意!仅磁盘格式为qcow2支持快照
LVM和LVM-thin
LVM有3个概念,一个是PV,一个是VG,一个是LV。
- PV 物理卷
- VG 卷组
- LV 逻辑卷
PV可以是一整个磁盘,也可以是一个分区。VG是一个PV或者多个PV组成的卷组。LV是一个VG下面的逻辑卷。
更多请参考
LVM——让Linux磁盘空间的弹性管理 – 知乎 (zhihu.com)
LVM管理 – 苦逼运维 – 博客园 (cnblogs.com)
LVM (简体中文) – ArchWiki (archlinux.org)
LVM
我们先说LVM。我们可以前往网页上,选中节点,展开磁盘选项,选择LVM,点击创建VG,选择磁盘和名称即可。
我这里创建一个名为lvm的lvm存储后端。
创建一个虚拟机,他的磁盘为vm-100-disk-0
,位置在/dev/lvm/vm-100-disk-0
如上面的例子,我们通过命令查看lv
root@pve:~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
vm-100-disk-0 lvm -wi-a----- 32.00g
root@pve:~# lvdisplay
--- Logical volume ---
LV Path /dev/lvm/vm-100-disk-0
LV Name vm-100-disk-0
VG Name lvm
LV UUID d3iw1e-2I8R-VfG7-wWQZ-UNNV-sTEd-EKjIkv
LV Write Access read/write
LV Creation host, time pve, 2022-08-15 03:02:07 +0000
LV Status available
# open 0
LV Size 32.00 GiB
Current LE 8192
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
按照正常的逻辑,我们要使用lvm,创建好lv之后,就需要对lv进行格式化,但是PVE并不这样。
PVE将LVM下的LV作为虚拟磁盘
LVM-thin
这是使用iso安装PVE后,默认的虚拟磁盘后端就是LVM-thin。
LVM-thin是一个非常精巧的文件系统,最直接的表现就是LVM-thin它可以超配,例如你的物理磁盘只有1T,使用LVM-thin之后,你可以分配总大小超过1T的磁盘。它是用多少,占用多少空间,且支持快照。
下面是我将一个100G的磁盘创建成了lvm-thin,并给100虚拟机创建了一个2T的磁盘。
root@pve:~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
thinpool thinpool twi-aotz-- 97.87g 0.00 1.61
vm-100-disk-0 thinpool Vwi-a-tz-- 2.00t thinpool 0.00
确实很强。
我们可以看到这个磁盘也是属于LV,那么对于LVM-thin后端来说,PVE也是直接将lv作为磁盘后端。
所以,当我们使用LVM-thin后端时,要记住PVE是直接创建并LV,前往不要自己去创建LV,挂载LV,再将挂载的目录存储虚拟机
ZFS本地文件系统
ZFS是在笔者眼里,是最强大的本地文件系统。具体怎么个强大法,我们不去深究,这是课外知识,有兴趣大家可以阅读下面文章
提升ZFS性能的10个简便方法_weixin_34092455的博客-CSDN博客
Oracle Solaris ZFS 文件系统(介绍) – Oracle Solaris 管理:ZFS 文件系统
提高truenas上zfs性能的几个小tips – 广陌 (utopiafar.com)
本节重点来了。PS.上面大多都没着重说明。
ZFS储存数据有2个迷糊点:
- zvol(卷):类似于分区
- dataset(数据集):文件夹
dataset
dataset
可以认为是一个特殊的文件夹,这个文件夹可以自定义zfs的一些特性,如去重策略,压缩策略,快照等等。注意,这里说的是文件夹,那么就可以存放文件,进行文件操作。
例如,我在zff池中,创建一个名为data的数据集,
zfs create zff/data
它在zfs的结构如下
root@pve:~# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zff 21.7G 74.7G 96K /zff
zff/data 96K 74.7G 96K /zff/data
挂载点在/zff/data
我们在这个目录中创建3个文件,可以通过tree命令看到目录树。
root@pve:/zff/data# touch this is data
root@pve:/zff/data# cd ..
root@pve:/zff# tree
.
└── data
├── data
├── is
└── this
1 directory, 3 files
随后我们将data这个数据集给挂载到/data位置
root@pve:/zff# zfs set mountpoint=/data zff/data
root@pve:/zff# tree
.
0 directories, 0 files
root@pve:/data# ls
data is this
可以看到zff目录下已经没有data了,在/data目录中有着相应的文件。
所以我们可以认为zfs的数据集(dataset)是一种特殊的文件夹,这有点类似于btrfs的子卷。
他不同于一般的文件夹,他可以单独快照,不能被rm
删除,不同的数据集,可以配置不同的策略。
zvol
zvol
也叫zfs 卷。当创建一个zvol
卷时,他会被标识为一个独立块设备
,位于/dev/zvol/{dsk,rdsk}/pool
。
在PVE上使用默认方式创建ZFS存储池后,虚拟机磁盘则会是一个zvol,如我创建了一个vmid为100的虚拟机,他的磁盘在zfs的位置是zff/vm-100-disk-0
root@pve:~# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zff 21.7G 74.7G 96K /zff
zff/vm-100-disk-0 21.7G 96.4G 56K -
root@pve:~#
在系统上的位置是/dev/zvol/zff/vm-100-disk-0
zvol
通常用于iscsi,swap以及虚拟机存储。
zvol
可以被创建在任意的一个数据集中,如我创建一个zvol
root@pve:/zff# zfs create -V 30G zff/data/zvoltest
我们再去查看zfs的结构
root@pve:/zff# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zff 52.6G 43.8G 96K /zff
zff/data 30.9G 43.8G 96K /data
zff/data/zvoltest 30.9G 74.7G 56K -
zff/vm-100-disk-0 21.7G 65.5G 56K -
root@pve:/zff# ls /data
root@pve:/zff# ls /dev/zff/data/zvoltest
/dev/zff/data/zvoltest
可以发现,创建的zvoltest
并不存在于/data
目录下,而是在/dev/zff/data/zvoltest
,linux中,/dev
目录下,均是设备,所以大家一定要记住,zvol
对系统来说是一个设备。
同时这个zvol
也和dataset
一样,可以设置单独的zfs策略,快照,块大小等等,尽管它可能存在某个dataset
下,但就是可以单独搞,这有点像套娃。不错,zfs的dataset
就是可以套娃,可以在一个dataset
下创建新的dataset
,然后在这个新的dataset
下,继续创建dataset
。
那么zvol
可以套娃吗?
PVE与zfs
经过上面的叙述,是否明白了,zfs的zvol和dataset的主要区别?
zvol
是块设备。dataset
是特殊的文件夹。zvol
可以创建在dataset
下。
PVE对zfs的支持仅只有zvol
这一种方式。例如,我们创建了一个zfs之后,在面板上添加存储时,ZFS池有2个选项,这一个是zff大池,一个是zff下名为data的数据集。
这意味着PVE支持将磁盘放置到池顶级dataset
中,也可以放到子dataset
中。
在内容选择上,只支持磁盘映像和容器。这直接说明了,PVE的ZFS并不是以文件方式存储磁盘映像的,而是通过块存储——zvol
。
如果你想要PVE上的ZFS池使用文件方式存储虚拟机镜像怎么办?
前面说了,zfs可以将dataset
挂载到一个目录,那么在PVE的面板上,以目录方式添加存储,选择dataset
路径即可。
此种方式,这将失去PVE对zfs的自动优化,你必须需要手动进行设置zfs的策略,且仅磁盘格式为qcow2才支持快照
No Comments