这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

Learning PVE

PVE学习笔记

1 - 介绍

PVE介绍,以及PVE的资料收集

1.1 - PVE介绍

PVE是什么?PVE可以用来做什么?

Proxmox VE是一个完整的企业虚拟化开源平台。借助内置的 Web 界面,您可以在单个解决方案上轻松管理 VM 和容器、软件定义的存储和网络、高可用性群集以及多个开箱即用的工具。

简介

https://www.proxmox.com/en/proxmox-ve

Proxmox VE是一个完整的开源服务器管理平台,用于企业虚拟化。它将 KVM 虚拟机管理程序和 Linux 容器 (LXC)、软件定义的存储和网络功能紧密集成在一个平台上。借助基于 Web 的集成用户界面,您可以轻松管理 VM 和容器、集群高可用性或集成的灾难恢复工具。

企业级功能和100%基于软件的关注使 Proxmox VE成为虚拟化IT基础架构,优化现有资源并以最低费用提高效率的完美选择。您可以轻松地虚拟化要求最苛刻的 Linux 和 Windows 应用程序工作负载,并随着需求的增长动态扩展计算和存储,确保您的数据中心适应未来的增长。

PVE的特性如下:

KVM & Container KVM & Container

服务器虚拟化

Proxmox 虚拟环境基于 Debian GNU/Linux,并使用自定义的 Linux 内核。Proxmox VE源代码是免费的,在GNU Affero通用公共许可证v3(GNU AGPL,v3)下发布。这意味着您可以自由使用该软件,随时检查源代码并自己为项目做出贡献。

使用开源软件可以保证完全访问所有功能,以及高水平的可靠性和安全性。我们鼓励每个人为Proxmox VE项目做出贡献,而Proxmox背后的公司确保产品符合一致的企业级质量标准。

基于内核的虚拟机 (KVM)

KVM 是业界领先的用于完全虚拟化的 Linux 虚拟化技术。它是一个内核模块,合并到主线 Linux 内核中,在所有支持虚拟化的 x86 硬件(英特尔 VT-x 或 AMD-V)上以近乎原生的性能运行。

使用 KVM,您可以在虚拟机 (VM) 中同时运行 Windows 和 Linux,其中每个虚拟机都有专用的虚拟化硬件:网卡、磁盘、图形适配器等。在单个系统的虚拟机中运行多个应用程序,使您能够节省电力并降低成本,同时使您能够灵活地构建敏捷且可扩展的软件定义数据中心,以满足您的业务需求。

Proxmox VE自2008年项目开始以来就包含了KVM支持(即从0.9beta2版本开始)。

基于容器的虚拟化

基于容器的虚拟化技术是全机器虚拟化的轻量级替代方案,因为它共享主机系统的内核。

Linux Containers / LXC 是操作系统级虚拟化环境,用于在单个 Linux 控制主机上运行多个隔离的 Linux 系统。LXC 用作 Linux 内核包含功能的用户空间接口。用户可以使用强大的 API 和简单的工具轻松创建和管理系统或应用程序容器。

管理

中央化管理

虽然许多人从单个节点开始,但Proxmox虚拟环境可以扩展到大量群集节点。集群堆栈是完全集成的,并随默认安装一起提供。要管理虚拟数据中心的所有任务,您可以使用基于 Web 的中央管理界面。

基于 Web 的管理界面

Proxmox VE易于使用。您可以使用集成的图形用户界面(GUI)执行所有管理任务,无需安装单独的管理工具。中央Web界面基于ExtJS JavaScript框架,可以从任何现代浏览器访问。除了管理任务外,它还提供每个节点的任务历史记录和系统日志的概述。这包括运行备份任务、实时迁移、软件定义的存储或 HA 触发的活动。多主工具允许您从集群的任何节点管理整个集群;您不需要专用的管理器节点。

命令行界面

对于习惯于舒适Unix shell或Windows Powershell的高级用户,Proxmox VE提供了一个命令行界面来管理虚拟环境的所有组件。此命令行界面具有智能制表符补全和 UNIX 手册页形式的完整文档。

Proxmox VE Mobile

您可以通过Android应用程序或通过基于HTML5的Web界面在移动设备上访问Proxmox VE浏览器。Proxmox VE Android应用程序基于Flutter框架,允许您访问Proxmox VE服务器并管理集群,节点,虚拟机和容器。Proxmox VE HTML5移动客户端使您能够随时随地管理Proxmox VE,包括访问SPICE和HTML5控制台。这允许你管理 VM 和容器,并查看其配置。

独特的多主站设计

为了简化集群的管理,您可以从任何节点在集群范围内执行维护任务。集成的基于 Web 的管理界面为您提供了整个集群中所有 KVM 客户机和 Linux 容器的清晰概览。您可以从 GUI 轻松管理 VM 和容器、存储或群集。无需安装单独的、复杂的且昂贵的管理服务器。

Proxmox 群集文件系统 (pmxcfs)

Proxmox VE使用独特的Proxmox Cluster File System(pmxcfs),这是Proxmox开发的数据库驱动文件系统。

pmxcfs 使您能够跨集群同步配置文件。通过使用Corosync,这些文件将实时复制到所有群集节点。文件系统将所有数据存储在磁盘上的持久数据库中,但是,数据的副本驻留在RAM中。目前的最大存储大小为 30 MB - 足以存储数千个 VM 的配置。

Proxmox VE是唯一使用这种独特的集群文件系统pmxcfs的虚拟化平台。

实时/在线迁移

借助集成的实时/在线迁移功能,您可以将正在运行的虚拟机从一个Proxmox VE群集节点移动到另一个节点,而不会造成任何停机时间或最终用户端的明显影响。

管理员可以从 Web 界面或命令行启动此过程。这使您能够在需要使主机系统脱机进行维护时最大限度地减少停机时间。

高可用性集群

多节点Proxmox VE集群支持创建高度可用的虚拟服务器。Proxmox VE HA集群基于成熟的Linux HA技术,提供稳定可靠的HA服务。

资源管理器 Proxmox VE HA 管理器监控群集中的所有虚拟机和容器,并在其中一个发生故障时自动运行。Proxmox VE HA管理器开箱即用。不需要任何配置。此外,基于监视器的屏蔽极大地简化了部署。

整个Proxmox VE HA集群可以从集成的基于Web的用户界面轻松配置。

Proxmox VE HA 模拟器

Proxmox VE包括一个HA模拟器。这允许你测试具有 6 个 VM 的实际 3 节点群集的行为。Proxmox HA模拟器开箱即用,可帮助您学习和理解Proxmox VE HA的工作原理。

网络

Bridged Networking 桥接网络

Proxmox VE使用桥接网络模型。每个主机最多可以有 4094 个网桥。

网桥就像物理网络交换机,在Proxmox VE主机上的软件中实现。所有 VM 可以共享一个网桥,就好像每个 Guest 的虚拟网络电缆都插入同一交换机一样。为了将 VM 连接到外部世界,网桥连接到分配了 TCP/IP 配置的物理网卡。

为了进一步提高灵活性,VLAN (IEEE 802.1q) 和网络绑定/聚合是可能的。通过这种方式,可以利用Linux网络堆栈的全部功能,为Proxmox VE主机构建复杂,灵活的虚拟网络。

如果您有更具体的需求,Proxmox VE还支持 Open vSwitch(OVS)作为Linux网桥,绑定和VLAN接口的替代方案。OVS提供高级功能,如RSTP支持,VXLAN和OpenFlow,并且还支持单个网桥上的多个VLAN。

存储

灵活的存储选项

Proxmox VE存储模型非常灵活。VM 映像可以存储在一个或多个本地存储设备上,也可以存储在 NFS 和 SAN 等共享存储上。没有限制。您可以根据需要配置任意数量的存储,并且可以使用 Debian GNU/Linux 可用的所有存储技术。将 VM 存储在共享存储上的好处是能够在不停机的情况下实时迁移正在运行的计算机。

支持的网络存储类型

  • LVM 组(使用 iSCSI targets 进行网络备份)
  • iSCSI target
  • NFS Share
  • SMB/CIFS
  • Ceph RBD
  • 直接连接到 iSCSI LUN
  • GlusterFS
  • CephFS

支持的本地存储类型

  • LVM Group
  • Directory (现有文件系统上的存储)
  • ZFS

采用 Ceph 的软件定义存储

Ceph 是一个开源分布式对象存储和文件系统,旨在提供卓越的性能、可靠性和可扩展性。Proxmox 虚拟环境完全集成了 Ceph,使您能够直接从任何集群节点运行和管理 Ceph 存储。

Ceph 提供两种类型的存储:RADOS 块设备 (RBD) 和 CephFS。RBD 为磁盘映像和快照等内容提供块级存储。CephFS 使用 Ceph 存储集群实现符合 POSIX 标准的文件系统来存储其数据。

备份

ackup/Restore 备份/恢复

备份是任何合理的 IT 环境的基本要求。Proxmox VE平台提供完全集成的解决方案,使用每个存储和每个 guest 系统类型的功能。备份可以使用 GUI 或 vzdump 备份工具(通过命令行)轻松启动。这些备份始终是完整备份 - 包含 VM 和容器的配置以及所有数据。

集成备份工具 (vzdump) 为正在运行的容器和 KVM 客户机创建一致的快照。它基本上创建虚拟机或容器数据的存档,还包括配置文件。

定时备份

可以安排备份作业,以便在特定的日期和时间自动执行备份作业,用于可选节点和来宾系统。

备份存储

KVM 实时备份适用于所有存储类型,包括 NFS、iSCSI LUN 和 Ceph RBD 上的虚拟机映像。Proxmox VE备份格式经过优化,可快速有效地存储虚拟机备份(考虑稀疏文件,无序数据,最小化I / O)。

Proxmox 备份服务器集成

Proxmox备份服务器是我们的企业级备份解决方案,能够备份虚拟机,容器和物理主机。对此的支持已完全集成到Proxmox VE中,这意味着您可以使用与其他存储类型相同的通用界面无缝备份和还原来宾。

这些备份是增量备份,仅通过网络传输新更改的数据。这在网络带宽和备份作业运行时方面非常有益。数据也可以在客户端轻松加密,以便攻击者无法访问您的备份数据。

单文件回复

通常,备份中只需要一个文件或目录。从Proxmox VE网页界面,您可以安全地从虚拟机或容器备份中搜索和还原单个文件或目录。

Live-Restore 实时恢复

还原大型备份可能需要很长时间,并且在发生灾难时会成为停机的主要来源。但是,对于存储在Proxmox备份服务器上的VM备份,实时还原功能可最大程度地减少此停机时间,从而允许VM在还原开始后立即启动。在这种情况下,数据会在后台连续复

防火墙

内置的Proxmox VE防火墙提供了一种简单的方法来保护您的IT基础架构。防火墙是完全可定制的,允许通过GUI或CLI进行复杂的配置。

您可以为群集中的所有主机设置防火墙规则,也可以仅为虚拟机和容器定义规则。防火墙宏、安全组、IP 集和别名等功能有助于简化该任务。

Distributed Firewall 分布式防火墙

虽然所有配置都存储在群集文件系统中,但基于 iptables 的防火墙在每个群集节点上运行,从而在虚拟机之间提供完全隔离。该系统的分布式特性还提供了比集中式防火墙解决方案高得多的带宽。

IPv4 and IPv6 IPv4 和 IPv6

防火墙完全支持 IPv4 和 IPv6。IPv6 支持是完全透明的,默认情况下我们会过滤两种协议的流量。因此,没有必要为 IPv6 维护一组不同的规则。

1.2 - PVE备份服务器

PVE备份服务器用于备份和还原虚拟机、容器和物理主机

Proxmox Backup Server

Proxmox备份服务器是一种企业备份解决方案,用于备份和还原虚拟机,容器和物理主机。开源解决方案支持增量备份、重复数据删除、Zstandard 压缩和经过身份验证的加密。

https://www.proxmox.com/en/proxmox-backup-server

Proxmox 备份服务器是一种企业备份解决方案,用于备份和还原虚拟机、容器和物理主机。通过支持增量,完全重复的重复数据备份,Proxmox备份服务器显着降低了网络负载并节省了宝贵的存储空间。借助强大的加密和确保数据完整性的方法,您可以在备份数据时感到安全,即使备份到不完全信任的目标也是如此。

在新式数据中心中,主要重点是最大程度地减少停机时间并确保数据安全。因此,可靠的备份软件是您可以投资的最重要的基础架构组件之一。为了提高工作效率,易于使用的Proxmox备份服务器可让您以节省空间的方式备份数据,快速恢复数据,并通过基于Web的用户界面简化管理,有效地减少工作时间。

备份

用于备份和还原的开源平台

由于删除、勒索软件或其他危险而导致的数据丢失或损坏随时可能发生。因此,定期备份重要数据至关重要。为了提高生产力并满足您的运营目标,用户友好的Proxmox Backup解决方案可让您以节省空间的方式备份数据,快速恢复数据,并通过简化的管理有效减少工作时间。

开源

Proxmox Backup是一个独立的解决方案。Proxmox 软件堆栈的开源性质意味着您可以获得值得信赖的安全、灵活的产品。源代码是自由和开源的,在GNU Affero通用公共许可证v3(GNU AGPL,v3)下授权。因此,您可以自由使用该软件,随时检查源代码或自己为项目做出贡献。

增量和重复数据删除

备份以增量方式从客户端发送到Proxmox备份服务器,然后在那里对数据进行重复数据删除。通常,定期备份之间的更改很小。仅读取和发送更改可减少使用的存储空间和网络影响。

定期备份通常会产生大量重复数据。Proxmox 备份解决方案中的重复数据删除层减少了重复数据量,减少了数据存储所需的物理空间。

执行重复数据删除时,有不同的策略可以在性能和/或重复数据删除率方面获得最佳结果。根据数据类型,数据可以拆分为固定或可变大小的块;Proxmox备份服务器支持这两种策略。

性能

整个Proxmox备份软件栈是用Rust编写的,这是一种现代的、快速的、内存效率高的语言。Rust提供了高速度和内存效率,部分原因是它没有运行时和垃圾收集器。它丰富的类型系统和所有权模型保证了内存安全和线程安全。

压缩

Proxmox使用超快速的Zstandard(ZSTD)压缩技术,每秒能够压缩数千兆字节的数据。ZSTD的特点是压缩率高,压缩速度非常快。

架构

Proxmox 备份解决方案使用客户端-服务器模型。这种分离允许多个不相关的主机使用备份服务器。虽然服务器存储备份数据并提供用于创建和管理数据存储的 API,但客户端工具将与大多数现代 Linux 发行版配合使用,允许您从所有主机创建和管理备份。该软件加密客户端上已有的数据的能力确保它在到达服务器之前是安全的。

远程同步

Proxmox 备份服务器使您能够将数据存储拉取或同步到其他位置以实现冗余。这是将数据同步到异地位置的有效方法。仅传输自上次同步以来的更改。

在Proxmox Backup中,这是通过使用远程和同步作业来实现的。

  • 术语“远程”是指具有可同步到本地存储的数据存储的单独服务器。
  • 同步作业是用于将数据存储的内容从远程拉取到本地数据存储的过程。您可以安排它定期运行或通过 Web 界面手动启动同步作业。

恢复

您的团队或组织在没有数据的情况下可以生存多久?对于任何合理的备份解决方案,恢复操作都应该是一个无摩擦的过程,不会给管理员带来数小时不必要和令人沮丧的劳动。恢复过程中的速度、准确性和灵活性非常重要。

Proxmox备份服务器速度快如闪电,这意味着当灾难发生时,您可以在几秒钟内恢复该虚拟机,存档甚至单个文件。在灾难情况下,通过GUI快速简单的恢复将减轻任何压力。

Granular Recovery

如果只能还原所需的数据,为什么要还原所有数据?为了减少开销,Proxmox备份服务器附带了一个用于导航的快照目录。您可以快速搜索内容的存档,并立即恢复单个对象。

  • 精细的恢复选项。
  • 从备份中还原单个文件/目录/存档。
  • 交互式恢复外壳,仅用于还原几个单独的文件。
  • 使用常规垃圾回收从数据存储中删除冗余数据并释放空间。

1.3 - PVE资料收集

收集PVE的各种资料

官方资料

社区资料

  • Proxmox VE Helper-Scripts: Scripts for Streamlining Your Homelab with Proxmox VE, 简化使用 Proxmox VE 家庭实验室的脚本

学习资料

2 - PVE安装

介绍PVE的安装,使用,配置

2.1 - 下载PVE

下载PVE的安装文件

pve安装包

官方下载地址:

https://www.proxmox.com/en/downloads

主要下载:

  • PVE 8.0 ISO installer
  • Proxmox Backup Server 3.0 ISO Installer

支持 BitTorrent 下载!

virtio windows 驱动

https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/

在这里下载最新的 virtio windows 驱动,使用 virtio 安装 windows 时必须挂载这个驱动,否则会找不到硬盘。

2.2 - BIOS设置

安装PVE的主板BIOS设置

2.3 - 安装PVE

在物理机上安装PVE

刻录安装U盘

用下载下来的 iso 文件,刻录安装U盘。

安装

设置 bios 为从 u 盘启动,推荐 UEFI 模式。

全程按照提示操作即可。

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#installation_installer

安装程序将创建一个名为 pve 的卷组 (VG),以及称为根卷、数据和交换的其他逻辑卷 (LV)。要控制这些卷的大小,请使用:

  • hdsize / 硬盘大小

    定义要使用的总硬盘大小。这样,您可以在硬盘上保留可用空间以进行进一步分区(例如,在同一硬盘上用于 LVM 存储的额外 PV 和 VG)。

  • swapsize / 交换大小

    定义交换卷的大小。默认值为已安装内存的大小,最小 4 GB,最大 8 GB。结果值不能大于 hdsize/8。

  • maxroot / 根卷的最大大小

    定义存储操作系统的根卷的最大大小。根卷大小的最大限制为 hdsize/4。

  • maxvz / 最大VZ

    定义数据卷的最大大小。数据量的实际大小为:

    datasize = hdsize - rootsize - swapsize - minfree 其中 datasize 不能大于 maxvz。

    注意: 如果设置为 0,则不会创建任何数据卷,并且将相应地调整存储配置。

  • minfree

    定义 LVM 卷组 pve 中剩余的可用空间量。当可用的存储空间超过 128GB 时,默认值为 16GB,否则将使用 hdsize/8。

暂时用的全默认值进行安装,PVE installer 会创建 local 和 local-lvm, 大小大概是 100g 和 剩余空间。swapsize 为 8G.

备注:zfs 和 ceph 的使用稍后再尝试。目前没有开启

为了支持使用 timeshift 工具进行备份和恢复,在安装时选择留出部分空间给到 timeshift,因此 hdsize 被设置为实际硬盘大小 - 50G 左右。后面再对这个空余空间进行分区和格式化并安装和配置 timeshift 。

常见问题

“Starting the installer GUI”

安装开始后,在获取 DHCP 之后,会准备启动图形界面的安装器。然后就在这里失败,无法启动图形界面。

参考:

解决方法:

执行

chmod 1777 /tmp   
Xorg -configure   
mv /xorg.conf.new /etc/X11/xorg.conf

再执行

vim /etc/X11/xorg.conf

找到 “device” 一节中的 “Driver” 设置,将值修改为 “fbdev” 。

启动x 图形界面,就可以继续图形化安装 pve。

startx

但我遇到的问题是安装完成之后,又卡在 “Loading initial ramdisk” 了。

“Loading initial ramdisk”

U 盘启动后,选择安装 PVE,然后在命令行界面上看到 “Loading initial ramdisk ……” 之后就进入黑屏状态,无任何显示。或者是屏幕保持不变,卡死在这个界面再也无法继续。

通过逐个排查 cmos 设置选项,最后发现是和 cpu 节能配置有关,必须将 “cpu C state control” 的这两个设置项设置为 Disable 才能避免出现这个问题。

  • CPU C3 report
  • CPU C6 report

这两个设置项如果在安装完成之后再开启,也会导致 PVE 启动时同样卡在 initial ramdisk 上,因此必须保证始终关闭。

备注:这个问题仅有某些机器(x99主板)上会出现,不是所有机器都有这个问题,比如z690主板上我发现就可以开启 C3 report 和 C6 report 之后继续安装和使用。

有人说是显卡的兼容性,可以通过使用集显来绕开这个问题:

也有通过增加 nomodeset 参数来解决的:

https://mengkai.fun/archives/1717297733491

我测试中发现(z690主板 + 13700kf cpu + nvidia 亮机卡)并不能解决问题: 1. 在Terminal UI界面通过增加参数 nomodeset 跳过这个报错之后,虽然安装成功,但是 pve 用不了。 2. 在 在 Graphic UI界面也可以增加参数 nomodeset,但随后的图形界面会有显示bug,无法正确显示。

最后,发现可能和 nvidia 显卡有关,因为出现报错:

loading dirvers: nvidiafb .......................

解决方法有两个:

  1. 如果有集成显卡,请使用集成显卡进行安装,这样就不会载入 nvidiafb
  2. 可以换成 amd 显卡

注意这个报错只出现在 pve 安装时,安装完成后 nvidia 显卡时可以使用的。因此有一个绕开这个问题的做法就是:先用集成显卡或者 amd 独立显卡完成 pve 的安装之后,再换成 nvidia 显卡。

“create LVs”

安装时,有时会遇到长时间(三五分钟)停留在 “create LVs” 处,原因不明,大部分机器没这个问题。

耐心等待就好,暂时不清楚问题,好在只是慢。

nvme device not ready

和具体使用的 nvme ssd 有关,我用的爱国者 p7000z 4t 版本就有这个问题,安装正常,但是启动 PVE 时会报错:

nvme nvme0: Device not ready; aborting initialisation, CSTS=0x0

参考帖子:

备注:pve8.1 版本之后就没有这个问题了,解决方案已经直接进入了新的 linux 内核。

2.4 - 配置国内的更新源

配置国内的更新源

修改之前先备份一下:

cp /etc/apt/sources.list /etc/apt/sources.list.original

添加国内软件源

修改

vi /etc/apt/sources.list

内容为:

deb https://mirrors.ustc.edu.cn/debian/ bookworm main contrib
# deb-src https://mirrors.ustc.edu.cn/debian/ bookworm main contribe
deb https://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib
# deb-src https://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib

给 PVE 更换国内源

vi /etc/apt/sources.list.d/pve-no-subscription.list

内容为:

deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian bookworm pve-no-subscription

屏蔽 PVE 的企业源和 ceph 的源

先注释掉pve的企业源:

vi /etc/apt/sources.list.d/pve-enterprise.list

将内容注释即可:

#deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise

再注释掉 ceph 的源:

vi /etc/apt/sources.list.d/ceph.list

将内容注释即可:

#deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise

执行命令:

更新

apt update

看一下有哪些可以更新的:

apt list --upgradable

执行更新:

apt upgrade

完成后,习惯性重启。

参考资料

2.5 - 安装配置git

安装git并设置代理

安装 git

apt -y install git 

配置代理

vi ~/.ssh/config

增加以下内容:

Host github.com
HostName github.com
User git
# http proxy
#ProxyCommand socat - PROXY:192.168.0.1:%h:%p,proxyport=7890
# socks5 proxy
ProxyCommand nc -v -x 192.168.0.1:7891 %h %p

2.6 - 安装配置zsh

安装zsh/ohmyzsh,并配置proxy信息

用习惯 zsh 和 ohmyzsh 了,pve 下希望继续保持相同的体验。

安装zsh

和 ubuntu 下类似,但是有些命令会报错,多执行几次就好了。

参考:

https://skyao.io/learning-ubuntu-server/docs/installation/basic/zsh/

apt -y install zsh zsh-doc

安装ohmyzsh

然后安装ohmyzsh:

sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安全起见,临时设置一下代理:

