2.2. ZFS文件系统安装方式
从Proxmox VE 3.4开始,Proxmox VE增加了ZFS文件系统作为可选的文件系统和根文件系统。Proxmox VE官方提供的ISO镜像已经集成了ZFS所需的软件包,用户无须手动编译就可以直接使用ZFS。
2.2.1. ZFS安装
Proxmox VE 7.0支持ZFS安装,与ext4/xfs安装不同,ZFS不使用卷管理器(LVM)物理存储,而是使用存储池(ZFS pool)来管理物理存储。
ZFS将存储设备统一汇聚到存储池中,而不是强制要求创建虚拟卷。存储池具备存储设备的物理特征,如RAID等级,并充当可以从其创建文件系统的任意数据存储库。文件系统不再仅限于单个设备,而是与存储池的所有文件系统共享磁盘空间。
第一步:选择zfs(RAID1)
选择文件系统“zfs(RAID1)”来进行系统安装,如图1所示。
图1. zfs(RAID1)安装
ZFS提供多种软级别的RAID,如果你的服务器没有硬件RAID卡,那么ZFS将会特别方便。通过Options按钮可以设置ZFS的RAID级别,并在磁盘列表里根据需要选择硬盘设备组成ZFS文件系统。注意:ZFS 不支持任何硬件RAID,可能会导致数据丢失。
选择zfs(RAID1),RAID1至少需要两个应该硬盘(关于RAID1的特性,可通过搜索引擎去搜索相关内容去了解),也就是说,图3中的目标硬盘是一组RAID1硬盘,使用空间只有1个硬盘,用作启动盘,另外一个硬盘用作备份盘。
当你使用Proxmox VE 安装程序安装时,可以选择使用ZFS 作为根文件系统。同时你需要在安装过程中选择配置RAID 级别。在Proxmox VE 7.0中,ZFS文件系统支持的RAID级别有六个类型,如图2所示。
图2. RAID级别类型
zfs(RAID0)
:也称为“条带”模式。该模式下ZFS卷的容量为所有硬盘容量的总和。但是RAID0 不提供任何冗余性,ZFS卷中任何一块硬盘故障都会导致整个卷不可用。该模式下,至少需要1块硬盘。
zfs(RAID1)
:也称为“镜像”模式。该模式下,数据会以复制方式同时写入所有硬盘。该模式下,至少需要2块容量一样的硬盘,而整个卷的容量就等于单块硬盘的容量。
zfs(RAID10)
:该模式是RAID0和RAID1的组合模式。该模式下,至少需要4块硬盘。
zfs(RAIDZ-1)
:该模式是RAID5的变体模式,提供单奇偶校验,即允许1块硬盘故障冗余。该模式下,至少需要3块硬盘。
zfs(RAIDZ-2)
:该模式是RAID5的变体模式,提供双奇偶校验,即允许2块硬盘故障冗余。该模式下,至少需要4块硬盘。
zfs(RAIDZ-3)
:该模式是RAID5的变体模式,提供三重奇偶校验,即允许3块硬盘故障冗余。该模式下,至少需要5块硬盘。
如果选择使用高级选项“Advanced Optinos”进行安装,可以进一步设置ZFS高级配置参数。
第二步:ZFS高级配置参数
Proxmox VE 7.0安装程序会自动创建名为rpool的ZFS存储池。使用ZFS时,默认不会创建swap空间,所以强烈建议你为ZFS配置足够的物理内存,避免系统出现可用内存不足的情形。如果实在是要建立swap分区,可以预留部分未分区空间以创建swap,也可以在安装完成后手工创建一个swap zvol卷,但是要注意手工创建swap可能会导致问题(详见《pve-admin-guide-7》用户手册第53页的SWAP on ZFS章节)。
如果你希望Proxmox VE自动对目标硬盘进行分区与格式化,可以不用理会“Advanced Optinos”高级选项,直接点击“Next”进行安装即可。
如果你要做ZFS参数调整,你也可以选择“Advanced Optinos”高级选项,“Advanced Optinos”会根据你的目前硬盘空间大小进行自动配置,否则可以不做改动,直接进行安装即可,如图3所示。
图3. ZFS告警配置参数
ZFS的高级配置参数如下:
ashift
:定义存储池的ashift值。ashift值至少设置为存储池中的磁盘扇区大小(2次ashift的幂是扇区大小),或任何新加入存储池的磁盘扇区大小(例如,更换故障磁盘时)。
例如,扇区是512字节的,那么ashift就等于9,扇区是4096字节的,那么ashift就等于12.
compress:定义是否为 rpool 启用压缩。
checksum
:定义rpool使用的校验和算法类型。
copies
:定义 rpool 的副本参数。 该参数不能替代磁盘冗余功能,具体原因及配置语法参加man手册。
hdsize
:定义目标硬盘的容量大小。通过设置该参数,可以在硬盘上预留部分空间给他用(如创建swap分区)。hdsize仅适用于引导磁盘(启动盘),例如RAID0,RAID1 或RAID10 中的第一个磁盘或镜像,或RAID-Z[123]中的所有磁盘。
第三步:ZFS性能提示
ZFS非常消耗内存资源,如果要使用ZFS作为存储,一般最少需要为ZFS配置8GB内存。在实际生产中,最好基于预算配置尽可能多的内存,建议以8GB为基础,每1TB裸硬盘容量需要增加1GB容量内存。如果你要为ZFS 配置独立的缓存盘或文件系统日志盘,最好使用企业级的SSD 盘,这能够极大的提升整体性能表现。
2.2.2. ZFS安装磁盘分区参数查看
Proxmox VE 7.0安装完成之后,我们来看一下Proxmox VE服务器主机的磁盘分区,如图4、图5和图6所示。
图4. 默认磁盘分区-Web UI
图5. 默认磁盘分区-系统盘
图6. 默认磁盘分区-未分区盘
从图5和图6中,我们可以看到,只有/dev/sda这样实际存储的硬盘设备及分区信息了,不存在一些类似/dev/mapper的逻辑设备了。
我们从WEB UI上也发现,在LVM和LVM-thin中已经没有逻辑卷分区,这主要是ZFS不使用LVM进行管理,而是使用存储池进行管理,如图7所示。
图7. ZFS不再使用LVM管理
2.2.3.默认存储位置
在ZFS安装方式情况下,Proxmox VE使用ZFS作为储存方式,在安装时将目标硬盘划分出BIOS boot、EFI分区后,在第三个分区/dev/sda3自动创建名为rpool的ZFS存储池。换言之,rpool是一个物理磁盘组,是一个分区,是一个物理设备,如图8、图9所示。
图8. ZFS存储池建立在sda3分区之上
图9. ZFS存储池
接着在/dev/sda3这个rpool存储池的基础上,Proxmox VE建立两个存储点,一个名为local的目录,主要用来保存VZDump备份文件, ISO镜像, 容器模板等;一个名为local-zfs的ZFS存储池,主要用于保存基于块存储的虚拟机镜像、容器卷等,亦即作为虚拟机的磁盘。
存放路径如下所示:
ISO镜像存放的路径
:/var/lib/vz/template/iso
备份存放路径
:/var/lib/vz/dump/
虚拟机文件存放
:/dev/rpool/data
WEB UI界面中的local和local-lzfs存储点的信息如图10、图11和图12所示。
图10. local和local-zfs的存储内容
图11. local的存储内容和空间
图12. local-zfs的存储内容和空间
我们在上面曾说到,local和local-zfs都是在/dev/sda3这个rpool存储池的基础上建立的,换句话来说,rpool存储池是一个共享存储池,是由local和local-zfs共同使用的。那实际情况是不是这样呢?我们来使用这个方法去验证一下:在local中上传一个镜像,在local-zfs中建立一个虚拟机,那么local占用的容量与local-zfs占用的容量之和等于rpool存储池所被占用的容量。用公式表示如下:
第一步:查看local已使用的空间容量
在local中,我们来查看一下上传一个ubuntu操作系统的镜像之后,所使用的空间容量为3.43GB,如图13所示。
图13. local已使用的容量
第二步:查看local-zfs已使用的空间容量
在local-zfs中,我们来创建一个虚拟机,并给虚拟机安装操作系统,然后查看local-zfs所使用的空间容量为0.46GB,如图14所示。
图14. local-zfs已使用的容量
第三步:查看rpool已使用的空间容量
在rpool存储池中,我们来查看一下rpool存储池的空间容量,已经使用的空间容量为3.91GB,如图15所示。
图15. rpool已使用的容量
根据上述数据,我们可以得出结论,local使用的空间容量与local-zfs使用的空间容量之和等于rpool使用的空间容量。从而进一步验证了,local和local-zfs共享rpool存储池。
2.2.4. 新建ZFS存储池zfs-pool
我们刚才已经验证了,local使用容量与local-zfs使用容量之和等于rpool所使用容量,所以rpool存储池是一个共享存储池,由local和local-zfs共享。那么,local和local-zfs在rpool存储中所占的比例是多少?可不可以手动设置?到目前为止,在WEB UI中和在命令行是无法做设置的。我也查了官网相关资料,也爬到网上去扒拉资料,发现没有这方面的相关介绍。
其实,local和local-zfs共用一个rpool存储池的方式不能说不好,主要的问题是这个rpool存储池是创建在启动盘的/dev/sda3上,这种方式不是很好的方式。我们可以这样来进行分区,local独享rpool存储池,即独享/dev/sda3,而local-zfs则在其他硬盘上创建就可以了。
第一步:先清空local-zfs中的虚拟机文件
,如图16和图17所示。
图16. 删除虚拟机文件
图17. 确认删除虚拟机文件
第二步:删除local-zfs存储池
图18. 删除local-zfs存储池
删除local-zfs存储池之后,我们再来看rpool这个大的存储池,这个rpool存储池不会被删除,因为local还在使用,如图19所示。
图19. rpool存储池仍保留
当local-zfs删除之后,local就会独享整个rpool存储池了,这样的话,local就有足够的空间来存放ISO镜像、容器模板等。
第三步:查看有哪些没有使用的硬盘
在为虚拟机文件创建存储池之前,我们需要知道有哪些没有使用的硬盘,然后将这些硬盘汇聚起来,创建一个存储池,如图20所示。
图20. 当前没有被使用的硬盘
第四步:创建lisq-zfs存储池,用于存放虚拟机文件
如图21所示,在ZFS存储池的界面中,点击“创建:ZFS”按钮,创建ZFS存储池。
图21. 创建新的ZFS存储池
在创建模板中,存储池名称输入“lisq-zfs”,RAID级别输入“RAIDZ2”,勾选当前4块未使用的硬盘,如图22所示。
图22. 创建lisq-zfs存储池
存储池lisq-zfs创建好之后,在右侧窗口会出现lisq-zfs的详细信息,在左侧导航窗口会出现lisq-zfs的存储标识,如图23、图24所示。
图23. lisq-zfs存储池
图24. lisq-zfs存储池详细信息
在“数据中心→存储”的界面中,我们可以发现,lisq-zfs自动添加上去了,如图25所示。
图25. lisq-zfs自动添加
第五步:lisq-zfs存储池中创建虚拟机
在lisq-zfs存储池中创建虚拟机,虚拟机文件存放在lisq-zfs存储中,如图26、图27和图28所示。
图26. 在lisq-zfs中创建虚拟机
图27. 虚拟机文件存放在lisq-zfs中
图28. 虚拟机文件存放在lisq-zfs中
2.2.5. PVE默认存储总结
local是一个目录,存放路径是/var/lib/vz,通过/var/lib/vz就可以把ISO镜像存放到rpool存储池中,路径对应关系如图29所示。
图29. local存储路径
local-zfs是一个存储池,一个磁盘池,物理设备,系统在创建虚拟机的时候,从local-zfs存储池中分配磁盘空间给虚拟机的硬盘,虚拟机的硬盘相当于local-zfs存储池中的块存储,如图30所示。
图30. local-zfs存储在rpool中
从这里我们可以发现,local-zfs有一个存放路径,就是数据存储在/dev/rpool/data中,如图31所示。
图31. local-zfs存放路径
是不是感觉这些映射关系很乱?其实可以理解,因为无论是Proxmox VE的WEB UI的界面还是CLI界面,对这部分内容的显示都有些不太完整,搞得很多人在理解方面有点蒙圈,得靠想象。下面,我把这些映射关系整理出来,做成一个表格,希望对大家学习Proxmox VE有所帮助,如图32所示。
图32. 默认存储点关系
参考资料:Proxmox VE官网的《pve-admin-guide-7》用户手册;