Learning PVE
- 1: 介绍
- 2: PVE安装
- 2.1: 下载PVE
- 2.2: BIOS设置
- 2.3: 安装PVE
- 2.4: 配置国内的更新源
- 2.5: 安装配置git
- 2.6: 安装配置zsh
- 2.7: 设置网络代理
- 2.8: 安装pvetools
- 2.9: 安装pve-source
- 2.10: 安装常用软件
- 2.11: 修改管理网络
- 3: 硬件配置
- 3.1: 更新CPU微码
- 3.2: [归档]安装r8125驱动
- 4: 系统设置
- 4.1: 修改swap分区参数
- 4.2: 修改locale设置
- 4.3: 合并local-lvm和local分区
- 4.4: 清理不再使用的内核
- 4.5: 安装配置timeshift
- 4.6: 开启自动备份虚拟机配置文件
- 4.7: 恢复系统设置
- 4.8: 进入恢复模式修复系统
- 5: 直通
- 5.1: 开启直通
- 5.2: 网卡直通
- 5.2.1: 设置网卡直通并检查是否生效
- 5.2.2: 常见问题
- 5.2.2.1: missing uar aborting
- 5.2.2.2: IRQ冲突
- 5.3: SR-IOV
- 5.3.1: 介绍
- 5.3.2: 配置 CX-3 网卡以开启 SR-IOV
- 5.3.3: 配置 CX-4 网卡以开启 SR-IOV
- 5.3.4: 为不同端口分别配置VF
- 5.3.5: 开启 SR-IOV 时的常见问题
- 5.3.5.1: 不支持开启 SR-IOV
- 5.4: SR-IOV实战
- 5.4.1: 带管理网络的 SR-IOV 实战
- 5.4.2: 软路由+软交换实战
- 5.4.3: 高速共享存储
- 6: 网络
- 7: 集群管理
- 8: 存储
- 8.1: 存储介绍
- 8.2: NFS
- 8.2.1: 配置NFS
- 8.2.2: [废弃]通过NFS复制
- 8.2.3: [废弃]通过 NFS 进行 dump 和恢复
- 8.3: Ceph
- 8.3.1: Ceph概述
- 9: 操作虚拟机
- 9.1: 上传文件
- 9.2: 创建虚拟机
- 9.3: 删除虚拟机
- 9.4: 打开虚拟机
- 9.5: 关闭虚拟机
- 9.6: 备份虚拟机
- 9.6.1: 备份和恢复虚拟机
- 9.6.2: 虚拟机备份实战
- 9.6.2.1: 从raw/qcow2格式的镜像文件中恢复虚拟机
- 9.6.2.2: 跨多个节点进行备份和恢复
- 10: 容器
1 - 介绍
1.1 - 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备份服务器
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资料收集
官方资料
社区资料
- Proxmox VE Helper-Scripts: Scripts for Streamlining Your Homelab with Proxmox VE, 简化使用 Proxmox VE 家庭实验室的脚本
学习资料
2 - PVE安装
2.1 - 下载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设置
2.3 - 安装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 .......................
- https://www.reddit.com/r/Proxmox/comments/1cuvv2q/proxmox_821_installer_is_stuck_at_loading_some/?rdt=46925
- https://forum.proxmox.com/threads/installing-proxmox-8-1-crashing-when-loading-nvidiafb-driver.143363/
解决方法有两个:
- 如果有集成显卡,请使用集成显卡进行安装,这样就不会载入 nvidiafb
- 可以换成 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
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 了,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
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,这个问题就消失了。
这个功能很实用,方便看这些信息了。
去除订阅提示
2.9 - 安装pve-source
看到推荐,暂时还没有使用过,记录备用。
2.10 - 安装常用软件
系统类
安装 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 - 硬件配置
3.1 - 更新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驱动
警告
发现更新驱动之后,普通模式下可以正常工作,但一旦开启直通,这个驱动就会无法工作。
而因为 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 - 系统设置
4.1 - 修改swap分区参数
打开文件:
vi /etc/sysctl.conf
在文件最后增加内容:
vm.swappiness = 1
设置内存剩余多少时使用 swap 分区,数字越小代表多使用物理内存。
sysctl -p
让配置生效。
4.2 - 修改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
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
手工操作
4.5 - 安装配置timeshift
前面在安装 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 - 开启自动备份虚拟机配置文件
准备工作
建立备份存放的目录
建立备份存放的目录,为了不被 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 - 恢复系统设置
4.8 - 进入恢复模式修复系统
背景
有时在经过错误的配置之后,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 - 开启直通
可以通过两种方式开启直通功能:
- 手工修改
- 用 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 - 设置网卡直通并检查是否生效
直通网卡
创建虚拟机
特别注意,创建虚拟机时要选择 q35
在虚拟机的 hardware 设置中,添加 pci device:
注意勾选 All functions 以直通网卡上的所有网口,另外对于 pcie 设置,要勾选 “PCI-Express”。
直通两块HP544+网卡之后,虚拟机的设置如下:
5.2.2 - 常见问题
在直通网卡时遇到很多问题,有些甚至莫名其妙,记录下来备用。
5.2.2.1 - 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冲突
故障描述
插入多块网卡后设置直通,在虚拟机启动时报错,错误描述如下:
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
5.3.1 - 介绍
介绍
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
准备工作
更新网卡固件
对于 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 。
参考资料
- How-to: configure Mellanox ConnectX-3 cards for SRIOV and VFS: 这个帖子对此有非常详细的讲解,我基本是按照他的指点来操作的
5.3.3 - 配置 CX-4 网卡以开启 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
背景
之前的 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 时的常见问题
5.3.5.1 - 不支持开启 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实战
5.4.1 - 带管理网络的 SR-IOV 实战
背景
需求:
- 在 pve 的各个虚拟机中分享网卡
- 同时支持管理网络也使用这个网卡, 从而实现管理网络的高速通讯
设备:
- 一块 40G/56G 网卡,型号为 HP544+,双口(但当前实战中只使用到一个口)
目标:
- 虚拟机中可以自由使用该网卡实现高速通讯
- 管理网络也使用这个网卡
规划:
- HP544+ 网卡
- 开启 SR-IOV
- PF 用于 vmbr0 实现管理网络
- VF 直通给到虚拟机
实现步骤:
- 先安装 PVE, 使用 HP544+ 网卡做管理网络,vmbr0 会基于 HP544+ 网卡
- 开启直通,设置 HP544+ 网卡 的 SR-IOV 配置
- 配置 ubuntu server 虚拟机,直通 VF
- 在 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 测试结果是这样的:
- 物理机下速度最快: 48G,得益于 rdma, CPU 占用基本为零
- 虚拟机网卡直通基本等同于物理机:同样 48g 速度 + CPU 占用基本为零
- PVE 系统直接使用 vmbr, 接近物理机和直通(算九五折): 45到47.9g不等,cpu占用约 20%
- 开启 SR-IOV 直通 VF, 速度下降:大约 42.8 g, 和最高性能相比打八折
- 虚拟机使用vmbr:速度最慢,约 20G, 和最高性能相比打四折,而且 cpu 占用很高
所以,建议在不同场景下酌情使用:
- vmbr 方法:最灵活,但性能最低(打四折),适用于无法或者不方便开启直通/SR-IOV 的场合
- 直通方案:性能最高,直逼物理机,但有独占网卡的限制
- SR-IOV 直通 VF 方案:兼顾性能和灵活度,八折性能换来可以在多个虚拟机中共享网卡 (HP544+ 网卡最多可以有 15 个 VF)
5.4.2 - 软路由+软交换实战
背景
需求:
- 在 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 虚拟机,提供两个速度和性能还不错(比完整直通低,比网桥高)的网口给到下游设备
实现步骤:
- 先在现有网络中安装 pve 到物理机,实现现有网络作为 pve 的管理网络
- 安装 openwrt 虚拟机和 ubuntu server 虚拟机
- 开启 SR-IOV 和 直通,准备必要的 vmbr,然后分别分配给 openwrt 虚拟机和 ubuntu server 虚拟机
- 配置 openwrt 虚拟机,实现 wan (使用临时网段暂时先接入现有网络)和 lan, DHCP 分配
- 配置 ubuntu server 虚拟机,实现基于 linux bridge 的软交换功能
- 修改 pve 的管理网络为使用 40G 高速网络
- 拆除现有网络,改用 openwrt 拨号并接入内网设备
- 修改 openwrt 的临时网段为正式网段
解释: 为什么不在 openwrt 中直接管理两块 40G 网卡?
- 最主要的原因是 openwrt 不支持 RDMA, 因此会有非常巨大的性能损失(超出50%)而且cpu消耗非常高
- openwrt 下 40G 网卡 (具体型号为 hp544+)的启用和停用,会影响 openwrt 下的网络命名 (eth0/eth1/eth2等的存在和顺序),而 openwrt 的 lan / wan 是绑定在 eth0 这样的名称上,而不是具体的 mac 地址上。因此如果下有的 40G 网络设备有启动或者停止,而 openwrt 又进行了重启,则会因为eth网卡顺序和名称的变化造成 openwrt 不可用。
准备工作
准备虚拟机
分别建立两个虚拟机:
-
用于软路由的 openwrt
安装的方法参考 https://skyao.io/learning-openwrt/docs/installation/pve/
注意: 先不要开启开机自动启动
-
用于软交换的 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 地址和网关
准备本地机器
需要准备一台本地机器,作为客户端接入到软路由和软交换的两个网段,因此要求这个机器有两块网卡,分别接入这两个网段。
实际操作时也可以用两台机器分别接入 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 中看到的网络情况:
目前 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)需要扮演三个角色:
- 作为 lan 接入到软路由 openwrt 中
- 作为 wan 接入到软交换 ubuntu server 中
- 作为管理网络接口提供远程管理功能: 这个功能在最后会被基于 enp4s0 的 vmbr1 取代
说明: 由于在安装 pve 时 40G高速网段不可用(软交换所在的 pve 还没有安装),因此只能将 vmbr0 绑定 2.5G 网卡。但后续为了速度起见还是会使用 40G 作为管理网络。
给两个虚拟机分别分配网卡。
注意: 要先将虚拟机关机再修改硬件配置,否则无法生效,包括重启之后也无法生效,需要停机/删除/再次添加。
这是 openwrt 的虚拟机,除了分配 vmbr0 外,还需要将另外一块 2.5G 网卡直通进入,充当 openwrt 的 wan 和 lan:
切记: 直通网卡时千万不要弄错,别把 pve 的管理网络所在的网卡(也就是vmbr0对应的网卡)给直通进去了,那样会导致管理网络无法使用。只能通过 pve 控制台来进行操作。
ubuntu server 的虚拟机,除了需要将使用 vmbr0 作为 wan 之外,还需要将两块 40G 网卡的四个端口都直通进去,其中第二块网卡开启了 SR-IOV,因此直通的是编号为1和5的两个 VF:
至此虚拟机和网卡就都准备好了,开始正式配置软路由和软交换
配置软路由 openwrt
将两块网卡给到 openwrt 虚拟机:
- 设备id 为 06 的 2.5G 网卡: 直通
- 设备id 为 07 的 2.5G 网卡: 以 vmbr0 的方式
之后两块2.5G网络将分别作为 wan 和 lan。
配置 openwrt 虚拟机
启动 openwrt 虚拟机,此时可以通过管理页面来操作,或者直接在机器的控制台操作。执行:
ip addr
可以看到 eth0 / eth1 两块网卡:
执行
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
网段:
此时本地机器就成功的接入了 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
开启 ubuntu server 虚拟机,登录进入后执行
ip addr
可以看到此时 enp1s0 已经自动获取了 192.168.0.0/24
网段的地址:
这是因为 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网卡连接情况如图所示:
之后通过 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 - 网络
6.1 - 网络设备的命名约定
参考:
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工具
参考:
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 - 网桥
参考:
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 - 路由
参考:
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
参考:
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
参考:
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 - 集群管理
7.1 - 集群介绍
参考:
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 集群。
创建集群
登录 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集群
准备工作
加入集群之前,有一些要求,比如不能有 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
7.5.1 - 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 - 存储
8.1 - 存储介绍
参考:
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
8.2.1 - 配置NFS
标准配置
在 pve 控制页面上打开 Datacenter, 进入 Storge, 在 “Add” 下拉框中选择 “NFS”:
这个方案在正常 pve 集群下没有问题,但是我这里因为机器都是按需启动,不会7x24小时在线,因此 pve 集群的最小法定人数经常无法达到,导致集群不可用。
如果用上面的方案,那么不同机器都会新建 nfs 存储,会导致都指向同一个 nfs 远程目录,这样应该会造成混乱。
个人实践(受限不能使用集群功能)
ID分段使用 nfs 存储
一番尝试之后发现,标准的 nfs 存储只要处理好 ID 分段,不同的 pve 节点使用不同的 ID 范围,就可以正常使用的(前提:有多台 pve 机器又不愿意建立集群)。
建立 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 节点机器(毕竟没有集群管理)。
好在模板一般数量有限,更新频率也不会太高,先这么对付着用,不行就写个脚本简化一下操作。
模板和虚拟机恢复的最佳实践
实际操作中,有一些发现:
-
从 dump 出来的备份文件恢复模板,速度是非常快的
不管是恢复到 nfs 存储还是某台 pve 节点的 local 本地存储,大概一分钟这个级别
-
从模板文件 clone 到虚拟机,速度非常慢
恢复 pve 节点的 local 本地存储,大概三五分钟这个级别。
-
clone 时如果选择 “Linked clone”,速度非常快。
10秒级别, 毕竟这种情况下无需复制整个模板的文件(10-20G级别)
因此,总结出来的最佳实现应该是这样:
- 坚持以模板为基础来实现虚拟机的备份和版本控制:模板是只读的,对内容的一致性有保障
- 以pve备份的方式对模板进行备份,得到 dump 文件,用于离线冷备份和不同机器之间分发
- dump 文件倒入到 nfs 存储中,全局一份
- 模板默认恢复一份到 nfs 存储中,同样全局只有一份:使用时直接在 nfs 上 “Linked clone”,用完即删
- 对于使用频率非常高的模板,直接恢复到 pve 节点的 local 本地存储:后续根据使用时间长短区分,长期使用的希望隔离性好的,用 “Full clone”。短期使用用完就删的用 “linked clone”
8.2.2 - [废弃]通过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 的方案还是手工操作太多。
考虑采用 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
8.3.1 - Ceph概述
9 - 操作虚拟机
9.1 - 上传文件
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
VM 的常规设置包括:
- node / 节点:将在其上运行虚拟机的物理服务器
- VM ID:此 Proxmox VE 安装中用于标识您的 VM 的唯一编号
- name:可用于描述 VM 的自由格式文本字符串
- Resource Pool / 资源池:虚拟机的逻辑组
OS
创建虚拟机(VM)时,设置正确的操作系统(OS)允许Proxmox VE优化一些低级参数。例如,Windows操作系统期望BIOS时钟使用本地时间,而基于Unix的操作系统期望BIOS时钟具有UTC时间。
选择需要用到的安装镜像,guest type 和 version 要正确填写。
System
- machine: q35
- scsi controller: virtIO scsi single
- 勾选 Qemu Agent
- BIOS选 OVMF(UEFI)
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
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 BlockVirtIO 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 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
对于每个虚拟机,您可以选择设置固定大小的内存或要求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
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,开始备份:
备份过程:
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
备份的结果:
这里可以看到文件名为 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 子项中已经可以看到刚才上传的的虚拟机备份文件:
点击 “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
恢复完成后的虚拟机:
参考资料
通过虚拟磁盘的方式备份
9.6.2 - 虚拟机备份实战
9.6.2.1 - 从raw/qcow2格式的镜像文件中恢复虚拟机
背景
由于没有备份虚拟机配置文件,而进行了诸如 timeshift restore 的操作,导致虚拟机配置文件消失,管理页面上看不到虚拟机,而镜像文件残存。
备注:后续要做好虚拟机配置文件的备份,配置文件都很小,容易备份和保存。
恢复操作
查看镜像文件情况
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 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 的虚拟机理解为是包含两个部分的信息:
-
虚拟机配置
配置信息保存在
/etc/pve/qemu-server
或者/etc/pve/nodes/skydev/qemu-server
目录下,名为 id.conf 的文件如 100.conf备注:
/etc/pve/qemu-server
是/etc/pve/nodes/skydev/qemu-server
目录 的软链接。 -
虚拟机镜像
镜像文件保存在
/var/lib/vz/images
目录下,名为 id 的子目录,如 100 文件夹。
前面出现的问题在于 timeshift restore 之后,保存在 /etc/pve/nodes/skydev/qemu-server
目录下的配置文件被清理,而保存在 /var/lib/vz/images
目录下的镜像文件没有被清理(被设置为 timeshift 的 excludes)。这样虚拟机配置信息没有,而虚拟机镜像文件残存。
上面恢复的过程,可以理解为:
- 新建一个虚拟机,保全丢失的虚拟机配置信息:因此要尽量按照之前的虚拟机配置进行创建
- 导入镜像,这是将新的虚拟机配置和残存的虚拟机镜像文件组合起来,形成新的完整的虚拟机。
9.6.2.2 - 跨多个节点进行备份和恢复
背景
有多台机器安装有 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 网络下的速度有点离谱,感觉有其他的瓶颈。