export all_proxy=socks5://192.168.0.1:7891;export http_proxy=http://192.168.0.1:7890;export https_proxy=http://192.168.0.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,192.168.0.0/16,10.0.0.0/16

配置 ohmyzsh

参考:

https://skyao.io/learning-ubuntu-server/docs/installation/basic/zsh/

完成后退出登录,然后重新登录进来,发现熟悉的 zsh 回来了。

2.7 - 设置网络代理

设置网络代理方便在必要时开启代理

安装完成 zsh 之后,顺便把代理配置上,必要时开启。

vi ~/.zshrc

增加以下内容:

# proxy
alias proxyon='export all_proxy=socks5://192.168.0.1:7891;export http_proxy=http://192.168.0.1:7890;export https_proxy=http://192.168.0.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16'
alias proxyoff='unset all_proxy http_proxy https_proxy no_proxy'

重新载入:

source ~/.zshrc

2.8 - 安装pvetools

安装pvetools

https://github.com/ivanhao/pvetools

安装

执行命令:

export LC_ALL=en_US.UTF-8
apt update
apt -y install git 
mkdir -p ~/work/soft
cd ~/work/soft
git clone https://github.com/ivanhao/pvetools.git

使用

cd ~/work/soft/pvetools
./pvetools.sh

主要用到的功能是:

配置apt国内源

可惜失败了,报错说版本不支持,可能 pve 8 太新还没有来得及更新。只能手工配置了。

安装配置 samba 和 nfs

安装配置cpu省电

需要设置cpu的最大频率和最小频率,注意单位,比如 4.5G 要设置为 4500000, 0.8g 要设置为 800000.

配置PCI硬件直通

配置pve的wb界面显示传感器温度/cpu频率

注意:不支持最新的 8.0.3,安装时会报错提示版本不匹配。

但如果是先在 8.0.2 版本下安装之后再升级到 8.0.3,则可以正常使用。

如果出现页面一直试图显示cpu温度信息,有个圈圈一直在转。修复的方式是先将pve降级,再重新升级回 8.0.3,这个问题就消失了。

这个功能很实用,方便看这些信息了。

Selection_002

去除订阅提示

2.9 - 安装pve-source

安装pve-source

看到推荐,暂时还没有使用过,记录备用。

2.10 - 安装常用软件

PVE安装完成后继续安装常用的各种软件

系统类

安装 dkms 和用于 pve 的 linux-headers:

apt install -y gcc make dkms
apt install -y pve-headers-$(uname -r)
apt install --fix-broken

工具类

apt install -y unzip 

网络类

apt install -y net-tools iperf iperf3

Iperf3 安装时会询问是否系统服务(自动启动),选择 yes,这样方便需要时排查网络。

开发类

2.11 - 修改管理网络

在安装完成后修改管理网络

管理网络的设置通常在安装时完成,但有时需要在安装完成之后修改管理网络。

通过web页面

如果还能打开 web 页面,则非常简单,在节点的 “System” -> “Network” 中找到管理网络(通常是一个 linux bridge),“Edit” 就可以修改。

这个方案适合修改 ip 地址,网管等基础信息。也可以修改 Bridge Ports 信息来指定其他网卡作为管理网路。

通过命令行

如果遇到 web 页面已经无法打开,比如更换网卡之后,网卡名称发生变化,作为管理网络的 linux bridge 会因为底层网卡不可用导致 linux bridge 也不可用。

这种情况下只能通过命令行来操作,登录之后,

vi /etc/network/interfaces

打开文件,修改各个 iface 对应的网卡信息,对于管理网络,需要修改 linux bridge 的 address / gateway / bridge-ports 等信息:

auto lo
iface lo inet loopback

iface enp11s0 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.0.18/24
        gateway 192.168.0.1
        bridge-ports enp11s0
        bridge-stp off
        bridge-fd 0

iface enp179s0 inet manual

iface enp179s0d1 inet manual

修改 hosts 文件

记得修改 hosts 文件中的记录:

vi /etc/hosts

这里也有一个旧的 IP 地址需要为新的 IP 地址。

修改完成后重启。

3 - 硬件配置

配置PVE下的硬件,包括驱动等

3.1 - 更新CPU微码

更新CPU微码

pve 启动时,看到屏幕上有提示要求更新 microcode。

添加仓库

需要添加 unstable repo:

echo "deb http://deb.debian.org/debian/ unstable non-free-firmware" > /etc/apt/sources.list.d/debian-unstable.list

执行更新:

apt update && apt list --upgradable

安装微码,intel 选择:

apt -y install intel-microcode

amd 选择:

apt -y install amd64-microcode

更新完之后重启,发现之前报告要求更新 microcode 的信息消失了,搞定。

记得把 unstable 仓库删除,避免不小心更新到这个仓库中的其他软件。

rm /etc/apt/sources.list.d/debian-unstable.list

引发问题

安装上面的方式安装微码之后,即使注释或者删除 debian-unstable.list 文件,在 apt update 时也会出现以下提示:

$ apt update
Hit:1 https://mirrors.ustc.edu.cn/debian bookworm InRelease
Hit:2 https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian bookworm InRelease
Hit:3 https://mirrors.ustc.edu.cn/debian bookworm-updates InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
N: Repository 'Debian bookworm' changed its 'firmware component' value from 'non-free' to 'non-free-firmware'
N: More information about this can be found online in the Release notes at: https://www.debian.org/releases/bookworm/amd64/release-notes/ch-information.html#non-free-split

如果不想继续看到这个提示,可以修改文件:

vi /etc/apt/apt.conf.d/no-bookworm-firmware.conf

输入内容:

APT::Get::Update::SourceListWarnings::NonFreeFirmware "false";

再次执行 apt update 命令就不会再出现这个提示了:

$ apt update
Hit:1 https://mirrors.ustc.edu.cn/debian bookworm InRelease
Hit:2 https://mirrors.ustc.edu.cn/debian bookworm-updates InRelease
Hit:3 https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian bookworm InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

参考资料

3.2 - [归档]安装r8125驱动

为relteck 8125 2.5G网卡安装驱动

警告

发现更新驱动之后,普通模式下可以正常工作,但一旦开启直通,这个驱动就会无法工作。

而因为 r8139 被加入黑名单,导致没有驱动可用,然后网卡就无法使用。

因为这个网卡是用于管理网络的,所以 pve 也跟着失联了……

因此,放弃更新这个驱动。后续移除了所有的 2.5g 网卡,统一使用 cx3 pro 40g (hp544+)或者 cx4 25g 网卡。

准备工作

apt install -y dkms
apt install -y pve-headers-$(uname -r)
apt install --fix-broken

下载驱动

https://github.com/awesometic/realtek-r8125-dkms/releases

mkdir ~/temp
cd ~/temp
wget https://github.com/awesometic/realtek-r8125-dkms/releases/download/9.010.01-2/realtek-r8125-dkms_9.010.01-2_amd64.deb

通过安装包安装驱动

dpkg -i realtek-r8125-dkms_9.010.01-2_amd64.deb

输出为:

dpkg -i realtek-r8125-dkms_9.010.01-2_amd64.deb
Selecting previously unselected package realtek-r8125-dkms.
(Reading database ... 86910 files and directories currently installed.)
Preparing to unpack realtek-r8125-dkms_9.010.01-2_amd64.deb ...
Unpacking realtek-r8125-dkms (9.010.01-2) ...
Setting up realtek-r8125-dkms (9.010.01-2) ...
locale: Cannot set LC_ALL to default locale: No such file or directory
Loading new realtek-r8125-9.010.01 DKMS files...
Deprecated feature: REMAKE_INITRD (/usr/src/realtek-r8125-9.010.01/dkms.conf)
Building for 6.2.16-4-pve
Building for architecture amd64
Building initial module for 6.2.16-4-pve
Deprecated feature: REMAKE_INITRD (/var/lib/dkms/realtek-r8125/9.010.01/source/dkms.conf)
Done.
Deprecated feature: REMAKE_INITRD (/var/lib/dkms/realtek-r8125/9.010.01/source/dkms.conf)
Deprecated feature: REMAKE_INITRD (/var/lib/dkms/realtek-r8125/9.010.01/source/dkms.conf)

r8125.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/6.2.16-4-pve/updates/dkms/
depmod...

这个版本是 9.010。

通过源码安装驱动

发现代码里面有更新到 9.011,只是没有打包发布为 deb 格式。但是可以从源码开始安装。

git clone https://github.com/awesometic/realtek-r8125-dkms.git 
cd realtek-r8125-dkms
./dkms-install.sh

输出为:

./dkms-install.sh 
About to run dkms install steps...
Deprecated feature: REMAKE_INITRD (/usr/src/r8125-9.011.01/dkms.conf)
Creating symlink /var/lib/dkms/r8125/9.011.01/source -> /usr/src/r8125-9.011.01
Sign command: /lib/modules/6.2.16-4-pve/build/scripts/sign-file
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub
Deprecated feature: REMAKE_INITRD (/var/lib/dkms/r8125/9.011.01/source/dkms.conf)

Building module:
Cleaning build area...
'make' -j16 KVER=6.2.16-4-pve BSRC=/lib/modules/6.2.16-4-pve modules......
Signing module /var/lib/dkms/r8125/9.011.01/build/src/r8125.ko
Cleaning build area...
Deprecated feature: REMAKE_INITRD (/var/lib/dkms/r8125/9.011.01/source/dkms.conf)

r8125.ko:
Running module version sanity check.
 - Original module
 - Installation
   - Installing to /lib/modules/6.2.16-4-pve/updates/dkms/
depmod...
Finished running dkms install steps.

更换驱动

屏蔽 r8169 驱动:

sudo sh -c 'echo blacklist r8169 >> /etc/modprobe.d/blacklist_r8169.conf'

重启机器,检验:

lsmod | grep r81  
r8125                 262144  0
r8169                 114688  0

对比没有更新驱动的输出:

lsmod | grep r81  
r8169                 114688  0

检验

更新之前,客户端和服务器端都使用默认的 r8169 驱动,iperf3 测试速度为 2.35-2.36G。

更新客户端驱动为 r8125 驱动, iperf3 测试速度为 2.35-2.36 G,几乎没有变化。

继续更新服务器端驱动为 r8125 驱动, iperf3 测试速度为 2.35/2.36G,几乎没有变化。

总结:更新驱动未能带来速度方面的直接收益。

参考资料

4 - 系统设置

设置PVE的系统

4.1 - 修改swap分区参数

修改swap分区参数,更多使用物理内存

打开文件:

vi /etc/sysctl.conf

在文件最后增加内容:

vm.swappiness = 1

设置内存剩余多少时使用 swap 分区,数字越小代表多使用物理内存。

sysctl -p

让配置生效。

4.2 - 修改locale设置

修改locale设置避免报错

修改配置

默认安装后,有时会遇到 locale 报错:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_IDENTIFICATION = "zh_CN.UTF-8",
	LC_NUMERIC = "zh_CN.UTF-8",
	LC_TIME = "zh_CN.UTF-8",
	LC_PAPER = "zh_CN.UTF-8",
	LC_MONETARY = "zh_CN.UTF-8",
	LC_TELEPHONE = "zh_CN.UTF-8",
	LC_MEASUREMENT = "zh_CN.UTF-8",
	LC_NAME = "zh_CN.UTF-8",
	LC_ADDRESS = "zh_CN.UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").

最简单的修改方案:

vi /etc/default/locale

将内容修改为:

LC_CTYPE="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
LANG="en_US.UTF-8"

参考资料

4.3 - 合并local-lvm和local分区

合并local-lvm和local分区

删除 local-lvm

lvremove pve/data

输出:

lvremove pve/data
Do you really want to remove active logical volume pve/data? [y/n]: y
  Logical volume "data" successfully removed.

扩展local

lvextend -l +100%FREE -r pve/root

输出为:

  Size of logical volume pve/root changed from 96.00 GiB (24576 extents) to 885.25 GiB (226624 extents).
  Logical volume pve/root successfully resized.
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/mapper/pve-root is mounted on /; on-line resizing required
old_desc_blocks = 12, new_desc_blocks = 111
The filesystem on /dev/mapper/pve-root is now 232062976 (4k) blocks long.

完成后,查看修改后的状态:

df -Th  

/dev/mapper/pve-root 现在是 831G 了。

Filesystem           Type      Size  Used Avail Use% Mounted on
udev                 devtmpfs   63G     0   63G   0% /dev
tmpfs                tmpfs      13G  1.9M   13G   1% /run
/dev/mapper/pve-root ext4      871G  4.0G  831G   1% /
tmpfs                tmpfs      63G   66M   63G   1% /dev/shm
tmpfs                tmpfs     5.0M     0  5.0M   0% /run/lock
/dev/nvme0n1p2       vfat     1022M  344K 1022M   1% /boot/efi
/dev/fuse            fuse      128M   48K  128M   1% /etc/pve
tmpfs                tmpfs      13G     0   13G   0% /run/user/0

对比修改前的:

df -Th
Filesystem           Type      Size  Used Avail Use% Mounted on
udev                 devtmpfs   63G     0   63G   0% /dev
tmpfs                tmpfs      13G  2.0M   13G   1% /run
/dev/mapper/pve-root ext4       94G  4.0G   86G   5% /
tmpfs                tmpfs      63G   66M   63G   1% /dev/shm
tmpfs                tmpfs     5.0M     0  5.0M   0% /run/lock
/dev/nvme0n1p2       vfat     1022M  344K 1022M   1% /boot/efi
/dev/fuse            fuse      128M   48K  128M   1% /etc/pve
tmpfs                tmpfs      13G     0   13G   0% /run/user/0

页面删除Local-LVM

管理页面上,找到 “Datacenter” -> “Storage” ,找到 local-lvm ,然后点击删除。

修改 local 属性

“Datacenter” -> “Storage” 下,选择 local, 编辑 Content ,选中所有内容。

参考资料

4.4 - 清理不再使用的内核

清理不再使用的内核

脚本操作

https://tteck.github.io/Proxmox/

找到 Proxmox VE Kernel Clean 这个脚本,执行:

bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/misc/kernel-clean.sh)"

也可以手工把这个脚本下载到本地,方便以后执行本地运行:

mkdir -p ~/work/soft/pve
cd ~/work/soft/pve
wget https://github.com/tteck/Proxmox/raw/main/misc/kernel-clean.sh
chmod +x kernel-clean.sh

以后运行时,就只要执行

~/work/soft/pve/kernel-clean.sh

手工操作

参考: https://asokolsky.github.io/proxmox/kernels.html

4.5 - 安装配置timeshift

安装配置 timeshift 来对 PVE 进行备份和恢复

前面在安装 pve 时,选择了留出 50G 大小的空间给 timeshift 使用。

为 timeshift 准备分区

查看当前磁盘分区情况

fdisk -l

查看当前硬盘情况:

Disk /dev/nvme0n1: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: WDC WDS500G1B0C-00S6U0                  
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: 000372CE-8B4D-4B12-974B-99C231DB3D67

Device           Start       End   Sectors  Size Type
/dev/nvme0n1p1      34      2047      2014 1007K BIOS boot
/dev/nvme0n1p2    2048   2099199   2097152    1G EFI System
/dev/nvme0n1p3 2099200 838860800 836761601  399G Linux LVM


Disk /dev/mapper/pve-swap: 8 GiB, 8589934592 bytes, 16777216 sectors
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: 96 GiB, 103079215104 bytes, 201326592 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

这是一个大小为 480G 的 nvme SSD 硬盘,实际可用空间为 465G。在安装 PVE 时我将 hdsize 设置为 400G, 因此 PVE 使用的空间只有400G。从上面输出可以看到:

/dev/nvme0n1p1      34      2047      2014 1007K BIOS boot
/dev/nvme0n1p2    2048   2099199   2097152    1G EFI System
/dev/nvme0n1p3 2099200 838860800 836761601  399G Linux LVM

nvme0n1p1 是 BIOS, nvme0n1p2 是 EFI 分区,PVE 使用的是 nvme0n1p3,399G。

另外可以看到:

Disk /dev/mapper/pve-swap: 8 GiB, 8589934592 bytes, 16777216 sectors
Disk /dev/mapper/pve-root: 96 GiB, 103079215104 bytes, 201326592 sectors

swap 使用了 8G, pve root 使用了 96 G。

lsblk -f

可以看到 nvme0n1p3 是一个 LVM2,400G 的总空间中,内部被分为 pve-swap / pve-root / pve-data_tmeta


NAME               FSTYPE      FSVER    LABEL UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1                                                                                             
|-nvme0n1p1                                                                                         
|-nvme0n1p2        vfat        FAT32          26F2-091E                              1021.6M     0% /boot/efi
`-nvme0n1p3        LVM2_member LVM2 001       foXyBZ-IPQT-wOCF-DWSN-u88a-sBVD-LaZ9zn                
  |-pve-swap       swap        1              c5d97cb5-4d18-4f43-a36f-fb67eb8dcc84                  [SWAP]
  |-pve-root       ext4        1.0            a0a46add-dda5-42b4-a978-97d363eeddd0     85.2G     4% /
  |-pve-data_tmeta                                                                                  
  | `-pve-data                                                                                      
  `-pve-data_tdata                                                                                  
    `-pve-data   

剩余的大约 60G 的空间在这里没有显示。

添加 timeshift 分区

fdisk /dev/nvme0n1

输出为:

Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.

在警告说磁盘使用中,重新分区不是一个好注意。不过我们是操作剩余空间,比较安全。

输入 m 获得帮助:

Command (m for help): m

Help:

  GPT
   M   enter protective/hybrid MBR

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty MBR (DOS) partition table
   s   create a new empty Sun partition table

输入 F 列出未分区的剩余空间:

Command (m for help): F

Unpartitioned space /dev/nvme0n1: 65.76 GiB, 70610066944 bytes, 137910287 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes

    Start       End   Sectors  Size
838862848 976773134 137910287 65.8G

这个 65.8G 就是我们之前预留的空间。

输入 n 添加新的分区,默认是利用剩余空间的全部。这里敲三次回车全部默认即可。

Command (m for help): n
Partition number (4-128, default 4): 
First sector (838860801-976773134, default 838862848): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (838862848-976773134, default 976773119): 

Created a new partition 4 of type 'Linux filesystem' and of size 65.8 GiB.

如果不是利用全部剩余空间,则可以通过输入 +100G 这样的内容来设置要添加的分区大小。

输入 p 显示修改之后的分区表:

Command (m for help): p
Disk /dev/nvme0n1: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: WDC WDS500G1B0C-00S6U0                  
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: 000372CE-8B4D-4B12-974B-99C231DB3D67

Device             Start       End   Sectors  Size Type
/dev/nvme0n1p1        34      2047      2014 1007K BIOS boot
/dev/nvme0n1p2      2048   2099199   2097152    1G EFI System
/dev/nvme0n1p3   2099200 838860800 836761601  399G Linux LVM
/dev/nvme0n1p4 838862848 976773119 137910272 65.8G Linux filesystem

可以看到我们新加的 nvme0n1p4 分区大小为 65.8G。

检查无误,输入 w 写入修改操作并退出。

Command (m for help): w
The partition table has been altered.
Syncing disks.

在 pve 下执行

fdisk -l 

再次检查分区情况:

......
Device             Start       End   Sectors  Size Type
/dev/nvme0n1p1        34      2047      2014 1007K BIOS boot
/dev/nvme0n1p2      2048   2099199   2097152    1G EFI System
/dev/nvme0n1p3   2099200 838860800 836761601  399G Linux LVM
/dev/nvme0n1p4 838862848 976773119 137910272 65.8G Linux filesystem

至此 timeshift 分区准备OK.

格式化 timeshift 分区

mkfs.ext4 /dev/nvme0n1p4

对分区进行格式化,格式为 ext4:


mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done                            
Creating filesystem with 17238784 4k blocks and 4317184 inodes
Filesystem UUID: 2411eb4e-67f1-4c7d-b633-17df1fa0c127
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done 

安装 timeshift

具体参考这里:

https://skyao.io/learning-ubuntu-server/docs/installation/timeshift/install/

安装配置完成后,执行

timeshift --list

查看 timeshift 情况:


First run mode (config file not found)
Selected default snapshot type: RSYNC
Mounted '/dev/nvme0n1p4' at '/run/timeshift/5364/backup'
Device : /dev/nvme0n1p4
UUID   : 2411eb4e-67f1-4c7d-b633-17df1fa0c127
Path   : /run/timeshift/5364/backup
Mode   : RSYNC
Status : No snapshots on this device
First snapshot requires: 0 B

No snapshots found

使用 timeshift 进行备份

设置自动备份

vi /etc/timeshift/timeshift.json

打开 timeshift 配置文件,修改以下内容

{
  "schedule_monthly" : "true",
  "schedule_weekly" : "true",
  "schedule_daily" : "true",
  "schedule_hourly" : "false",
  "schedule_boot" : "false",
  "count_monthly" : "2",
  "count_weekly" : "3",
  "count_daily" : "5",
  "count_hourly" : "6",
  "count_boot" : "5",
}

对于软路由机器,由于是长期开机并且改动不过,因此 schedule_monthly / schedule_weekly / schedule_daily 设置为 true,数量用默认值。

排除不需要备份的内容

默认情况下 timeshift 的配置文件中已经设置了 exclude:

{
  "exclude" : [
    "/var/lib/ceph/**",
    "/root/**"
  ],
  "exclude-apps" : []
}
  • /var/lib/ceph/: ceph 相关的文件

  • /root/: root 用户的 home 路径,如果使用其他用户,也需要将它们的 home 目录加入进来。

但这些是不够的,还需要增加以下内容:

  • /var/lib/vz/

    pve的各种文件,包括虚拟机,模版,备份,上传的iso文件等都在这里,这些文件太大,不适合用 timeshift 备份,因此必须排除。

    ls /var/lib/vz
    dump  images  private  snippets  template
    
    • dump: 这里保存 pve backup 备份下来的虚拟机镜像文件
    • images: 这里保存 pve 虚拟机镜像文件
    • template: iso 子目录中保存的是上传到 pve 的各种 iso/img 文件
  • /etc/pve/qemu-server/: pve 的虚拟机配置文件,这些文件也不要用 timeshift 备份,避免恢复时把虚拟机文件也给覆盖了。虚拟机文件的备份会由下一节中提到的自动脚本进行备份。

  • /root/data/backup/pve/pveConfBackup: pve虚拟机文件的自动备份目录,详情见下一节。

  • /mnt/pve: 在 pve 下使用 nfs 存储时,远程 nfs 会自动 mount 到这个目录下,这些文件肯定也不能被 timeshift 备份。因此必须排除。

最后通过设置的 exclude 为:

{
  ......
  "exclude" : [
    "/var/lib/ceph/**",
    "/root/**",
    "/var/lib/vz/**",
    "/etc/pve/qemu-server/**",
    "/root/data/backup/pve/pveConfBackup/**",
    "/mnt/pve/**"
  ],
}

设置自动备份虚拟机文件

见下一章,推荐完成这个操作之后再执行手工备份。

手工备份

timeshift --create --comments "first backup after apt upgrade and basic soft install"

输入为:

Estimating system size...
Creating new snapshot...(RSYNC)
Saving to device: /dev/nvme0n1p4, mounted at path: /run/timeshift/6888/backup
Syncing files with rsync...
Created control file: /run/timeshift/6888/backup/timeshift/snapshots/2023-07-25_21-10-04/info.json
RSYNC Snapshot saved successfully (41s)
Tagged snapshot '2023-07-25_21-10-04': ondemand
------------------------------------------------------------------------------

查看当前备份情况:

timeshift --list                                                                      
Mounted '/dev/nvme0n1p4' at '/run/timeshift/7219/backup'
Device : /dev/nvme0n1p4
UUID   : 2411eb4e-67f1-4c7d-b633-17df1fa0c127
Path   : /run/timeshift/7219/backup
Mode   : RSYNC
Status : OK
1 snapshots, 64.5 GB free

