目前,pvenode允许您设置节点的描述、在节点的来宾上运行各种批量操作、查看节点的任务历史记录以及管理节点的 SSL 证书,这些证书通过 pveproxy 用于 API 和 Web GUI。
3.10.1. 局域网唤醒
LAN 唤醒 (WoL) 允许您通过发送魔术数据包来打开网络中休眠的计算机。至少一个 NIC 必须支持此功能,并且需要在计算机的固件 (BIOS/UEFI) 配置中启用相应的选项。选项名称可能有所不同,从“Enable Wake-on-Lan”到 “Power On By PCIE Device”;如果您不确定,请检查主板的供应商手册。ethtool可用于通过运行以下命令来检查<interface>的 WoL 配置 :
ethtool <接口> | grep 唤醒
pvenode允许您使用以下命令通过 WoL 唤醒集群中的休眠成员:
pvenodewakeonlan<节点>
这会在 UDP 端口 9 上广播 WoL 魔术数据包,其中包含从wakeonlan属性获取的<node>的 MAC 地址。可以使用以下命令设置特定于节点的 wakeonlan属性:
pvenode 配置集 -wakeonlan XX:XX:XX:XX:XX:XX
3.10.2. 任务历史记录
在对服务器问题(例如失败的备份作业)进行故障排除时,拥有先前运行的任务的日志通常会很有帮助。使用 Proxmox VE,您可以通过pvenode 任务命令访问节点的任务历史记录。
您可以使用list子命令获取节点已完成任务的筛选列表 。例如,要获取与 VM 100相关且以错误结束的任务列表 ,命令将为:
pvenode 任务列表 --errors --vmid 100
然后可以使用其 UPID 打印任务的日志:
pvenode 任务日志 UPID:pve1:00010D94:001CA6EA:6124E1B9:vzdump:100:root@pam:
3.10.3. 批量访客电源管理
如果您有许多虚拟机/容器,则可以使用pvenode的 startall和stopall子命令批量执行启动和停止 guest 虚拟机。默认情况下,pvenode startall将仅启动已设置为在启动时自动启动的虚拟机/容器(请参阅 自动启动和关闭虚拟机),但是,您可以使用–force标志覆盖此行为。这两个命令还有一个–vms选项,它将停止/启动的 guest 虚拟机限制为指定的 VMID。
例如,要启动虚拟机100、101和102,无论它们是否设置了onboot,您都可以使用:
pvenode startall --vms 100,101,102 --force
要停止这些来宾(以及可能正在运行的任何其他来宾),请使用以下命令:
普韦诺德停止
stopall 命令首先尝试执行干净关闭,然后等待,直到所有来宾都成功关闭或可覆盖的超时(默认为 3 分钟)到期。一旦发生这种情况并且强制停止参数未显式设置为 0 (false),所有仍在运行的虚拟客户端都会被硬停止。 |
3.10.4. 第一个来宾启动延迟
如果您的虚拟机/容器依赖于启动缓慢的外部资源(例如 NFS 服务器),您还可以在 Proxmox VE 启动时间和配置为自动启动的第一个虚拟机/容器时间之间设置每个节点的延迟启动(请参阅虚拟机的自动启动和关闭)。
您可以通过设置以下内容来实现此目的(其中10代表延迟(以秒为单位)):
pvenode 配置集 --startall-onboot-delay 10
3.10.5。批量访客迁移
如果升级情况要求您将所有来宾从一个节点迁移到另一个节点,pvenode还提供用于批量迁移的migrateall子命令。默认情况下,此命令会将系统上的每个来宾迁移到目标节点。但是,它可以设置为仅迁移一组来宾。
例如,要将虚拟机100、101、102迁移到节点pve2,并启用本地磁盘热迁移,您可以运行:
pvenode migrateall pve2 --vms 100,101,102 --with-local-disks
3.11. 证书管理
3.11.1. 集群内通信证书
默认情况下,每个 Proxmox VE 集群都会创建自己的(自签名)证书颁发机构 (CA),并为每个节点生成由上述 CA 签名的证书。这些证书用于与集群的pveproxy服务和 Shell/控制台功能(如果使用 SPICE)进行加密通信。
CA 证书和密钥存储在Proxmox 集群文件系统 (pmxcfs)中。
3.11.2. API 和 Web GUI 证书
REST API 和 Web GUI 由pveproxy服务提供,该服务在每个节点上运行。
对于pveproxy使用的证书,您有以下选项:
默认情况下,使用/etc/pve/nodes/NODENAME/pve-ssl.pem 中的节点特定证书 。该证书由集群 CA 签名,因此不会自动受到浏览器和操作系统的信任。
使用外部提供的证书(例如由商业 CA 签名)。
使用 ACME (Let’s Encrypt) 获取可自动续订的可信证书,这也集成在 Proxmox VE API 和 Web 界面中。
对于选项 2 和 3,使用文件/etc/pve/local/pveproxy-ssl.pem(和 /etc/pve/local/pveproxy-ssl.key,需要没有密码)。
请记住,/etc/pve/local是/etc/pve/nodes/NODENAME的节点特定符号链接 。 |
证书使用 Proxmox VE 节点管理命令进行管理(请参阅pvenode(1)联机帮助页)。
请勿替换或手动修改/etc/pve/local/pve-ssl.pem和 /etc/pve/local/pve-ssl.key中自动生成的节点证书文件或/etc/pve/pve中的集群 CA 文件 -root-ca.pem和/etc/pve/priv/pve-root-ca.key。 |
3.11.4. 通过 Let’s Encrypt (ACME) 获得可信证书
Proxmox VE 包括自动证书管理环境ACME协议 的实现,允许 Proxmox VE 管理员使用像 Let’s Encrypt 这样的 ACME 提供程序来轻松设置 TLS 证书,这些证书在现代操作系统和 Web 浏览器上被接受和信任。盒子。
目前,实现的两个 ACME 端点是 Let’s Encrypt (LE)生产环境及其暂存环境。我们的 ACME 客户端支持使用内置 Web 服务器验证http-01挑战,并使用支持acme.sh 的所有 DNS API 端点的 DNS 插件验证dns-01挑战。
ACME账户
您可以通过 Web 界面 数据中心 -> ACME或使用pvenode命令行工具来注册和停用 ACME 帐户。
pvenode acme 帐户注册 account-name [email protected]
由于速率限制,您应该使用 LE分期进行实验或者如果您是第一次使用 ACME。 |
ACME 插件
ACME 插件的任务是提供自动验证,确保您以及您操作下的 Proxmox VE 集群是域的真正所有者。这是自动证书管理的基础构建块。
ACME 协议指定了不同类型的挑战,例如 http-01,其中 Web 服务器提供具有特定内容的文件以证明其控制域。有时这是不可能的,要么是因为技术限制,要么是由于无法从公共互联网访问记录的地址。在这些情况下可以使用dns-01质询。通过在域的区域中创建特定的 DNS 记录来完成此挑战。
ACME 插件配置存储在/etc/pve/priv/acme/plugins.cfg中。插件可用于集群中的所有节点。
3.11.5。ACME HTTP 挑战插件
始终有一个隐式配置的独立插件,用于通过端口 80 上生成的内置网络服务器验证 http-01挑战。
名称“独立”意味着它可以自行提供验证,无需任何第三方服务。因此,该插件也适用于集群节点。 |
使用它通过 Let’s Encrypts ACME 进行证书管理需要满足一些先决条件。
您必须接受 Let’s Encrypt 的服务条款才能注册帐户。
节点的80 端口需要可从 Internet 访问。
端口 80 上不得有其他侦听 器。
请求的(子)域需要解析为节点的公共IP。
3.11.6。ACME DNS API 挑战插件
在不可能或不需要通过http-01方法进行外部访问验证的系统上,可以使用dns-01验证方法。此验证方法需要一个允许 通过 API配置TXT记录的 DNS 服务器。
配置 ACME DNS API 进行验证
Proxmox VE 重新使用了为acme.sh [ 6 ]项目开发的 DNS 插件,有关具体 API 配置的详细信息,请参阅其文档。
使用 DNS API 配置新插件的最简单方法是使用 Web 界面(数据中心 -> ACME)。
请参阅 acme.sh 如何使用 DNS API wiki,了解有关为提供商获取 API 凭据的更多详细信息。 |
由于有许多 DNS 提供商和 API 端点,Proxmox VE 会自动生成某些提供商的凭证表单。对于其他人,您将看到更大的文本区域,只需将所有凭据KEY = VALUE对复制到其中即可。
通过 CNAME 别名进行 DNS 验证
如果您的主/真实 DNS 不支持通过 API 进行配置,可以使用特殊的别名模式来处理不同域/DNS 服务器上的验证。手动为_acme-challenge.domain1.example设置指向_acme-challenge.domain2.example的永久CNAME记录 ,并将Proxmox VE节点配置文件中的 alias属性 设置为domain2.example ,以允许domain2.example的DNS服务器验证domain1.example的所有挑战。
插件组合
如果您的节点可通过具有不同要求/DNS 配置功能的多个域访问,则可以结合http-01和dns-01验证。通过为每个域指定不同的插件实例,也可以混合来自多个提供商或实例的 DNS API。
在多个域上访问同一服务会增加复杂性,应尽可能避免。 |
3.11.7. ACME证书自动更新
如果节点已成功配置了 ACME 提供的证书(通过 pvenode 或通过 GUI),则该证书将由 pve -daily-update.service自动更新。目前,如果证书已过期或将在未来 30 天内过期,则会尝试续订。
3.11.8。使用pvenode的 ACME 示例
示例:使用 Let’s Encrypt 证书的pvenode调用示例
root@proxmox:~# pvenode acme 账户注册默认 [email protected] 目录端点: 0) 让我们加密 V2 (https://acme-v02.api.letsencrypt.org/directory) 1) 让我们加密 V2 Staging (https://acme-staging-v02.api.letsencrypt.org/directory) 2) 定制 输入选择:1 服务条款:https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf 您同意以上条款吗?[y|N]y ... 任务确定 root@proxmox:~# pvenode 配置集 --acme 域=example.invalid root@proxmox:~# pvenode acme 证书订单 正在加载 ACME 帐户详细信息 下 ACME 订单 ... 状态为“有效”! 所有域名均已验证! ... 正在下载证书 设置 pveproxy 证书和密钥 重新启动 pveproxy 任务确定
示例:设置 OVH API 以验证域
无论使用哪种插件,账号注册步骤都是一样的,这里不再赘述。 |
OVH_AK和OVH_AS需要根据OVH API文档从OVH获取 |
首先,您需要获取所有信息,以便您和 Proxmox VE 可以访问 API。
root@proxmox:~# cat /path/to/api-token OVH_AK=XXXXXXXXXXXXXXXXXX OVH_AS=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY root@proxmox:~# 源 /path/to/api-token root@proxmox:~#curl -XPOST -H"X-Ovh-Application: $OVH_AK" -H "内容类型: application/json" \ https://eu.api.ovh.com/1.0/auth/credential -d '{ “访问规则”:[ {"方法": "GET","路径": "/auth/time"}, {"方法": "GET","路径": "/domain"}, {"方法": "GET","路径": "/domain/zone/*"}, {"method": "GET","path": "/domain/zone/*/record"}, {"方法": "POST","路径": "/domain/zone/*/record"}, {"方法": "POST","路径": "/domain/zone/*/refresh"}, {"方法": "PUT","路径": "/domain/zone/*/record/"}, {"method": "DELETE","path": "/domain/zone/*/record/*"} ] }' {“consumerKey”:“ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ”,“state”:“pendingValidation”,“validationUrl”:“https://eu.api.ovh.com/auth/?credentialToken=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA”} (打开验证 URL 并按照说明将应用程序密钥与帐户/消费者密钥链接) root@proxmox:~# echo "OVH_CK=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" >> /path/to/api-token
现在您可以设置 ACME 插件:
root@proxmox:~# pvenode acme 插件添加 dns example_plugin --api ovh --data /path/to/api_token root@proxmox:~# pvenode acme 插件配置 example_plugin ┌────────┬──────────────────────────────────────── ──┐ │ 键 │ 值 │ ╞════════╪══════════════════════════════ ══════════ ══╡ │ API │ ovh │ ├────────┼──────────────────────────────────────── ──┤ │ 数据 │ OVH_AK=XXXXXXXXXXXXXXX │ │ │ OVH_AS=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY │ │ │ OVH_CK=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ │ ├────────┼──────────────────────────────────────── ──┤ │ 摘要 │ 867fcf556363ca1bea866863093fcab83edf47a1 │ ├────────┼──────────────────────────────────────── ──┤ │ 插件 │ example_plugin │ ├────────┼──────────────────────────────────────── ──┤ │ 类型 │ DNS │ └────────┴──────────────────────────────────────── ──┘
最后,您可以配置要为其获取证书的域并为其下订单:
root@proxmox:~# pvenode config set -acmedomain0 example.proxmox.com,plugin=example_plugin root@proxmox:~# pvenode acme 证书订单 正在加载 ACME 帐户详细信息 下 ACME 订单 订单网址:https://acme-staging-v02.api.letsencrypt.org/acme/order/11111111/22222222 从“https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333”获取授权详细信息 example.proxmox.com 的验证正在等待! [2020 年 CEST 4 月 22 日星期三 09:25:30] 使用 OVH 端点:ovh-eu [2020 年 CEST 2020 年 4 月 22 日星期三 09:25:30] 检查身份验证 [2020 年 CEST 4 月 22 日星期三 09:25:30] 消费者密钥正常。 [2020 年 CEST 4 月 22 日星期三 09:25:31] 添加记录 [2020 年 CEST 4 月 22 日星期三 09:25:32] 添加,睡眠 10 秒。 添加TXT记录:_acme-challenge.example.proxmox.com 触发验证 睡觉5秒 状态为“有效”! [2020 年 CEST 2020 年 4 月 22 日星期三 09:25:48] 使用 OVH 端点:ovh-eu [2020 年 CEST 2020 年 4 月 22 日星期三 09:25:48] 检查身份验证 [2020 年 CEST 4 月 22 日星期三 09:25:48] 消费者密钥正常。 删除 TXT 记录:_acme-challenge.example.proxmox.com 所有域名均已验证! 创造企业社会责任 检查订单状态 订单已准备就绪,正在完成订单 有效的! 正在下载证书 设置 pveproxy 证书和密钥 重新启动 pveproxy 任务确定
示例:从暂存目录切换到常规 ACME 目录
不支持更改帐户的 ACME 目录,但由于 Proxmox VE 支持多个帐户,您只需创建一个新帐户,并将生产(受信任)ACME 目录作为端点。您还可以停用暂存帐户并重新创建它。
root@proxmox:~# pvenode acme 帐户停用默认值 将帐户文件从“/etc/pve/priv/acme/default”重命名为“/etc/pve/priv/acme/_deactivated_default_4” 任务确定 root@proxmox:~# pvenode acme 帐户注册默认 [email protected] 目录端点: 0) 让我们加密 V2 (https://acme-v02.api.letsencrypt.org/directory) 1) 让我们加密 V2 Staging (https://acme-staging-v02.api.letsencrypt.org/directory) 2) 定制 输入选择:0 服务条款:https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf 您同意以上条款吗?[y|N]y ... 任务确定
3.12. 主机引导加载程序
Proxmox VE 目前使用两个引导加载程序之一,具体取决于安装程序中选择的磁盘设置。
对于使用 ZFS 作为根文件系统安装的 EFI 系统,使用systemd-boot。所有其他部署都使用标准grub引导加载程序(这通常也适用于安装在 Debian 之上的系统)。
3.12.1. 安装程序使用的分区方案
Proxmox VE 安装程序在选择安装的所有磁盘上创建 3 个分区。
创建的分区是:
1 MB BIOS 引导分区(gdisk 类型 EF02)
512 MB EFI 系统分区(ESP,gdisk 类型 EF00)
第三个分区跨越设置的hdsize参数或用于所选存储类型的剩余空间
使用 ZFS 作为根文件系统的系统通过存储在 512 MB EFI 系统分区上的内核和 initrd 映像进行引导。对于传统 BIOS 系统,使用grub ,对于 EFI 系统,使用systemd-boot 。两者均已安装并配置为指向 ESP。
BIOS 模式下的grub ( –target i386-pc ) 安装到使用grub引导的所有系统上所有选定磁盘的 BIOS 引导分区上 [ 7 ]。
3.12.2. 使用proxmox-boot-tool同步 ESP 的内容
proxmox-boot-tool是一个实用程序,用于保持 EFI 系统分区的内容正确配置和同步。它将某些内核版本复制到所有 ESP,并将相应的引导加载程序配置为从vfat格式的 ESP 引导。在 ZFS 作为根文件系统的上下文中,这意味着您可以使用根池上的所有可选功能,而不是grub中 ZFS 实现中也存在的子集,或者必须创建一个单独的小型引导池[ 8 ]。
在冗余设置中,所有磁盘均由安装程序使用 ESP 进行分区。这可以确保即使第一个引导设备出现故障或者 BIOS 只能从特定磁盘引导,系统也能引导。
正常运行期间,ESP 不会保持安装状态。这有助于防止系统崩溃时vfat格式的 ESP 的文件系统损坏,并且在主引导设备发生故障时无需手动调整/etc/fstab 。
proxmox-boot-tool处理以下任务:
格式化并设置新分区
将新的内核映像和 initrd 映像复制并配置到所有列出的 ESP
同步内核升级和其他维护任务的配置
管理同步的内核版本列表
配置引导加载程序以引导特定内核版本(固定)
您可以通过运行以下命令查看当前配置的 ESP 及其状态:
# proxmox-boot-tool 状态
要将分区格式化并初始化为同步 ESP,例如,在替换 rpool 中的故障 vdev 后,或者在转换同步机制之前的现有系统时,可以使用 proxmox-kernel-helper 中的 proxmox- boot – tool 。
format命令将格式化<partition>,确保传递正确的设备/分区! |
例如,要将空分区/dev/sda2格式化为 ESP,请运行以下命令:
# proxmox-boot-tool 格式 /dev/sda2
要设置位于/dev/sda2上的现有未安装 ESP以包含在 Proxmox VE 的内核更新同步机制中,请使用以下命令:
# proxmox-boot-tool init /dev/sda2
之后/etc/kernel/proxmox-boot-uuids应包含一个新行,其中包含新添加分区的 UUID。init命令还将自动触发所有已配置 ESP 的刷新。
要复制和配置所有可启动内核并使/etc/kernel/proxmox-boot-uuids中列出的所有 ESP 保持 同步,您只需运行:
# proxmox-boot-tool 刷新
(相当于在 root 上运行带有ext4或xfs 的update-grub系统)。
如果您对内核命令行进行更改,或者想要同步所有内核和 initrd,则这是必要的。
update -initramfs和apt(必要时)都会自动触发刷新。 |
默认配置以下内核版本:
当前运行的内核
软件包更新时新安装的版本
两个最新已安装的内核
倒数第二个内核系列的最新版本(例如 5.0、5.3)(如果适用)
任何手动选择的内核
如果您希望将某个内核和 initrd 映像添加到可启动内核列表中,请使用proxmox-boot-tool kernel add。
例如,运行以下命令将 ABI 版本5.0.15-1-pve的内核添加 到内核列表中,以保持安装并同步到所有 ESP:
# proxmox-boot-tool 内核添加 5.0.15-1-pve
proxmox-boot-tool kernel list将列出当前选择用于启动的所有内核版本:
# proxmox-boot-tool 内核列表 手动选择内核: 5.0.15-1-pve 自动选择内核: 5.0.12-1-pve 4.15.18-18-pve
运行proxmox-boot-tool kernel remove以从手动选择的内核列表中删除内核,例如:
# proxmox-boot-tool 内核删除 5.0.15-1-pve
在手动添加或删除上面的内核后,需要运行proxmox-boot-toolfresh来更新所有 EFI 系统分区 (ESP)。 |
3.12.3. 确定使用哪个引导加载程序
您将看到蓝色的grub框或简单的白底黑字 systemd-boot。
# efibootmgr -v
如果返回不支持 EFI 变量的消息,则在 BIOS/Legacy 模式下使用grub 。
如果输出包含类似于以下内容的行,则表明grub在 UEFI 模式下使用。
Boot0005* proxmox [...] 文件(\EFI\proxmox\grubx64.efi)
如果输出包含类似于以下内容的行,则使用systemd-boot 。
Boot0006* Linux 启动管理器 [...] 文件(\EFI\systemd\systemd-bootx64.efi)
通过运行:
# proxmox-boot-tool 状态
您可以查看proxmox-boot-tool是否已配置,这可以很好地指示系统如何启动。
3.12.4. 蛴螬
grub多年来一直是引导 Linux 系统的事实上的标准,并且有很好的文档记录 [ 9 ]。
配置
对grub配置的更改是通过默认文件 /etc/default/grub或/etc/default/grub.d中的配置片段完成的。要在更改配置后重新生成配置文件,请运行: [ 10 ]
# 更新 grub
3.12.5。系统引导
systemd-boot是一个轻量级的 EFI 引导加载程序。它直接从安装它的 EFI 服务分区 (ESP) 读取内核和 initrd 映像。直接从 ESP 加载内核的主要优点是不需要重新实现访问存储的驱动程序。在 Proxmox VE 中, proxmox-boot-tool用于保持 ESP 上的配置同步。
配置
systemd-boot通过EFI 系统分区 (ESP) 根目录中的文件loader/loader.conf进行配置。有关详细信息,请参阅loader.conf(5)联机帮助页。
每个引导加载程序条目都放置在目录loader/entries/中自己的文件中
示例entry.conf 如下所示(/指 ESP 的根目录):
标题 Proxmox 版本 5.0.15-1-pve 选项 root=ZFS=rpool/ROOT/pve-1 boot=zfs linux /EFI/proxmox/5.0.15-1-pve/vmlinuz-5.0.15-1-pve initrd /EFI/proxmox/5.0.15-1-pve/initrd.img-5.0.15-1-pve
3.12.6。编辑内核命令行
您可以在以下位置修改内核命令行,具体取决于所使用的引导加载程序:
内核命令行需要放置在 文件/etc/default/grub 的变量GRUB_CMDLINE_LINUX_DEFAULT中。运行 update-grub会将其内容附加到/boot/grub/grub.cfg中的所有linux条目 。
内核命令行需要作为一行放置在/etc/kernel/cmdline中。要应用更改,请运行proxmox-boot-toolfresh,这会将其设置 为loader/entries/proxmox-*.conf中所有配置文件的选项行。
3.12.7. 覆盖下次启动的内核版本
要选择当前不是默认内核的内核,您可以:
使用启动过程开始时显示的启动加载程序菜单
使用proxmox-boot-tool将系统一次性或永久 固定到内核版本(直到重置 pin)。
这应该可以帮助您解决新内核版本和硬件之间的不兼容性问题。
应尽快删除此类 pin,以便最新内核的所有当前安全补丁也适用于系统。 |
例如:要永久选择版本5.15.30-1-pve进行引导,您可以运行:
# proxmox-boot-tool 内核引脚 5.15.30-1-pve
固定功能适用于所有 Proxmox VE 系统,不仅适用于那些使用 proxmox-boot-tool来同步 ESP 内容的系统,如果您的系统不使用proxmox-boot-tool进行同步,您也可以跳过 proxmox-boot-tool最后刷新通话。 |
您还可以设置仅在下次系统启动时启动的内核版本。例如,这对于测试更新的内核是否解决了导致您首先固定版本的问题很有用:
# proxmox-boot-tool 内核引脚 5.15.30-1-pve --next-boot
要删除任何固定版本配置,请使用unpin子命令:
# proxmox-boot-tool 内核取消固定
虽然unpin也有一个–next-boot选项,但它用于清除使用–next-boot设置的固定版本。由于这种情况在启动时已经自动发生,因此手动调用它几乎没有什么用处。
设置或清除固定版本后,您还需要通过运行刷新子命令来同步 ESP 上的内容和配置。
如果您以交互方式调用该工具,系统将提示您自动为proxmox-boot-tool托管系统执行此操作 。 |
# proxmox-boot-tool 刷新
3.13. 内核同页合并 (KSM)
内核同页合并 (KSM) 是 Linux 内核提供的一项可选内存重复数据删除功能,在 Proxmox VE 中默认启用。KSM 的工作原理是扫描一系列物理内存页面中的相同内容,并识别映射到它们的虚拟页面。如果找到相同的页面,则重新映射相应的虚拟页面,使它们都指向同一物理页面,并释放旧页面。虚拟页被标记为“写时复制”,因此对它们的任何写入都将写入新的内存区域,而共享物理页完好无损。
3.13.1. KSM 的影响
KSM 可以优化虚拟化环境中的内存使用,因为运行相似操作系统或工作负载的多个虚拟机可能会共享大量公共内存页面。
然而,虽然 KSM 可以减少内存使用,但它也带来了一些安全风险,因为它可能使虚拟机遭受旁道攻击。研究表明,通过利用 KSM 的某些特征,可以通过同一主机上的第二个 VM 推断有关正在运行的 VM 的信息。
因此,如果您使用 Proxmox VE 提供托管服务,您应该考虑禁用 KSM,以便为您的用户提供额外的安全性。此外,您应该检查您所在国家/地区的法规,因为禁用 KSM 可能是法律要求。
3.13.2. 禁用 KSM
要查看 KSM 是否处于活动状态,您可以检查以下输出:
# systemctl 状态 ksmtuned
如果是,可以立即禁用它:
# systemctl 禁用 --now ksmtuned
最后,要取消合并所有当前合并的页面,请运行:
# echo 2 > /sys/kernel/mm/ksm/run