{pve} 存储模型非常灵活。虚拟机镜像可以存储在一个或多个本地存储上,或者存储在NFS或iSCSI(NAS, SAN)这样的共享存储上。没有限制,你可以根据需要配置尽可能多的存储池。你可以使用Debian Linux支持的所有存储技术。
将虚拟机存储在共享存储上的一个主要好处是能够在没有任何停机时间的情况下实现正在运行的机器的实时迁移,因为集群中的所有节点都可以直接访问虚拟机磁盘镜像。没有必要复制虚拟机镜像数据,所以在这种情况下实时迁移是非常快速的。
存储库(包 libpve-storage-perl
)使用一个灵活的插件系统为所有存储类型提供了一个共同的接口。这可以轻松地适配以后包含更多的存储类型。
存储类型
基本上有两类不同的存储类型:
- 文件级存储
-
基于文件级别的存储技术允许访问具有完整特性的(POSIX)文件系统。它们通常比任何块级存储(见下文)更灵活,并允许你存储任何类型的内容。ZFS可能是最先进的系统,它完全支持快照和克隆。
- 块级存储
-
允许存储大型的“原始”图片。通常无法在这类存储类型上存储其他文件(ISO、备份等)。大多数现代的块级存储实现支持快照和克隆。RADOS和GlusterFS是分布式系统,将存储数据复制到不同的节点。
描述 | 插件类型 | 层级 | 共享 | 快照 | 稳定性 |
---|---|---|---|---|---|
ZFS (本地) |
|
双重1 |
否 |
是 |
是 |
目录 |
|
文件 |
否 |
否2 |
是 |
BTRFS |
|
文件 |
否 |
是 |
技术预览 |
NFS |
|
文件 |
是 |
否2 |
是 |
CIFS |
|
文件 |
是 |
否2 |
是 |
Proxmox 备份 |
|
双重 |
是 |
不适用 |
是 |
GlusterFS |
|
文件 |
是 |
否2 |
是 |
CephFS |
|
文件 |
是 |
是 |
是 |
LVM |
|
块级 |
否3 |
否 |
是 |
LVM-thin |
|
块级 |
否 |
是 |
是 |
iSCSI/kernel |
|
块级 |
是 |
否 |
是 |
iSCSI/libiscsi |
|
块级 |
是 |
否 |
是 |
Ceph/RBD |
|
块级 |
是 |
是 |
是 |
ZFS over iSCSI |
|
块级 |
是 |
是 |
是 |
虚拟机的磁盘映像存储在ZFS卷(zvol)数据集中,这些数据集提供块设备功能。
2: 在基于文件的存储系统中,使用’qcow2’格式可以实现快照。
3:可以在基于iSCSI或FC的存储之上使用LVM。这样你就可以获得一个`共享`的LVM存储。
细粒度存储配置
许多存储设备,以及QEMU镜像格式`qcow2`,支持’薄置备'。使用薄置备时,只有客户系统实际使用的块会被写入存储。
例如,如果你创建了一个配备32GB硬盘的虚拟机,在安装了客户系统操作系统后,虚拟机的根文件系统包含3GB的数据。在这种情况下,即使虚拟机看到的是32GB硬盘,存储上也只写入了3GB的数据。通过这种方式,细粒度预配允许你创建大于当前可用存储块的磁盘映像。你可以为你的虚拟机创建大容量的磁盘映像,并且在需要时,无需调整虚拟机文件系统的大小,就可以向你的存储中添加更多磁盘。
所有具有“快照”功能的存储类型也支持瘦置备。
Caution
|
如果存储空间满了,使用该存储空间的所有客户端会接收到IO错误。这可能会导致文件系统不一致,并且可能会损坏您的数据。因此,建议避免过度配置存储资源或仔细观察剩余空间,以避免这种情况。 |
存储配置
所有 {pve} 相关的存储配置都保存在单个文本文件 /etc/pve/storage.cfg
中。由于这个文件位于 /etc/pve/
目录下,它会自动分发到所有集群节点。因此,所有节点共享相同的存储配置。
共享存储配置对于共享存储来说非常有意义,因为所有节点都可以访问相同的“共享”存储。但它对于本地存储类型也很有用。在这种情况下,这样的本地存储在所有节点上都可用,但它是物理上不同的,并且可以有完全不同的内容。
存储池
每个存储池都有一个`<type>,并且通过其
<STORAGE_ID>`进行唯一识别。一个池配置看起来像这样:
<type>: <STORAGE_ID> <property> <value> <property> <value> <property> ...
"The <type>: <STORAGE_ID>
行开始定义存储池,随后是一系列属性的列表。大多数属性需要一个值。一些属性有合理的默认值,这种情况下你可以省略值。"
要更具体一点,看看安装后的默认存储配置。它包含一个名为`local`的特殊本地存储池,指向目录`/var/lib/vz`,并且始终可用。{pve}安装程序会根据安装时选择的存储类型创建额外的存储条目。
/etc/pve/storage.cfg
)dir: local path /var/lib/vz content iso,vztmpl,backup # default image store on LVM based installation lvmthin: local-lvm thinpool data vgname pve content rootdir,images # default image store on ZFS based installation zfspool: local-zfs pool rpool/data sparse content images,rootdir
Caution
|
将多个存储配置指向完全相同的底层存储是有问题的。这样一个_别名_存储配置可能导致两个不同的卷标识(volid)指向同一个磁盘映像。{pve}期望映像的卷标识指向的是唯一的。为_别名_存储配置选择不同的内容类型可能是可行的,但不推荐这样做。 |
常见存储属性
几种存储类型之间有一些共同的存储属性。
- 节点
-
此存储可用/可访问的集群节点名称列表。可以使用此属性将存储访问限制为一组有限的节点。
- 内容
-
一个存储系统可以支持多种内容类型,例如虚拟磁盘镜像、光盘ISO镜像、容器模板或容器根目录。并非所有类型的存储都支持所有内容类型。可以设置此属性来选择该存储用于什么目的。
- 图像
-
QEMU/KVM 虚拟机镜像。
- 根目录
-
允许储存容器数据。
- vztmpl
-
容器模板。
- 备份
-
备份文件(
vzdump
)。 - 国际标准化组织
-
ISO 镜像
- 代码片段
-
片段文件,例如客人挂钩脚本
- 共享
-
指示这是一个单一的存储,其内容在所有节点上相同(或所有在’nodes’选项中列出的节点上相同)。它不会使本地存储的内容自动对其他节点可用,它只是将一个已经共享的存储标记为这样!
- 禁用
-
您可以使用这个标志来完全禁用存储。
- 最大文件数
-
已废弃,请使用`prune-backups`代替。每个虚拟机的备份文件最大数量。使用`0`表示无限。
- 修剪备份
-
备份的保留选项。详细信息见备份保留。
- 格式
-
默认镜像格式(
raw|qcow2|vmdk
) - 预分配
-
预分配模式(
off|metadata|falloc|full
)适用于基于文件存储的`raw`和`qcow2`镜像。默认为`metadata`,对于`raw`镜像来说,这被视为`off`。在结合大型`qcow2`镜像使用网络存储时,使用`off`可以帮助避免超时。
Warning
|
不建议在不同的{pve}集群上使用相同的存储池。一些存储操作需要对存储进行独占访问,因此需要适当的锁定。虽然这在一个集群内部已经实现,但在不同的集群之间是不起作用的。 |
卷
我们使用一种特殊的符号来定位存储数据。当你从存储池分配数据时,它会返回这样一个卷标识符。卷是通过`<STORAGE_ID>来识别的,后面跟着由冒号分隔的存储类型依赖的卷名。一个有效的
<VOLUME_ID>`看起来像这样:
local:230/example-image.raw
local:iso/debian-501-amd64-netinst.iso
local:vztmpl/debian-5.0-joomla_1.5.9-1_i386.tar.gz
iscsi-storage:0.0.2.scsi-14f504e46494c4500494b5042546d2d646744372d31616d61
要获取`<VOLUME_ID>`的文件系统路径,请使用:
pvesm path <VOLUME_ID>
卷所有权
对于`image`类型的卷存在所有权关系。每个此类卷都由一个虚拟机或容器所拥有。例如,卷`local:230/example-image.raw`由虚拟机230拥有。大多数存储后端将这种所有权信息编码到卷名称中。
当你移除一个虚拟机或容器时,系统也会删除所有与该虚拟机或容器相关联的、归该虚拟机或容器所有的卷。
使用命令行界面
建议您熟悉存储池和卷标识符背后的概念,但在实际操作中,您不必在命令行上强制执行任何这些底层操作。通常,卷的分配和移除是通过虚拟机和容器管理工具完成的。
尽管如此,有一个命令行工具叫做`pvesm`(“{pve} 存储管理器”),它能够执行常见的存储管理任务。
例子
添加存储池
pvesm add <TYPE> <STORAGE_ID> <OPTIONS> pvesm add dir <STORAGE_ID> --path <PATH> pvesm add nfs <STORAGE_ID> --path <PATH> --server <SERVER> --export <EXPORT> pvesm add lvm <STORAGE_ID> --vgname <VGNAME> pvesm add iscsi <STORAGE_ID> --portal <HOST[:PORT]> --target <TARGET>
禁用存储池
pvesm set <STORAGE_ID> --disable 1
启用存储池
pvesm set <STORAGE_ID> --disable 0
更改/设置存储选项
pvesm set <STORAGE_ID> <OPTIONS> pvesm set <STORAGE_ID> --shared 1 pvesm set local --format qcow2 pvesm set <STORAGE_ID> --content iso
删除存储池。这不会删除任何数据,也不会断开连接或卸载任何东西。它只是删除存储配置。
pvesm remove <STORAGE_ID>
分配卷
pvesm alloc <STORAGE_ID> <VMID> <name> <size> [--format <raw|qcow2>]
在本地存储中分配一个4G的卷。如果你传递一个空字符串作为`<name>`,名称将自动生成。
pvesm alloc local <VMID> 4G
自由体积
pvesm free <VOLUME_ID>
Warning
|
这真的会销毁所有的音量数据。 |
列出存储状态
pvesm状态
列出存储内容
pvesm list <STORAGE_ID> [--vmid <VMID>]
列出由VMID分配的卷
pvesm list <STORAGE_ID> --vmid <VMID>
列出ISO镜像文件
pvesm list <STORAGE_ID> --content iso
列表容器模板
pvesm list <STORAGE_ID> --content vztmpl
显示卷的文件系统路径
pvesm path <VOLUME_ID>
将卷 local:103/vm-103-disk-0.qcow2
导出到文件 target
。这主要在使用 pvesm import
时内部使用。流格式 qcow2+size 与 qcow2 格式不同。因此,导出的文件不能简单地附加到虚拟机。这也适用于其他格式。
pvesm export local:103/vm-103-disk-0.qcow2 qcow2+size target --with-snapshots 1
目录后端
存储池类型:`dir
{pve} 可以使用本地目录或本地挂载的共享作为存储。目录是一种文件级存储,因此您可以存储任何类型的内容,如虚拟磁盘映像、容器、模板、ISO映像或备份文件。
Note
|
您可以通过标准的Linux /etc/fstab 挂载额外的存储设备,然后为该挂载点定义一个目录存储。通过这种方式,您可以使用Linux支持的任何文件系统。
|
这个后端假设底层目录与POSIX兼容,但没有其他假设。这意味着你不能在存储级别创建快照。但是,对于使用`qcow2`文件格式的VM镜像存在一种变通方法,因为该格式内部支持快照。
Tip
|
有些存储类型不支持`O_DIRECT`,因此你不能在这些存储上使用缓存模式`none`。只需改为使用缓存模式`writeback`即可。 |
我们使用预定义的目录布局将不同类型的内容存储到不同的子目录中。这种布局被所有文件级存储后端所使用。
Content type | Subdir |
---|---|
VM images |
|
ISO images |
|
Container templates |
|
Backup files |
|
Snippets |
|
配置
这个后端支持所有常见的存储属性,并增加了两个额外的属性。`path`属性用于指定目录。这需要是一个绝对的文件系统路径。
可选的 content-dirs
属性允许更改默认布局。它由以下格式的标识符组成的逗号分隔列表构成:
路径类型
在这里,vtype
是存储允许的内容类型之一,而 path
是相对于存储的挂载点的路径。
/etc/pve/storage.cfg
)dir: backup path /mnt/backup content backup prune-backups keep-last=7 max-protected-backups 3 content-dirs backup=custom/backup/dir
上述配置定义了一个名为 backup
的存储池。该存储池可用于存储最多7个常规备份(keep-last=7
)以及每个虚拟机3个受保护的备份。备份文件的实际路径是 /mnt/backup/custom/backup/dir/...
。
文件命名规范
这个后端使用了一个定义良好的命名方案来命名虚拟机镜像:
vm-<VMID>-<NAME>.<FORMAT>
- <VMID>
-
这指定了所有者虚拟机。
- <NAME>
-
这可以是一个任意的名字(
ascii
),不包含空格。后端默认使用`disk-作为名称,其中
[N]`会被替换为一个整数,以确保名字的唯一性。 - <FORMAT>
-
指定图像格式(
raw|qcow2|vmdk
)。
当您创建一个虚拟机模板时,所有虚拟机镜像都会被重新命名,以表明它们现在是只读的,并且可以作为克隆的基础镜像使用:
base-<VMID>-<NAME>.<FORMAT>
Note
|
这些基础镜像被用来生成克隆镜像。因此,这些文件是只读的,并且永远不会被修改是非常重要的。如果存储支持的话,后端会将访问模式更改为`0444`,并设置不可变标志(chattr +i )。
|
存储特性
正如上面提到的,大多数文件系统并不支持开箱即用的快照功能。为了解决这个问题,这个后端能够利用`qcow2`内部的快照功能。
克隆也是如此。后端使用`qcow2`基础映像功能来创建克隆。
Content types | Image formats | Shared | Snapshots | Clones |
---|---|---|---|---|
|
|
no |
qcow2 |
qcow2 |
示例
请使用以下命令在`local`存储上分配一个4GB的镜像:
pvesm alloc local 100 vm-100-disk10.raw 4G
Formatting '/var/lib/vz/images/100/vm-100-disk10.raw', fmt=raw size=4294967296 successfully created 'local:100/vm-100-disk10.raw'
Note
|
图片名称必须符合上述命名规范。 |
实际的文件系统路径显示为:
pvesm path local:100/vm-100-disk10.raw
/var/lib/vz/images/100/vm-100-disk10.raw
你可以通过以下方式删除图片:
# pvesm free local:100/vm-100-disk10.raw
NFS 后端
存储池类型:`nfs
NFS后端基于目录后端,因此它们有许多共同的属性。目录布局和文件命名规则是相同的。主要优势在于你可以直接配置NFS服务器的属性,因此后端可以自动挂载共享。无需修改`/etc/fstab`。后端还可以测试服务器是否在线,并提供一种查询服务器导出共享的方法。
配置
后端支持所有常见的存储属性,除了共享标志始终被设置外。此外,以下属性用于配置NFS服务器:
- 服务器
-
服务器的IP地址或DNS名称。为了避免DNS查询延迟,通常使用IP地址而不是DNS名称是更可取的 - 除非你有一个非常可靠的DNS服务器,或者将服务器列在本地的`/etc/hosts`文件中。
- 导出
-
NFS导出路径(如`pvesm nfsscan`所列)。
你也可以设置NFS挂载选项:
- 路径
-
本地挂载点(默认为
/mnt/pve/<STORAGE_ID>/
)。 - 内容目录
-
默认目录布局的覆盖项。可选的。
- 选项
-
NFS挂载选项(参见`man nfs`)。
/etc/pve/storage.cfg
)nfs: iso-templates path /mnt/pve/iso-templates server 10.0.0.10 export /space/iso-templates options vers=3,soft content iso,vztmpl
Tip
|
在一个NFS请求超时后,默认情况下NFS请求会无限期地重试。这可能导致客户端出现意外的挂起。对于只读内容,考虑使用NFS的`soft`选项是值得的,它将重试次数限制为三次。 |
存储功能
NFS不支持快照,但后端使用`qcow2`功能来实现快照和克隆。
Content types | Image formats | Shared | Snapshots | Clones |
---|---|---|---|---|
|
|
yes |
qcow2 |
qcow2 |
例子
你可以用以下方法获取已导出NFS共享的列表:
pvesm nfsscan <server>
CIFS后端
存储池类型:`cifs
CIFS后端扩展了目录后端,因此不需要手动设置CIFS挂载。这样的存储可以直接通过{pve} API或者Web用户界面添加,拥有我们所有后端的优势,如服务器心跳检查或者导出共享的舒适选择。
配置
后端支持所有常见的存储属性,除了共享标志始终设置之外。此外,以下是CIFS特殊属性可用:
- 服务器
-
服务器IP或DNS名称。必填。
Tip
|
为了避免DNS查找延迟,通常更倾向于使用IP地址而不是DNS名称 - 除非你有一个非常可靠的DNS服务器,或者在本地的`/etc/hosts`文件中列出了该服务器。 |
- 分享
-
要使用的CIFS共享(使用`pvesm scan cifs <address>`或Web界面获取可用的共享)。必填。
- 用户名
-
CIFS存储的用户名。可选,默认为`guest'。
- 密码
-
用户密码。可选。它将被保存在一个仅有root权限可读的文件中(
/etc/pve/priv/storage/<STORAGE-ID>.pw
)。 - 域名
-
为此存储设置用户域(工作组)。可选。
- smbversion
-
SMB 协议版本。可选,默认为
3
。由于安全问题,不支持 SMB1。 - 路径
-
本地挂载点。可选,默认为
/mnt/pve/<STORAGE_ID>/
。 - 内容目录
-
覆盖默认目录布局。可选的。
- 选项
-
额外的CIFS挂载选项(参见`man mount.cifs`)。有些选项会自动设置,不应该在这里设置。{pve}总是会设置`soft`选项。根据配置,这些选项会自动设置:
username
、credentials
、guest
、domain
、vers
。 - 子目录
-
要挂载的共享的子目录。可选的,默认为共享的根目录。
/etc/pve/storage.cfg
)cifs: backup path /mnt/pve/backup server 10.0.0.11 share VMData content backup options noserverino,echo_interval=30 username anna smbversion 3 subdir /data
存储特性
CIFS不支持在存储级别上的快照。但是如果你仍然希望拥有快照和克隆功能,你可以使用`qcow2`备份文件。
Content types | Image formats | Shared | Snapshots | Clones |
---|---|---|---|---|
|
|
yes |
qcow2 |
qcow2 |
例子
你可以通过以下方式获取已导出的CIFS共享列表:
# pvesm scan cifs <server> [--username <username>] [--password]
然后你可以使用以下方法将这个分享作为存储添加到整个{pve}集群中:
# pvesm add cifs <storagename> --server <server> --share <share> [--username <username>] [--password]
Proxmox备份服务器
存储池类型:`pbs
这个后端允许直接将Proxmox备份服务器集成到{pve}中,就像任何其他存储一样。可以通过{pve} API、CLI或者网页界面直接添加Proxmox备份存储。
配置
后端支持所有常见的存储属性,除了始终设置的共享标志外。此外,还有以下Proxmox Backup Server的特殊属性可用:
- 服务器
-
服务器IP或DNS名称。必填。
- 用户名
-
Proxmox Backup Server 存储的用户名。这是必需的。
Tip
|
不要忘记在用户名后添加域名。例如,root@pam 或 archiver@pbs 。
|
- 密码
-
用户密码。该值将保存在`/etc/pve/priv/storage/<STORAGE-ID>.pw`文件中,访问权限仅限于root用户。此项为必填。
- 数据存储
-
要使用的Proxmox Backup Server数据存储的ID。必填。
- 指纹
-
Proxmox备份服务器API TLS证书的指纹。你可以在服务器仪表板中获取它,或者使用`proxmox-backup-manager cert info`命令获取。对于自签名证书或任何其他主机不信任服务器CA的情况,此为必需。
- 加密密钥
-
一个用于从客户端加密备份数据的密钥。目前仅支持不受密码保护的密钥(无密钥派生函数(kdf))。该密钥将被保存在文件`/etc/pve/priv/storage/<STORAGE-ID>.enc`中,访问权限限制为仅root用户。使用魔术值`autogen`可以通过`proxmox-backup-client key create --kdf none <path>`自动生成新的密钥。可选。
- 主公钥
-
作为备份任务的一部分,用于加密备份加密密钥的公共RSA密钥。加密副本将被附加到备份中并存储在Proxmox备份服务器实例上以用于恢复目的。可选,需要`encryption-key`。
/etc/pve/storage.cfg
)pbs: backup datastore main server enya.proxmox.com content backup fingerprint 09:54:ef:..snip..:88:af:47:fe:4c:3b:cf:8b:26:88:0b:4e:3c:b2 prune-backups keep-all=1 username archiver@pbs
存储功能
Proxmox Backup Server仅支持备份,它们可以是块级别的或文件级别的。{pve}对于虚拟机使用块级别,对于容器使用文件级别。
Content types | Image formats | Shared | Snapshots | Clones |
---|---|---|---|---|
|
n/a |
yes |
n/a |
n/a |
加密
您可以选择使用AES-256在GCM模式下配置客户端加密。加密可以通过网络界面配置,也可以在CLI上使用`encryption-key`选项配置(见上文)。密钥将被保存在文件`/etc/pve/priv/storage/<STORAGE-ID>.enc`中,该文件仅能由root用户访问。
Warning
|
没有密钥,备份将无法访问。因此,你应该将密钥有序存放,并且存放在与备份内容分开的地方。例如,可能发生的情况是,你使用系统上的一个密钥备份整个系统。如果该系统因任何原因变得无法访问,并需要恢复,这将无法实现,因为加密密钥将与损坏的系统一同丢失。 |
建议您将密钥保管在安全但又便于快速获取的地方,以便在紧急情况下快速恢复。因此,最佳的存储位置是您的密码管理器,可以立即恢复。作为备份,您还应该将密钥保存到USB闪存驱动器,并将其存储在一个安全的地方。这样,密钥与任何系统隔离,但在紧急情况下仍然易于恢复。最后,为了准备最坏的情况,您还应该考虑将密钥的纸质副本锁在一个安全的地方。可以使用`paperkey`子命令创建密钥的QR编码版本。以下命令将`paperkey`命令的输出发送到文本文件,以便轻松打印。
# proxmox-backup-client key paperkey /etc/pve/priv/storage/<STORAGE-ID>.enc --output-format text > qrkey.txt
此外,可以使用单个RSA主密钥对来进行密钥恢复:配置所有执行加密备份的客户端使用单一的公共主密钥,之后所有加密的备份都将包含一个使用RSA加密的AES加密密钥副本。相应的私有主密钥允许恢复AES密钥并解密备份,即使客户端系统不再可用。
Warning
|
主密钥对的保管规则与常规加密密钥的保管规则相同。如果没有私钥的副本,恢复是不可能的!`paperkey`命令支持生成私有主密钥的纸质副本,以便存放在一个安全的物理位置。 |
因为加密是在客户端管理的,所以你可以在服务器上使用相同的数据存储来进行未加密备份和加密备份,即使这些备份使用的是不同的密钥。然而,使用不同密钥的备份之间无法进行数据去重,因此通常最好创建单独的数据存储。
Note
|
如果加密没有好处,就不要使用它,例如,当你在受信任的网络中本地运行服务器时。从未加密的备份中恢复总是更容易的。 |
示例:通过命令行接口添加存储
然后你可以使用以下方法将这个共享作为存储添加到整个 {pve} 集群中:
# pvesm add pbs <id> --server <server> --datastore <datastore> --username <username> --fingerprint 00:B4:... --password
GlusterFS 后端
存储池类型:`glusterfs
GlusterFS是一种可扩展的网络文件系统。该系统采用模块化设计,可以在通用硬件上运行,并且能以低成本提供高可用性的企业存储。这种系统能够扩展到数百万吉字节,且能处理成千上万的客户端。
Note
|
在节点/磁盘坏掉后,GlusterFS 会执行一次完整的 rsync 来确保数据的一致性。这在面对大文件时可能需要非常长的时间,因此这种后端不适合用来存储大型虚拟机镜像。
|
配置
后端支持所有常见的存储属性,并添加了以下GlusterFS特定选项:
- 服务器
-
GlusterFS 卷文件服务器的 IP 或 DNS 名称。
- server2
-
备份卷文件服务器IP或DNS名称。
- 体积
-
GlusterFS 卷。
- 运输
-
GlusterFS 传输方式:
tcp
、unix
或 `rdma
/etc/pve/storage.cfg
)glusterfs: Gluster server 10.2.3.4 server2 10.2.3.5 volume glustervol content images,iso
文件命名规范
目录布局和文件命名约定是继承自 dir
后端的。
存储特性
该存储提供了文件级别的接口,但没有原生的快照/克隆实现。
Content types | Image formats | Shared | Snapshots | Clones |
---|---|---|---|---|
|
|
yes |
qcow2 |
qcow2 |
本地 ZFS 池后端
存储池类型:`zfspool
这个后端允许你访问本地的ZFS池(或者这些池中的ZFS文件系统)。
配置
后端支持常见的存储属性`content`、nodes
、disable
,以及以下特定于ZFS的属性:
- 池塘
-
选择ZFS池/文件系统。所有的分配都在那个池中完成。
- 块大小
-
设置ZFS块大小参数。
- 稀疏
-
使用ZFS薄置备。稀疏卷是一个预留空间不等于卷大小的卷。
- 挂载点
-
ZFS池/文件系统的挂载点。更改此项不会影响
zfs
所看到的数据集的mountpoint
属性。默认为/<pool>
。
/etc/pve/storage.cfg
)zfspool: vmdata pool tank/vmdata content rootdir,images sparse
文件命名规范
后端对虚拟机镜像使用以下命名方案:
vm-<VMID>-<NAME> // 普通虚拟机镜像 base-<VMID>-<NAME> // 模板虚拟机镜像(只读) subvol-<VMID>-<NAME> // 子卷 (ZFS 文件系统用于容器)
- <VMID>
-
这指定了所有者虚拟机。
- <NAME>
-
这可以是一个任意的名字(
ascii
),不包含空白字符。后端默认使用`disk[N]作为名称,其中的
[N]`被替换为一个整数以确保名称的唯一性。
存储功能
ZFS可能是关于快照和克隆方面最先进的存储类型。后端使用ZFS数据集来存储虚拟机镜像(格式为`raw`)和容器数据(格式为`subvol`)。ZFS属性从父数据集继承,因此你可以简单地在父数据集上设置默认值。
Content types | Image formats | Shared | Snapshots | Clones |
---|---|---|---|---|
|
|
no |
yes |
yes |
示例
建议创建一个额外的ZFS文件系统来存储你的虚拟机镜像:
# zfs create tank/vmdata
要在那个新分配的文件系统上启用压缩:
zfs set compression=on tank/vmdata
您可以使用以下命令获取可用的ZFS文件系统列表:
pvesm zfsscan
LVM 后端
存储池类型:`lvm
LVM是硬盘和分区之上的一个轻量级软件层。它可以用来将可用的磁盘空间分割成较小的逻辑卷。LVM在Linux上得到了广泛的应用,并使得硬盘管理变得更加容易。
另一个用途是将LVM放置在一个大的iSCSI LUN之上。这样你就可以轻松管理那个iSCSI LUN上的空间,否则是不可能做到的,因为iSCSI规范没有定义用于空间分配的管理接口。
配置
LVM后端支持常见的存储属性`content`、nodes
、disable
,以及以下LVM特定的属性:
- vgname
-
LVM 卷组名称。这必须指向一个已存在的卷组。
- 基底
-
基础卷。在访问存储之前,这个卷会自动被激活。这在LVM卷组位于远程iSCSI服务器上时非常有用。
- '
saferemove
' -
在Web界面中称为“清除已删除的卷”。删除逻辑卷时将数据清零。当移除一个卷时,这确保所有数据被擦除,且无法被后来创建的其他逻辑卷访问(这些逻辑卷恰好被分配了相同的物理扩展区)。这是一个成本高昂的操作,但在某些环境下作为安全措施可能是必需的。
- saferemove_throughput
-
擦写吞吐量(
cstream -t
参数值)。
/etc/pve/storage.cfg
)lvm: myspace vgname myspace content rootdir,images
文件命名规范
后端基本上使用与ZFS池后端相同的命名约定。
vm-<VMID>-<NAME> // 普通的虚拟机镜像
存储特性
LVM是典型的块存储,但这种后端不支持快照和克隆。不幸的是,正常的LVM快照效率相当低,因为它们会在快照期间干扰整个卷组上的所有写操作。
一个很大的优势是你可以将它用在共享存储之上,例如,一个iSCSI的逻辑单元号(LUN)。后端本身实现了适当的集群范围内的锁定。
Tip
|
新的LVM-thin后端允许快照和克隆,但不支持共享存储。 |
内容类型 | 图像格式 | 共享 | 快照 | 克隆 |
---|---|---|---|---|
|
|
可能的 |
不可以 |
不可以 |
范例
列出可用的卷组:
pvesm lvmscan
LVM细分后端
存储池类型:`lvmthin
LVM通常在您创建卷时分配块。而LVM精简池只在写入数据时分配块。这种行为称为精简配置,因为卷的大小可以远远大于物理可用空间。
您可以使用常规的LVM命令行工具来管理和创建LVM细分池(有关详细信息,请参阅`man lvmthin`)。假设您已经有一个名为`pve`的LVM卷组,以下命令将创建一个新的名为`data`的LVM细分池(大小为100G):
lvcreate -L 100G -n data pve lvconvert --type thin-pool pve/data
配置
LVM薄后端支持常见的存储属性`content`、nodes
、disable
,以及以下LVM特有的属性:
- 卷组名称
-
LVM 卷组名称。这必须指向一个现有的卷组。
- thinpool
-
LVM薄置池的名称。
/etc/pve/storage.cfg
)lvmthin: local-lvm thinpool data vgname pve content rootdir,images
文件命名规范
后端基本上使用与ZFS池后端相同的命名约定。
vm-<VMID>-<NAME> // 普通虚拟机镜像
存储特性
LVM thin 是一种块存储,但完全支持快照和克隆的高效。新卷会自动用零初始化。
必须指出,LVM薄池不能跨多个节点共享,因此您只能将它们用作本地存储。
内容类型 | 图像格式 | 共享 | 快照 | 克隆 |
---|---|---|---|---|
|
|
否 |
是 |
是 |
例子
列出卷组 pve
上可用的LVM薄池:
pvesm lvmthinscan pve
Open-iSCSI 发起者
存储池类型:`iscsi
iSCSI是一种广泛使用的技术,用于连接存储服务器。几乎所有的存储供应商都支持iSCSI。也有基于开源的iSCSI目标解决方案,例如基于Debian的https://www.openmediavault.org/[OpenMediaVault]。
要使用这个后端,你需要安装[Open-iSCSI](https://www.open-iscsi.com/)(open-iscsi
)包。这是一个标准的Debian包,但为了节省资源,它默认不会被安装。
apt-get install open-iscsi
低级别的iscsi管理任务可以使用`iscsiadm`工具来完成。
配置
后端支持常见的存储属性`content`、nodes
、disable
,以及以下特定于iSCSI的属性:
- 门户网站
-
iSCSI门户(IP或带可选端口的DNS名称)。
- 目标
-
iSCSI目标。
/etc/pve/storage.cfg
)iscsi: mynas portal 10.10.10.1 target iqn.2006-01.openfiler.com:tsn.dcb5aaaddd content none
Tip
|
如果你想在iSCSI之上使用LVM,设置`content none`是有意义的。这样就不可能直接使用iSCSI LUNs创建虚拟机了。 |
文件命名规范
iSCSI协议没有定义分配或删除数据的接口。相反,这需要在目标端完成,而且是特定于供应商的。目标仅仅将它们作为编号的LUN来导出。所以 {pve} iSCSI卷名只是对Linux内核所见的LUN的一些信息进行编码。
存储功能
iSCSI 是一种块级存储类型,并且不提供管理接口。因此,通常最好导出一个大的LUN,并在该LUN上设置LVM。然后,您可以使用LVM插件来管理该iSCSI LUN上的存储。
Content types | Image formats | Shared | Snapshots | Clones |
---|---|---|---|---|
|
|
yes |
no |
no |
例子
扫描远程iSCSI门户,并返回可能的目标列表:
pvesm scan iscsi <HOST[:PORT]>
用户模式iSCSI后端
存储池类型:`iscsidirect
这个后端提供了基本与Open-iSCSI后端相同的功能,但它使用用户级库来实现。您需要安装`libiscsi-bin`包才能使用这个后端。
应该注意的是,这里没有涉及到内核驱动,所以这可以被视为性能优化。但这样做有一个缺点,即您不能在此类iSCSI LUN之上使用LVM。因此,您需要在存储服务器端管理所有的空间分配。
配置
用户模式iSCSI后端使用与Open-iSCSI后端相同的配置选项。
/etc/pve/storage.cfg
)iscsidirect: faststore portal 10.10.10.1 target iqn.2006-01.openfiler.com:tsn.dcb5aaaddd
存储特性
Note
|
这个后端仅支持虚拟机。容器不能使用这个驱动。 |
Content types | Image formats | Shared | Snapshots | Clones |
---|---|---|---|---|
|
|
yes |
no |
no |
Ceph RADOS块设备(RBD)
存储池类型:`rbd
''Ceph是一个分布式对象存储和文件系统,旨在提供杰出的性能、可靠性和可扩展性。RADOS块设备实现了一个功能丰富的块级存储,你将获得以下优势:''
-
细粒度供应
-
可调整大小的卷
-
分布式且有冗余的(跨多个OSD条带化)
-
完整快照和克隆功能
-
自我愈合
-
没有单点故障
-
可扩展到艾字节级别
-
内核和用户空间可用的实现方式
Note
|
在较小的部署中,也可以直接在您的 {pve} 节点上运行 Ceph 服务。近期的硬件拥有充足的 CPU 功率和 RAM,所以在同一节点上运行存储服务和虚拟机是可行的。 |
配置
这个后端支持常见的存储属性`nodes`、disable
、content
,以及以下`rbd`特定属性:
- 监控主机
-
监控守护进程的IP列表。可选,仅在Ceph未运行在{pve}集群上时需要。
- 泳池
-
Ceph存储池名称。
- 用户名
-
RBD用户ID。可选,仅在Ceph未在{pve}集群上运行时需要。请注意,只应使用用户ID。“client.”类型前缀必须省略。
- krbd
-
通过krbd内核模块强制访问rados块设备。可选。
Note
|
容器将独立于选项值使用`krbd`。 |
/etc/pve/storage.cfg
)rbd: ceph-external monhost 10.1.1.20 10.1.1.21 10.1.1.22 pool ceph-external content images username admin
Tip
|
您可以使用 rbd 工具来执行低级管理任务。
|
认证
Note
|
如果Ceph被安装在{pve}集群上,当添加存储时,以下操作会自动完成。 |
如果你使用的是默认启用的`cephx`认证,你需要提供来自外部Ceph集群的密钥环。
通过CLI配置存储,您首先需要使包含密钥环的文件可用。一种方式是直接从外部Ceph集群将文件复制到{pve}节点之一。以下示例将其复制到我们运行它的节点的`/root`目录:
# scp <external cephserver>:/etc/ceph/ceph.client.admin.keyring /root/rbd.keyring
然后使用 pvesm
CLI 工具来配置外部 RBD 存储,使用 --keyring
参数,这需要是您复制的密钥环文件的路径。例如:
# pvesm add rbd <name> --monhost "10.1.1.20 10.1.1.21 10.1.1.22" --content images --keyring /root/rbd.keyring
在通过图形用户界面配置外部RBD存储时,可以复制并粘贴密钥环到相应的字段中。
密钥环将被存储在
# /etc/pve/priv/ceph/<STORAGE_ID>.keyring
Tip
|
在连接到外部集群时,建议创建一个仅包含所需功能的密钥环。有关Ceph用户管理的更多信息,请参见Ceph文档。脚注参考:[cephusermgmt,{cephdocs-url}/rados/operations/user-management/[Ceph用户管理]]。 |
Ceph 客户端配置(可选)
连接到外部Ceph存储时,并不总是允许在外部集群的配置数据库中设置客户端特定的选项。你可以添加一个`ceph.conf`文件在Ceph密钥环旁边,以更改存储的Ceph客户端配置。
ceph.conf需要与存储具有相同的名称。
# /etc/pve/priv/ceph/<STORAGE_ID>.conf
请参见RBD配置参考脚注:[RBD配置参考 {cephdocs-url}/rbd/rbd-config-ref/] 了解可能的设置。
Note
|
不要轻易更改这些设置。{PVE} 正在将 <STORAGE_ID>.conf 与存储配置合并。 |
存储特性
rbd`后端是一种块级存储,并实现了完整的快照和克隆功能。
内容类型 | 图像格式 | 共享 | 快照 | 克隆 |
---|---|---|---|---|
|
|
是 |
是 |
是 |
Ceph 文件系统 (CephFS)
存储池类型:`cephfs
CephFS 实现了一个符合 POSIX 标准的文件系统,它利用一个[Ceph](https://ceph.com)存储集群来存储其数据。由于 CephFS 是在 Ceph 的基础上构建的,因此它具有 Ceph 的大部分属性。这包括冗余性、可扩展性、自愈能力以及高可用性。
Tip
|
{pve} 可以管理Ceph设置(xref:chapter_pveceph),这使得配置CephFS存储更加容易。由于现代硬件提供了大量的处理能力和RAM,因此在同一节点上运行存储服务和VM是可能的,而不会造成显著的性能影响。 |
要使用CephFS存储插件,您必须通过添加我们的Ceph仓库来替换标准的Debian Ceph客户端。添加后,运行`apt update`,然后运行`apt dist-upgrade`,以便获取最新的包。
Warning
|
请确保没有配置其他的Ceph仓库。否则安装会失败,或者节点上会有混合的包版本,导致意外的行为。 |
配置
这个后端支持常见的存储属性`nodes`、disable
、content
,以及以下`cephfs`特定的属性:
- 文件系统名称
-
Ceph FS 的名称。
- 监控主机
-
监控守护进程地址列表。可选,只有当Ceph没有在 {pve} 集群上运行时才需要。
- 路径
-
本地挂载点。可选,默认为
/mnt/pve/<STORAGE_ID>/
。 - 用户名
-
Ceph 用户 ID。可选项,仅在 Ceph 不运行在 {pve} 集群上时需要,默认值为
admin
。 - 子目录
-
要挂载的CephFS子目录。可选,默认为`/`。
- 保险丝
-
通过FUSE访问CephFS,而不是内核客户端。可选,默认为`0`。
/etc/pve/storage.cfg
)cephfs: cephfs-external monhost 10.1.1.20 10.1.1.21 10.1.1.22 path /mnt/pve/cephfs-external content backup username admin fs-name cephfs
Note
|
如果没有禁用cephx,请不要忘记设置客户端的密钥文件。 |
认证
Note
|
如果Ceph被安装在{pve}集群上,那么在添加存储时,以下操作会自动完成。 |
如果您使用的是默认启用的`cephx`身份验证,那么您需要提供外部Ceph集群的密钥。
通过CLI配置存储,首先需要使包含秘密的文件可用。一种方法是直接从外部Ceph集群将文件复制到{pve}节点之一。以下示例将其复制到我们运行它的节点的`/root`目录:
# scp <external cephserver>:/etc/ceph/cephfs.secret /root/cephfs.secret
然后使用 pvesm
命令行工具来配置外部的RBD存储, 使用 --keyring
参数,该参数需要是你复制的密钥文件的路径。例如:
# pvesm add cephfs <name> --monhost "10.1.1.20 10.1.1.21 10.1.1.22" --content backup --keyring /root/cephfs.secret
通过GUI配置外部RBD存储时,您可以将密钥复制并粘贴到相应的字段中。
秘密仅仅是密钥本身,与`rbd`后端不同,后者还包含一个`[client.userid]`部分。
秘密将被存放在
# /etc/pve/priv/ceph/<STORAGE_ID>.secret
通过以下命令可以从Ceph集群(作为Ceph管理员)接收到一个秘密,其中`userid`是已配置为访问集群的客户端ID。有关Ceph用户管理的更多信息,请查阅Ceph文档。[cephusermgmt]
# ceph auth get-key client.userid > cephfs.secret
存储特性
cephfs 后端是一个遵循 POSIX 的文件系统,构建在 Ceph 集群之上。
Content types | Image formats | Shared | Snapshots | Clones |
---|---|---|---|---|
|
|
yes |
yes[1] |
no |
虽然当前没有已知的错误,但快照尚未保证稳定性,因为它们缺乏足够的测试。
BTRFS 后端
存储池类型:`btrfs
在表面上,这种存储类型与目录存储类型非常相似,因此请参阅目录后端部分以获取概览。
主要区别在于,对于这种存储类型,`raw`格式的磁盘将被放置在一个子卷中,以便于进行快照的拍摄,并支持带快照保留的离线存储迁移。
Note
|
BTRFS在打开文件时会认可`O_DIRECT`标志,这意味着虚拟机不应该使用缓存模式`none`,否则会出现校验和错误。 |
配置
这个后端配置与目录存储类似。请注意,当添加一个目录作为BTRFS存储,而该目录又不是挂载点本身时,强烈建议通过`is_mountpoint`选项指定实际的挂载点。
例如,如果BTRFS文件系统挂载在`/mnt/data2`,并且它的`pve-storage/`子目录(可能是快照,这是推荐的)应该被添加为名为`data2`的存储池,你可以使用以下条目:
btrfs: data2 path /mnt/data2/pve-storage content rootdir,images is_mountpoint /mnt/data2
快照
当对子卷或`raw`文件进行快照时,快照将作为一个只读子卷创建,其路径与原路径相同,后跟一个`@`符号和快照的名称。
ZFS通过ISCSI后端
储存池类型:`zfs
这个后端访问一个拥有ZFS池作为存储并通过`ssh`实现iSCSI目标的远程机器。对于每个客户端磁盘,它创建一个ZVOL,并将其作为iSCSI LUN导出。这个LUN由{pve}用作客户端磁盘。
以下iSCSI目标实现是受支持的:
-
LIO (Linux)
-
IET (Linux)
-
ISTGT (FreeBSD)
-
康斯塔(索拉里斯)
Note
|
这个插件需要一个支持ZFS的远程存储设备,你不能用它在常规存储设备/SAN上创建一个ZFS池。 |
配置
为了使用ZFS over iSCSI插件,您需要配置远程机器(目标)以接受来自{pve}节点的`ssh`连接。{pve}连接到目标机器以创建ZVOLs并通过iSCSI导出它们。认证是通过存储在`/etc/pve/priv/zfs/<target_ip>_id_rsa`中的无密码保护的ssh-key完成的。
以下步骤创建一个ssh密钥并将其分发到IP为192.0.2.1的存储机器:
mkdir /etc/pve/priv/zfs ssh-keygen -f /etc/pve/priv/zfs/192.0.2.1_id_rsa ssh-copy-id -i /etc/pve/priv/zfs/192.0.2.1_id_rsa.pub root@192.0.2.1 ssh -i /etc/pve/priv/zfs/192.0.2.1_id_rsa root@192.0.2.1
后端支持常见的存储属性`content`、nodes
、disable
,以及以下特定于ZFS over ISCSI的属性:
- 游泳池
-
iSCSI目标上的ZFS池/文件系统。所有分配都在该池中完成。
- 传送门
-
iSCSI门户(IP或DNS名称,可选端口)。
- 目标
-
iSCSI 目标。
- iSCSI提供者
-
远程机器上使用的iSCSI目标实现
- comstar_tg
-
comstar视图的目标群体。
- comstar_hg
-
用于comstar视图的主机组。
- lio_tpg
-
Linux LIO目标的目标门户组
- 禁用写缓存
-
禁用目标设备上的写缓存
- 块大小
-
设置ZFS块大小参数。
- 稀疏
-
使用ZFS薄配置。稀疏卷是一个保留空间不等于卷大小的卷。
/etc/pve/storage.cfg
)zfs: lio blocksize 4k iscsiprovider LIO pool tank portal 192.0.2.111 target iqn.2003-01.org.linux-iscsi.lio.x8664:sn.xxxxxxxxxxxx content images lio_tpg tpg1 sparse 1 zfs: solaris blocksize 4k target iqn.2010-08.org.illumos:02:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:tank1 pool tank iscsiprovider comstar portal 192.0.2.112 content images zfs: freebsd blocksize 4k target iqn.2007-09.jp.ne.peach.istgt:tank1 pool tank iscsiprovider istgt portal 192.0.2.113 content images zfs: iet blocksize 4k target iqn.2001-04.com.example:tank1 pool tank iscsiprovider iet portal 192.0.2.114 content images
存储特性
ZFS通过iSCSI插件提供了一个能够进行快照的共享存储。你需要确保在部署过程中,ZFS设备不会成为单点故障。
Content types | Image formats | Shared | Snapshots | Clones |
---|---|---|---|---|
|
|
yes |
yes |
no |