Num     Name                 Tags  Description                                            
------------------------------------------------------------------------------
0    >  2023-07-25_21-10-04  O     first backup after apt upgrade and basic soft install  

结合备份之前看到的 timeshift 备份分区的大小为 65.8G,减去这里的 64.5 GB free,也就是这个备份用掉了 1.3 G 的磁盘空间。

4.6 - 开启自动备份虚拟机配置文件

备份PVE的虚拟机配置文件,方便在必要时进行恢复

准备工作

建立备份存放的目录

建立备份存放的目录,为了不被 timeshift 影响,我们将备份目录放到 root 用户的 home 目录(即 /root 目录)。由于在前面 timeshift 设置中的 exclude 中排除了 /root/**,因此我们可以将备份目录放到 /root/** 下。

建立备份目录 /root/data/backup/pve:

mkdir -p /root/data/backup/pve
cd /root/data/backup/pve

启动虚拟机conf文件备份

通过 pvetools 脚本来启用 “自动备份虚拟机 conf 文件”

/root/work/soft/pvetools/pvetools.sh

输入前面准备的备份路径 /root/data/backup/pve

备份数量输入 8 。之后虚拟机配置文件就会自动备份到这个目录了。

可以对比一下备份的原始数据和备份后的文件:

  • 这是要备份的文件

    $ ls /etc/pve/qemu-server/                       
    1000.conf  1001.conf
    
  • 这时备份好的目录

    $ ls /root/data/backup/pve/pveConfBackup 
    20240315
    $ ls /root/data/backup/pve/pveConfBackup/20240315 
    1000.conf  1001.conf
    

恢复虚拟机配置文件

在虚拟机配置文件丢失的情况下(典型例子就是用 timeshift restore 功能从备份中恢复),可以通过获取备份的文件来进行恢复。

找到备份的文件:

$ cd /root/data/backup/pve/pveConfBackup/
$ ls 
20240315
$ cd 20240315                            
$ ls                      
1000.conf  1001.conf

复制到 /etc/pve/qemu-server/ 目录:

rm /etc/pve/qemu-server/*
cp /root/data/backup/pve/pveConfBackup/20240315/* /etc/pve/qemu-server/

配置 timeshift excludes

注意:必须将虚拟机配置文件备份路径加入到 timeshift excludes 中,避免在通过 timeshift 进行恢复时丢失备份的数据。

{
  ......
  "exclude" : [
    ......
    "/root/data/backup/pve/pveConfBackup/**",
    ......
  ],
}

4.7 - 恢复系统设置

在必要时恢复PVE的系统设置

4.8 - 进入恢复模式修复系统

在必要时通过进入 pve 的恢复模式来修复系统

背景

有时在经过错误的配置之后,pve 系统会无法使用,甚至无法进入系统和页面控制台。

此时需要有其他的方案来修复系统。

恢复模式

进入恢复模式

开机,选择 “Advanced options for Proxmox VE GNU/Linux” ,然后选择 Rescue mode。

用 root 密码登录即可。

启动集群

systemctl start pve-cluster

这是就可以访问目录 /etc/pve 来操作集群和虚拟机了。

操作虚拟机

比如关闭有问题的虚拟机:

qm stop id

修改虚拟机配置

cd /etc/pve/nodes/<node_name>/qume-server

这里能看到各个虚拟机的配置文件,打开相应的配置文件修改即可,比如取消虚拟机的开机,只要将 onboot 修改为 0.

5 - 直通

直通硬件到虚拟机

5.1 - 开启直通

开启直通功能

可以通过两种方式开启直通功能:

  1. 手工修改
  2. 用 pvetools 工具帮忙

准备工作

主板bios设置

必须先在主板 bios 中开启 cpu 的 VD-T 支持和虚拟化支持。

VD-T不支持就无法直通。intel 要 b75 以上芯片组才支持。也就是需要从 intel 4代酷睿处理器开始才支持。

虚拟机设置

在创建虚拟机时,芯片组一定要q35 。因为Q35,才能 PCIE 直通,否则就是 PCI 直通。

手工

开启 iommu

vi /etc/default/grub

修改 GRUB_CMDLINE_LINUX_DEFAULT,增加 intel_iommu=on 。使用 intel_iommu=on 后,开机会有内核crash,可以尝试加一个 iommu=pt。这样就是:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_pstate=disable intel_iommu=on iommu=pt pcie_acs_override=downstream pci=realloc=off"

备注: 安装完成后的默认值是 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_pstate=disable"

解释:

  • pcie_acs_override=downstream
  • pci=realloc=off

修改完成之后,更新 grub:

update-grub

设置虚拟化驱动

vi /etc/modules

增加以下内容:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

备注: 安装完成后的默认值是空,仅有少量注释。

升级并更新配置:

update-initramfs -u -k all

之后重启机器。

pvetools

使用 pvetools 就简单了,只要在 pvetools 的菜单中选择 “配置PCI硬件直通” -》“配置开启物理机硬件直通支持”。

完成后重启机器。

检验

检验 iommu 是否开启

dmesg | grep -e DMAR -e IOMMU

正确开启时的输出会类似如下:

[    0.000000] Warning: PCIe ACS overrides enabled; This may allow non-IOMMU protected peer-to-peer DMA
[    0.033632] ACPI: DMAR 0x00000000BC4B0870 0000B8 (v01 INTEL  HSW      00000001 INTL 00000001)
[    0.033687] ACPI: Reserving DMAR table memory at [mem 0xbc4b0870-0xbc4b0927]
[    0.066765] DMAR: IOMMU enabled
[    0.186968] DMAR: Host address width 39
[    0.186972] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[    0.186988] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap c0000020660462 ecap f0101a
[    0.186996] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[    0.187006] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008020660462 ecap f010da
[    0.187012] DMAR: RMRR base: 0x000000bc1d8000 end: 0x000000bc1e4fff
[    0.187017] DMAR: RMRR base: 0x000000bf000000 end: 0x000000cf1fffff
[    0.187024] DMAR-IR: IOAPIC id 8 under DRHD base  0xfed91000 IOMMU 1
[    0.187030] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[    0.187034] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.188070] DMAR-IR: Enabled IRQ remapping in x2apic mode
[    0.634998] DMAR: No ATSR found
[    0.635001] DMAR: No SATC found
[    0.635004] DMAR: IOMMU feature pgsel_inv inconsistent
[    0.635008] DMAR: IOMMU feature sc_support inconsistent
[    0.635011] DMAR: IOMMU feature pass_through inconsistent
[    0.635014] DMAR: dmar0: Using Queued invalidation
[    0.635026] DMAR: dmar1: Using Queued invalidation
[    0.720415] DMAR: Intel(R) Virtualization Technology for Directed I/O
[   14.512740] i915 0000:00:02.0: [drm] DMAR active, disabling use of stolen memory

可以看到 “DMAR: IOMMU enabled” / “DMAR: Intel(R) Virtualization Technology for Directed I/O” 的字样,说明 IOMMU 开启成功。

执行命令:

dmesg | grep 'remapping'

如果看到类似如下 “Enabled IRQ remapping in x2apic mode” 内容,也说明 IOMMU 开启成功:

[    0.187034] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.188070] DMAR-IR: Enabled IRQ remapping in x2apic mode

或者执行

dmesg | grep iommu

如果能看到类似内容,也说明 IOMMU 开启成功:

[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.2.16-3-pve root=/dev/mapper/pve-root ro quiet intel_pstate=disable intel_iommu=on iommu=pt pcie_acs_override=downstream pci=realloc=off
[    0.066508] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.2.16-3-pve root=/dev/mapper/pve-root ro quiet intel_pstate=disable intel_iommu=on iommu=pt pcie_acs_override=downstream pci=realloc=off
[    0.558404] iommu: Default domain type: Passthrough (set via kernel command line)
[    0.719593] pci 0000:00:02.0: Adding to iommu group 0
[    0.719693] pci 0000:00:00.0: Adding to iommu group 1
[    0.719725] pci 0000:00:01.0: Adding to iommu group 2
[    0.719755] pci 0000:00:01.1: Adding to iommu group 3
......
[    0.720223] pci 0000:05:00.0: Adding to iommu group 17
[    0.720252] pci 0000:06:00.0: Adding to iommu group 18
[    0.720278] pci 0000:08:00.0: Adding to iommu group 19

还可以执行命令

find /sys/kernel/iommu_groups/ -type l 

如果能看到很多直通组,说明开启成功:

/sys/kernel/iommu_groups/17/devices/0000:05:00.0
/sys/kernel/iommu_groups/7/devices/0000:00:1c.0
/sys/kernel/iommu_groups/15/devices/0000:02:00.0
/sys/kernel/iommu_groups/5/devices/0000:00:16.0
......
/sys/kernel/iommu_groups/19/devices/0000:08:00.0
/sys/kernel/iommu_groups/9/devices/0000:00:1c.3

5.2 - 网卡直通

直通网卡到虚拟机

5.2.1 - 设置网卡直通并检查是否生效

设置pve下的网卡直通并检查是否生效

直通网卡

创建虚拟机

特别注意,创建虚拟机时要选择 q35

在虚拟机的 hardware 设置中,添加 pci device:

注意勾选 All functions 以直通网卡上的所有网口,另外对于 pcie 设置,要勾选 “PCI-Express”。

直通两块HP544+网卡之后,虚拟机的设置如下:

5.2.2 - 常见问题

直通网卡的常见问题

在直通网卡时遇到很多问题,有些甚至莫名其妙,记录下来备用。

5.2.2.1 - missing uar aborting

直通网卡时因驱动问题造成的 missing uar aborting 错误

故障描述

网卡直通给到虚拟机后,lspci 能看到设备:

lspci | grep Mel
01:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
02:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
lspci -k

可以看到网卡的驱动情况如下:

01:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
	Subsystem: Hewlett-Packard Company InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+FLR-QSFP Adapter
	Kernel driver in use: vfio-pci
	Kernel modules: mlx4_core
02:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
	Subsystem: Hewlett-Packard Company InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+FLR-QSFP Adapter
	Kernel driver in use: vfio-pci
	Kernel modules: mlx4_core

但是直通给虚拟机之后,在虚拟机中网卡无法识别,networkctl 看不到设备:

networkctl 
IDX LINK    TYPE     OPERATIONAL SETUP     
  1 lo      loopback carrier     unmanaged 
  2 enp6s18 ether    routable    configured

2 links listed.

lsmod 时发现只有 mlx4_core , 没有其他比如 mlx4_en:

lsmod  | grep mlx
mlx4_core             311296  0

对比正常情况下的 lsmod 输出应该是这样的:

lsmod | grep mlx   
mlx4_ib               245760  0
ib_uverbs             163840  1 mlx4_ib
mlx4_en               155648  0
ib_core               393216  2 mlx4_ib,ib_uverbs
mlx4_core             405504  2 mlx4_ib,mlx4_en

查找问题

在 pve 机器中同样执行 lsmod | grep mlx 命令,会发现存在和在虚拟机中同样的问题,输出中也只有 mlx4_core:

lsmod | grep mlx   
mlx4_core             462848  0

重新安装 ubuntu server 也无法解决这个问题。而且安装 ubuntu server 20.04 时,在最开始的启动界面,会看到类似这样的错误提示:

mlx4_core 0000:01:00.0: Missing UAR, aborting

在 pve 操作系统中执行命令:

dmesg | grep mlx    

也会看到类似的输出:

[    2.364990] mlx4_core: Mellanox ConnectX core driver v4.0-0
[    2.365005] mlx4_core: Initializing 0000:01:00.0
[    2.365098] mlx4_core 0000:01:00.0: Missing UAR, aborting
[    2.365214] mlx4_core: Initializing 0000:02:00.0
[    2.365309] mlx4_core 0000:02:00.0: Missing UAR, aborting

执行命令:

dmesg | grep mlx

输出类似为:

mlx_compat: loading out-of-tree module taints kernel.[0.991286] mlx_compat: module verification failed: signature and/or required key missing - tainting kernel[0.992456] mlx4_core: Mellanox ConnectX core driver v4.1-1.0.2 (27 Jun 2017)[0.992479] mlx4_core: Initializing 0000:01:00.0[0.992621] mlx4_core 0000:01:00.0: Missing UAR, aborting

基本可以判断存在某个问题导致网卡驱动无法正确加载,从而导致网卡无法识别和驱动。

修复方式

增加 “pci=realloc=off” 参数

google之后发现有人遇到类似的问题,验证可行:

https://forums.developer.nvidia.com/t/mlx4-core-missing-uar-aborting/207322/2

按照这里的意思,应该增加 pci=realloc=off

  • edit /etc/default/grub
  • add GRUB_CMDLINE_LINUX_DEFAULT=“pci=realloc=off”
  • update-grub
  • Reboot

修改主板 bios 设置,开启 ASPM

在华硕z87-a主板,还需要在 bios 中打开 ASPM 相关的选项。

5.2.2.2 - IRQ冲突

直通网卡时因 IRQ 冲突造成不可用

故障描述

插入多块网卡后设置直通,在虚拟机启动时报错,错误描述如下:

kvm: -device vfio-pci,host=0000:01:00.0,id=hostpci1,bus=ich9-pcie-port-2,addr=0x0: vfio 0000:01:00.0: Failed to set up TRIGGER eventfd signaling for interrupt INTX-0: VFIO_DEVICE_SET_IRQS failure: Device or resource busy
TASK ERROR: start failed: QEMU exited with code 1

查找问题

检查 INTx disable

参考这个帖子的描述:

https://forums.unraid.net/topic/120895-passing-a-capture-card-to-vms/

可以用下面这个 check.sh 脚本来检查网卡是否设置了 INTx disable :

#!/bin/sh
# Usage $0 <PCI device>, ex: 9:00.0

INTX=$(( 0x400 ))
ORIG=$(( 0x$(setpci -s $1 4.w) ))

if [ $(( $INTX & $ORIG )) -ne 0 ]; then
echo "INTx disable supported and enabled on $1"
exit 0
fi

NEW=$(printf %04x $(( $INTX | $ORIG )))
setpci -s $1 4.w=$NEW
NEW=$(( 0x$(setpci -s $1 4.w) ))

if [ $(( $INTX & $NEW )) -ne 0 ]; then
echo "INTx disable support available on $1"
else
echo "INTx disable support NOT available on $1"
fi

NEW=$(printf %04x $ORIG)
setpci -s $1 4.w=$NEW

执行结果如下:

➜  ~ ./check.sh 01:00.0
INTx disable support available on 01:00.0
➜  ~ ./check.sh 04:00.0
INTx disable support available on 04:00.0
➜  ~ ./check.sh 08:00.0
INTx disable support available on 08:00.0
➜  ~ ./check.sh 09:00.0
INTx disable supported and enabled on 09:00.0

检查启动日志

可以执行

dmesg

查看 pve 的启动日志,找到其中报错的内容:

[ 3852.066855] vfio-pci 0000:04:00.0: vfio_ecap_init: hiding ecap 0x19@0x18c
[ 3852.210816] vfio-pci 0000:01:00.0: vfio_ecap_init: hiding ecap 0x19@0x18c
[ 3852.219438] genirq: Flags mismatch irq 16. 00000000 (vfio-intx(0000:01:00.0)) vs. 00000000 (vfio-intx(0000:04:00.0))


 3940.230432] vfio-pci 0000:04:00.0: vfio_ecap_init: hiding ecap 0x19@0x18c
[ 3940.374391] vfio-pci 0000:08:00.0: vfio_ecap_init: hiding ecap 0x19@0x18c
[ 3940.383218] genirq: Flags mismatch irq 16. 00000000 (vfio-intx(0000:08:00.0)) vs. 00000000 (vfio-intx(0000:04:00.0))

查看 IRQ 情况

IRQ 情况可以这样查看:

cat /proc/interrupts

输出为:

            CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       CPU8       CPU9       CPU10      CPU11      
   0:         11          0          0          0          0          0          0          0          0          0          0          0  IR-IO-APIC    2-edge      timer
   8:          0          0          0          0          0          0          0          0          0          0          0          0  IR-IO-APIC    8-edge      rtc0
   9:          0          0          0          0          0          0          0          0          0          0          0          0  IR-IO-APIC    9-fasteoi   acpi
  14:          0          0          0          0          0          0          0          0          0          0          0          0  IR-IO-APIC   14-fasteoi   INTC1056:00
  18:          0          0          0          5          0          0          0          0          0          0          0          0  IR-IO-APIC   18-fasteoi   i801_smbus
  27:          0          0          0          0          0          0          0          0          0          0          0          0  IR-IO-APIC   27-fasteoi   idma64.0, i2c_designware.0
  29:          0          0          0          0          0          0          0          0          0          0          0          0  IR-IO-APIC   29-fasteoi   idma64.2, i2c_designware.2
  40:          0          0          0          0          0          0          0          0          0          0          0          0  IR-IO-APIC   40-fasteoi   idma64.1, i2c_designware.1
 120:          0          0          0          0          0          0          0          0          0          0          0          0  DMAR-MSI    0-edge      dmar0
 121:          0          0          0          0          0          0          0          0          0          0          0          0  DMAR-MSI    1-edge      dmar1
 122:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:01.0    0-edge      PCIe PME, aerdrv
 123:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:1a.0    0-edge      PCIe PME, pciehp
 124:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:1b.0    0-edge      PCIe PME
 125:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:1b.4    0-edge      PCIe PME, aerdrv
 126:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:1c.0    0-edge      PCIe PME, pciehp
 127:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:1c.1    0-edge      PCIe PME, aerdrv
 128:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:1c.2    0-edge      PCIe PME, aerdrv
 129:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:1c.4    0-edge      PCIe PME, aerdrv
 130:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:1d.0    0-edge      PCIe PME, aerdrv
 131:          0          0      13081          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:17.0    0-edge      ahci[0000:00:17.0]
 132:          0          0          0          0    1083661          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:06:00.0    0-edge      enp6s0
 133:          0          0          0          0         90          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:14.0    0-edge      xhci_hcd
 134:          0          0          0          0          0      88674          0          0          0          0          0          0  IR-PCI-MSIX-0000:07:00.0    0-edge      enp7s0
 210:          0          0          0          0          0          0          0          0          0          0          0         74  IR-PCI-MSIX-0000:09:00.0    0-edge      mlx4-async@pci:0000:09:00.0
 211:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0    1-edge      mlx4-1@0000:09:00.0
 212:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0    2-edge      mlx4-2@0000:09:00.0
 213:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0    3-edge      mlx4-3@0000:09:00.0
 214:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0    4-edge      mlx4-4@0000:09:00.0
 215:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0    5-edge      mlx4-5@0000:09:00.0
 216:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0    6-edge      mlx4-6@0000:09:00.0
 217:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0    7-edge      mlx4-7@0000:09:00.0
 218:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0    8-edge      mlx4-8@0000:09:00.0
 219:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0    9-edge      mlx4-9@0000:09:00.0
 220:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   10-edge      mlx4-10@0000:09:00.0
 221:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   11-edge      mlx4-11@0000:09:00.0
 222:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   12-edge      mlx4-12@0000:09:00.0
 223:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   13-edge      mlx4-13@0000:09:00.0
 224:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   14-edge      mlx4-14@0000:09:00.0
 225:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   15-edge      mlx4-15@0000:09:00.0
 226:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   16-edge      mlx4-16@0000:09:00.0
 227:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   17-edge      mlx4-17@0000:09:00.0
 228:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   18-edge      mlx4-18@0000:09:00.0
 229:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   19-edge      mlx4-19@0000:09:00.0
 230:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   20-edge      mlx4-20@0000:09:00.0
 231:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   21-edge      mlx4-21@0000:09:00.0
 232:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   22-edge      mlx4-22@0000:09:00.0
 233:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   23-edge      mlx4-23@0000:09:00.0
 234:          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSIX-0000:09:00.0   24-edge      mlx4-24@0000:09:00.0
 235:          0         49          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:16.0    0-edge      mei_me
 236:          0          0        271          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:02.0    0-edge      i915
 237:          0          0          0        750          0          0          0          0          0          0          0          0  IR-PCI-MSI-0000:00:1f.3    0-edge      snd_hda_intel:card0
 NMI:          1          0          3          0          5          1          1          6          1          0          1          0   Non-maskable interrupts
 LOC:      99118      43626     176733      55708     828067     207665     115311     154475      78857      10037      61928      11351   Local timer interrupts
 SPU:          0          0          0          0          0          0          0          0          0          0          0          0   Spurious interrupts
 PMI:          1          0          3          0          5          1          1          6          1          0          1          0   Performance monitoring interrupts
 IWI:      86064      28486     141932      40754     157189      94910      89143     116144      60778       5779      51049       5784   IRQ work interrupts
 RTR:          0          0          0          0          0          0          0          0          0          0          0          0   APIC ICR read retries
 RES:        310        314       5048        112        755        544        799       3192        584         60        481         99   Rescheduling interrupts
 CAL:      20663      17009      19217      16776      19075      18387      15627      15893      17333      18026      18963      17581   Function call interrupts
 TLB:         87         35        141         33         81         26         79         62         86         18         75          8   TLB shootdowns
 TRM:          1          1          1          1          1          1          1          1          1          1          1          1   Thermal event interrupts
 THR:          0          0          0          0          0          0          0          0          0          0          0          0   Threshold APIC interrupts
 DFR:          0          0          0          0          0          0          0          0          0          0          0          0   Deferred Error APIC interrupts
 MCE:          0          0          0          0          0          0          0          0          0          0          0          0   Machine check exceptions
 MCP:         17         18         18         18         18         18         18         18         18         18         18         18   Machine check polls
 ERR:          0
 MIS:          0
 PIN:          0          0          0          0          0          0          0          0          0          0          0          0   Posted-interrupt notification event
 NPI:          0          0          0          0          0          0          0          0          0          0          0          0   Nested posted-interrupt event
 PIW:          0          0          0          0          0          0          0          0          0          0          0          0   Posted-interrupt wakeup event

对于具体的网卡,可以通过

 lspci -v -s 0000:01:00

来查看:

01:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
	Subsystem: Hewlett-Packard Company InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+FLR-QSFP Adapter
	Flags: fast devsel, IRQ 16, IOMMU group 17
	Memory at 82200000 (64-bit, non-prefetchable) [disabled] [size=1M]
	Memory at 6166000000 (64-bit, prefetchable) [disabled] [size=32M]
	Capabilities: [40] Power Management version 3
	Capabilities: [48] Vital Product Data
	Capabilities: [9c] MSI-X: Enable- Count=128 Masked-
	Capabilities: [60] Express Endpoint, MSI 00
	Capabilities: [c0] Vendor Specific Information: Len=18 <?>
	Capabilities: [100] Alternative Routing-ID Interpretation (ARI)
	Capabilities: [148] Device Serial Number c4-34-6b-ff-ff-df-e1-80
	Capabilities: [108] Single Root I/O Virtualization (SR-IOV)
	Capabilities: [154] Advanced Error Reporting
	Capabilities: [18c] Secondary PCI Express
	Kernel driver in use: vfio-pci
	Kernel modules: mlx4_core

IRQ 16,后面发现另外一个网卡(hp561万兆电口网卡)同样使用 IRQ 16 从而造成冲突。

解决方案

删除造成 irq 冲突的硬件

可以用如下方法来删除造成冲突的硬件 :

echo -n 1 > "/sys/devices/pci0000:00/0000:00:1b.0/remove"

通过 lspci 可以看到设备 device id :

lspci

00:00.0 Host bridge: Intel Corporation Device 4650 (rev 05)
00:01.0 PCI bridge: Intel Corporation 12th Gen Core Processor PCI Express x16 Controller #1 (rev 05)
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-S GT1 [UHD Graphics 730] (rev 0c)
00:0a.0 Signal processing controller: Intel Corporation Platform Monitoring Technology (rev 01)
00:14.0 USB controller: Intel Corporation Alder Lake-S PCH USB 3.2 Gen 2x2 XHCI Controller (rev 11)
00:14.2 RAM memory: Intel Corporation Alder Lake-S PCH Shared SRAM (rev 11)
00:15.0 Serial bus controller: Intel Corporation Alder Lake-S PCH Serial IO I2C Controller #0 (rev 11)
00:15.1 Serial bus controller: Intel Corporation Alder Lake-S PCH Serial IO I2C Controller #1 (rev 11)
00:15.2 Serial bus controller: Intel Corporation Alder Lake-S PCH Serial IO I2C Controller #2 (rev 11)
00:16.0 Communication controller: Intel Corporation Alder Lake-S PCH HECI Controller #1 (rev 11)
00:17.0 SATA controller: Intel Corporation Alder Lake-S PCH SATA Controller [AHCI Mode] (rev 11)
00:1a.0 PCI bridge: Intel Corporation Alder Lake-S PCH PCI Express Root Port #25 (rev 11)
00:1b.0 PCI bridge: Intel Corporation Device 7ac0 (rev 11)
00:1b.4 PCI bridge: Intel Corporation Device 7ac4 (rev 11)
00:1c.0 PCI bridge: Intel Corporation Alder Lake-S PCH PCI Express Root Port #1 (rev 11)
00:1c.1 PCI bridge: Intel Corporation Alder Lake-S PCH PCI Express Root Port #2 (rev 11)
00:1c.2 PCI bridge: Intel Corporation Device 7aba (rev 11)
00:1c.4 PCI bridge: Intel Corporation Alder Lake-S PCH PCI Express Root Port #5 (rev 11)
00:1d.0 PCI bridge: Intel Corporation Alder Lake-S PCH PCI Express Root Port #9 (rev 11)
00:1f.0 ISA bridge: Intel Corporation Z690 Chipset LPC/eSPI Controller (rev 11)
00:1f.3 Audio device: Intel Corporation Alder Lake-S HD Audio Controller (rev 11)
00:1f.4 SMBus: Intel Corporation Alder Lake-S PCH SMBus Controller (rev 11)
00:1f.5 Serial bus controller: Intel Corporation Alder Lake-S PCH SPI Controller (rev 11)

01:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
04:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
06:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02)
07:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
08:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
09:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]

尝试过,如下设置,无效:

mkdir -p /sys/devices/pci0000:00/0000:01:00.0/
mkdir -p /sys/devices/pci0000:00/0000:04:00.0/
mkdir -p /sys/devices/pci0000:00/0000:08:00.0/
mkdir -p /sys/devices/pci0000:00/0000:09:00.0/
echo -n 1 > "/sys/devices/pci0000:00/0000:01:00.0/remove"
echo -n 1 > "/sys/devices/pci0000:00/0000:04:00.0/remove"
echo -n 1 > "/sys/devices/pci0000:00/0000:08:00.0/remove"
echo -n 1 > "/sys/devices/pci0000:00/0000:09:00.0/remove"

后记

这个问题第一次在 华硕 z690-p 主板上遇到,当时插了三块 hp544+ 和一块 hp561,结果 hp561 和 hp544+ 冲突了。

后来在 z87 主板上遇到类似的问题,IRQ 冲突严重到 pve 系统都不稳定。不得已只好放弃在这两个主板上插多块网卡的想法。

5.3 - SR-IOV

以SR-IOV的方式直通硬件到虚拟机

5.3.1 - 介绍

SR-IOV介绍

介绍

SR-IOV是 “Single Root I/O Virtualization” 的缩写,是 Intel 在 2007年提出的一种基于硬件的虚拟化解决方案。

SR-IOV 规范由 PCI-SIG 在 http://www.pcisig.com 上进行定义和维护。

原理

虚拟设备有性能和时延的问题,intel VT-D ((Virtualization Technology for Directed I/O)) 可以将 PCIE 物理设备分配给虚拟机,让虚拟机直接控制硬件。

但网卡直通给虚拟机,会造成虚拟机独占网卡所在的PCIE 物理设备,就无法在其他虚拟机中使用这个设备。

为此,Intel 提出 SR-IOV ,将一个物理网卡虚拟出来多个轻量化的 PCIE 物理设备,从而可以分配给虚拟机使用。

SR-IOV 是一种规范,使得单根端口下的单个快速外围组件互连 (PCIe) 物理设备显示为管理程序或客户机操作系统的多个单独的物理设备,既有直通设备的性能优势,又可以支持多个虚拟机,一举两得。

优缺点

优点

SR-IOV 是虚拟化的一个重要功能。启用SR-IOV 将大大减轻宿主机的 CPU负荷,提高网络性能,降低网络时延等。

单个 I/O 资源可由许多虚拟机共享。共享的设备将提供专用的资源,并且还使用共享的通用资源。这样,每个虚拟机都可访问唯一的资源。因此,启用了 SR-IOV 并且具有适当的硬件和 OS 支持的 PCIe 设备(例如以太网端口)可以显示为多个单独的物理设备,每个都具有自己的 PCIe 配置空间。

  • 性能好
  • 减少主机 CPU 消耗

缺点

  • 虚拟机使用 VF 后无法进行内存超分、快照、热迁移等高级功能
  • 配置管理复杂

功能类型

SR-IOV 使用 physical functions (PF) 和 virtual functions (VF) 为 SR-IOV 设备管理全局功能。

  • PF 包含SR-IOV 功能的完整PCIe设备,PF 作为普通的PCIe 设备被发现、管理和配置 。PF 通过分配VF 来配置和管理 SR-IOV 功能。禁用SR-IOV后,主机将在一个物理网卡上创建一个 PF。
  • VF 是轻量级 PCIe 功能(I/O 处理)的 PCIe 设备,每个 VF 都是通过 PF 来生成管理的,VF 的具体数量限制受限于 PCIe 设备自身配置及驱动程序的支持,启用SR-IOV后,主机将在一个物理NIC上创建单个PF和多个VF。 VF的数量取决于配置和驱动程序支持。

每个 SR-IOV 设备都可有一个 PF(Physical Functions),并且每个 PF 最多可有64,000个与其关联的 VF(Virtual Function)。PF 可以通过寄存器创建 VF,这些寄存器设计有专用于此目的的属性。一旦在 PF 中启用了 SR-IOV,就可以通过 PF 的总线、设备和功能编号(路由 ID)访问各个 VF 的 PCI 配置空间。

每个 VF 都具有一个 PCI 内存空间,用于映射其寄存器集。VF设备驱动程序对寄存器集进行操作以启用其功能,并且显示为实际存在的PCI设备。创建 VF 后,可以直接将其指定给虚拟机或各个应用程序。此功能使得虚拟功能可以共享物理设备,并在没有CPU和虚拟机管理程序软件开销的情况下执行 I/O。

通过下面的命令查看开启 sriov 的 pci 设备,一块设置了 8 个 VF的 ConnectX-3 Pro 网卡:

lspci -vvv | grep Mellanox

输出为:

81:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
81:00.1 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.2 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.3 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.4 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.5 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.6 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.7 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:01.0 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]

参考资料

5.3.2 - 配置 CX-3 网卡以开启 SR-IOV

配置 Mellanox connextx-3 网卡配置以便在 pve 中开启网卡的 SR-IOV 功能

准备工作

更新网卡固件

对于 HP544+ 网卡,参考:

https://skyao.io/learning-computer-hardware/nic/hp544/firmware/

设置主板bios

需要在主板中设置开启以下功能:

  • 虚拟机支持
  • vt-d
  • SR-IOV

安装 pve-headers

对于 PVE,还需要安装额外的 pve-headers,否则后续安装 mft 时会报错,提示要安装 linux-headers 和 linux-headers-generic:

./install.sh
-E- There are missing packages that are required for installation of MFT.
-I- You can install missing packages using: apt-get install linux-headers linux-headers-generic

安装:

apt install -y gcc make dkms
apt install -y pve-headers-$(uname -r)
apt install --fix-broken

安装完成之后,需要重启,否则直接安装 mft,依然会继续同样报错。

安装 mft

需要 mft 工具修改 ConnectX 网卡的配置,对于 cx3 pro (hp544+)网卡下载安装方式为:

mkdir -p ~/work/soft/mellanox
cd ~/work/soft/mellanox

wget --no-check-certificate https://www.mellanox.com/downloads/MFT/mft-4.24.0-72-x86_64-deb.tgz
tar xvf mft-4.24.0-72-x86_64-deb.tgz
cd mft-4.24.0-72-x86_64-deb

对于 cx4 / cx5 等新一点的网卡,可以安装 mft 最新版本。

wget --no-check-certificate https://www.mellanox.com/downloads/MFT/mft-4.27.0-83-x86_64-deb.tgz
tar xvf mft-4.27.0-83-x86_64-deb.tgz
cd mft-4.27.0-83-x86_64-deb

执行安装脚本:

./install.sh

输出为:

-I- Removing mft external packages installed on the machine
-I- Installing package: /root/temp/mft-4.24.0-72-x86_64-deb/SDEBS/kernel-mft-dkms_4.24.0-72_all.deb
-I- Installing package: /root/temp/mft-4.24.0-72-x86_64-deb/DEBS/mft_4.24.0-72_amd64.deb
-I- In order to start mst, please run "mst start".

下载 mlxup

cd ~/work/soft/mellanox

wget https://www.mellanox.com/downloads/firmware/mlxup/4.22.1/SFX/linux_x64/mlxup
chmod +x ./mlxup
./mlxup

能看到当前网卡的固件情况:

Querying Mellanox devices firmware ...

Device #1:
----------

  Device Type:      ConnectX3Pro
  Part Number:      764285-B21_Ax
  Description:      HP InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+FLR-QSFP Adapter
  PSID:             HP_1380110017
  PCI Device Name:  /dev/mst/mt4103_pci_cr0
  Port1 GUID:       c4346bffffdfe181
  Port2 GUID:       c4346bffffdfe182
  Versions:         Current        Available     
     FW             2.42.5700      N/A           

  Status:           No matching image found

安装 mstflint

apt install mstflint

设置网卡

启动 mft 工具

mst start

输入为:

Starting MST (Mellanox Software Tools) driver set
Loading MST PCI module - Success
Loading MST PCI configuration module - Success
Create devices

查看网卡配置

mst status

可以看到当前网卡信息(这是只插了一块HP544+ 网卡的情况):

MST modules:
------------
    MST PCI module loaded
    MST PCI configuration module loaded

MST devices:
------------
/dev/mst/mt4103_pciconf0         - PCI configuration cycles access.
                                   domain:bus:dev.fn=0000:02:00.0 addr.reg=88 data.reg=92 cr_bar.gw_offset=-1
                                   Chip revision is: 00
/dev/mst/mt4103_pci_cr0          - PCI direct access.
                                   domain:bus:dev.fn=0000:02:00.0 bar=0xdfe00000 size=0x100000
                                   Chip revision is: 00

继续执行命令:

mlxconfig -d /dev/mst/mt4103_pciconf0 q

可以看到网卡的配置信息:

Device #1:
----------

Device type:    ConnectX3Pro    
Device:         /dev/mst/mt4103_pciconf0

Configurations:                                      Next Boot
         SRIOV_EN                                    True(1)         
         NUM_OF_VFS                                  16              
         WOL_MAGIC_EN_P2                             True(1)         
         LINK_TYPE_P1                                VPI(3)          
         PHY_TYPE_P1                                 0               
         XFI_MODE_P1                                 _10G(0)         
         FORCE_MODE_P1                               False(0)        
         LINK_TYPE_P2                                VPI(3)          
         PHY_TYPE_P2                                 0               
         XFI_MODE_P2                                 _10G(0)     

修改网卡配置

mlxconfig -d /dev/mst/mt4103_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=8

对于有多块网卡的机器,可以根据需要决定是否为其中的一块或者多块网卡开启 SR-IOV ,然后需要开启的设置 SRIOV_EN=1 ,不需要开启的设置 SRIOV_EN=0。

注意这里的 mt4103_pciconf0 / mt4103_pciconf1 等编号是按照 lspci 时显示的设备 id 来排序的,因此用这个方法可以分辨各个网卡。

重启机器。

设置网卡驱动

vi /etc/modprobe.d/mlx4_core.conf

对于 hp544+ 网卡,输入内容为(在双头网卡上配置8个VF, 都在端口1上生效):

options mlx4_core port_type_array=2,2 num_vfs=8,0,0 probe_vf=8,0,0 log_num_mgm_entry_size=-1
options mlx4_core enable_sys_tune=1
options mlx4_en inline_thold=0

执行:

update-initramfs -u

开启 SR-IOV

开启成功时的例子,这里有两块网卡,一块设置开启 SR-IOV,另一块设置不开启 SR-IOV (准备网卡整体直通给虚拟机)。

lspci | grep Mel
01:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
04:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
04:00.1 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.2 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.3 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.4 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.5 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.6 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.7 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:01.0 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
  • 01:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro] : 设置为不开启 SR-IOV 的网卡,显示为一块物理网卡(PF)。
  • 04:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]: 设置为开启 SR-IOV 的网卡,显示为一块物理网卡(PF) + 下面多块(例子中是每个port 4个,一共8个) 虚拟网卡(VF)。
  • 04:00.x Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]: 设置为开启 SR-IOV 的网卡的所有的 VF 。

参考资料

5.3.3 - 配置 CX-4 网卡以开启 SR-IOV

配置 Mellanox connextx-4 网卡配置以便在 pve 中开启网卡的 SR-IOV 功能

准备工作

更新网卡固件

对于 mcx4121 网卡,参考:

https://skyao.io/learning-computer-hardware/nic/cx4121a/firmware/

设置主板bios

需要在主板中设置开启以下功能:

  • 虚拟机支持
  • vt-d
  • SR-IOV

安装 pve-headers

对于 PVE,还需要安装额外的 pve-headers,否则后续安装 mft 时会报错,提示要安装 linux-headers 和 linux-headers-generic:

./install.sh
-E- There are missing packages that are required for installation of MFT.
-I- You can install missing packages using: apt-get install linux-headers linux-headers-generic

安装:

apt install -y gcc make dkms
apt install -y pve-headers-$(uname -r)
apt install --fix-broken

安装完成之后,需要重启,否则直接安装 mft,依然会继续同样报错。

安装 mft

对于 cx4 / cx5 等新一点的网卡,可以安装 mft 最新版本。

mkdir -p ~/work/soft/mellanox
cd ~/work/soft/mellanox

wget --no-check-certificate https://www.mellanox.com/downloads/MFT/mft-4.27.0-83-x86_64-deb.tgz
tar xvf mft-4.27.0-83-x86_64-deb.tgz
cd mft-4.27.0-83-x86_64-deb

执行安装脚本:

./install.sh

输出为:

-I- Removing mft external packages installed on the machine
-I- Removing the packages:  kernel-mft-dkms...
-I- Installing package: /root/temp/mft-4.27.0-83-x86_64-deb/SDEBS/kernel-mft-dkms_4.27.0-83_all.deb
-I- Installing package: /root/temp/mft-4.27.0-83-x86_64-deb/DEBS/mft_4.27.0-83_amd64.deb
-I- Installing package: /root/temp/mft-4.27.0-83-x86_64-deb/DEBS/mft-autocomplete_4.27.0-83_amd64.deb

下载 mlxup

cd ~/work/soft/mellanox

wget https://www.mellanox.com/downloads/firmware/mlxup/4.22.1/SFX/linux_x64/mlxup
chmod +x ./mlxup
./mlxup

能看到当前网卡的固件情况:

Querying Mellanox devices firmware ...

Device #1:
----------

  Device Type:      ConnectX3Pro
  Part Number:      764285-B21_Ax
  Description:      HP InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+FLR-QSFP Adapter
  PSID:             HP_1380110017
  PCI Device Name:  /dev/mst/mt4103_pci_cr0
  Port1 GUID:       c4346bffffdfe181
  Port2 GUID:       c4346bffffdfe182
  Versions:         Current        Available     
     FW             2.42.5700      N/A           

  Status:           No matching image found

安装 mstflint

apt install mstflint

设置网卡

启动 mft 工具

mst start

输出为:

Starting MST (Mellanox Software Tools) driver set
Loading MST PCI module - Success
Loading MST PCI configuration module - Success
Create devices
Unloading MST PCI module (unused) - Success

查看网卡配置

mst status

可以看到当前网卡信息(这是只插了一块 mcx4121a 网卡的情况):

MST modules:
------------
    MST PCI module is not loaded
    MST PCI configuration module loaded

MST devices:
------------
/dev/mst/mt4117_pciconf0         - PCI configuration cycles access.
                                   domain:bus:dev.fn=0000:06:00.0 addr.reg=88 data.reg=92 cr_bar.gw_offset=-1
                                   Chip revision is: 00

继续执行命令:

mlxconfig -d /dev/mst/mt4117_pciconf0 q

可以看到网卡的配置信息:

Device #1:
----------

Device type:        ConnectX4LX         
Name:               MCX4121A-ACU_Ax     
Description:        ConnectX-4 Lx EN network interface card; 25GbE dual-port SFP28; PCIe3.0 x8; UEFI Enabled; tall bracket
Device:             /dev/mst/mt4117_pciconf0

Configurations:                                          Next Boot
        MEMIC_BAR_SIZE                              0                   
        MEMIC_SIZE_LIMIT                            _256KB(1)           
        FLEX_PARSER_PROFILE_ENABLE                  0                   
        FLEX_IPV4_OVER_VXLAN_PORT                   0                   
        ROCE_NEXT_PROTOCOL                          254                 
        PF_NUM_OF_VF_VALID                          False(0)            
        NON_PREFETCHABLE_PF_BAR                     False(0)            
        VF_VPD_ENABLE                               False(0)            
        STRICT_VF_MSIX_NUM                          False(0)            
        VF_NODNIC_ENABLE                            False(0)            
        NUM_PF_MSIX_VALID                           True(1)             
        NUM_OF_VFS                                  8                   
        NUM_OF_PF                                   2                   
        SRIOV_EN                                    True(1)             
        PF_LOG_BAR_SIZE                             5                   
        VF_LOG_BAR_SIZE                             0                   
        NUM_PF_MSIX                                 63                  
        NUM_VF_MSIX                                 11                  
        INT_LOG_MAX_PAYLOAD_SIZE                    AUTOMATIC(0)        
        PCIE_CREDIT_TOKEN_TIMEOUT                   0                   
        ACCURATE_TX_SCHEDULER                       False(0)            
        PARTIAL_RESET_EN                            False(0)            
        SW_RECOVERY_ON_ERRORS                       False(0)            
        RESET_WITH_HOST_ON_ERRORS                   False(0)            
        PCI_BUS0_RESTRICT_SPEED                     PCI_GEN_1(0)        
        PCI_BUS0_RESTRICT_ASPM                      False(0)            
        PCI_BUS0_RESTRICT_WIDTH                     PCI_X1(0)           
        PCI_BUS0_RESTRICT                           False(0)            
        PCI_DOWNSTREAM_PORT_OWNER                   Array[0..15]        
        CQE_COMPRESSION                             BALANCED(0)         
        IP_OVER_VXLAN_EN                            False(0)            
        MKEY_BY_NAME                                False(0)            
        UCTX_EN                                     True(1)             
        PCI_ATOMIC_MODE                             PCI_ATOMIC_DISABLED_EXT_ATOMIC_ENABLED(0)
        TUNNEL_ECN_COPY_DISABLE                     False(0)            
        LRO_LOG_TIMEOUT0                            6                   
        LRO_LOG_TIMEOUT1                            7                   
        LRO_LOG_TIMEOUT2                            8                   
        LRO_LOG_TIMEOUT3                            13                  
        ICM_CACHE_MODE                              DEVICE_DEFAULT(0)   
        TX_SCHEDULER_BURST                          0                   
        LOG_MAX_QUEUE                               17                  
        LOG_DCR_HASH_TABLE_SIZE                     14                  
        MAX_PACKET_LIFETIME                         0                   
        DCR_LIFO_SIZE                               16384               
        ROCE_CC_PRIO_MASK_P1                        255                 
        ROCE_CC_PRIO_MASK_P2                        255                 
        CLAMP_TGT_RATE_AFTER_TIME_INC_P1            True(1)             
        CLAMP_TGT_RATE_P1                           False(0)            
        RPG_TIME_RESET_P1                           300                 
        RPG_BYTE_RESET_P1                           32767               
        RPG_THRESHOLD_P1                            1                   
        RPG_MAX_RATE_P1                             0                   
        RPG_AI_RATE_P1                              5                   
        RPG_HAI_RATE_P1                             50                  
        RPG_GD_P1                                   11                  
        RPG_MIN_DEC_FAC_P1                          50                  
        RPG_MIN_RATE_P1                             1                   
        RATE_TO_SET_ON_FIRST_CNP_P1                 0                   
        DCE_TCP_G_P1                                1019                
        DCE_TCP_RTT_P1                              1                   
        RATE_REDUCE_MONITOR_PERIOD_P1               4                   
        INITIAL_ALPHA_VALUE_P1                      1023                
        MIN_TIME_BETWEEN_CNPS_P1                    4                   
        CNP_802P_PRIO_P1                            6                   
        CNP_DSCP_P1                                 48                  
        CLAMP_TGT_RATE_AFTER_TIME_INC_P2            True(1)             
        CLAMP_TGT_RATE_P2                           False(0)            
        RPG_TIME_RESET_P2                           300                 
        RPG_BYTE_RESET_P2                           32767               
        RPG_THRESHOLD_P2                            1                   
        RPG_MAX_RATE_P2                             0                   
        RPG_AI_RATE_P2                              5                   
        RPG_HAI_RATE_P2                             50                  
        RPG_GD_P2                                   11                  
        RPG_MIN_DEC_FAC_P2                          50                  
        RPG_MIN_RATE_P2                             1                   
        RATE_TO_SET_ON_FIRST_CNP_P2                 0                   
        DCE_TCP_G_P2                                1019                
        DCE_TCP_RTT_P2                              1                   
        RATE_REDUCE_MONITOR_PERIOD_P2               4                   
        INITIAL_ALPHA_VALUE_P2                      1023                
        MIN_TIME_BETWEEN_CNPS_P2                    4                   
        CNP_802P_PRIO_P2                            6                   
        CNP_DSCP_P2                                 48                  
        LLDP_NB_DCBX_P1                             False(0)            
        LLDP_NB_RX_MODE_P1                          OFF(0)              
        LLDP_NB_TX_MODE_P1                          OFF(0)              
        LLDP_NB_DCBX_P2                             False(0)            
        LLDP_NB_RX_MODE_P2                          OFF(0)              
        LLDP_NB_TX_MODE_P2                          OFF(0)              
        ROCE_RTT_RESP_DSCP_P1                       0                   
        ROCE_RTT_RESP_DSCP_MODE_P1                  DEVICE_DEFAULT(0)   
        ROCE_RTT_RESP_DSCP_P2                       0                   
        ROCE_RTT_RESP_DSCP_MODE_P2                  DEVICE_DEFAULT(0)   
        DCBX_IEEE_P1                                True(1)             
        DCBX_CEE_P1                                 True(1)             
        DCBX_WILLING_P1                             True(1)             
        DCBX_IEEE_P2                                True(1)             
        DCBX_CEE_P2                                 True(1)             
        DCBX_WILLING_P2                             True(1)             
        KEEP_ETH_LINK_UP_P1                         True(1)             
        KEEP_IB_LINK_UP_P1                          False(0)            
        KEEP_LINK_UP_ON_BOOT_P1                     False(0)            
        KEEP_LINK_UP_ON_STANDBY_P1                  False(0)            
        DO_NOT_CLEAR_PORT_STATS_P1                  False(0)            
        AUTO_POWER_SAVE_LINK_DOWN_P1                False(0)            
        KEEP_ETH_LINK_UP_P2                         True(1)             
        KEEP_IB_LINK_UP_P2                          False(0)            
        KEEP_LINK_UP_ON_BOOT_P2                     False(0)            
        KEEP_LINK_UP_ON_STANDBY_P2                  False(0)            
        DO_NOT_CLEAR_PORT_STATS_P2                  False(0)            
        AUTO_POWER_SAVE_LINK_DOWN_P2                False(0)            
        NUM_OF_VL_P1                                _4_VLs(3)           
        NUM_OF_TC_P1                                _8_TCs(0)           
        NUM_OF_PFC_P1                               8                   
        VL15_BUFFER_SIZE_P1                         0                   
        NUM_OF_VL_P2                                _4_VLs(3)           
        NUM_OF_TC_P2                                _8_TCs(0)           
        NUM_OF_PFC_P2                               8                   
        VL15_BUFFER_SIZE_P2                         0                   
        DUP_MAC_ACTION_P1                           LAST_CFG(0)         
        SRIOV_IB_ROUTING_MODE_P1                    LID(1)              
        IB_ROUTING_MODE_P1                          LID(1)              
        DUP_MAC_ACTION_P2                           LAST_CFG(0)         
        SRIOV_IB_ROUTING_MODE_P2                    LID(1)              
        IB_ROUTING_MODE_P2                          LID(1)              
        PHY_FEC_OVERRIDE_P1                         DEVICE_DEFAULT(0)   
        PHY_FEC_OVERRIDE_P2                         DEVICE_DEFAULT(0)   
        PF_SD_GROUP                                 0                   
        ROCE_CONTROL                                ROCE_ENABLE(2)      
        PCI_WR_ORDERING                             per_mkey(0)         
        MULTI_PORT_VHCA_EN                          False(0)            
        PORT_OWNER                                  True(1)             
        ALLOW_RD_COUNTERS                           True(1)             
        RENEG_ON_CHANGE                             True(1)             
        TRACER_ENABLE                               True(1)             
        IP_VER                                      IPv4(0)             
        BOOT_UNDI_NETWORK_WAIT                      0                   
        UEFI_HII_EN                                 True(1)             
        BOOT_DBG_LOG                                False(0)            
        UEFI_LOGS                                   DISABLED(0)         
        BOOT_VLAN                                   1                   
        LEGACY_BOOT_PROTOCOL                        PXE(1)              
        BOOT_INTERRUPT_DIS                          False(0)            
        BOOT_LACP_DIS                               True(1)             
        BOOT_VLAN_EN                                False(0)            
        BOOT_PKEY                                   0                   
        DYNAMIC_VF_MSIX_TABLE                       False(0)            
        ADVANCED_PCI_SETTINGS                       False(0)            
        SAFE_MODE_THRESHOLD                         10                  
        SAFE_MODE_ENABLE                            True(1)

修改网卡配置

mlxconfig -d /dev/mst/mt4117_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=8

对于有多块网卡的机器,可以根据需要决定是否为其中的一块或者多块网卡开启 SR-IOV ,然后需要开启的设置 SRIOV_EN=1 ,不需要开启的设置 SRIOV_EN=0。

重启机器。

开启 SR-IOV

开启前的检查

查看网卡情况:

ip addr

enp6s0f0np0 和 enp6s0f1np1 为这块 cx4 lx 双头网卡的两个网口,这里我们使用了 enp6s0f1np1:

2: enp6s0f0np0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b8:ce:f6:0b:d9:1c brd ff:ff:ff:ff:ff:ff
3: enp6s0f1np1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000
    link/ether b8:ce:f6:0b:d9:1d brd ff:ff:ff:ff:ff:ff

查看网卡 pci 情况:

lspci -k | grep -i ethernet

可以看到 enp6s0f1np1 这个网卡对应的是 06:00.1 :

06:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
06:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]

执行命令查看网卡的 vfs 设置:

cat /sys/bus/pci/devices/0000:06:00.1/sriov_totalvfs
8

开启的脚本

新建文件 cx4sriov.service:

cd /etc/systemd/system
vi cx4sriov.service

内容为(注意替换 enp6s0f1np1):

[Unit]
Description=Script to enable SR-IOV for cx4 NIC on boot

[Service]
Type=simple

start SR-IOV

ExecStartPre=/usr/bin/bash -c '/usr/bin/echo 8 > /sys/class/net/enp6s0f1np1/device/sriov_numvfs'

set VF MAC

ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0f1np1 vf 0 mac 00:80:00:00:00:00'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0f1np1 vf 1 mac 00:80:00:00:00:01'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0f1np1 vf 2 mac 00:80:00:00:00:02'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0f1np1 vf 3 mac 00:80:00:00:00:03'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0f1np1 vf 4 mac 00:80:00:00:00:04'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0f1np1 vf 5 mac 00:80:00:00:00:05'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0f1np1 vf 6 mac 00:80:00:00:00:06'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp6s0f1np1 vf 7 mac 00:80:00:00:00:07'

set PF up

ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp6s0f1np1 up'

set VF up

ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp6s0f1np1v0 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp6s0f1np1v1 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp6s0f1np1v2 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp6s0f1np1v3 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp6s0f1np1v4 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp6s0f1np1v5 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp6s0f1np1v6 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp6s0f1np1v7 up'

Restart=on-failure

[Install]
WantedBy=multi-user.target

启用 cx4sriov.service:

systemctl daemon-reload
systemctl enable cx4sriov.service
reboot

重启之后查看网卡信息:

$ lspci -k | grep -i ethernet

06:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
06:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
06:01.2 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
06:01.3 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
06:01.4 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
06:01.5 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
06:01.6 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
06:01.7 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
06:02.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
06:02.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
$ ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: enp6s0f0np0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b8:ce:f6:0b:d9:1c brd ff:ff:ff:ff:ff:ff
3: enp6s0f1np1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000
    link/ether b8:ce:f6:0b:d9:1d brd ff:ff:ff:ff:ff:ff
4: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether b8:ce:f6:0b:d9:1d brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.109/24 scope global vmbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::bace:f6ff:fe0b:d91d/64 scope link 
       valid_lft forever preferred_lft forever
5: enp6s0f1v0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether ae:0a:fe:86:e3:9a brd ff:ff:ff:ff:ff:ff
6: enp6s0f1v1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 12:e3:9e:f9:22:b6 brd ff:ff:ff:ff:ff:ff
7: enp6s0f1v2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 2a:f5:00:14:0f:cc brd ff:ff:ff:ff:ff:ff
8: enp6s0f1v3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether ba:5d:6c:3d:4a:68 brd ff:ff:ff:ff:ff:ff
9: enp6s0f1v4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 86:e2:c0:ec:a3:d8 brd ff:ff:ff:ff:ff:ff
10: enp6s0f1v5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether aa:52:93:a7:01:af brd ff:ff:ff:ff:ff:ff
11: enp6s0f1v6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether be:b2:59:79:13:9f brd ff:ff:ff:ff:ff:ff
12: enp6s0f1v7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 3a:07:60:b5:04:74 brd ff:ff:ff:ff:ff:ff

参考资料

5.3.4 - 为不同端口分别配置VF

在 pve 下为不同端口分别配置 SR-IOV 的 VF

背景

之前的 sr-iov 配置,对于有两个 port (即双头网卡)的网卡是以相同方式进行配置的,这样产生的 vf 对应到不同的端口。

options mlx4_core num_vfs=4,4,0 port_type_array=2,2 probe_vf=4,4,0 probe_vf=4,4,0

有些,我们需要对不同的端口进行不一样的配置,比如可能只使用其中的一个端口,或者某一个端口可能就不使用 vf 了。

配置方式

参考文章 HOWTO CONFIGURE SR-IOV VFS ON DIFFERENT CONNECTX-3 PORTS

为单头网卡配置8个 VF

编辑 /etc/modprobe.d/mlx4.conf ,设置

options mlx4_core port_type_array=2 num_vfs=8 probe_vf=8 log_num_mgm_entry_size=-1

在双头网卡上配置8个VF, 都在端口1上生效

options mlx4_core port_type_array=2,2 num_vfs=8,0,0 probe_vf=8,0,0 log_num_mgm_entry_size=-1

在双头网卡上配置8个VF, 4个VF在端口1上生效,4个VF在端口2上生效

options mlx4_core port_type_array=2,2 num_vfs=4,4,0 probe_vf=4,4,0 log_num_mgm_entry_size=-1

在双头网卡上配置8个VF, 2个VF在端口1上生效,2个VF在端口2上生效,还有4个VF在两个端口上都生效

options mlx4_core port_type_array=2,2 num_vfs=2,2,4 probe_vf=2,2,4 log_num_mgm_entry_size=-1

参考资料

5.3.5 - 开启 SR-IOV 时的常见问题

在 pve 中开启网卡 SR-IOV 功能常遇见的问题

5.3.5.1 - 不支持开启 SR-IOV

在 pve 中遇到的不支持开启 SR-IOV 的情况

技嘉x99 ud4 主板没有 SR-IOV 设置项

这个主板非常奇怪,bios 选项中找不到 SR-IOV 的设置项,当然,虚拟化支持和 vt-x 是可以的。

后来意外发现:只有在清理 cmos 后第一次启动进入 bios 时,能够在网卡列表中看到当前的所有网卡,其中包括我的 hp544+ 和 realtek 8125b。这是可以进入网卡的配置中找到 SR-IOv 的支持选项,默认是开启的。

但奇怪的是,只要保存 bios,之后再次进入 bios, 就会发现再也无法列出 hp544+ 网卡 , 而 realtek 8125b 网卡有时候有,有没有没有。也就是说只有清理 bios 之后的第一次进入bios能看到网卡列表。反复测试过几次都是这样,不清楚问题所在。

尝试过清理bios后,第一次进入,就把所有的配置都设置好,保存,启动机器,然后再试开启 SR-IOV。这是寄希望于虽然网卡列表不显示但第一次配置的信息还能生效,但很遗憾的失败了。

开启 SR-IOV 导致启动时报错:

[   13.741520] mlx4_core 0000:02:00.0: DMFS high rate steer mode is: performance optimized for limited rule configuration (static)
[   13.741725] mlx4_core 0000:02:00.0: Enabling SR-IOV with 8 VFs
[   13.741741] mlx4_core 0000:02:00.0: not enough MMIO resources for SR-IOV
[   13.741747] mlx4_core 0000:02:00.0: Failed to enable SR-IOV, continuing without SR-IOV (err = -12)

最后,无奈的放弃了在 技嘉x99 ud4 主板上开启 SR-IOV 的尝试,最终选择了性能最佳毛病最少的物理机方案(虚拟机直通方案遇到 IRQ 冲突)。

5.4 - SR-IOV实战

SR-IOV 实战的例子

5.4.1 - 带管理网络的 SR-IOV 实战

在开启 SR-IOV 给虚拟机共享网卡的同时支持管理网络

背景

需求:

  • 在 pve 的各个虚拟机中分享网卡
  • 同时支持管理网络也使用这个网卡, 从而实现管理网络的高速通讯

设备:

  • 一块 40G/56G 网卡,型号为 HP544+,双口(但当前实战中只使用到一个口)

目标:

  • 虚拟机中可以自由使用该网卡实现高速通讯
  • 管理网络也使用这个网卡

规划:

  • HP544+ 网卡
  • 开启 SR-IOV
  • PF 用于 vmbr0 实现管理网络
  • VF 直通给到虚拟机

实现步骤:

  1. 先安装 PVE, 使用 HP544+ 网卡做管理网络,vmbr0 会基于 HP544+ 网卡
  2. 开启直通,设置 HP544+ 网卡 的 SR-IOV 配置
  3. 配置 ubuntu server 虚拟机,直通 VF
  4. 在 ubuntu server 虚拟机中检验网卡的使用

准备工作

安装 PVE

正常安装 PVE, 安装时网卡选择 HP544+ 网卡,填写网络信息类似为:

  • ip 地址: 192.168.99.18
  • 网关:192.168.99.1
  • DNS: 192.168.99.1

PVE 安装完成后,检查是否可以连接到网关

ping 192.168.99.1

如果有问题,则需要

ip addr

查看网卡情况,然后执行

vi /etc/network/interfaces

修改 vmbr0 的配置,指向正确的网卡。然后执行

ifup -a

让网卡配置生效。重新 ping 来检验连接是否成功。

安装网卡相关软件

需要安装以下工具软件:

  • mft 工具
  • mlxup
  • mstflint

实战步骤

开启直通

按照前面介绍的方式,开启 pve 的直通支持。

设置 SR-IOV

修改 HP544+ 网卡配置:

mst start

mlxconfig -d /dev/mst/mt4103_pci_cr0 reset

mlxconfig -d /dev/mst/mt4103_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=8 WOL_MAGIC_EN_P2=0 LINK_TYPE_P1=2 LINK_TYPE_P2=2

然后执行

vi /etc/modprobe.d/mlx4_core.conf

修改网卡配置为只在 port 1 上建立8个 vf:

options mlx4_core port_type_array=2,2 num_vfs=8,0,0 probe_vf=8,0,0 log_num_mgm_entry_size=-1

最后执行

update-initramfs -u

重启机器。

此时 ip addr 看到的是:

4: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000
    link/ether 48:0f:cf:ef:08:11 brd ff:ff:ff:ff:ff:ff
    altname enp129s0
5: ens4d1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 48:0f:cf:ef:08:12 brd ff:ff:ff:ff:ff:ff
    altname enp129s0d1
6: ens4v0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 7e:e8:bb:78:9b:e4 brd ff:ff:ff:ff:ff:ff
    altname enp129s0v0
7: ens4v1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 52:59:cf:53:10:ac brd ff:ff:ff:ff:ff:ff
    altname enp129s0v1
8: ens4v2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 02:d6:04:5b:7e:63 brd ff:ff:ff:ff:ff:ff
    altname enp129s0v2
9: ens4v3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether ee:89:43:2e:af:d3 brd ff:ff:ff:ff:ff:ff
    altname enp129s0v3
10: ens4v4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 8e:8d:ac:50:63:17 brd ff:ff:ff:ff:ff:ff
    altname enp129s0v4
11: ens4v5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 7e:b7:b5:c7:2a:bf brd ff:ff:ff:ff:ff:ff
    altname enp129s0v5
12: ens4v6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 76:47:57:f5:b7:c8 brd ff:ff:ff:ff:ff:ff
    altname enp129s0v6
13: ens4v7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 3e:10:37:3c:86:49 brd ff:ff:ff:ff:ff:ff
    altname enp129s0v7
14: ens4v8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 76:34:75:33:95:6b brd ff:ff:ff:ff:ff:ff
    altname enp129s0v8
15: ens4v9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether ee:13:54:87:51:bc brd ff:ff:ff:ff:ff:ff
    altname enp129s0v9
16: ens4v10: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 5a:33:72:74:5a:78 brd ff:ff:ff:ff:ff:ff
    altname enp129s0v10
17: ens4v11: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether ae:a4:58:ec:ee:0a brd ff:ff:ff:ff:ff:ff
    altname enp129s0v11
18: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 48:0f:cf:ef:08:11 brd ff:ff:ff:ff:ff:ff
    inet 192.168.99.58/24 scope global vmbr0
       valid_lft forever preferred_lft forever

执行

lspci | grep Mel

可以看到

81:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
81:00.1 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.2 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.3 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.4 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.5 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.6 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:00.7 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:01.0 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:01.1 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:01.2 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:01.3 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
81:01.4 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]

速度对比

虚拟机使用 vmbr0

iperf -c 192.168.99.1 -P 10 -t 20 -i 1

实际测试下来大概是 20G:

[SUM]  0.0-20.1 sec  46.8 GBytes  20.0 Gbits/sec

虚拟机使用 VF

直通一个 VF 进入虚拟机,删除 vmbr0, 同样测速,结果大概是 42.8 G:

[SUM]  0.0-20.0 sec  99.8 GBytes  42.8 Gbits/sec

虚拟机直通网卡

这个之前测试过,速度可以达到 48G ,基本等同于物理机上测试的结果。

总结

以 HP544+ 网卡为例,开启 56G eth 模式,各种情况下的 iperf 测试结果是这样的:

  1. 物理机下速度最快: 48G,得益于 rdma, CPU 占用基本为零
  2. 虚拟机网卡直通基本等同于物理机:同样 48g 速度 + CPU 占用基本为零
  3. PVE 系统直接使用 vmbr, 接近物理机和直通(算九五折): 45到47.9g不等,cpu占用约 20%
  4. 开启 SR-IOV 直通 VF, 速度下降:大约 42.8 g, 和最高性能相比打八折
  5. 虚拟机使用vmbr:速度最慢,约 20G, 和最高性能相比打四折,而且 cpu 占用很高

所以,建议在不同场景下酌情使用:

  • vmbr 方法:最灵活,但性能最低(打四折),适用于无法或者不方便开启直通/SR-IOV 的场合
  • 直通方案:性能最高,直逼物理机,但有独占网卡的限制
  • SR-IOV 直通 VF 方案:兼顾性能和灵活度,八折性能换来可以在多个虚拟机中共享网卡 (HP544+ 网卡最多可以有 15 个 VF)

5.4.2 - 软路由+软交换实战

基于openwrt+ubuntu server的软路由+软交换实战

背景

需求:

  • 在 pve 中搭建 openwrt 的虚拟机,实现软路由功能
  • 在 pve 中搭建 ubuntu server 的虚拟机,实现软交换功能

设备:

  • 两块 2.5G 网卡,型号为 realtek 8125b,单口
  • 两块 40G 网卡,型号为 HP544+,双口

目标:

  • openwrt 能实现拨号上网的功能
  • openwrt 能提供 DHCP 服务
  • 40G 网卡能组建一个高速子网(这是下一个实战的内容),并且开启 RDMA 功能以保证速度和性能
  • pve 机器上的其他虚拟机可以自如的访问 40g 和 2.5G 网络

规划:

  • 两块 2.5g 网卡,分别用于 openwrt 的 wan 和 lan

    • 其中 lan 会接入 2.5G 交换机,为内网其他设备提供网络服务
    • wan 接入 2.5G 光猫,实现拨号上网
  • 两块 40G 网卡

    • 一块 40G 网卡 将完全直通给到 ubuntu server 虚拟机,提供两个速度和性能最佳的网口给到下游设备
    • 一块 40G 网卡将开启 SR-IOV,
      • port1 的PF(物理网卡)将以 vmbr 的形式提供 PVE 管理网络
      • port1 和 port2 的第一个 VF 将直通给到 ubuntu server 虚拟机,提供两个速度和性能还不错(比完整直通低,比网桥高)的网口给到下游设备

实现步骤:

  1. 先在现有网络中安装 pve 到物理机,实现现有网络作为 pve 的管理网络
  2. 安装 openwrt 虚拟机和 ubuntu server 虚拟机
  3. 开启 SR-IOV 和 直通,准备必要的 vmbr,然后分别分配给 openwrt 虚拟机和 ubuntu server 虚拟机
  4. 配置 openwrt 虚拟机,实现 wan (使用临时网段暂时先接入现有网络)和 lan, DHCP 分配
  5. 配置 ubuntu server 虚拟机,实现基于 linux bridge 的软交换功能
  6. 修改 pve 的管理网络为使用 40G 高速网络
  7. 拆除现有网络,改用 openwrt 拨号并接入内网设备
  8. 修改 openwrt 的临时网段为正式网段

解释: 为什么不在 openwrt 中直接管理两块 40G 网卡?

  • 最主要的原因是 openwrt 不支持 RDMA, 因此会有非常巨大的性能损失(超出50%)而且cpu消耗非常高
  • openwrt 下 40G 网卡 (具体型号为 hp544+)的启用和停用,会影响 openwrt 下的网络命名 (eth0/eth1/eth2等的存在和顺序),而 openwrt 的 lan / wan 是绑定在 eth0 这样的名称上,而不是具体的 mac 地址上。因此如果下有的 40G 网络设备有启动或者停止,而 openwrt 又进行了重启,则会因为eth网卡顺序和名称的变化造成 openwrt 不可用。

准备工作

准备虚拟机

分别建立两个虚拟机:

  1. 用于软路由的 openwrt

    安装的方法参考 https://skyao.io/learning-openwrt/docs/installation/pve/

    注意: 先不要开启开机自动启动

  2. 用于软交换的 ubuntu server 20.04

网卡基本情况

lspci | grep controller

可以看到 pci 设备情况:

01:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
04:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
06:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
07:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)

四块网卡网卡的设备 id 依次是 01/04/06/07。

对应他们的网络设备名称,执行

ip addr

可以看到:

2: enp6s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UP group default qlen 1000
    link/ether 38:ca:73:fe:01:60 brd ff:ff:ff:ff:ff:ff
3: enp7s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 58:11:22:08:76:ed brd ff:ff:ff:ff:ff:ff
4: enp1s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 50:65:f3:89:24:21 brd ff:ff:ff:ff:ff:ff
5: enp1s0d1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 50:65:f3:89:24:22 brd ff:ff:ff:ff:ff:ff
6: enp4s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 50:65:f3:89:b4:61 brd ff:ff:ff:ff:ff:ff
7: enp4s0d1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 50:65:f3:89:b4:62 brd ff:ff:ff:ff:ff:ff
......
16: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 38:ca:73:fe:01:60 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.8/24 scope global vmbr0
  • enp6s0: 2.5G 网卡,这块卡按照规划是 openwrt 的 wan 口
  • enp7s0: 2.5G 网卡,这块卡按照规划是 openwrt 的 lan 口,同时也是 ubuntu server 的 wan 口
  • enp1s0 / enp1s0d1: 第一块(离cpu近) 40G 网卡的两个 port ,这个网卡准备直通给到软交换的 ubuntu server 虚拟机
  • enp4s0 / enp4s0d1: 第二块 40G 网卡的两个 port ,需要做 SR-IOV,同时用于管理网络/软交换的 ubuntu server 虚拟机/其他虚拟机
  • vmbr0: 管理网络使用的网桥,绑定在 enp7s0 上
  • 新加 vmbr1:未来管理网络将要使用的网桥,绑定在 enp4s0 上,因此暂时没有设置 ip 地址和网关

pve-network

准备本地机器

需要准备一台本地机器,作为客户端接入到软路由和软交换的两个网段,因此要求这个机器有两块网卡,分别接入这两个网段。

实际操作时也可以用两台机器分别接入 2.5G 和 40G 网络。

准备网卡的直通和开启SR-IOV

按照前面的做法, 开启 PVE 的直通支持,并将两块 40G 网卡中的第二块(离cpu远的)设置为开启 SR-IOV。注意:第一块 40G 网卡不要开启 SR-IOV。

lspci | grep controller

查看设置完成之后的网卡设备情况(忽略其他设备):

......
01:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
04:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
04:00.1 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.2 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.3 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.4 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.5 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.6 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:00.7 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
04:01.0 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
06:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
07:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)

在 pve 中看到的网络情况:

pve-network2

目前 vmbr0 绑定在 enp7s0 这块 2.5G 网卡上。

网段规划和网卡分工

规划有两个网段:

  • 192.168.0.0/24: 这是软路由的目标网段,openwrt 软路由地址为 192.168.0.1,作为 192.168.0.0/24 网段的网关

    • 注意,在实施过程时,因为现有网络使用了 192.168.0.0/24 网段,因此 openwrt 会先临时使用 192.168.5.0/24 网段,待一切完成后,再改为 192.168.0.0/24 网段
  • 192.168.99.0/24: 这是软交换的网段,ubuntu server 软路由地址为 192.168.99.1,作为 192.168.99.0/24 网段的网关

刚开始时,由其他路由器拨号,pve 主机安装和配置过程中都需要使用到网络,因此安装 pve 时使用 2.5g 网卡 enp7s0 作为 pve 管理网络(绑定到 vmbr0),此时的 ip 地址是 192.168.0.8,如上图所示。

vmbr0 以及它绑定的网卡(现在是 2.5G 的 enp7s0)需要扮演三个角色:

  1. 作为 lan 接入到软路由 openwrt 中
  2. 作为 wan 接入到软交换 ubuntu server 中
  3. 作为管理网络接口提供远程管理功能: 这个功能在最后会被基于 enp4s0 的 vmbr1 取代

说明: 由于在安装 pve 时 40G高速网段不可用(软交换所在的 pve 还没有安装),因此只能将 vmbr0 绑定 2.5G 网卡。但后续为了速度起见还是会使用 40G 作为管理网络。

给两个虚拟机分别分配网卡。

注意: 要先将虚拟机关机再修改硬件配置,否则无法生效,包括重启之后也无法生效,需要停机/删除/再次添加。

这是 openwrt 的虚拟机,除了分配 vmbr0 外,还需要将另外一块 2.5G 网卡直通进入,充当 openwrt 的 wan 和 lan:

openwrt-nic-list

切记: 直通网卡时千万不要弄错,别把 pve 的管理网络所在的网卡(也就是vmbr0对应的网卡)给直通进去了,那样会导致管理网络无法使用。只能通过 pve 控制台来进行操作。

ubuntu server 的虚拟机,除了需要将使用 vmbr0 作为 wan 之外,还需要将两块 40G 网卡的四个端口都直通进去,其中第二块网卡开启了 SR-IOV,因此直通的是编号为1和5的两个 VF:

ubuntu-server-nic-list

至此虚拟机和网卡就都准备好了,开始正式配置软路由和软交换

配置软路由 openwrt

将两块网卡给到 openwrt 虚拟机:

  1. 设备id 为 06 的 2.5G 网卡: 直通
  2. 设备id 为 07 的 2.5G 网卡: 以 vmbr0 的方式

之后两块2.5G网络将分别作为 wan 和 lan。

配置 openwrt 虚拟机

启动 openwrt 虚拟机,此时可以通过管理页面来操作,或者直接在机器的控制台操作。执行:

ip addr

可以看到 eth0 / eth1 两块网卡:

openwrt-ip-addr

执行

lspci

同样能看到两块网卡:

openwrt-lspci

其中一块是直通的,因此能看到型号 RTL8125。另一块是以 vmbr0 的形式,采用的是 Virtio 模式,因此看到的是 “virtio network device”。

但现在看不出来 eth0 / eth1 和两块网卡之间的对应关系。但有个简单的办法,就是拔掉网线,只保留 vmbr0 对应的网卡有网线,然后就可以通过网卡的 UP 状态来识别了。

修改 openwrt 的 /etc/config/network 文件,将 lan 设置为 eth0, ipaddr 设置为 192.168.0.1。拔掉 wan 口的网线,然后重启 openwrt。

此时,会有两个 192.168.0.1/24 网段: 1. 原有的网络 2. 新的 openwrt 的网络

下面我们要将本地机器接入到新的 openwrt 的网络进行后续操作。

本地机器接入软路由网络

此时在本地机器上,连接作为 openwrt lan 口的 2.5g网卡, 接入 openwrt 的 192.168.0.0/24 网段:

local-nic-2.5g

此时本地机器就成功的接入了 openwrt 的 192.168.0.0/24 ,可以通过访问 http://192.168.0.1/ 来管理 openwrt ,也可以通过访问 https://192.168.0.8:8006/ 来操作 pve。

启用 openwrt 软路由

在本地机器上打开 http://192.168.0.1/ ,登录进入,执行 openwrt 的各种设置(或者直接倒入之前备份的配置)。

我这里因为之前有备份的配置,因此直接导入。openwrt 会自动重启,之后重新登录。

此时 openwrt 就准备好了,除了 wan 口还没有接入光猫来进行拨号,以及还没有接入内网 2.5g 交换机。

去掉之前使用的路由器,连接 openwrt 的 万口和 光猫,改由 openwrt 拨号。并将 内网 2.5g 交换机接入 opemwrt 的 lan 口。

一切搞定之后,关闭 openwrt, 然后在设置中开启自动启动。再重启 pve 机器,验证一下。

至此 openwrt 软路由完成。

搭建软交换

在 ubuntu server 虚拟机上设置网卡,将

  • 设备id 为 04 的 40G 网卡的第一个端口的第一个 VF:

    04:00.1 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]

  • 设备id 为 04 的 40G 网卡的第二个端口的第一个 VF:

    04:00.5 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]

  • 设备id 为 01 的 40G 网卡: 整个网卡直通进入,注意不是 VF,这块网卡特意没有开启 SR-IOV

switch-nic

开启 ubuntu server 虚拟机,登录进入后执行

ip addr

可以看到此时 enp1s0 已经自动获取了 192.168.0.0/24 网段的地址:

switch-ip-addr

这是因为 enp1s0 是 VF,而另外一个 VF 在前面被我们直通给了 openwrt 主机。两个网段之间的联系(包括和管理网络的联系)就是通过这样的方式建立起来的。

之后按照软交换的设置方式,参考 https://skyao.io/learning-ubuntu-server/docs/router/router.html

切换管理网络为高速网络

在两个虚拟机准备好之后,第一件事情是修改为采用 40G 高速网络进行 pve 管理,以便后续将两块 2.5g 网卡都直通给到 openwrt 的虚拟机。

现在我们要做的是修改 vmbr0 的设置,让它绑定在 enp4s0 这块 40G 网卡的 port1 上。

先将一台电脑的 40G 网卡和 pve 所在机器的这块40G网卡的 port 1 (两个网口中更靠近主板的那个)连接,后续就只能依靠这条网络来远程管理 pve。

更换管理网络的事情最好还是在 pve 机器控制台上进行,因为中途管理网络会中断。

修改 /etc/network/interfaces 中 vmbr0 对应的网卡,从原有的 enp6s0 修改为 enp4s0,然后设置:

  • ip地址为 192.168.99.8
  • 子网掩码为 255.255.255.0
  • 网关为 192.168.99.1: 这个网关现在还不存在,未来将在软交换 ubuntu server 中创建,但不影响现在的使用

然后重启 pve。

本地机器接入软交换网络

PVE 重启完成后,设置本地机器的 40G 网卡:

  • ip地址为 192.168.99.90
  • 子网掩码为 255.255.255.0
  • 网关为 192.168.99.8: 目前网关不存在,就只能指定为网线直连的对端的 ip 地址

本地40G网卡连接情况如图所示:

local-nic

之后通过 https://192.168.99.8:8006/ 就可以访问到 pve 机器的新的管理网络了,后续操作都将在远程进行。

5.4.3 - 高速共享存储

开启直通来建立高速的共享存储

背景

需求:

  • 希望在局域网内为其他机器提供高速网络共享服务

设备:

  • 一块 40G/56G 网卡,型号为 HP544+,双口(但当前实战中只使用到一个口)
  • 一块爱国者p7000z 4T pcie 4.0 硬盘
  • 一块华硕z690-p d4 主板

目标:

  • 虚拟机拥有 56G 高速网络,同时可以高速读写那块 4T 的 pcie4 ssd 硬盘

规划方案1

  • HP544+ 网卡直通给到虚拟机
  • p7000z 硬盘直通给到虚拟机

规划方案2:

  • HP544+ 网卡直通给到虚拟机
  • p7000z 硬盘由 pve 管理,然后以 pve hard disk 的方式传递给虚拟机

遇到问题修改规划

规划1 在实践时遇到问题,HP544+ 网卡和 p7000z 硬盘都可以单独直通给到虚拟机,但是如果两个设备同时一起直通给到虚拟机,则会报错:

kvm: -device vfio-pci,host=0000:01:00.0,id=hostpci1,bus=ich9-pcie-port-2,addr=0x0: vfio 0000:01:00.0: Failed to set up TRIGGER eventfd signaling for interrupt INTX-0: VFIO_DEVICE_SET_IRQS failure: Device or resource busy
TASK ERROR: start failed: QEMU exited with code 1

google 一番没有找到解决方案,倒是找到了一个问题和我类似的帖子:

https://forum.proxmox.com/threads/passthrough-two-pci-devices.110397/

作者说问题发生在使用两块 Mellanox ConnectX-3 网卡时,当他换成 Mellanox ConnectX-4 网卡时问题就消失了。

考虑到目前我还没有换 Mellanox ConnectX-4 的计划,只能放弃规划方案1, 后面的操作是基于规划方案2。

准备工作

准备 PVE 和直通支持

安装 pve 8.0, 开启直通支持。

准备虚拟机

安装 ubuntu server 20.04, 按照之前虚拟机的要求为直通做好准备。

实战步骤

速度对比

6 - 网络

配置PVE的网络

6.1 - 网络设备的命名约定

PVE网络中网络设备的命名约定

参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#sysadmin_network_configuration

3.3.2. Naming Conventions 一节。

命名约定

目前对设备名称使用以下命名约定:

  • 以太网设备:en*,systemd 网络接口名称。此命名方案用于自版本 5.0 以来的新 Proxmox VE 安装。
  • 以太网设备:eth[N],其中 0 ≤ N (eth0, eth1, …)此命名方案用于在5.0版本之前安装的Proxmox VE主机。升级到 5.0 时,名称将保持原样。
  • 网桥名称:vmbr[N],其中 0 ≤ N ≤ 4094 (vmbr0 - vmbr4094)
  • bond:bond[N],其中 0 ≤ N (bond0, bond1, …)
  • VLAN:只需将 VLAN 编号添加到设备名称中,用句点分隔(eno1.50、bond1.30)

下面是一个默认安装后的 /etc/network/interfaces 文件内容:

auto lo
iface lo inet loopback

iface enp7s0 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.0.18/24
        gateway 192.168.0.1
        bridge-ports enp7s0
        bridge-stp off
        bridge-fd 0

iface enp179s0 inet manual

iface enp179s0d1 inet manual

iface enp101s0 inet manual

iface enp101s0d1 inet manual

systemd 网络接口名称

Systemd 对以太网网络设备使用两个字符前缀 en。接下来的字符取决于设备驱动程序以及哪个架构首先匹配的事实。

  • o<index>[n<phys_port_name>|d<dev_port>] — 板载设备
  • s[<slot>f<function>][n<phys_port_name>|d<dev_port>] — 按热插拔 ID 划分的设备
  • [P<domain>]p<bus>s[<slot>f]<function>[n<phys_port_name>|d<dev_port>] — 按 bus id 划分的设备
  • x<MAC> — 按 MAC 地址划分的设备

最常见的模式是:

  • eno1 — 是第一个板载网卡
  • enp3s0f1 — 是 pcibus 3 插槽 0 上的网卡,并使用网卡功能 1。

有关详细信息,请参阅 可预测的网络接口名称

6.2 - ifupdown2工具

使用 ifupdown2 配置PVE网络

参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#sysadmin_network_configuration

使用推荐的 ifupdown2 软件包(自Proxmox VE 7.0以来的新安装默认),可以在不重新启动的情况下应用网络配置更改。如果通过 GUI 更改网络配置,则可以单击“应用配置”按钮。这会将更改从暂存接口.new 文件移动到 /etc/network/interfaces 并实时应用它们。

下面是自带的 ifupdown2 软件包的版本情况:

ifup --version
info: executing /usr/bin/dpkg -l ifupdown2
ifupdown2:3.2.0-1+pmx3

ifdown --version
info: executing /usr/bin/dpkg -l ifupdown2
ifupdown2:3.2.0-1+pmx3

6.3 - 网桥

PVE网络中的网桥

参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#sysadmin_network_configuration

3.3.4. Default Configuration using a Bridge 一节。

网桥

网桥就像在软件中实现的物理网络交换机。所有虚拟geust 可以共享单个网桥,也可以创建多个网桥来分隔网络域。每个主机最多可以有 4094 个网桥。

安装程序会创建一个名为 vmbr0 的单个网桥,该网桥连接到第一个以太网卡。/etc/network/interfaces 中的相应配置可能如下所示:

auto lo
iface lo inet loopback

iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.10.2/24
        gateway 192.168.10.1
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0

虚拟机的行为就像它们直接连接到物理网络一样。反过来,网络将每个虚拟机视为具有自己的 MAC,即使只有一根网络电缆将所有这些 VM 连接到网络也是如此。

6.4 - 路由

PVE网络中的路由

参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#sysadmin_network_configuration

3.3.5. Routed Configuration 一节。

路由

大多数托管服务提供商不支持上述设置(网桥)。出于安全原因,一旦在单个接口上检测到多个 MAC 地址,它们就会禁用网络。

可以通过单个接口“路由”所有流量来避免此问题。这可确保所有网络数据包使用相同的 MAC 地址。

一种常见情况是,你有一个公共 IP(在本例中假定为 198.51.100.5),以及一个用于 VM 的额外 IP 块 (203.0.113.16/28)。对于此类情况,我们建议进行以下设置:

auto lo
iface lo inet loopback

auto eno0
iface eno0 inet static
        address  198.51.100.5/29
        gateway  198.51.100.1
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up echo 1 > /proc/sys/net/ipv4/conf/eno0/proxy_arp


auto vmbr0
iface vmbr0 inet static
        address  203.0.113.17/28
        bridge-ports none
        bridge-stp off
        bridge-fd 0

6.5 - NAT

PVE网络中的NAT

参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#sysadmin_network_configuration

3.3.6. Masquerading (NAT) with iptables 一节。

NAT

伪装(Masquerading)允许只有专用 IP 地址的 guest 通过将主机 IP 地址用于传出流量来访问网络。iptables 会重写每个传出数据包,使其显示为源自主机,并相应地重写响应以路由到原始发送方。

安装程序会创建一个名为 vmbr0 的单个网桥,该网桥连接到第一个以太网卡。/etc/network/interfaces 中的相应配置可能如下所示:

auto lo
iface lo inet loopback

auto eno1
#real IP address
iface eno1 inet static
        address  198.51.100.5/24
        gateway  198.51.100.1

auto vmbr0
#private sub network
iface vmbr0 inet static
        address  10.10.10.1/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0

        post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up   iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE

6.6 - Bond

PVE网络中的Bond

参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#sysadmin_network_configuration

3.3.7. Linux Bond 3.3.7. Linux Bond 一节。

Bond

Bond(也称为 NIC 组合或链路聚合)是一种将多个 NIC 绑定到单个网络设备的技术。可以实现不同的目标,例如使网络容错,提高性能或两者兼而有之。

高速硬件(如光纤通道)和相关交换硬件可能非常昂贵。通过执行链路聚合,两个 NIC 可以显示为一个逻辑接口,从而实现双倍速度。这是大多数交换机支持的本机 Linux 内核功能。如果您的节点有多个以太网端口,您可以通过将网络电缆连接到不同的交换机来分配故障点,并且在出现网络故障时,绑定连接将故障转移到一根电缆或另一根电缆。

聚合链接可以改善实时迁移延迟并提高Proxmox VE群集节点之间的数据复制速度。

有 7 种 bond 模式:

  • Round-robin (balance-rr):按顺序从第一个可用网络接口 (NIC) 到最后一个网络接口从属服务器传输网络数据包。此模式提供负载平衡和容错。
  • Active-backup (active-backup): bond中只有一个 NIC 从属设备处于活动状态。当且仅当活动从站发生故障时,另一个从站才会变为活动状态。单个逻辑绑定接口的 MAC 地址仅在一个 NIC(端口)上外部可见,以避免网络交换机失真。此模式提供容错。
  • Broadcast (broadcast): 在所有从属网络接口上传输网络数据包。此模式提供容错。
  • IEEE 802.3ad 动态链路聚合 (802.3ad)(LACP):创建共享相同速度和双工设置的聚合组。根据 802.3ad 规范利用活动聚合器组中的所有从属网络接口。
  • 自适应传输负载平衡(balance-tlb):不需要任何特殊网络交换机支持的 Linux 绑定驱动程序模式。传出网络数据包流量根据每个网络接口从属设备上的当前负载(相对于速度计算)进行分配。传入流量由一个当前指定的从属网络接口接收。如果此接收从站发生故障,另一个从站将接管发生故障的接收从站的MAC地址。
  • 自适应负载平衡 (balance-alb):包括用于 IPV4 流量的 balance-tlb 和接收负载平衡 (rlb),不需要任何特殊的网络交换机支持。接收负载平衡是通过 ARP 协商实现的。绑定驱动程序在输出时拦截本地系统发送的 ARP 回复,并使用单个逻辑绑定接口中其中一个 NIC 从属设备的唯一硬件地址覆盖源硬件地址,以便不同的网络对等方对其网络数据包流量使用不同的 MAC 地址。

如果您的交换机支持 LACP (IEEE 802.3ad) 协议,则我们建议使用相应的绑定模式 (802.3ad)。否则,通常应使用主动备份模式。

对于群集网络 (Corosync),我们建议使用多个网络对其进行配置。Corosync 不需要网络冗余绑定,因为如果网络无法使用,它可以自行在网络之间切换。

7 - 集群管理

配置管理pve集群

7.1 - 集群介绍

介绍pve集群

参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#chapter_pvecm

集群

Proxmox VE集群管理器pvecm是创建一组物理服务器的工具。这样的组称为群集。我们使用Corosync集群引擎进行可靠的群组通信。群集中的节点数没有明确限制。实际上,实际可能的节点计数可能受到主机和网络性能的限制。目前(2021 年),有报告称集群(使用高端企业硬件)在生产中有超过 50 个节点。

pvecm 可用于创建新群集、将节点加入群集、离开群集、获取状态信息以及执行各种其他与群集相关的任务。Proxmox 群集文件系统 (“pmxcfs”) 用于透明地将群集配置分发到所有群集节点。

将节点分组到群集中具有以下优点:

  • 基于 Web 的集中式管理
  • 多主集群:每个节点可以完成所有管理任务
  • 使用 pmxcfs(一种数据库驱动的文件系统)来存储配置文件,并使用 corosync 在所有节点上实时复制
  • 在物理主机之间轻松迁移虚拟机和容器
  • 快速部署
  • 群集范围的服务,如防火墙和 HA

7.2 - 创建pve集群

创建pve集群

选择一台机器(通常我会选择软路由所在的机器),开始创建 pve 集群。

创建集群

登录 web 界面,选择 “data center”,找到 “cluster” ,然后 “create cluster”.

创建完成后,点击 “Join Information”,然后 “copy information”。

设置vote

修改这台机器的配置:

vi /etc/pve/corosync.conf

修改 nodelist 中这台机器的 quorum_votes 参数,设置的大一些,保证只要这台机器启动就能满足法定人数的需求:

nodelist {
  node {
    name: skyrouter2
    nodeid: 1
    quorum_votes: 3
    ring0_addr: 192.168.20.9
  }
}

比如我这个集群只有三台机器,因此我设置软路由所在机器的 quorum_votes 为 3,保证只要软路由这台机器处于开机状态(同样软路由是24小时开机的),集群的法定人数就足以满足要求,其他机器全部关机都不受影响。

备注:这个操作的主要原因是家庭环境下,其他 pve 机器都是按需开启的,不会24小时在线,因此必须处理法定人数的问题。

7.3 - 加u人pve集群

加入pve集群

准备工作

加入集群之前,有一些要求,比如不能有 guest 虚拟机。

现有集群的备份和恢复

如果有的话,需要先备份,然后删除。待加入集群成功之后,再恢复回来

这个稍后再试。

全新机器

比较干净的方式是刚安装完成的 pve 节点,在进行其他操作之前,现行加入集群,避免麻烦。

加入集群

选择另一台pve机器,登录 web 界面,选择 “data center”,找到 “cluster” ,然后 “join cluster”.

“Join Information” 选择前面复制的 “Join Information” 即可。

注意:

Join cluster 提交之后,页面可能会显示 connection fail 之类的错误信息,这是因为节点加入群集后,其当前节点证书将替换为从群集证书颁发机构 (CA) 签名的证书。这意味着当前会话将在几秒钟后停止工作。

这时要做的是重新打开 web 页面,再次登录,然后再查看集群信息就能发现已经顺利加入集群。

7.4 - 删除集群节点

将节点从集群中删除

参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#_remove_a_cluster_node

注意:

删除节点后,其 SSH 指纹仍将驻留在其他节点的known_hosts中。如果您在重新加入具有相同 IP 或主机名的节点后收到 SSH 错误,请在重新添加的节点上运行一次 pvecm 更新证书,以更新其指纹集群范围。

退出节点

登录集群中待退出之外的其他任意一个节点,执行

pvecm nodes

输出如下:

    Nodeid      Votes Name
         1          1 skyserver (local)
         2          1 skyaio2
         3          1 skyserver2
         4          1 skyserver3
         5          1 skyserver4
         6          1 skyserver5
         7          1 skyserver6
         8          1 skyaio

现在来让 skyaio 节点退出。

先关闭 skyaio 节点,确保该节点已经关机。

pvecm delnode skyaio

节点删除之后检验一下:

pvecm nodes

可以看到 skyaio 节点已经不在了:

    Nodeid      Votes Name
         1          1 skyserver (local)
         2          1 skyaio2
         3          1 skyserver2
         4          1 skyserver3
         5          1 skyserver4
         6          1 skyserver5
         7          1 skyserver6

用命令查看集群状态:

pvecm status

可以看到 skyaio 节点已经不在了:

......
Membership information
----------------------
    Nodeid      Votes Name
0x00000001          1 192.168.0.18 (local)
0x00000002          1 192.168.0.82
0x00000003          1 192.168.0.28
0x00000004          1 192.168.0.38
0x00000005          1 192.168.0.48
0x00000006          1 192.168.0.58
0x00000007          1 192.168.0.68

清理残存信息

从web页面列表中清除

打开 pve 的 web 页面时,会发现 skyaio 节点还在列表中,但已经无法连接。

依然是登录任意一个节点,

cd /etc/pve/nodes
ls
skyaio  skyaio2  skyserver  skyserver2  skyserver3  skyserver4  skyserver5  skyserver6

删除 skyaio 目录:

rm -rf skyaio

刷新页面即可看到 skyaio 节点消失了。

清除 authorized_keys 和 known_hosts

cd /etc/pve/priv

清理 authorized_keys

vi authorized_keys

打开后搜索 skyaio,然后删除该行。

vi known_hosts

同样在打开后搜索 skyaio,然后删除该行。

清除其他信息

查找其他位置可能存在的节点信息:

grep skyaio /etc -r  

排除 /etc/pve/.clusterlog 之外,比如这个文件:

/etc/pve/storage.cfg:	nodes skyserver2,skyaio,skyserver6,skyserver5,skyserver4,skyaio2,skyserver3,skyserver

打开后删除 skyaio 即可。

7.5 - pmxcfs

pmxcfs 群集文件系统

7.5.1 - pmxcfs介绍

pmxcfs是一个数据库驱动的文件系统,用于存储配置文件

参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#chapter_pmxcfs

pmxcfs

Proxmox 集群文件系统 (“pmxcfs”) 是一个数据库驱动的文件系统,用于存储配置文件,使用 corosync 实时复制到所有集群节点。我们使用它来存储所有与Proxmox VE相关的配置文件。

尽管文件系统将所有数据存储在磁盘上的持久数据库中,但数据的副本驻留在 RAM 中。这对最大大小施加了限制,目前为 128 MiB。这仍然足以存储数千个虚拟机的配置。

该系统具有以下优点:

  • 将所有配置实时无缝复制到所有节点
  • 提供强大的一致性检查以避免重复的虚拟机 ID
  • 节点丢失仲裁时为只读
  • 自动更新所有节点的同步群集配置
  • 包括分布式锁定机制

文件系统挂载在:

/etc/pve

8 - 存储

配置PVE的存储

8.1 - 存储介绍

介绍PVE的存储

参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#chapter_storage

Proxmox VE存储模型非常灵活。虚拟机映像可以存储在一个或多个本地存储上,也可以存储在 NFS 或 iSCSI(NAS、SAN)等共享存储上。没有限制,您可以根据需要配置任意数量的存储池。您可以使用所有可用于 Debian Linux 的存储技术。

将 VM 存储在共享存储上的一个主要好处是能够在不停机的情况下实时迁移正在运行的计算机,因为群集中的所有节点都可以直接访问 VM 磁盘映像。无需复制 VM 映像数据,因此在这种情况下,实时迁移非常快。

存储库(包libpve-storage-perl)使用灵活的插件系统为所有存储类型提供通用接口。这可以很容易地采用,以包括将来的更多存储类型。

存储类型

基本上有两种不同类型的存储类型:

  • File level storage 文件级存储

    基于文件级的存储技术允许访问功能齐全的 (POSIX) 文件系统。它们通常比任何块级存储(见下文)更灵活,并允许您存储任何类型的内容。ZFS 可能是最先进的系统,它完全支持快照和克隆。

  • Block level storage 块级存储

    允许存储大型 raw 镜像。通常不可能在此类存储类型上存储其他文件(ISO、备份等)。大多数现代块级存储实现都支持快照和克隆。RADOS和GlusterFS是分布式系统,将存储数据复制到不同的节点。

可用的存储类型

Description Plugin type Level Shared Snapshots Stable
ZFS (local) zfspool both1 no yes yes
Directory dir file no no2 yes
BTRFS btrfs file no yes technology preview
NFS nfs file yes no2 yes
CIFS cifs file yes no2 yes
Proxmox Backup pbs both yes n/a yes
GlusterFS glusterfs file yes no2 yes
CephFS cephfs file yes yes yes
LVM lvm block no3 no yes
LVM-thin lvmthin block no yes yes
iSCSI/kernel iscsi block yes no yes
iSCSI/libiscsi iscsidirect block yes no yes
Ceph/RBD rbd block yes yes yes
ZFS over iSCSI zfs block yes yes yes

精简配置

许多存储和 QEMU 映像格式 qcow2 支持精简配置。激活精简置备后,只有客户机系统实际使用的块才会写入存储。

例如,假设您创建了一个具有 32GB 硬盘的 VM,在安装 guest 系统操作系统后,该 VM 的根文件系统包含 3 GB 的数据。在这种情况下,即使来宾虚拟机看到 32GB 的硬盘驱动器,也只会将 3GB 写入存储。通过这种方式,精简配置允许您创建大于当前可用存储块的磁盘映像。可以为 VM 创建大型磁盘映像,并在需要时向存储添加更多磁盘,而无需调整 VM 文件系统的大小。

具有“快照”功能的所有存储类型也支持精简配置。

存储配置

所有与Proxmox VE相关的存储配置都存储在/etc/pve/storage.cfg的单个文本文件中。由于此文件位于 /etc/pve/ 中,因此会自动分发到所有群集节点。因此,所有节点共享相同的存储配置。

共享存储配置对于共享存储非常有意义,因为可以从所有节点访问相同的“共享”存储。但它对于本地存储类型也很有用。在这种情况下,这种本地存储在所有节点上都可用,但它在物理上是不同的,并且可以具有完全不同的内容。

存储池

每个存储池都有一个 <type>,并由其 <STORAGE_ID>。池配置如下所示:

<type>: <STORAGE_ID>
        <property> <value>
        <property> <value>
        <property>
        ...

<type>: <STORAGE_ID> 行开始池定义,然后是属性列表。大多数属性都需要值。有些具有合理的默认值,在这种情况下,您可以省略该值。

更具体地说,请查看安装后的默认存储配置。它包含一个名为 local 的特殊本地存储池,该池引用目录 /var/lib/vz 并且始终可用。Proxmox VE安装程序根据安装时选择的存储类型创建其他存储条目。

默认存储配置 (/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

8.2 - NFS

配置PVE的NFS存储

8.2.1 - 配置NFS

配置PVE的NFS存储配置

标准配置

在 pve 控制页面上打开 Datacenter, 进入 Storge, 在 “Add” 下拉框中选择 “NFS”:

add

这个方案在正常 pve 集群下没有问题,但是我这里因为机器都是按需启动,不会7x24小时在线,因此 pve 集群的最小法定人数经常无法达到,导致集群不可用。

如果用上面的方案,那么不同机器都会新建 nfs 存储,会导致都指向同一个 nfs 远程目录,这样应该会造成混乱。

个人实践(受限不能使用集群功能)

ID分段使用 nfs 存储

一番尝试之后发现,标准的 nfs 存储只要处理好 ID 分段,不同的 pve 节点使用不同的 ID 范围,就可以正常使用的(前提:有多台 pve 机器又不愿意建立集群)。

add-nfs

建立 nfs 存储的方式和标准方式一样,只是 Content 只选了三个: Disk image, ISO image 和 VZDump backup file。

ID 分段规则:

  • local: 从 100 到 999
  • nfs-fast: skyserver1-6六台机器,分段分别为 1000-1099 / 2000-2099 / 3000-3099 / 4000-4099 / 5000-5099 / 6000-6099
  • template: 10000 开始

nfs 文件存储位置

服务器端

在 export 文件中,服务器端 export 的目录是 /mnt/data/pve-share

ls
dump  images  template
  • template/iso 目录: 存放上传的 iso 文件
  • dump 目录: 存放虚拟机和模板的备份文件,可以用于恢复。

客户端

在 pve 页面上用 nfs-fast 为 ID 建立的 nfs 存储,在本地磁盘上挂载的路径为 /mnt/pve/nfs-fast

共享模板

由于模板是只读的,因此适合跨pve节点共享,但是按照 pve 标准的恢复方式,从 dump 文件恢复后存放在 nfs 存储中的模板虚拟机,只保存在执行恢复操作的这一台 pve 机器上,其他 pve 机器只能在 “VM Disk” 看到这些模板的镜像文件,但是在虚拟机列表中无法列出。

ssh 登录操作模板恢复的 pve 节点,可以看到恢复的虚拟机模板:

cd /etc/pve/qemu-server
ls

10000.conf  10001.conf

这里遵守前面定制的规则:虚拟机模板的 id 从 10000 开始,确保不会和本地存储上的虚拟机ID重叠。

先把配置文件下载到本地作为备份:

cd /media/d/backup/pve/qemu-server
scp root@192.168.99.38:/etc/pve/qemu-server/10000.conf /media/d/backup/pve/qemu-server/
scp root@192.168.99.38:/etc/pve/qemu-server/10001.conf /media/d/backup/pve/qemu-server/

然后将这些模板的配置文件复制到其他 pve 节点:

# skyserver
scp /media/d/backup/pve/qemu-server/10000.conf root@192.168.99.18:/etc/pve/qemu-server
scp /media/d/backup/pve/qemu-server/10001.conf root@192.168.99.18:/etc/pve/qemu-server

# skyserver2
scp /media/d/backup/pve/qemu-server/10000.conf root@192.168.99.28:/etc/pve/qemu-server
scp /media/d/backup/pve/qemu-server/10001.conf root@192.168.99.28:/etc/pve/qemu-server

# skyserver4
scp /media/d/backup/pve/qemu-server/10000.conf root@192.168.99.48:/etc/pve/qemu-server
scp /media/d/backup/pve/qemu-server/10001.conf root@192.168.99.48:/etc/pve/qemu-server

# skyserver5
scp /media/d/backup/pve/qemu-server/10000.conf root@192.168.99.58:/etc/pve/qemu-server
scp /media/d/backup/pve/qemu-server/10001.conf root@192.168.99.58:/etc/pve/qemu-server

比较麻烦一点的是以后模板文件有变化(增加/修改/删除)时,需要用这个方式手工同步各个 pve 节点机器(毕竟没有集群管理)。

好在模板一般数量有限,更新频率也不会太高,先这么对付着用,不行就写个脚本简化一下操作。

模板和虚拟机恢复的最佳实践

实际操作中,有一些发现:

  1. 从 dump 出来的备份文件恢复模板,速度是非常快的

    不管是恢复到 nfs 存储还是某台 pve 节点的 local 本地存储,大概一分钟这个级别

  2. 从模板文件 clone 到虚拟机,速度非常慢

    恢复 pve 节点的 local 本地存储,大概三五分钟这个级别。

  3. clone 时如果选择 “Linked clone”,速度非常快。

    10秒级别, 毕竟这种情况下无需复制整个模板的文件(10-20G级别)

因此,总结出来的最佳实现应该是这样:

  1. 坚持以模板为基础来实现虚拟机的备份和版本控制:模板是只读的,对内容的一致性有保障
  2. 以pve备份的方式对模板进行备份,得到 dump 文件,用于离线冷备份和不同机器之间分发
  3. dump 文件倒入到 nfs 存储中,全局一份
  4. 模板默认恢复一份到 nfs 存储中,同样全局只有一份:使用时直接在 nfs 上 “Linked clone”,用完即删
  5. 对于使用频率非常高的模板,直接恢复到 pve 节点的 local 本地存储:后续根据使用时间长短区分,长期使用的希望隔离性好的,用 “Full clone”。短期使用用完就删的用 “linked clone”

8.2.2 - [废弃]通过NFS复制

通过 NFS 复制文件来同步虚拟机和模板内容

背景

scp 命令的速度,只能达到 300-400MB,无法发挥出网络和硬盘的速度。

nfs 会快一些,实际测试可以达到 2000 - 3000 MB (主要瓶颈在ssd写入速度)。

准备工作

准备 nfs 服务器端

在 skydev 机器上开通 nfs,然后将 4t 的 pcie 4.0 ssd 以 nfs 的方式共享出来

nfs 地址为: 192.168.99.100 , export 地址为 /mnt/data/share

准备 nfs 客户端

pve 节点上安装 nfs 客户端。

mount nfs 到 pve 节点

在pve 节点上执行命令:

mkdir -p /mnt/nfs-fast
# on skywork
sudo mount 192.168.100.1:/mnt/data/share /mnt/nfs-fast
# on skyserver
mount 192.168.99.100:/mnt/data/share /mnt/nfs-fast

为了方便,

vi ~/.zshrc

增加一个 alias :

# on skywork
alias mount-nfs-fast='sudo mount 192.168.100.1:/mnt/data/share /mnt/nfs-fast'
# on skyserver
alias mount-nfs-fast='mount 192.168.99.100:/mnt/data/share /mnt/nfs-fast'

复制虚拟机和模板

复制虚拟机或者模板文件到 pve 的 dump 目录:

cd /mnt/nfs-fast/pve-share/templates/ubuntu20.04
cp *.vma *.vma.notes /var/lib/vz/dump 

同样为了方便,

vi ~/.zshrc

增加一个 alias :

alias copy-pve-dump='cp *.vma *.vma.notes /var/lib/vz/dump/'

恢复虚拟机或者模板

在 pve 管理页面操作,打开 local,“Backups” 。

总结

这个方案中,nfs 只是作为一种快速的远程源文件复制方式,从 nfs 服务器端将虚拟机或者模板文件复制到 pve 本地存储,然后通过标准的 pve 虚拟机恢复方式来恢复虚拟机或者模板。之后虚拟机或者模板就存放在 pve 本地存储上了,再进行各种 clone 操作也就方便了。

缺点就是完全绕开了 pve, 需要 ssh + 命令手工执行。

8.2.3 - [废弃]通过 NFS 进行 dump 和恢复

通过 NFS 进行 dump 和恢复虚拟机和模板内容

背景

前面纯 nfs 的方案还是手工操作太多。

考虑采用 pve 的 nfs storage,但是只存放 dump 出来的虚拟机或者模板文件,不涉及到 vm id,不会造成冲突。

准备工作

准备 nfs 服务器端

在 skydev 机器上开通 nfs,额外增加一个 export 地址,为 /mnt/data/pve-dump

新建 nfs 存储

打开 pve 管理页面,在 “datacenter” -》 “storage” 下,“Add” 一个名为 “nfs-fast-dump” 的 NFS 存储, export 选择 /mnt/data/pve-dump。“content” 只选择 “VZDump backup file”。

此时 pve 会自动在 /mnt/data/pve-dump 目录下新建一个名为 “dump” 的子目录,将之前备份的 vma 等文件,复制到 /mnt/data/pve-dump/dump/ 目录。

刷新 “nfs-fast-dump” 存储的 “Backups” 就可以看到之前备份的 dump 文件,然后就可以用 pve 标准的恢复功能将他们恢复为虚拟机或者模板。

实践了一下, 8G 的模板恢复时间为 66 秒:

restore vma archive: vma extract -v -r /var/tmp/vzdumptmp101735.fifo /mnt/pve/nfs-fast-dump/dump/vzdump-qemu-107-2023_07_26-02_23_55.vma /var/tmp/vzdumptmp101735
CFG: size: 667 name: qemu-server.conf
DEV: dev_id=1 size: 540672 devname: drive-efidisk0
DEV: dev_id=2 size: 549755813888 devname: drive-scsi0
CTIME: Wed Jul 26 02:23:55 2023
Formatting '/var/lib/vz/images/101/vm-101-disk-0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off preallocation=metadata compression_type=zlib size=540672 lazy_refcounts=off refcount_bits=16
new volume ID is 'local:101/vm-101-disk-0.qcow2'
Formatting '/var/lib/vz/images/101/vm-101-disk-1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off preallocation=metadata compression_type=zlib size=549755813888 lazy_refcounts=off refcount_bits=16
new volume ID is 'local:101/vm-101-disk-1.qcow2'
map 'drive-efidisk0' to '/var/lib/vz/images/101/vm-101-disk-0.qcow2' (write zeros = 0)
map 'drive-scsi0' to '/var/lib/vz/images/101/vm-101-disk-1.qcow2' (write zeros = 0)
progress 1% (read 5497618432 bytes, duration 1 sec)
progress 2% (read 10995171328 bytes, duration 3 sec)
progress 3% (read 16492724224 bytes, duration 6 sec)
progress 4% (read 21990277120 bytes, duration 7 sec)
......
progress 99% (read 544258785280 bytes, duration 66 sec)
progress 100% (read 549756338176 bytes, duration 66 sec)
total bytes read 549756403712, sparse bytes 541771325440 (98.5%)
space reduction due to 4K zero blocks 5.08%
rescan volumes...
Convert to template.
TASK OK

20G 的模板恢复时间为 115 秒:

restore vma archive: vma extract -v -r /var/tmp/vzdumptmp103025.fifo /mnt/pve/nfs-fast-dump/dump/vzdump-qemu-102-2023_07_26-01_23_50.vma /var/tmp/vzdumptmp103025
CFG: size: 637 name: qemu-server.conf
DEV: dev_id=1 size: 540672 devname: drive-efidisk0
DEV: dev_id=2 size: 549755813888 devname: drive-scsi0
CTIME: Wed Jul 26 01:23:50 2023
Formatting '/var/lib/vz/images/102/vm-102-disk-0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off preallocation=metadata compression_type=zlib size=540672 lazy_refcounts=off refcount_bits=16
new volume ID is 'local:102/vm-102-disk-0.qcow2'
Formatting '/var/lib/vz/images/102/vm-102-disk-1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off preallocation=metadata compression_type=zlib size=549755813888 lazy_refcounts=off refcount_bits=16
new volume ID is 'local:102/vm-102-disk-1.qcow2'
map 'drive-efidisk0' to '/var/lib/vz/images/102/vm-102-disk-0.qcow2' (write zeros = 0)
map 'drive-scsi0' to '/var/lib/vz/images/102/vm-102-disk-1.qcow2' (write zeros = 0)
progress 1% (read 5497618432 bytes, duration 5 sec)
progress 2% (read 10995171328 bytes, duration 6 sec)
......
progress 98% (read 538761232384 bytes, duration 108 sec)
progress 99% (read 544258785280 bytes, duration 109 sec)
progress 100% (read 549756338176 bytes, duration 115 sec)
total bytes read 549756403712, sparse bytes 529814392832 (96.4%)
space reduction due to 4K zero blocks 2.65%
rescan volumes...
Convert to template.
TASK OK

速度只能说还凑合,模板恢复的速度太慢了。

总结

这个方案中,使用到了 pve nfs 存储的功能,但是为了避免在多个 pve 机器(不是一个 cluster) 之间出现冲突,因此只在这个 nfs 存储中存放不涉及到集群的内容。

思路扩展

按照上面的思路,只要 nfs 存储上放的内容不涉及到集群,即不会造成集群范围内的冲突,就不影响使用。

扩展存储类型以包含 ISO 文件

因此,nfs 存储存放的类型可以不限于单纯的 “VZDump backup file”, 可以增加 iso image, 毕竟 iso 文件是没有任何集群属性的,而且也没有必要每台 pve 机器都存放一份。

手工分配 id 以避免冲突

继续扩展上面的思路,对于可能会造成集群冲突的内容,如果能通过某种方式避免冲突,那么也是可以存放在 nfs 上的(备注:多台 pve 机器但是不建立集群) ,比虚拟机和模板。

关键: 在虚拟机和模板的建立过程(包括新建,clone, 恢复等)中, id 是容许手工指定的。

因此,只要制订并遵守某个 id 分配的规则,让不同 pve 节点上的 nfs 存储以不同的 id 段分配 id, 就可以确保任意一台 pve 节点上的 id 都不会和其他 pve 节点重复。

按照这个思路,修改 nfs 存储可以存放的类型,增加 “Disk image” 用来存放虚拟机和模板的镜像文件。

比如 skysever4 这台机器的 id 就以 14000 开头,从 14001 到 14999,绝对够用。skysever5 就用 15001 到 15999……

8.3 - Ceph

配置PVE的Ceph存储

8.3.1 - Ceph概述

配置PVE的Ceph存储

9 - 操作虚拟机

操作虚拟机

9.1 - 上传文件

上传安装虚拟机需要的ISO文件

9.2 - 创建虚拟机

创建虚拟机

相关背景知识

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#chapter_virtual_machines

创建虚拟机的过程有非常多的选项。可以参考:

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#qm_virtual_machines_settings

创建虚拟机

General

general

VM 的常规设置包括:

  • node / 节点:将在其上运行虚拟机的物理服务器
  • VM ID:此 Proxmox VE 安装中用于标识您的 VM 的唯一编号
  • name:可用于描述 VM 的自由格式文本字符串
  • Resource Pool / 资源池:虚拟机的逻辑组

OS

创建虚拟机(VM)时,设置正确的操作系统(OS)允许Proxmox VE优化一些低级参数。例如,Windows操作系统期望BIOS时钟使用本地时间,而基于Unix的操作系统期望BIOS时钟具有UTC时间。

os

选择需要用到的安装镜像,guest type 和 version 要正确填写。

System

  • machine: q35
  • scsi controller: virtIO scsi single
  • 勾选 Qemu Agent
  • BIOS选 OVMF(UEFI)

os

Proxmox VE允许使用不同的固件和机器类型引导VM,即SeaBIOS和OVMF。在大多数情况下,只有当您计划使用 PCIe 直通时,您才希望从默认的 SeaBIOS 切换到 OVMF。虚拟机计算机类型定义虚拟机虚拟主板的硬件布局。您可以在默认的英特尔 440FX 或 Q35 芯片组之间进行选择,后者还提供虚拟 PCIe 总线,因此,如果要通过 PCIe 硬件,则可能需要。

主要是考虑到后面会直通 pcie 网卡到虚拟机。

Disks

  • bus/device: SCSI
  • SCSI controller: VirtIO SCSI single
  • IO Thread 勾选
  • format: QEMU image format

高级选项中:

  • 勾选 backup

disks

QEMU

QEMU 可以模拟多个存储控制器:

  • IDE

    DE控制器的设计可以追溯到1984年的PC/AT磁盘控制器。即使这个控制器已经被最近的设计所取代,你能想到的每个操作系统都支持它,如果你想运行2003年之前发布的操作系统,它是一个不错的选择。您最多可以在此控制器上连接 4 台设备。

  • sata

    SATA(串行ATA)控制器可追溯到2003年,具有更现代的设计,允许更高的吞吐量和更多的设备连接。您最多可以在此控制器上连接 6 台设备。

  • SCSI

    SCSI控制器设计于1985年,常见于服务器级硬件,最多可连接14个存储设备。Proxmox VE默认模拟LSI 53C895A控制器。

  • VirtIO SCSI single

    如果您的目标是性能,建议使用 VirtIO SCSI single 控制器并为连接的磁盘启用 IO 线程设置。这是自Proxmox VE 7.3以来新创建的Linux VM的默认设置。每个磁盘都有自己的 VirtIO SCSI 控制器,QEMU 将在专用线程中处理磁盘 IO。Linux 发行版从 2012 年开始支持这个控制器,FreeBSD 从 2014 年开始支持。对于 Windows 操作系统,您需要在安装过程中提供包含驱动程序的额外 ISO。

  • VirtIO Block

    VirtIO Block 控制器,通常简称为 VirtIO 或 virtio-blk,是一种较老类型的半虚拟化控制器。在功能方面,它已被 VirtIO SCSI 控制器取代。

考虑到使用的都是高性能的 nvme ssd,因此选择 SCSI + VirtIO SCSI single

Image Format 图像格式的说明

在每个控制器上,您连接了许多模拟硬盘,这些硬盘由驻留在配置存储中的文件或块设备提供支持。存储类型的选择将决定硬盘映像的格式。提供块设备(LVM,ZFS,Ceph)的存储将需要原始磁盘映像格式,而基于文件的存储(Ext4,NFS,CIFS,GlusterFS)将允许您选择原始磁盘映像格式或QEMU映像格式。

有三个选项:

  • QEMU image format

    copy on write 格式,它允许快照和磁盘映像的精简配置。

  • raw disk image

    硬盘的位到位映像,类似于在 Linux 中的块设备上执行 dd 命令时获得的映像。此格式本身不支持精简配置或快照,需要存储层的合作才能完成这些任务。但是,它可能比 QEMU 图像格式快 10%。

  • VMware image format

    仅当您打算将磁盘映像导入/导出到其他虚拟机管理程序时,VMware 映像格式才有意义。

Cache Mode 缓存模式

设置硬盘驱动器的缓存模式将影响主机系统通知客户机系统块写入完成的方式。无缓存默认值意味着当每个块到达物理存储写入队列时,将通知来宾系统写入已完成,而忽略主机页缓存。这在安全性和速度之间提供了良好的平衡。

高级选项

如果您希望 Proxmox VE 备份管理器在备份 VM 时跳过磁盘,则可以在该磁盘上设置无备份选项。

如果您希望 Proxmox VE 存储复制机制在启动复制作业时跳过磁盘,则可以在该磁盘上设置跳过复制选项。从Proxmox VE 5.0开始,复制要求磁盘映像位于zfspool类型的存储上,因此在VM配置了复制时将磁盘映像添加到其他存储需要跳过此磁盘映像的复制。

CPU

  • type:host (暂时不用担心迁移的问题)
  • 对cpu资源暂时不做限制

cpu

CPU socket

CPU 插槽是 PC 主板上的物理插槽,您可以在其中插入 CPU。然后,此 CPU 可以包含一个或多个内核,这些内核是独立的处理单元。从性能的角度来看,您是具有 4 个内核的单个 CPU 插槽还是两个具有两个内核的 CPU 插槽大多无关紧要。但是,某些软件许可证取决于计算机具有的套接字数,在这种情况下,将套接字数设置为许可证允许您的数量是有意义的。

cores

增加虚拟 CPU(内核和插槽)的数量通常会提高性能,但这在很大程度上取决于 VM 的使用。多线程应用程序当然会受益于大量的虚拟CPU,因为对于您添加的每个虚拟CPU,QEMU将在主机系统上创建一个新的执行线程。如果不确定 VM 的工作负荷,通常可以将核心总数设置为 2。

如果所有 VM 的核心总数大于服务器上的核心数(例如,在只有 8 个核心的计算机上,4 个 VM 各有 4 个核心(= 总共 16 个),则这是完全安全的。在这种情况下,主机系统将在服务器内核之间平衡 QEMU 执行线程,就像运行标准多线程应用程序一样。但是,Proxmox VE 将阻止您启动具有比物理可用更多的虚拟 CPU 内核的虚拟机,因为这只会由于上下文切换的成本而降低性能。

Resource Limits

除了虚拟核心数之外,您还可以配置虚拟机可以获得的资源量(相对于主机 CPU 时间以及与其他虚拟机)相关的资源量。使用 cpulimit(“主机 CPU 时间”)选项,可以限制整个虚拟机在主机上可以使用的 CPU 时间。它是一个浮点值,以百分比表示 CPU 时间,因此 1.0 等于 100%,2.5 到 250%,依此类推。如果单个进程完全使用一个内核,则 CPU 时间使用率为 100%。如果具有四个核心的 VM 完全利用其所有核心,理论上它将使用 400%。实际上,使用率甚至可能更高,因为 QEMU 除了 vCPU 核心线程之外,还可以为 VM 外围设备提供额外的线程。如果 VM 应具有多个 vCPU,此设置非常有用,因为它并行运行几个进程,但整个 VM 不应同时以 100% 的速度运行所有 vCPU。举一个具体的例子:假设我们有一个虚拟机,它将从拥有 8 个 vCPU 中受益,但任何时候这 8 个内核都不应该以满负载运行 - 因为这会使服务器过载,以至于其他虚拟机和 CT 将获得更少的 CPU。因此,我们将 cpulimit 限制设置为 4.0 (=400%)。如果所有内核都执行相同的繁重工作,它们都将获得实际主机内核 CPU 时间的 50%。但是,如果只有 4 个可以工作,他们仍然可以获得几乎 100% 的真实核心。

第二个 CPU 资源限制设置是 CPUUNITS(现在通常称为 CPU 份额或 CPU 权重),用于控制与其他正在运行的 VM 相比,VM 获得的 CPU 时间。它是一个相对权重,默认为 100(如果主机使用旧版 cgroup v1,则为 1024)。如果为 VM 增加此值,则与其他权重较低的 VM 相比,计划程序将优先考虑此值。例如,如果 VM 100 已设置默认值 100,并且 VM 200 更改为 200,则后一个 VM 200 将获得比第一个 VM 100 两倍的 CPU 带宽。

第三个 CPU 资源限制设置“ affinity”控制允许虚拟机在哪些主机核心上执行。例如,如果提供的关联值为 0-3,8-11,则虚拟机将限制为使用主机核心 0、1、2、3、8、9、10 和 11。有效的关联性值以 cpuset 列表格式写入。列表格式是以逗号分隔的 CPU 编号和数字范围列表,采用 ASCII 十进制格式。

备注:这个如果可行, 似乎可以用来支持 intel 12代/13代 大小核的 CPU,将不关键的虚拟机分配到小核上去运行。待验证。

CPU Type

QEMU 可以模拟从 486 到最新至强处理器的许多不同 CPU 类型。每一代新的处理器都增加了新功能,如硬件辅助 3D 渲染、随机数生成、内存保护等。此外,当前一代可以通过带有错误或安全修复的微码更新进行升级。

通常,您应该为虚拟机选择与主机系统的 CPU 非常匹配的处理器类型,因为这意味着主机 CPU 功能(也称为 CPU 标志)将在虚拟机中可用。如果需要完全匹配,可以将 CPU 类型设置为 host,在这种情况下,VM 将具有与主机系统完全相同的 CPU 标志。

不过,这有一个缺点。如果要在不同主机之间实时迁移 VM,则 VM 最终可能会位于具有不同 CPU 类型或不同微码版本的新系统上。如果传递给客户机的 CPU 标志丢失,QEMU 进程将停止。为了解决这个问题,QEMU也有它自己的虚拟CPU类型,Proxmox VE默认使用。

后端默认值为 kvm64,它基本上适用于所有x86_64主机 CPU,创建新虚拟机时的 UI 默认值为 x86-64-v2-AES,这需要从 Westmere 开始的主机 CPU,用于英特尔或至少第四代皓龙用于 AMD。

总之:

  • 如果您不关心实时迁移,或者有一个同构集群,其中所有节点具有相同的 CPU 和相同的微码版本,请将 CPU 类型设置为 host,因为理论上这将为您的 guest 提供最大性能。
  • 如果您关心实时迁移和安全性,并且只有英特尔 CPU 或只有 AMD CPU,请选择集群的最低代 CPU 型号。
  • 如果您关心没有安全性的实时迁移,或者混合了英特尔/AMD 集群,请选择兼容性最低的虚拟 QEMU CPU 类型。

NUMA

还可以选择在 VM 中模拟 NUMA 体系结构。NUMA 体系结构的基础知识意味着,内存不是为所有内核提供全局内存池,而是分布到靠近每个插槽的本地库中。这可以带来速度改进,因为内存总线不再是瓶颈。如果您的系统具有 NUMA 体系结构 ,我们建议激活该选项,因为这将允许在主机系统上正确分配虚拟机资源。热插拔 VM 中的核心或 RAM 也需要此选项。

如果使用 NUMA 选项,建议将 socket 数设置为主机系统的节点数。

备注: 双路cpu似乎应该设置这个,稍后研究。

内存

  • Memory: 32678 / 32G
  • Minimum memory: 8192 / 8G

memery

对于每个虚拟机,您可以选择设置固定大小的内存或要求Proxmox VE根据主机的当前RAM使用情况动态分配内存。

固定内存分配

将内存和最小内存设置为相同数量时,Proxmox VE将简单地将您指定的内容分配给VM。

即使使用固定的内存大小,ballooning device 也会添加到 VM,因为它提供了有用的信息,例如 guest 实际使用的内存量。通常,您应该启用 ballooning ,但如果您想禁用它(例如用于调试目的),只需取消选中 ballooning device 或在配置中设置balloon: 0

自动内存分配

当将最小内存设置为低于内存时,Proxmox VE将确保您指定的最小内存量始终可用于VM,如果主机上的RAM使用率低于80%,则将动态向 guest 添加内存,直至达到指定的最大内存。

当主机的 RAM 不足时,VM 会释放一些内存回主机,根据需要交换正在运行的进程,并在万不得已的情况下启动 oom 杀手。主机和 guest 之间的内存传递是通过在 guest 内部运行的特殊 ballooning 内核驱动程序完成的,该驱动程序将从主机获取或释放内存页。

当多个虚拟机使用自动分配工具时,可以设置份额 Shares 系数,该系数指示每个虚拟机应占用的可用主机内存的相对量。例如,假设您有四个虚拟机,其中三个运行 HTTP 服务器,最后一个是数据库服务器。要在数据库服务器 RAM 中缓存更多数据库块,您希望在备用 RAM 可用时确定数据库 VM 的优先级。为此,将“Shares /份额”属性 3000 分配给数据库 VM,将其他 VM 保留为“份额”默认设置 1000。主机服务器有 32GB 的 RAM,当前使用 16GB,剩下 32 * 80/100 - 16 = 9GB RAM 分配给虚拟机。数据库 VM 将获得 9 * 3000 / (3000 + 1000 + 1000 + 1000) = 4.5 GB 额外 RAM,每个 HTTP 服务器将获得 1.5 GB。

2010 年之后发布的所有 Linux 发行版都包含 balloon 内核驱动程序。对于 Windows 操作系统,balloon 驱动程序需要手动添加,并且可能会导致 guest 速度变慢,因此我们不建议在关键系统上使用它。

网络

  • Model: VirtIO paravirtualized NIC

network

Model

每个 VM 可以有多个网络接口控制器 (NIC),有四种不同类型的控制器:

  • 英特尔 E1000

    是默认的,并模拟英特尔千兆位网卡。

  • VirtIO paravirtualized NIC

    如果您的目标是实现最佳性能,则应使用 VirtIO 半虚拟化 NIC (VirtIO paravirtualized NIC)。与所有 VirtIO 设备一样,guest 操作系统应安装正确的驱动程序。

  • Realtek 8139

    Realtek 8139 模拟较旧的 100 MB/s 网卡,并且只能在模拟较旧的操作系统时使用( 2002 年之前发布)

  • vmxnet3

    vmxnet3 是另一个半虚拟化设备,仅在从其他虚拟机管理程序导入虚拟机时应使用。

Mac 地址

Proxmox VE 将为每个 NIC 生成一个随机 MAC 地址,以便您的 VM 可在以太网网络上寻址。

9.3 - 删除虚拟机

删除虚拟机

常规方法

标准的做法是在web界面上,将虚拟机停止之后再删除。

强制删除

因为某些原因,导致默认的 local-lvm 被删除。此时提交命令

cd /etc/pve/qemu-server/
rm 100.conf

重启,这个虚拟机就消失了。

删除虚拟机磁盘文件

某些情况下,比如没有备份的情况下执行 timeshift restore 操作,会导致虚拟机配置文件丢失,而留下 qcow2 格式的虚拟机磁盘文件,如:

$ pwd
/var/lib/vz/images/104

$ ls -l 
total 23781688
-r--r--r-- 1 root root       917504 Aug 15  2023 base-104-disk-0.qcow2
-r--r--r-- 1 root root 549839962112 Aug 15  2023 base-104-disk-1.qcow2

$ rm -rf base-104-disk-0.qcow2 
rm: cannot remove 'base-104-disk-0.qcow2': Operation not permitted

$ 104 chmod +w base-104-disk-0.qcow2       
chmod: changing permissions of 'base-104-disk-0.qcow2': Operation not permitted$$

此时需要用 chattr 去掉 immutable flag 然后再删除:

chattr -i base-104-disk-0.qcow2
rm base-104-disk-0.qcow2

9.4 - 打开虚拟机

打开虚拟机

9.5 - 关闭虚拟机

关闭虚拟机

强行关闭虚拟机

遇到情况是,在虚拟机操作系统安装界面,因为有配置错误需要关闭虚拟机再修改虚拟机配置,结果发现在操作系统安装界面会无法关闭虚拟机。

强行关闭虚拟机的方式:

  • 登录节点:可以从 web 或者 ssh
  • 执行命令: qm stop 100 (100 是虚拟机编号,自行替代)

修改虚拟机配置文件

重启 pve,在启动菜单中选择高级选项,然后选择恢复模式。

恢复模式启动后,输入 root 账号密码登录。

启动 pve-cluster :

service pve-cluster start

进入 qemu-server:

cd /etc/pve/qemu-server

这时就可以直接编辑和修改虚拟机配置文件了。

9.6 - 备份虚拟机

备份虚拟机

9.6.1 - 备份和恢复虚拟机

备份虚拟机以便恢复

背景知识

虚拟机相关的文件一般默认在 /var/lib/vz/

系统镜像一般在: /var/lib/vz/template/iso

备份在web页面操作,备份目录一般在 /var/lib/vz/dump

使用pve的备份功能

备份虚拟机

在 pve 的页面,选择需要备份的虚拟机(或者 template), “Backup” 选项中,点击 “Backup”。压缩选择 none, mode 选择 stop, 存储选 local,开始备份:

backup-now

备份过程:

INFO: starting new backup job: vzdump 102 --storage local --node skyserver --remove 0 --mode stop --compress 0 --notes-template '{{guestname}}'
INFO: Starting Backup of VM 102 (qemu)
INFO: Backup started at 2023-07-26 01:23:50
INFO: status = stopped
INFO: backup mode: stop
INFO: ionice priority: 7
INFO: VM Name: template-ubuntu-20.04-5.4-basic-r02
INFO: include disk 'scsi0' 'nfs:102/base-102-disk-1.qcow2' 512G
INFO: include disk 'efidisk0' 'nfs:102/base-102-disk-0.qcow2' 528K
INFO: creating vzdump archive '/var/lib/vz/dump/vzdump-qemu-102-2023_07_26-01_23_50.vma'
INFO: starting template backup
INFO: /usr/bin/vma create -v -c /var/lib/vz/dump/vzdump-qemu-102-2023_07_26-01_23_50.tmp/qemu-server.conf exec:cat > /var/lib/vz/dump/vzdump-qemu-102-2023_07_26-01_23_50.dat drive-efidisk0=/mnt/pve/nfs/images/102/base-102-disk-0.qcow2 drive-scsi0=/mnt/pve/nfs/images/102/base-102-disk-1.qcow2
INFO: progress 0% 0/549756354560 0
INFO: progress 1% 5500125184/549756354560 4384260096
INFO: progress 2% 10995187712/549756354560 9787478016
INFO: progress 3% 16492740608/549756354560 10499731456
INFO: progress 4% 21993046016/549756354560 15671595008
......
INFO: progress 98% 538762362880/549756354560 520591867904
INFO: progress 99% 544258801664/549756354560 525779709952
INFO: progress 100% 549756354560/549756354560 529814441984
INFO: image drive-efidisk0: size=540672 zeros=49152 saved=491520
INFO: image drive-scsi0: size=549755813888 zeros=529814392832 saved=19941421056
INFO: archive file size: 18.64GB
INFO: adding notes to backup
INFO: Finished Backup of VM 102 (00:01:04)
INFO: Backup finished at 2023-07-26 01:24:54
INFO: Backup job finished successfully
TASK OK

备份的结果:

backup-result

这里可以看到文件名为 vzdump-qemu-102-2023_07_26-01_23_50.vma,文件大小为 20.02G。

ls -lh /var/lib/vz/dump/*.vma

可以看到保存的备份文件:

ls -lh /var/lib/vz/dump/*.vma
-rw-r--r-- 1 root root 19G Jul 26 01:24 /var/lib/vz/dump/vzdump-qemu-102-2023_07_26-01_23_50.vma

如果备份时候选择了 zstd 压缩,请后面使用备份文件时要先使用 zstd 解压得到 vma 文件:

zstd -d vzdump-qemu-102-2023_07_26-01_23_50.vma.zst 

下载虚拟机文件

通过 scp 等方式将备份文件下载下来:

scp ./vzdump-qemu-102-2023_07_26-01_23_50.vma sky@192.168.0.240:/media/sky/data/backup/pve

通过vma命令转换成raw后缀的磁盘文件

vma extract vzdump-qemu-103-2023_04_01-13_36_26.vma extract

可以通过这样的命令下载整个机器上所有的备份文件到本地磁盘(这里是苹果笔记本上插的移动硬盘):

scp root@192.168.20.29:"/var/lib/vz/dump/vzdump-*" /Volumes/u4t/data/backup/pve-backup/skyaio2

上传虚拟机文件

类似的,将虚拟机备份文件上传到准备做恢复的 pve 上,目标路径同样为 /var/lib/vz/dump/

scp /media/sky/data/backup/pve/vzdump-qemu-102-2023_07_26-01_23_50.vma root@192.168.0.8:/var/lib/vz/dump/

如果执行备份和恢复的这两台机器之间可以直通,则可以直接传递备份文件:

scp /var/lib/vz/dump/vzdump-qemu-107-2023_07_26-02_23_55.vma root@192.168.0.8:/var/lib/vz/dump/

恢复虚拟机

登录要恢复的 pve, 找到 local 仓库,Backup 子项中已经可以看到刚才上传的的虚拟机备份文件:

local-repo

点击 “restore”,选择存储:

restore

恢复过程:

restore vma archive: vma extract -v -r /var/tmp/vzdumptmp24252.fifo /var/lib/vz/dump/vzdump-qemu-102-2023_07_26-01_23_50.vma /var/tmp/vzdumptmp24252
CFG: size: 637 name: qemu-server.conf
DEV: dev_id=1 size: 540672 devname: drive-efidisk0
DEV: dev_id=2 size: 549755813888 devname: drive-scsi0
CTIME: Wed Jul 26 01:23:50 2023
  Rounding up size to full physical extent 4.00 MiB
  Logical volume "vm-100-disk-0" created.
new volume ID is 'local-lvm:vm-100-disk-0'
  WARNING: You have not turned on protection against thin pools running out of space.
  WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full.
  Logical volume "vm-100-disk-1" created.
  WARNING: Sum of all thin volume sizes (512.00 GiB) exceeds the size of thin pool pve/data and the size of whole volume group (<399.00 GiB).
new volume ID is 'local-lvm:vm-100-disk-1'
map 'drive-efidisk0' to '/dev/pve/vm-100-disk-0' (write zeros = 0)
map 'drive-scsi0' to '/dev/pve/vm-100-disk-1' (write zeros = 0)
progress 1% (read 5497618432 bytes, duration 2 sec)
progress 2% (read 10995171328 bytes, duration 3 sec)
......
progress 99% (read 544258785280 bytes, duration 64 sec)
progress 100% (read 549756338176 bytes, duration 67 sec)
total bytes read 549756403712, sparse bytes 529814392832 (96.4%)
space reduction due to 4K zero blocks 2.65%
rescan volumes...
VM 100 (efidisk0): size of disk 'local-lvm:vm-100-disk-0' updated from 528K to 4M
Convert to template.
  Renamed "vm-100-disk-1" to "base-100-disk-1" in volume group "pve"
  Logical volume pve/base-100-disk-1 changed.
  WARNING: Combining activation change with other commands is not advised.
  Renamed "vm-100-disk-0" to "base-100-disk-0" in volume group "pve"
  Logical volume pve/base-100-disk-0 changed.
  WARNING: Combining activation change with other commands is not advised.
TASK OK

恢复完成后的虚拟机:

vm

参考资料

通过虚拟磁盘的方式备份

9.6.2 - 虚拟机备份实战

虚拟机备份实战

9.6.2.1 - 从raw/qcow2格式的镜像文件中恢复虚拟机

在只有 raw/qcow2 格式的镜像文件的情况下恢复虚拟机

背景

由于没有备份虚拟机配置文件,而进行了诸如 timeshift restore 的操作,导致虚拟机配置文件消失,管理页面上看不到虚拟机,而镜像文件残存。

images-file-list

备注:后续要做好虚拟机配置文件的备份,配置文件都很小,容易备份和保存。

恢复操作

查看镜像文件情况

ssh 登录到 pve 主机,执行

cd /var/lib/vz/images

进入虚拟机镜像保存目录,每个虚拟机都在单独的子目录下保存,目录名为 虚拟机id:

$ ls
100  101  102

进入要恢复的虚拟机如 100, 可以看到格式为 raw 的镜像文件。

$ ls
vm-100-disk-0.raw

这是一个 openwrt 的镜像。

新建虚拟机

新建一个虚拟机以便稍后倒入镜像文件,这里按照正常的虚拟机创建操作进行即可,磁盘那里可以不用设置,稍后会删除这个磁盘,然后使用倒入的磁盘。

记录新建虚拟机的 id 备用。

导入镜像

使用 qm importdisk 命令来进行导入,命令格式为:

qm importdisk  <vmid> <images-name> <storage pool>  --format=<disk-fs>

实际操行的例子:

qm importdisk 100 ./vm-100-disk-0.raw  local --format=qcow2

注意要先创建虚拟机,这个命令的意思是将这个镜像文件导入到目标虚拟机中, 因此目标虚拟机必须先存在。

否则会报错:

qm importdisk 100 ./vm-100-disk-0.raw  local --format=qcow2
Configuration file 'nodes/skydev/qemu-server/100.conf' does not exist

成功执行 qm importdisk 命令的输入为:

importing disk './vm-100-disk-0.raw' to VM 100 ...
Formatting '/var/lib/vz/images/100/vm-100-disk-2.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off preallocation=metadata compression_type=zlib size=9680748544 lazy_refcounts=off refcount_bits=16
transferred 0.0 B of 9.0 GiB (0.00%)
transferred 110.8 MiB of 9.0 GiB (1.20%)
......
transferred 8.8 GiB of 9.0 GiB (97.76%)
transferred 8.9 GiB of 9.0 GiB (99.16%)
transferred 9.0 GiB of 9.0 GiB (100.00%)
Successfully imported disk as 'unused0:local:100/vm-100-disk-2.qcow2'

配置虚拟机

此时在虚拟机 hardware 硬件列表中会出现一个 “unused Disk 0”

unused_disk

选择这个 “unused Disk 0”,点 “edit”,出来的界面中点 “Add”。然后删除创建虚拟机时的那块磁盘。

再修改 “Options” 中的 “Boot Order”,改用新导入的磁盘做启动。

启动虚拟机

至此就可以正常的启动虚拟机了。

删除旧的镜像文件

这是虚拟机下会有新旧两个虚拟机镜像文件:

ls /var/lib/vz/images/100
vm-100-disk-0.raw  vm-100-disk-2.qcow2

删除旧的这个 vm-100-disk-0.raw 文件即可。

总结

可以将 pve 的虚拟机理解为是包含两个部分的信息:

  1. 虚拟机配置

    配置信息保存在 /etc/pve/qemu-server 或者 /etc/pve/nodes/skydev/qemu-server 目录下,名为 id.conf 的文件如 100.conf

    备注: /etc/pve/qemu-server/etc/pve/nodes/skydev/qemu-server 目录 的软链接。

  2. 虚拟机镜像

    镜像文件保存在 /var/lib/vz/images 目录下,名为 id 的子目录,如 100 文件夹。

前面出现的问题在于 timeshift restore 之后,保存在 /etc/pve/nodes/skydev/qemu-server 目录下的配置文件被清理,而保存在 /var/lib/vz/images 目录下的镜像文件没有被清理(被设置为 timeshift 的 excludes)。这样虚拟机配置信息没有,而虚拟机镜像文件残存。

上面恢复的过程,可以理解为:

  1. 新建一个虚拟机,保全丢失的虚拟机配置信息:因此要尽量按照之前的虚拟机配置进行创建
  2. 导入镜像,这是将新的虚拟机配置和残存的虚拟机镜像文件组合起来,形成新的完整的虚拟机。

9.6.2.2 - 跨多个节点进行备份和恢复

在多个 pve 节点之间进行虚拟机的备份和恢复,以便快速创建虚拟机

背景

有多台机器安装有 pve 8.0, 但是由于这些机器不是24小时在线,而是按需开机。

按照 pve 标准的做法, 应该建立一个 cluster 集群,然后将所有机器都加入集群,之后就可以在任意一台机器的pve控制台操作集群内的任意机器,还可以在集群内跨节点的执行一些操作和配置。比如 clone 和 migrate 虚拟机和模板。

但因为我的机器不是 24 小时在线,如果建立并加入集群,那么当有大部分机器没有在线时,会因为 法定人数 不足造成无法锁定集群配置进行写操作,恶劣时连虚拟机都无法启动。

因此,不得已只能让每个节点都成为独立节点,不建立 pve 的集群。

当这样一来就无法使用到 pve 集群的跨节点功能,比如这篇文章中涉及到的在多个 pve 节点之间进行虚拟机的备份和恢复,以便实现快速复制虚拟机和模板。

解决方案和思路

尝试找到方便可行速度快的解决方案,首先考虑的就是利用虚拟机的备份和恢复功能。

  • 虚拟机备份之后,可以得到文件大小10-20G级别的 vma 文件
  • 这些 vma 文件可以以普通二进制文件的方式下载/保存/上传,方便在多个pve节点之间分发虚拟机的 vma 文件
  • 将 vma 文件上传到 pve 节点后,可以通过恢复功能得到本地存储上运行的虚拟机或者模板
  • 之后本地存储上的虚拟机或者模板就可以用 pve 自己的 clone 功能进行复制

因此,这个方案的关键在于如何快速的在不同 pve 节点之间分发 vma 文件,由于文件大小有 10-20g 级别, 因此必须考虑节点间的文件传输速度。

节点间文件传输

scp 命令

scp 命令按说是最简单直接的方案,pve 自带随时可以使用。

测试速度结果如下:

  • 2.5G 网络: 实际测试文件传输速度约为 220 MB/s, 19GB的 vma 文件用时 86 秒
  • 56G 网络: 实际测试文件传输速度约为 290 MB/s, 19GB的 vma 文件用时 64 秒

56G 网络下的速度有点离谱,感觉有其他的瓶颈。

nfs 共享

10 - 容器

容器