VM 将继续在源主机中运行,而 KVM 会将虚拟机的内存页面传送到目标主机。当迁移接近完成后,KVM 会非常简单地挂起虚拟机,并在目标主机上恢复它。
对于需要一直保持运行的虚拟机,这个方法非常有用。但是,对于修改内存页面的虚拟机比 KVM 可以传输它们的速度快(如 I/O 负载较重的虚拟机),实时迁移可能会失败。(1)
VM 的磁盘镜像在迁移过程中必须可以被源主机和目标主机访问。(2)
将虚拟机的配置移到目标主机
建议用于关闭虚拟机,以及关闭虚拟机不会影响您的工作负载的情况。
VM 的磁盘镜像不必在迁移过程中被源或目标主机访问,并可手动复制或移动到目标主机。
(1)有关可能的解决方案,请参阅:
实时迁移的额外
virsh
迁移选项
(2)要达到此目的,请使用以下任一操作:
存储位于
共享网络上
virsh migrate
命令的
--copy-storage-all
参数,它通过网络将磁盘镜像内容从源复制到目的地。
存储区域网络(SAN)逻辑单元(LUN)。
Ceph 存储集群
要更轻松地管理大规模迁移,探索其他红帽产品,例如:
OpenShift Virtualization
Red Hat OpenStack Platform
迁移虚拟机的好处
将虚拟机磁盘镜像与其他主机共享
迁移虚拟机对以下情况非常有用:
如果主机超载或者另一台主机使用不足,则可将虚拟机移动到使用率较低的主机中。
当您需要升级、添加或删除主机中的硬件设备时,您可以安全地将虚拟机重新定位到其他主机。这意味着,在改进硬件时虚拟机不需要停机。
虚拟机可重新分发到其他主机,因此可关闭未载入的主机系统以便在低用量时节约能源并降低成本。
可将虚拟机移动到另一个物理位置,以减少延迟,或者因为其他原因需要。
在 RHEL 9 中迁移虚拟机前,请确定您了解迁移的限制。
使用以下功能和配置的虚拟机在迁移时将无法正常工作,或者迁移失败。这些特性包括:
SR-IOV 设备分配(除
迁移具有 Mellanox 网络设备附加的虚拟功能的虚拟机外),该设备
可以正常工作。)
介质设备,如 vGPU (
迁移附加 NVIDIA vGPU 的虚拟机
除外,这可以正常工作。)
使用非统一内存访问(NUMA)固定的主机之间的迁移只有在主机有类似的拓扑时才能正常工作。但是,迁移可能会对运行工作负载的性能造成负面影响。
源和目标主机都使用虚拟机迁移支持的特定 RHEL 版本,
请参阅支持的虚拟机迁移主机
源虚拟机和目标虚拟机上的物理 CPU 必须相同,否则迁移可能会失败。虚拟机之间在以下 CPU 相关区域的任何区别都可能会引起迁移问题:
CPU 型号
不支持在 Intel 64 主机和 AMD64 主机之间迁移,即使它们共享 x86-64 指令集。
有关确保在迁移到具有不同 CPU 模型的主机后虚拟机可以正常工作的步骤,请参阅
验证虚拟机迁移的主机 CPU 兼容性
。
物理计算机固件版本和设置
如果虚拟机所在的当前主机变得不适合或者无法再使用,或者要重新分发托管工作负载,您可以将该虚拟机迁移到另一个 KVM 主机中。您可以
执行实时迁移
或
离线迁移
。有关这两种情况之间的区别,
请参阅如何迁移虚拟机
。
hypervisor :
源主机和目标主机都使用 KVM hypervisor。
网络连接:
源主机和目标主机可以通过网络互相访问。使用
ping
工具进行验证。
打开端口
:确保目标主机上打开了以下端口
。
使用 SSH 连接到目标主机需要端口 22。
使用 TLS 连接到目标主机需要端口 16509。
使用 TCP 连接到目标主机需要端口 16514。
QEMU 需要端口 49152-49215 ,来传输内存和磁盘迁移数据。
主机 :
要红帽支持迁移,源主机和目标主机必须使用特定的操作系统和机器类型。要确保情况是这种情况,请查看
支持的虚拟机迁移主机
。
cpu:
虚拟机必须与目标主机的 CPU 功能兼容。要确保情况如此,请参阅
验证虚拟机迁移的主机 CPU 兼容性
。
存储:
将要迁移的虚拟机的磁盘镜像可以被源主机和目标主机访问。这在离线迁移中是可选的,但在迁移运行的虚拟机时是必需的。要确保存储可被两个主机访问,必须应用以下内容之一:
您正在使用存储区域网络(SAN)逻辑单元(LUN)。
正在您使用
Ceph 存储集群
。
您已创建了与源虚拟机磁盘
相同的格式和大小的磁盘镜像,在迁移虚拟机时将使用
--copy-storage-all
参数。
磁盘镜像在单独的网络位置上。有关设置这样的共享虚拟机存储的步骤,请参阅
与其他主机共享虚拟机磁盘镜像
。
网络带宽 :
迁移正在运行的虚拟机时,您的网络带宽必须高于虚拟机生成脏内存页面的速度。
要在开始实时迁移之前获取虚拟机的脏页面率,请执行以下操作:
监控虚拟机在短时间内的脏页面生成率。
# virsh domdirtyrate-calc <example_VM> 30
在监控完成后,获取其结果:
# virsh domstats <example_VM> --dirtyrate
Domain: 'example-VM'
dirtyrate.calc_status=2
dirtyrate.calc_start_time=200942
dirtyrate.calc_period=30
dirtyrate.megabytes_per_second=2
在本例中,VM 每秒会生成 2 MB 的脏内存页面。如果您不暂停虚拟机或降低其工作负载,那么在小于或等于 2 MB/秒带宽的网络中尝试实时迁移这样的虚拟机会导致实时迁移不会进行。
为确保实时迁移成功完成,红帽建议您的网络带宽要明显大于虚拟机的脏页面生成率。
calc_period
选项的值可能因工作负载和脏页率而异。您可以使用多个
calc_period
值进行试验,以确定与您环境中脏页率一致的最合适的周期。
网桥
tap 网络:
在迁移公共网桥 tap 网络中的现有虚拟机时,源和目标主机必须位于同一网络中。否则,迁移后 VM 网络将无法正常工作。
连接协议:
在执行虚拟机迁移时,源主机上的
virsh
客户端可以使用多种协议之一连接到目标主机上的 libvirt 守护进程。以下流程中的示例使用 SSH 连接,但您可以选择不同的连接。
如果您希望 libvirt 使用 SSH 连接,请确保启用
virtqemud
套接字并在目标主机上运行。
# systemctl enable --now virtqemud.socket
如果您希望 libvirt 使用 TLS 连接,请确保启用
virtproxyd-tls
套接字并在目标主机上运行。
# systemctl enable --now virtproxyd-tls.socket
如果您希望 libvirt 使用 TCP 连接,请确保
virtproxyd-tcp
套接字已经启用并在目标主机上运行。
# systemctl enable --now virtproxyd-tcp.socket
实时迁移
-
以下命令使用 SSH 隧道将
example-VM
虚拟机从本地主机迁移到
example-destination
主机的系统连接。虚拟机在迁移过程中继续运行。
# virsh migrate --live --persistent <example_VM> qemu+ssh://example-destination/system
-
等待迁移完成。这个过程可能需要一些时间,具体取决于网络带宽、系统负载和虚拟机的大小。如果
virsh migrate
没有使用
--verbose
选项,CLI 不会显示任何进度指示器,除了错误。
迁移进行时,您可以使用
virsh domjobinfo
工具显示迁移统计信息。
多 FD 实时迁移
-
您可以在实时迁移过程中使用到目标主机的多个并行连接。这也被称为多个文件描述符(multi-FD)迁移。借助多 FD 迁移,您可以使用迁移过程的所有可用网络带宽来加快迁移速度。
# virsh migrate --live --persistent --parallel --parallel-connections 4 <example_VM> qemu+ssh://<example-destination>/system
这个示例使用 4 个多 FD 频道来迁移虚拟机
<example_VM>
。建议为可用网络带宽的每 10 Gbps 使用一个通道。默认值为 2 通道。
后复制迁移
-
如果您的虚拟机有较大的内存占用,您可以执行
复制后
迁移,首先将源虚拟机的 CPU 状态传输,并立即在目标主机上启动迁移的虚拟机。源虚拟机的内存页面在迁移的虚拟机已在目标主机上运行后传输。因此,
复制后
迁移可能会导致迁移的虚拟机出现较小的停机时间。
但是,目标主机上运行的虚拟机可能尝试访问尚未传输的内存页面,这会导致
页面错误
。如果迁移过程中出现太多
页面错误
,则迁移的虚拟机的性能可能会严重降级。
由于
复制后
迁移的潜在复杂情况,建议使用下列命令来启动标准实时迁移,并在指定时间内无法完成实时迁移,并切换到复制后迁移。
# virsh migrate --live --persistent --postcopy --timeout <time_interval_in_seconds> --timeout-postcopy <example_VM> qemu+ssh://<example-destination>/system
自动聚合实时迁移
-
如果您的虚拟机处于大量内存工作负载中,您可以使用
-auto-converge
选项。这个选项会自动减慢虚拟机 CPU 的执行速度。因此,这个 CPU 节流有助于降低内存写入的速度,这意味着即使有大量内存工作负载的虚拟机,实时迁移也会成功。
但是,CPU 节流不有助于解决内存写入与 CPU 执行速度直接相关的工作负载,这可能会影响实时迁移过程中虚拟机的性能。
# virsh migrate --live --persistent --auto-converge <example_VM> qemu+ssh://<example-destination>/system
对于
实时迁移
:
在目标主机上,列出可用的虚拟机以验证目标虚拟机的状态:
# virsh list --all
Id Name State
----------------------------------
10 example-VM-1 running
如果虚拟机的状态为
running
,这表示迁移已完成。但是,如果实时迁移仍在进行中,目标虚拟机的状态将列为
暂停
。
对于
复制后
迁移:
在源主机上,列出可用的虚拟机以验证源虚拟机的状态。
# virsh list --all
Id Name State
----------------------------------
10 example-VM-1 shut off
在目标主机上,列出可用的虚拟机以验证目标虚拟机的状态。
# virsh list --all
Id Name State
----------------------------------
10 example-VM-1 running
如果源虚拟机的状态为
shut off
,并且目标虚拟机的状态被列为
running
,这表示迁移已完成。
virsh migrate --help
命令
您系统上的
virsh (1)
手册页
如果要迁移正在执行需要它持续运行的任务的虚拟机(VM),您可以将该虚拟机迁移到另一个 KVM 主机上,而无需关闭它。这也称为实时迁移。以下说明解释了如何使用 Web 控制台进行此操作。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
hypervisor :
源主机和目标主机都使用 KVM hypervisor。
hosts :
源和目标主机正在运行。
打开端口
:确保目标主机上打开了以下端口
。
使用 SSH 连接到目标主机需要端口 22。
使用 TLS 连接到目标主机需要端口 16509。
使用 TCP 连接到目标主机需要端口 16514。
QEMU 需要端口 49152-49215 来传输内存和磁盘迁移数据。
cpu:
虚拟机必须与目标主机的 CPU 功能兼容。要确保情况如此,请参阅
验证虚拟机迁移的主机 CPU 兼容性
。
存储:
将要迁移的虚拟机的磁盘镜像可以被源主机和目标主机访问。这在离线迁移中是可选的,但在迁移运行的虚拟机时是必需的。要确保存储可被两个主机访问,必须应用以下内容之一:
您正在使用存储区域网络(SAN)逻辑单元(LUN)。
正在您使用
Ceph 存储集群
。
您已创建了与源虚拟机磁盘
相同的格式和大小的磁盘镜像,在迁移虚拟机时将使用
--copy-storage-all
参数。
磁盘镜像在单独的网络位置上。有关设置这样的共享虚拟机存储的步骤,请参阅
与其他主机共享虚拟机磁盘镜像
。
网络带宽 :
迁移正在运行的虚拟机时,您的网络带宽必须高于虚拟机生成脏内存页面的速度。
要在开始实时迁移前获得虚拟机的脏页面率,请在命令行界面中执行以下操作:
监控虚拟机在短时间内的脏页面生成率。
# virsh domdirtyrate-calc vm-name 30
在监控完成后,获取其结果:
# virsh domstats vm-name --dirtyrate
Domain: 'vm-name'
dirtyrate.calc_status=2
dirtyrate.calc_start_time=200942
dirtyrate.calc_period=30
dirtyrate.megabytes_per_second=2
在本例中,VM 每秒会生成 2 MB 的脏内存页面。如果您不暂停虚拟机或降低其工作负载,那么在小于或等于 2 MB/秒带宽的网络中尝试实时迁移这样的虚拟机会导致实时迁移不会进行。
为确保实时迁移成功完成,红帽建议您的网络带宽要明显大于虚拟机的脏页面生成率。
calc_period
选项的值可能因工作负载和脏页率而异。您可以使用多个
calc_period
值进行试验,以确定与您环境中脏页率一致的最合适的周期。
网桥
tap 网络:
在迁移公共网桥 tap 网络中的现有虚拟机时,源和目标主机必须位于同一网络中。否则,迁移后 VM 网络将无法正常工作。
在 web 控制台的虚拟机界面中,单击您要迁移的虚拟机的菜单按钮
⋮
。
此时会出现一个下拉菜单,控制各种虚拟机操作。
点击
Migrate
此时将显示将虚拟机迁移到另一主机的对话框。
输入目标主机的 URI。
配置迁移的持续时间:
永久
- 如果要永久迁移虚拟机,请勿选中该框。永久迁移会从源主机上完全删除虚拟机配置。
Temporary
- 临时迁移会将虚拟机的副本迁移到目标主机。虚拟机关闭时,此副本将从目标主机中删除。原始虚拟机会保留在源主机上。
点击
Migrate
您的虚拟机被迁移到目标主机上。
要验证虚拟机是否已成功迁移并正常工作:
确认虚拟机是否在目标主机上可用虚拟机的列表中。
启动迁移的虚拟机,并观察其是否启动。
12.6. 实时迁移附加了 Mellanox 虚拟功能的虚拟机
作为技术预览,您可以实时迁移附加了 Mellanox 网络设备的虚拟功能(VF)的虚拟机(VM)。目前,这只在使用 Mellanox CX-7 网络设备时才有可能。Mellanox CX-7 网络设备上的 VF 使用一个新的
mlx5_vfio_pci
驱动程序,它添加了实时迁移所需的功能,并且
libvirt
自动将新驱动程序绑定到 VF。
目前,当实时迁移附加了 Mellanox 虚拟功能的虚拟机时,无法使用一些虚拟化功能:
计算虚拟机的脏内存页生成率。
目前,当迁移带有附加的 Mellanox VF 的虚拟机时,由
virsh domjobinfo
和
virsh domdirtyrate-calc
命令提供的实时迁移数据和统计信息不准确,因为计算只计算客户机 RAM 而不包括附加的 VF 的影响。
使用复制后实时迁移。
在虚拟机中使用虚拟 I/O 内存管理单元(vIOMMU)设备。
这个功能只作为
技术预览
包含在 RHEL 9 中,这意味着它不被支持。
您有一个 Mellanox CX-7 网络设备,其固件版本等于或大于
28.36.1010
。
有关固件版本的详情,请参阅
Mellanox 文档
。
mstflint
软件包已安装在源和目标主机上:
# dnf install mstflint
Mellanox CX-7 网络设备的
VF_MIGRATION_MODE
设置为
MIGRATION_ENABLED
:
# mstconfig -d <device_pci_address> query | grep -i VF_migration
VF_MIGRATION_MODE MIGRATION_ENABLED(2)
openvswitch
软件包已安装在源和目标主机上:
# dnf install openvswitch
所有常规 SR-IOV 设备先决条件。详情请参阅
将 SR-IOV 网络设备附加到虚拟机
所有常规虚拟机迁移先决条件。详情请参阅
使用命令行界面迁移虚拟机
在源主机上,将 Mellanox 网络设备设置为
switchdev
模式。
# devlink dev eswitch set pci/<device_pci_address> mode switchdev
在源主机上,在 Mellanox 设备上创建一个虚拟功能。
# echo 1 > /sys/bus/pci/devices/0000\:e1\:00.0/sriov_numvfs
文件路径的
/0000\:e1\:00.0/
部分基于设备的 PCI 地址。在示例中,其为:
0000:e1:00.0
在源主机上,将 VF 与其驱动程序解绑。
# virsh nodedev-detach <vf_pci_address> --driver pci-stub
您可以使用以下命令查看 VF 的 PCI 地址:
# lshw -c network -businfo
Bus info Device Class Description
===========================================================================
pci@0000:e1:00.0 enp225s0np0 network MT2910 Family [ConnectX-7]
pci@0000:e1:00.1 enp225s0v0 network ConnectX Family mlx5Gen Virtual Function
在源主机上,启用 VF 的迁移功能。
# devlink port function set pci/0000:e1:00.0/1 migratable enable
在本例中,
pci/0000:e1:00.0/1
指向带有给定 PCI 地址的 Mellanox 设备上的第一个 VF。
在源主机上,为 VF 的迁移配置 Open vSwitch (OVS)。如果 Mellanox 设备处于
switchdev
模式,则无法通过网络传输数据。
确保
openvswitch
服务正在运行。
# systemctl start openvswitch
启用硬件卸载,以提高网络性能。
# ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
增加最大闲置时间,以确保网络连接在迁移过程中保持打开状态。
# ovs-vsctl set Open_vSwitch . other_config:max-idle=300000
在 OVS 实例中创建一个新网桥。
# ovs-vsctl add-br <bridge_name>
重新启动
openvswitch
服务。
# systemctl restart openvswitch
将物理 Mellanox 设备添加到 OVS 网桥。
# ovs-vsctl add-port <bridge_name> enp225s0np0
在本例中,
<bridge_name>
是您在步骤
d
中创建的网桥的名称,
enp225s0np0
是 Mellanox 设备的网络接口的名称。
将 Mellanox 设备的 VF 添加到 OVS 网桥。
# ovs-vsctl add-port <bridge_name> enp225s0npf0vf0
在本例中,
<bridge_name>
是您在步骤
d
中创建的网桥的名称,
enp225s0npf0vf0
是 VF 的网络接口的名称。
在
目标主机上
重复步骤 1-5。
在源主机上,打开一个新文件,如
mlx_vf.xml
,并添加以下 VF 的 XML 配置:
<interface type='hostdev' managed='yes'>
<mac address='52:54:00:56:8c:f7'/>
<source>
<address type='pci' domain='0x0000' bus='0xe1' slot='0x00' function='0x1'/>
</source>
</interface>
这个示例将 VF 的 pass-through 配置为虚拟机的网络接口。确保 MAC 地址是唯一的,并在源主机上使用 VF 的 PCI 地址。
在源主机上,将 VF XML 文件附加到虚拟机。
# virsh attach-device <vm_name> mlx_vf.xml --live --config
在本例中,
mlx_vf.xml
是带有 VF 配置的 XML 文件的名称。使用
--live
选项将设备附加到正在运行的虚拟机上。
在源主机上,启动正在运行的带有附加 VF 的虚拟机的实时迁移。
# virsh migrate --live --domain <vm_name> --desturi qemu+ssh://<destination_host_ip_address>/system
有关执行实时迁移的详情
,请参阅使用命令行界面迁移虚拟机
在迁移的虚拟机中,查看 Mellanox VF 的网络接口名称。
# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::a00:27ff:fe4e:66a1 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:4e:66:a1 txqueuelen 1000 (Ethernet)
RX packets 100000 bytes 6543210 (6.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 100000 bytes 6543210 (6.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp4s0f0v0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.3.10 netmask 255.255.255.0 broadcast 192.168.3.255
inet6 fe80::a00:27ff:fe4e:66c3 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:4e:66:c3 txqueuelen 1000 (Ethernet)
RX packets 200000 bytes 12345678 (12.3 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 200000 bytes 12345678 (12.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在迁移的虚拟机中,检查 Mellanox VF 是否正常工作,例如:
# ping -I <VF_interface_name> 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 192.168.3.10 <VF_interface_name>: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=27.4 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=57 time=26.9 ms
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 26.944/27.046/27.148/0.102 ms
12.7. 使用附加的 NVIDIA vGPU 实时迁移虚拟机
如果您在虚拟化工作负载中使用虚拟 GPU (vGPU),您可以实时迁移带有附加 vGPU 到另一个 KVM 主机的正在运行的虚拟机(VM)。目前,这只能使用 NVIDIA GPU。
您有一个带有支持此功能的 NVIDIA Virtual GPU 软件驱动程序版本的 NVIDIA GPU。如需了解更多详细信息,请参阅相关的 NVIDIA vGPU 文档。
您有一个正确配置的 NVIDIA vGPU 分配给虚拟机。具体步骤请参阅:
设置 NVIDIA vGPU 设备
也可以实时迁移附加多个 vGPU 设备的虚拟机。
主机使用 RHEL 9.4 或更高版本作为操作系统。
NVIDIA 记录的所有 vGPU 迁移先决条件。如需了解更多详细信息,请参阅相关的 NVIDIA vGPU 文档。
所有常规虚拟机迁移先决条件。详情请参阅
使用命令行界面迁移虚拟机
某些 NVIDIA GPU 功能可以禁用迁移。如需更多信息,请参阅您的图形卡的特定 NVIDIA 文档。
有些 GPU 工作负载与迁移期间发生的停机时间不兼容。因此,GPU 工作负载可能会停止或崩溃。建议您在尝试 vGPU 实时迁移前测试您的工作负载是否与停机时间兼容。
目前,如果 vGPU 驱动程序版本在源和目标主机上有所不同,则 vGPU 实时迁移会失败。
目前,当实时迁移带有附加 vGPU 的虚拟机时,一些常规虚拟化功能无法使用:
计算虚拟机的脏内存页生成率。
目前,在迁移带有附加 vGPU 的虚拟机时,
virsh domjobinfo
和
virsh domdirtyrate-calc
命令提供的实时迁移数据和统计信息会不准确,因为计算只计算出没有包括 vGPU 的 vRAM 的客户机 RAM。
使用复制后实时迁移。
在虚拟机中使用虚拟 I/O 内存管理单元(vIOMMU)设备。
有关如何进行实时迁移的步骤,请参阅:
使用命令行界面迁移虚拟机
附加的 vGPU 设备不需要 migration 命令的额外参数。
常规 NVIDIA vGPU 文档
常规 NVIDIA AI Enterprise 文档
要在
支持的 KVM 主机
之间执行虚拟机(VM)的实时迁移,您也必须以一种方式迁移正在运行的虚拟机的存储,该方式在迁移过程中使虚拟机可以对存储进行读写。
实现此操作的方法之一是使用共享虚拟机存储。以下流程提供了使用 NFS 协议将本地存储的虚拟机镜像与源主机和目标主机进行共享的说明。
旨在迁移的虚拟机被关闭。
可选:主机系统可用于托管不是源或目标主机的存储,但源和目标主机都可以通过网络访问它。这是共享存储的最佳解决方案,并被红帽推荐。
请确定 NFS 文件锁定没有被使用,因为在 KVM 中不支持它。
已在源和目标主机上安装并启用了 NFS 协议。请参阅
部署 NFS 服务器
。
virt_use_nfs
SELinux 布尔值在
上
设置为。
# setsebool virt_use_nfs 1
流程
-
连接到提供共享存储的主机。在本例中,它是
example-shared-storage
主机:
# ssh root@example-shared-storage
root@example-shared-storage's password:
Last login: Mon Sep 24 12:05:36 2019
root~#
-
在
example-shared-storage
主机上创建一个目录,该目录将保存磁盘镜像,并与迁移主机共享:
# mkdir /var/lib/libvirt/shared-images
-
将虚拟机的磁盘镜像从源主机复制到新创建的目录。以下示例将虚拟机的磁盘镜像
example-disk-1
复制到
example-shared-storage
主机的
/var/lib/libvirt/shared-images/
目录中:
# scp /var/lib/libvirt/images/example-disk-1.qcow2 root@example-shared-storage:/var/lib/libvirt/shared-images/example-disk-1.qcow2
-
在您要用于共享存储的主机上,将共享目录添加到
/etc/exports
文件中。以下示例将
/var/lib/libvirt/shared-images
目录与
example-source-machine
和
example-destination-machine
主机共享:
# /var/lib/libvirt/shared-images example-source-machine(rw,no_root_squash) example-destination-machine(rw,no\_root_squash)
-
运行
exportfs -a
命令以使
/etc/exports
文件中的更改生效。
# exportfs -a
-
在源和目标主机上,将共享目录挂载到
/var/lib/libvirt/images
目录中:
# mount example-shared-storage:/var/lib/libvirt/shared-images /var/lib/libvirt/images
要使迁移的虚拟机 (VM) 在目标主机上正常工作,源和目标主机上的 CPU 必须兼容。要确保情况如此,请在开始迁移前计算一个常见 CPU 基准。
本节中的说明使用了具有以下主机 CPU 的迁移示例:
源主机:Intel Core i7-8650U
目标主机:Intel Xeon CPU E5-2620 v2
已在您的系统中
安装并启用
虚拟化。
您具有对源主机和迁移的目标主机的管理员访问权限。
在源主机上,获取其 CPU 功能并将其粘贴到新的 XML 文件中,如
domCaps-CPUs.xml
。
# virsh domcapabilities | xmllint --xpath "//cpu/mode[@name='host-model']" - > domCaps-CPUs.xml
在 XML 文件中,将
<mode> </mode>
标签替换为
<cpu> </cpu>
。
可选:验证
domCaps-CPUs.xml
文件的内容类似如下:
# cat domCaps-CPUs.xml
<model fallback="forbid">Skylake-Client-IBRS</model>
<vendor>Intel</vendor>
<feature policy="require" name="ss"/>
<feature policy="require" name="vmx"/>
<feature policy="require" name="pdcm"/>
<feature policy="require" name="hypervisor"/>
<feature policy="require" name="tsc_adjust"/>
<feature policy="require" name="clflushopt"/>
<feature policy="require" name="umip"/>
<feature policy="require" name="md-clear"/>
<feature policy="require" name="stibp"/>
<feature policy="require" name="arch-capabilities"/>
<feature policy="require" name="ssbd"/>
<feature policy="require" name="xsaves"/>
<feature policy="require" name="pdpe1gb"/>
<feature policy="require" name="invtsc"/>
<feature policy="require" name="ibpb"/>
<feature policy="require" name="ibrs"/>
<feature policy="require" name="amd-stibp"/>
<feature policy="require" name="amd-ssbd"/>
<feature policy="require" name="rsba"/>
<feature policy="require" name="skip-l1dfl-vmentry"/>
<feature policy="require" name="pschange-mc-no"/>
<feature policy="disable" name="hle"/>
<feature policy="disable" name="rtm"/>
在目标主机上,使用以下命令获取其 CPU 功能:
# virsh domcapabilities | xmllint --xpath "//cpu/mode[@name='host-model']" -
<mode name="host-model" supported="yes">
<model fallback="forbid">IvyBridge-IBRS</model>
<vendor>Intel</vendor>
<feature policy="require" name="ss"/>
<feature policy="require" name="vmx"/>
<feature policy="require" name="pdcm"/>
<feature policy="require" name="pcid"/>
<feature policy="require" name="hypervisor"/>
<feature policy="require" name="arat"/>
<feature policy="require" name="tsc_adjust"/>
<feature policy="require" name="umip"/>
<feature policy="require" name="md-clear"/>
<feature policy="require" name="stibp"/>
<feature policy="require" name="arch-capabilities"/>
<feature policy="require" name="ssbd"/>
<feature policy="require" name="xsaveopt"/>
<feature policy="require" name="pdpe1gb"/>
<feature policy="require" name="invtsc"/>
<feature policy="require" name="ibpb"/>
<feature policy="require" name="amd-ssbd"/>
<feature policy="require" name="skip-l1dfl-vmentry"/>
<feature policy="require" name="pschange-mc-no"/>
</mode>
将从目标主机获取的 CPU 功能添加到源主机上的
domCaps-CPUs.xml
文件。同样,将
<mode> </mode>
标签替换为
<cpu> </cpu>
并保存文件。
可选:验证 XML 文件现在是否包含两个主机的 CPU 功能。
# cat domCaps-CPUs.xml
<model fallback="forbid">Skylake-Client-IBRS</model>
<vendor>Intel</vendor>
<feature policy="require" name="ss"/>
<feature policy="require" name="vmx"/>
<feature policy="require" name="pdcm"/>
<feature policy="require" name="hypervisor"/>
<feature policy="require" name="tsc_adjust"/>
<feature policy="require" name="clflushopt"/>
<feature policy="require" name="umip"/>
<feature policy="require" name="md-clear"/>
<feature policy="require" name="stibp"/>
<feature policy="require" name="arch-capabilities"/>
<feature policy="require" name="ssbd"/>
<feature policy="require" name="xsaves"/>
<feature policy="require" name="pdpe1gb"/>
<feature policy="require" name="invtsc"/>
<feature policy="require" name="ibpb"/>
<feature policy="require" name="ibrs"/>
<feature policy="require" name="amd-stibp"/>
<feature policy="require" name="amd-ssbd"/>
<feature policy="require" name="rsba"/>
<feature policy="require" name="skip-l1dfl-vmentry"/>
<feature policy="require" name="pschange-mc-no"/>
<feature policy="disable" name="hle"/>
<feature policy="disable" name="rtm"/>
<model fallback="forbid">IvyBridge-IBRS</model>
<vendor>Intel</vendor>
<feature policy="require" name="ss"/>
<feature policy="require" name="vmx"/>
<feature policy="require" name="pdcm"/>
<feature policy="require" name="pcid"/>
<feature policy="require" name="hypervisor"/>
<feature policy="require" name="arat"/>
<feature policy="require" name="tsc_adjust"/>
<feature policy="require" name="umip"/>
<feature policy="require" name="md-clear"/>
<feature policy="require" name="stibp"/>
<feature policy="require" name="arch-capabilities"/>
<feature policy="require" name="ssbd"/>
<feature policy="require" name="xsaveopt"/>
<feature policy="require" name="pdpe1gb"/>
<feature policy="require" name="invtsc"/>
<feature policy="require" name="ibpb"/>
<feature policy="require" name="amd-ssbd"/>
<feature policy="require" name="skip-l1dfl-vmentry"/>
<feature policy="require" name="pschange-mc-no"/>
使用 XML 文件计算您要迁移的虚拟机的 CPU 功能基准。
# virsh hypervisor-cpu-baseline domCaps-CPUs.xml
<cpu mode='custom' match='exact'>
<model fallback='forbid'>IvyBridge-IBRS</model>
<vendor>Intel</vendor>
<feature policy='require' name='ss'/>
<feature policy='require' name='vmx'/>
<feature policy='require' name='pdcm'/>
<feature policy='require' name='pcid'/>
<feature policy='require' name='hypervisor'/>
<feature policy='require' name='arat'/>
<feature policy='require' name='tsc_adjust'/>
<feature policy='require' name='umip'/>
<feature policy='require' name='md-clear'/>
<feature policy='require' name='stibp'/>
<feature policy='require' name='arch-capabilities'/>
<feature policy='require' name='ssbd'/>
<feature policy='require' name='xsaveopt'/>
<feature policy='require' name='pdpe1gb'/>
<feature policy='require' name='invtsc'/>
<feature policy='require' name='ibpb'/>
<feature policy='require' name='amd-ssbd'/>
<feature policy='require' name='skip-l1dfl-vmentry'/>
<feature policy='require' name='pschange-mc-no'/>
打开您要迁移的虚拟机 XML 配置,并将 <cpu> 部分的内容替换为上一步中获取的设置。
# virsh edit <vm_name>
如果虚拟机正在运行,请关闭虚拟机并再次启动它。
# virsh shutdown <vm_name>
# virsh start <vm_name>
要使虚拟机迁移正常工作且受红帽支持,源和目标主机必须是特定的 RHEL 版本和机器类型。下表显示了支持的虚拟机迁移路径。
表 12.2. 实时迁移兼容性
迁移方法
|
发行类型
|
将来的版本示例
|
支持状态
|
次发行版本
9.0.1 → 9.1
在支持的 RHEL 9 系统上: 机器类型
q35
。
次发行版本
9.1 → 9.0.1
在支持的 RHEL 9 系统上: 机器类型
q35
。
对红帽提供的其他虚拟化解决方案(包括 RHOSP 和 OpenShift Virtualization)的支持等级有所不同。
要保存虚拟机的当前状态,您可以创建一个虚拟机的
快照
。之后,您可以恢复到快照,来将虚拟机返回到保存的状态。
VM 快照包含虚拟机的磁盘镜像。如果您从正在运行的虚拟机创建一个快照(也称为
实时快照
),则快照还包含虚拟机的内存状态,其中包括正在运行的进程和应用程序。
例如,对于以下任务,创建快照可能很有用:
保存客户机操作系统的干净状态
确保您在对虚拟机执行具有潜在的破坏性操作之前有一个恢复点
红帽仅在使用
external
快照时支持对 RHEL 上虚拟机(VM)的快照功能。目前,只有在满足以下要求时,才能在 RHEL 上创建外部快照:
您的主机使用 RHEL 9.4 或更高版本。
虚拟机使用基于文件的存储。
您只能在以下场景之一创建虚拟机快照:
虚拟机已关闭。
如果虚拟机正在运行,您可以使用
--disk-only --quiesce
选项或
--live --memspec
选项。
大多数其他配置会创建
内部
快照,它们在 RHEL 9 中已弃用。内部快照可能适用于您的用例,但红帽不提供对它们的全面测试和支持。
不要在生产环境中使用内部快照。
要确保快照被支持,请显示快照的 XML 配置,并检查快照类型和存储:
# virsh snapshot-dumpxml <vm-name> <snapshot-name>
-
支持的快照的输出示例:
<domainsnapshot>
<name>sample-snapshot-name-1<name>
<state>shutoff</state>
<creationTime>1706658764</creationTime>
<memory snapshot='no'/>
<disks>
<disk name='vda' snapshot='external' type='file'>
<driver type='qcow2'/>
<source file='/var/lib/libvirt/images/vm-name.sample-snapshot-name-1'/>
</disk>
</disks>
<domain type='kvm'>
[...]
-
不支持的快照的输出示例:
<domainsnapshot>
<name>sample-snapshot-name-2</name>
<state>running</state>
<creationTime>1653396424</creationTime>
<memory snapshot='internal'/>
<disks>
<disk name='vda' snapshot='internal'/>
<disk name='sda' snapshot='no'/>
</disks>
<domain type='kvm'>
[...]
要将虚拟机(VM)的状态保存到快照中,您可以使用 RHEL web 控制台。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
您的主机使用 RHEL 9.4 或更高版本。
Web 控制台 VM 插件
已安装在您的系统上
。
虚拟机使用基于文件的存储。要确保情况是这种情况,请执行以下步骤:
在 web 控制台的
Virtual machines
界面中,点您要创建快照的虚拟机。
在管理概述的
Disks
窗格中,检查列出的设备的
Source
列。在所有列出源的设备中,此源必须是
File
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在 web 控制台的
Virtual machines
界面中,点您要创建快照的虚拟机。
此时会打开虚拟机的管理概述。
在管理概述的
Snapshots
窗格中,单击
Create snapshot
按钮。
输入快照的名称,并可选择输入描述。
点
Create
。
要确保创建快照是否已成功,请检查快照现在是否列在虚拟机的
Snapshots
窗格中。
验证快照是否已创建为
external
。为此,请在主机的命令行界面中使用以下命令:
# virsh snapshot-dumpxml <Testguest1> <Snapshot1> | grep external
<disk name='vda' snapshot='external' type='file'>
如果这个命令的输出包含
snapshot='external'
,则快照是外部的,因此被红帽支持。
使用 Web 控制台恢复到虚拟机快照
使用命令行界面恢复到虚拟机快照
要将虚拟机(VM)返回到快照中保存的状态,您可以使用命令行界面(CLI)。
您之前
在 web 控制台中
或通过
使用命令行界面
创建的虚拟机的快照可用。
可选:您已创建虚拟机当前状态的快照。如果您恢复到以前没有保存当前状态的快照,则自上次快照以来在虚拟机上执行的更改将丢失。
使用
virsh snapshot-revert
工具,并指定虚拟机的名称以及您要恢复到的快照的名称。例如:
# virsh snapshot-revert Testguest2 clean-install
Domain snapshot clean-install reverted
要将虚拟机(VM)返回到快照中保存的状态,您可以使用 RHEL web 控制台。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
您之前
在 web 控制台中
或通过
使用命令行界面
创建的虚拟机的快照可用。
可选:您已创建虚拟机当前状态的快照。如果您恢复到以前没有保存当前状态的快照,则自上次快照以来在虚拟机上执行的更改将丢失。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在 web 控制台的
Virtual machines
界面中,点您要恢复其状态的虚拟机。
此时会打开虚拟机的管理概述。
在管理概述的
Snapshots
窗格中,单击您要恢复的快照旁边的
Revert
按钮。
等待恢复操作完成。根据快照的大小以及其与当前状态如何不同,这可能需要最多几分钟。
在
Snapshots
窗格中,如果现在在所选快照的左侧显示绿色复选符号,则您已成功恢复。
当虚拟机(VM)快照不再对您有用时,您可以在命令行界面中删除它,来释放其使用的磁盘空间。
可选:存在您要删除的快照的子快照。
当您有一个活跃的快照并创建一个新快照时,会自动创建一个子快照。如果您删除了没有子快照的快照,则在从其父快照创建后,您将丢失快照中保存的任何更改。
要查看虚拟机中快照的父子结构,请使用
virsh snapshot-list --tree
命令。以下示例显示
Latest-snapshot
为
Redundant-snapshot
的一个子快照。
# virsh snapshot-list --tree <vm-name>
Clean-install-snapshot
+- Redundant-snapshot
+- Latest-snapshot
验证
-
要确保您删除的快照不再存在,请显示受影响的虚拟机的现有快照及其父-子结构:
# virsh snapshot-list --tree <Testguest1>
Clean-install-snapshot
+- Latest-snapshot
在本例中,
Redundant-snapshot
已被删除,
Latest-snapshot
已变为
Clean-install-snapshot
的子快照。
当虚拟机(VM)快照不再对您有用时,您可以在 web 控制台中删除它,来释放其使用的磁盘空间。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
可选:存在您要删除的快照的子快照。
当您有一个活跃的快照并创建一个新快照时,会自动创建一个子快照。如果您删除了没有子快照的快照,则在从其父快照创建后,您将丢失快照中保存的任何更改。
要检查快照是否有子快照,请在虚拟机的 Web 控制台概述中
Snapshots
的
Parent snapshot
列中列出的快照中进行确认。
在 web 控制台的
Virtual machines
界面中,点击您要删除其快照的虚拟机。
此时会打开虚拟机的管理概述。
在管理概述的
Snapshots
窗格中,单击您要删除的快照旁边的
Delete
按钮。
等待删除操作完成。根据快照的大小,这可能需要最多几分钟时间。
如果快照不再出现在
Snapshots
窗格中,则它已被成功删除。
管理虚拟机功能、特性和性能的最有效的方法之一是调整其
虚拟设备
。
以下章节提供了虚拟设备的
概述
,以及如何使用
CLI
或
Web 控制台
来管理它们的说明。
与物理机一样,虚拟机(VM)也要求专门的设备来为系统提供功能,如处理能力、内存、存储、网络或图形。物理系统通常将硬件设备用于这些目的。但是,由于虚拟机作为软件实现来工作,因此它们需要使用此类设备的软件抽象,称为
虚拟设备
。
附加到虚拟机的虚拟设备可在
创建虚拟机时
配置,也可以在现有虚拟机上管理。通常,只有在虚拟机处于关闭状态时才能从虚拟机挂载或卸载虚拟设备,但某些设备可在虚拟机运行时进行添加或删除。这个功能被称为设备
热插(hot plug)
和
热拔(hot unplug)
。
创建新虚拟机时,
libvirt
会自动创建和配置一组默认的基本虚拟设备,除非用户另有指定。它们基于主机系统架构和机器类型,通常包括:
网络接口控制器(NIC)
各种设备控制器
一个视频卡
要在创建虚拟机后管理虚拟设备,请使用命令行界面(CLI)。但是,要管理虚拟存储设备和 NIC,您还可以使用 RHEL 9 web 控制台。
RHEL 9 中的虚拟化可显示可附加到虚拟机的几种不同类型的虚拟设备:
模拟设备是广泛使用的物理设备的软件实现。为物理设备设计的驱动程序还与模拟设备兼容。因此可非常灵活地使用模拟设备。
但是,由于需要忠实地模拟特定类型的硬件,与相应的物理设备或更为优化的虚拟设备相比,模拟设备可能会会遭受显著的性能损失。
支持以下模拟设备类型:
虚拟 CPU(vCPU),有大量 CPU 型号可供选择。模拟的性能影响显著取决于主机 CPU 和模拟 vCPU 之间的差异。
模拟系统组件,如 PCI 总线控制器。
模拟存储控制器,如 SATA、SCSI 甚至 IDE。
模拟声音设备,如 ICH9、ICH6 或 AC97。
模拟图形卡,如 VGA 卡。
模拟网络设备,如 rtl8139。
半虚拟设备
半虚拟(Paravirtualization)提供了向虚拟机公开虚拟设备的速度。半虚拟设备公开专用于虚拟机使用的接口,因此可显著提高设备的性能。RHEL 9 使用
virtio
API 作为 hypervisor 和虚拟机之间的层,来为虚拟机提供半虚拟化设备。这个方法的缺陷在于它需要在客户端操作系统中使用特定的设备驱动程序。
建议您尽可能为虚拟机使用半虚拟设备而不是模拟设备,特别是当它们运行大量 I/O 的应用程序时。半虚拟设备减少 I/O 延迟并增加 I/O 吞吐量,在某些情况下可使其非常接近裸机性能。其它半虚拟设备还会在不能使用的虚拟机中添加功能。
支持以下半虚拟设备类型:
半虚拟化网络设备(
virtio-net
)。
半虚拟化存储控制器:
virtio-blk
- 提供块设备模拟。
virtio-scsi
- 提供更完整的 SCSI 模拟。
半虚拟时钟。
半虚拟化串行设备(
virtio-serial
)。
气球(balloon)设备(
virtio-balloon
)用于在虚拟机及其主机之间动态分配内存。
半虚拟随机数字生成器(
virtio-rng
)。
物理共享设备
某些硬件平台可让虚拟机直接访问各种硬件设备和组件。这个过程被称为
设备分配
或者
透传(passthrough)
。
以这种方式连接时,物理设备的某些方面可以直接用于虚拟机,就像它们可用于物理机一样。这为虚拟机中使用的设备提供了出众的性能。但是,物理连接到虚拟机的设备对主机不可用,也无法迁移。
然而,某些设备可以在多个虚拟机之间
共享
。例如,一个物理设备在某些情况下可以提供多个
介质设备
,然后将其分配给不同的虚拟机。
支持以下 passthrough 设备类型:
USB、PCI 和 SCSI 直通 - 直接向虚拟机公开通用的行业标准总线,以便其特定功能对虚拟客户机软件可用。
单根 I/O 虚拟化(SR-IOV)- 一种支持 PCI Express 资源的硬件强制隔离的规范。这使得将单个物理 PCI 资源划分成虚拟 PCI 功能变得安全而高效。它通常用于网络接口卡(NIC)。
N_Port ID 虚拟化(NPIV)- 一种光纤通道技术,来与多个虚拟端口共享单个物理主机总线适配器(HBA)。
GPU 和 vGPU - 用于特定图形或计算工作负载的加速器。一些 GPU 可以直接连接到虚拟机,而某些类型也提供能够创建共享底层物理硬件的虚拟 GPU(vGPU)的能力。
这些类型的某些设备可能不被支持,或者与 RHEL 不兼容。如果您需要帮助设置虚拟设备,请咨询红帽支持。
要修改虚拟机的功能,您可以使用命令行界面(CLI)管理附加到虚拟机的设备。
您可以通过附加新的虚拟设备来向虚拟机(VM)添加特定的功能。
以下流程使用命令行界面(CLI)创建虚拟设备,并将其附加到虚拟机(VM)。一些设备也可以
使用 RHEL web 控制台
附加到虚拟机。
例如,您可以通过将新虚拟磁盘设备附加到虚拟机来增加虚拟机的存储容量。这也被称为
内存热插拔
。
RHEL 9 不支持从虚拟机中删除内存设备(也称为
内存热拔
)。红帽不建议使用它。
获取您要附加到虚拟机的设备所需的选项。要查看特定设备的可用选项,请使用
virt-xml --
device
=?
命令。例如:
# virt-xml --network=?
--network options:
[...]
address.unit
boot_order
clearxml
driver_name
[...]
流程
-
要将设备附加到虚拟机,请使用
virt-xml --add-device
命令,包括该设备的定义和所需的选项:
例如,以下命令会在
/var/lib/libvirt/images/
目录中创建一个 20GB 的
newdisk
qcow2 磁盘镜像,并在虚拟机启动时将其作为虚拟磁盘附加到运行的
testguest
虚拟机上:
# virt-xml testguest --add-device --disk /var/lib/libvirt/images/newdisk.qcow2,format=qcow2,size=20
Domain 'testguest' defined successfully.
Changes will take effect after the domain is fully powered off.
-
在虚拟机运行时,下面的命令会将一个 USB 盘(在主机的 002 总线中作为设备 004)附加到
testguest2
虚拟机:
# virt-xml testguest2 --add-device --update --hostdev 002.004
Device hotplug successful.
Domain 'testguest2' defined successfully.
可以使用
lsusb
命令获得用于定义 USB 的总线设备组合。
要验证设备是否已被添加,请执行以下操作之一:
使用
virsh dumpxml
命令,并查看设备的 XML 定义是否已添加到虚拟机 XML 配置中的
<devices>
部分。
例如,以下输出显示了
testguest
虚拟机的配置,并确认已添加了 002.004 USB 闪存磁盘设备。
# virsh dumpxml testguest
[...]
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<vendor id='0x4146'/>
<product id='0x902e'/>
<address bus='2' device='4'/>
</source>
<alias name='hostdev0'/>
<address type='usb' bus='0' port='3'/>
</hostdev>
[...]
-
运行虚拟机并测试该设备是否存在并正常工作。
man virt-xml
命令
您可以通过编辑附加的虚拟设备的配置来更改虚拟机(VM)的功能。例如,如果想要优化虚拟机的性能,您可以更改其虚拟 CPU 型号来更好地匹配主机的 CPU 。
以下流程提供了使用命令行界面(CLI)修改虚拟设备的通用说明。还可以
使用 RHEL 9 web 控制台
来修改附加到虚拟机的某些设备,如磁盘和 NIC。
获取您要附加到虚拟机的设备所需的选项。要查看特定设备的可用选项,请使用
virt-xml --
device
=?
命令。例如:
# virt-xml --network=?
--network options:
[...]
address.unit
boot_order
clearxml
driver_name
[...]
-
可选:使用
virsh dumpxml
vm-name
备份虚拟机的 XML 配置,并将输出发送到文件。例如,以下命令将
testguest1
虚拟机的配置备份为
testguest1.xml
文件:
# virsh dumpxml testguest1 > testguest1.xml
# cat testguest1.xml
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<name>testguest1</name>
<uuid>ede29304-fe0c-4ca4-abcd-d246481acd18</uuid>
[...]
</domain>
流程
-
使用
virt-xml --edit
命令,包括设备的定义以及所需的选项:
例如,以下可清除关闭的
testguest
虚拟机的
<cpu>
配置,并将其设置为
host-model
:
# virt-xml testguest --edit --cpu host-model,clearxml=yes
Domain 'testguest' defined successfully.
对于对虚拟机 XML 配置的小更改,您可以使用
virsh edit
命令 - 例如
virsh edit testguest
。但是,对于更广泛的更改,请勿使用此方法,因为它很可能会破坏配置,从而阻止虚拟机启动。
man virt-xml
命令
您可以通过移除虚拟设备来更改虚拟机(VM)的功能。例如,如果不再需要,您可以从其中一个虚拟机中删除虚拟磁盘设备。
以下流程演示了如何使用命令行界面(CLI)从虚拟机(VM)中删除虚拟设备。还可
使用 RHEL 9 web 控制台
从虚拟机中删除一些设备,如磁盘或 NIC。
可选:使用
virsh dumpxml
vm-name
备份虚拟机的 XML 配置,并将输出发送到文件。例如,以下命令将
testguest1
虚拟机的配置备份为
testguest1.xml
文件:
# virsh dumpxml testguest1 > testguest1.xml
# cat testguest1.xml
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<name>testguest1</name>
<uuid>ede29304-fe0c-4ca4-abcd-d246481acd18</uuid>
[...]
</domain>
流程
-
使用
virt-xml --remove-device
命令,包括设备的定义。例如:
以下会在运行的
testguest
虚拟机关闭后,从其中删除标记为
vdb
的存储设备:
# virt-xml testguest --remove-device --disk target=vdb
Domain 'testguest' defined successfully.
Changes will take effect after the domain is fully powered off.
-
以下命令会立即从运行的
testguest2
虚拟机中删除 USB 闪存驱动器设备:
# virt-xml testguest2 --remove-device --update --hostdev type=usb
Device hotunplug successful.
Domain 'testguest2' defined successfully.
要修改虚拟机的功能,您可以使用 Red Hat Enterprise Linux 9 web 控制台管理附加到虚拟机的主机设备。
主机设备是附加到主机系统的物理设备。根据您的需求,您可以让虚拟机直接访问这些硬件设备和组件。
您可以使用 Web 控制台:
14.4.1. 使用 web 控制台查看附加到虚拟机的设备
在添加或修改附加到虚拟机(VM)的设备之前,您可能需要查看已附加到虚拟机的设备。以下流程提供了使用 Web 控制台查看这些设备的说明。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在
界面中,点击您要查看其信息的虚拟机。
这会打开一个新页面,其中包含有关虚拟机的详细信息。
滚动到
Host devices
部分。
管理虚拟设备
14.4.2. 使用 web 控制台将设备附加到虚拟机
要为虚拟机添加特定的功能,您可以使用 web 控制台将主机设备附加到虚拟机。
不能同时附加多个主机设备。一次只能附加一个设备。
如需更多信息,请参阅
RHEL 9 已知问题。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
如果要附加 PCI 设备,请确保
hostdev
元素的
managed
属性的状态被设为
yes
。
将 PCI 设备附加到虚拟机时,请不要省略
hostdev
元素的
managed
属性,或者将其设为
no
。如果您这样做了,当把 PCI 设备传给虚拟机时,会无法自动将 PCI 设备与主机分离。当您关闭虚拟机时,也不能自动将它们重新附加到主机上。
因此,主机可能会变得无响应,或者意外关闭。
您可以在虚拟机的 XML 配置中找到
managed
属性的状态。以下示例打开
example-VM-1
虚拟机的 XML 配置。
# virsh edit example-VM-1
备份虚拟机中的重要数据。
可选:备份虚拟机的 XML 配置。例如,要备份
example-VM-1
虚拟机:
# virsh dumpxml example-VM-1 > example-VM-1.xml
Web 控制台 VM 插件已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在
接口中,点击您要给其附加主机设备的虚拟机。
这会打开一个新页面,其中包含有关所选虚拟机基本信息的
概述
,以及访问虚拟机图形界面的
控制台
部分。
滚动到
。
主机设备
部分显示有关附加到虚拟机的设备的信息,以及
A添加
或
删除
设备的选项。
点击
Add host device
。
此时会出现
Add host device
对话框。
选择您要附加到虚拟机的设备。
所选设备被附加到虚拟机。
运行虚拟机并检查该设备是否出现在
Host devices
部分中。
14.4.3. 使用 web 控制台从虚拟机中删除设备
要释放资源,修改虚拟机的功能或两个都做,您可以使用 Web 控制台来修改虚拟机,并删除不再需要的主机设备。
使用 Web 控制台删除附加的 USB 主机设备可能会失败,因为设备和 USB 设备的总线号之间的关联不正确。
如需更多信息,请参阅
RHEL 9 已知问题。
作为临时解决方案,使用
virsh
工具从虚拟机的 XML 配置中删除 USB 设备的 <hostdev> 部分。以下示例打开
example-VM-1
虚拟机的 XML 配置:
# virsh edit <example-VM-1>
先决条件
-
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件已安装在您的系统上
。
可选:使用
virsh dumpxml
example-VM-1
备份虚拟机的 XML 配置,并将输出发送到文件。例如,以下命令将
testguest1
虚拟机的配置备份为
testguest1.xml
文件:
# virsh dumpxml testguest1 > testguest1.xml
# cat testguest1.xml
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<name>testguest1</name>
<uuid>ede29304-fe0c-4ca4-abcd-d246481acd18</uuid>
[...]
</domain>
流程
-
在
接口中,点击您要从中删除主机设备的虚拟机。
这会打开一个新页面,其中包含有关所选虚拟机基本信息的
概述
,以及访问虚拟机图形界面的
控制台
部分。
滚动到
。
主机设备
部分显示有关附加到虚拟机的设备的信息,以及
A添加
或
删除
设备的选项。
点击您要从虚拟机中删除设备旁边的
Remove
按钮。
此时会出现删除设备确认对话框。
点击
Remove
。
该设备从虚拟机中删除。
如果删除主机设备导致虚拟机无法启动,请使用
virsh define
工具通过重新载入之前备份的 XML 配置文件来恢复 XML 配置。
# virsh define testguest1.xml
使用虚拟机(VM)时,您可以访问并控制 USB 设备,如附加到主机系统的如闪存驱动器或 Web 相机。在这种情况下,主机系统会将设备的控制权传递给虚拟机。这也被称为 USB-passthrough。
要将 USB 设备附加到虚拟机,您可以在虚拟机 XML 配置文件中包含 USB 设备信息。
确定您要传递给虚拟机的设备已附加到主机。
找到您要附加到虚拟机的 USB 总线和设备值。
例如:以下命令显示附加到该主机的 USB 设备列表。在这个示例中,使用的设备作为设备 005 总线附加到总线 001 中。
# lsusb
[...]
Bus 001 Device 003: ID 2567:0a2b Intel Corp.
Bus 001 Device 005: ID 0407:6252 Kingston River 2.0
[...]
使用
virt-xml
工具及
--add-device
参数。
例如,以下命令将 USB 闪存驱动器附加到
example-VM-1
虚拟机。
# virt-xml example-VM-1 --add-device --hostdev 001.005
Domain 'example-VM-1' defined successfully.
要将 USB 设备连接到正在运行的虚拟机,请将
--update
参数添加到上一命令中。
运行虚拟机并测试该设备是否存在并正常工作。
使用
virsh dumpxml
命令查看设备的 XML 定义是否已添加到虚拟机 XML 配置文件中的 <devices> 部分。
# virsh dumpxml example-VM-1
[...]
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<vendor id='0x0407'/>
<product id='0x6252'/>
<address bus='1' device='5'/>
</source>
<alias name='hostdev0'/>
<address type='usb' bus='0' port='3'/>
</hostdev>
[...]
要从虚拟机中删除 USB 设备,您可以从虚拟机 XML 配置中删除 USB 设备信息。
找到您要从虚拟机中删除的 USB 的 bus 和 device 值。
例如:以下命令显示附加到该主机的 USB 设备列表。在这个示例中,使用的设备作为设备 005 总线附加到总线 001 中。
# lsusb
[...]
Bus 001 Device 003: ID 2567:0a2b Intel Corp.
Bus 001 Device 005: ID 0407:6252 Kingston River 2.0
[...]
使用
virt-xml
工具及
--remove-device
参数。
例如,以下命令从
example-VM-1
虚拟机中删除附加到主机作为总线 001 上设备 005 的 USB 闪存驱动器。
# virt-xml example-VM-1 --remove-device --hostdev 001.005
Domain 'example-VM-1' defined successfully.
要从正在运行的虚拟机中删除 USB 设备,请将
--update
参数添加到上一命令中。
运行虚拟机并检查该设备是否已从设备列表中删除。
您系统上的
virt-xml (1)
手册页
将设备附加到虚拟机
当使用虚拟机时,您可以访问保存在主机中 ISO 镜像中的信息。要做到这一点,请将 ISO 镜像作为虚拟光驱附加到虚拟机,比如 CD 驱动器或者 DVD 驱动器。
要将 ISO 镜像作为虚拟光驱附加,请编辑虚拟机的 XML 配置文件并添加新驱动器。
您必须在主机机器上存储和复制 ISO 镜像的路径。
使用带有
--add-device
参数的
virt-xml
工具:
例如,以下命令将存储在
/home/username/Downloads
目录中的
example-ISO-name
ISO 镜像附加到
example-VM-name
虚拟机。
# virt-xml example-VM-name --add-device --disk /home/username/Downloads/example-ISO-name.iso,device=cdrom
Domain 'example-VM-name' defined successfully.
验证
-
运行虚拟机并测试该设备是否存在并正常工作。
man virt-xml
命令
将设备附加到虚拟机
14.6.2. 使用 web 控制台将 CD-ROM 添加到正在运行的虚拟机上
您可以使用 web 控制台将 CD-ROM 插入到正在运行的虚拟机(VM),而无需指定介质。
您已在系统上安装了 Web 控制台虚拟机插件
。
关闭虚拟机。
在不指定源镜像的情况下附加一个虚拟 CD-ROM 设备。
# virt-xml vmname --add-device --disk target.dev=sda,device=cdrom
运行虚拟机。
打开 web 控制台,并在
界面中点击您要附加 CD-ROM 的虚拟机。
滚动到
。
Disks 部分显示有关分配给虚拟机的磁盘的信息,以及用于
Add
或
Edit
磁盘的选项。
点
cdrom
设备的
Insert
选项。
为您要附加的文件选择一个
Source
:
Custom Path
:文件位于主机上的自定义目录中。
Use existing
: 文件位于您创建的存储池中。
点
Insert
。
在
接口中,该文件将出现在
Disks
部分下。
要替换作为虚拟光驱附加到虚拟机(VM)的 ISO 镜像,请编辑虚拟机的 XML 配置文件,并指定替换。
您必须将 ISO 镜像存储在主机机器上。
您必须知道 ISO 镜像的路径。
定位 CD-ROM 附加到虚拟机的目标设备。您可以在虚拟机 XML 配置文件中找到这些信息。
例如:以下命令显示
example-VM-name
虚拟机的 XML 配置文件,其中用于 CD-ROM 的目标设备是
sda
。
# virsh dumpxml example-VM-name
<source file='$(/home/username/Downloads/example-ISO-name.iso)'/>
<target dev='sda' bus='sata'/>
</disk>
使用 virt-xml 工具及 --edit 参数。
例如,以下命令使用存储在 /dev/cdrom 目录中的 example-ISO-name-2 ISO 镜像替换附加到 example-VM-name 虚拟机目标 sda 处的 example-ISO-name ISO 镜像。
# virt-xml example-VM-name --edit target=sda --disk /dev/cdrom/example-ISO-name-2.iso
Domain 'example-VM-name' defined successfully. 验证 -
运行虚拟机并测试是否替换该设备并正常工作。
man virt-xml 命令
要从附加到虚拟机(VM)的虚拟光驱中删除 ISO 镜像,请编辑虚拟机的 XML 配置文件。
定位 CD-ROM 附加到虚拟机的目标设备。您可以在虚拟机 XML 配置文件中找到这些信息。
例如:以下命令显示
example-VM-name
虚拟机的 XML 配置文件,其中用于 CD-ROM 的目标设备是
sda
。
# virsh dumpxml example-VM-name
<source file='$(/home/username/Downloads/example-ISO-name.iso)'/>
<target dev='sda' bus='sata'/>
</disk>
使用 virt-xml 工具及 --edit 参数。
例如,以下命令从附加到 example-VM-name 虚拟机的 CD 驱动器中删除 example-ISO-name ISO 镜像。
# virt-xml example-VM-name --edit target=sda --disk path=
Domain 'example-VM-name' defined successfully. 验证 -
运行虚拟机,检查镜像已不再可用。
man virt-xml 命令
要删除附加到虚拟机的光驱,编辑虚拟机的 XML 配置文件。
定位 CD-ROM 附加到虚拟机的目标设备。您可以在虚拟机 XML 配置文件中找到这些信息。
例如:以下命令显示
example-VM-name
虚拟机的 XML 配置文件,其中用于 CD-ROM 的目标设备是
sda
。
# virsh dumpxml example-VM-name
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='sda' bus='sata'/>
</disk>
使用带 --remove-device 参数的virt-xml 工具。
例如,以下命令从 example-VM-name 虚拟机中删除作为目标 sda 附加的光驱。
# virt-xml example-VM-name --remove-device --disk target=sda
Domain 'example-VM-name' defined successfully. 验证 -
确认该设备不再列在虚拟机 XML 配置文件中。
man virt-xml 命令
14.6.6. 使用 web 控制台从正在运行的虚拟机中删除 CD-ROM
您可以使用 web 控制台从正在运行的虚拟机(VM)中弹出 CD-ROM 设备。
您已在系统上安装了 Web 控制台虚拟机插件
。
在
接口中,点击您要从中删除 CD-ROM 的虚拟机。
滚动到
。
Disks 部分显示有关分配给虚拟机的磁盘的信息,以及用于
Add
或
Edit
磁盘的选项。
点
cdrom
设备的
Eject
选项。
Eject media from VM?
对话框将打开。
单击
Eject
。
在
接口中,附加的文件不再显示在
Disks
部分下。
模拟虚拟设备通常使用比硬件网络设备更多的 CPU 和内存。这可能会限制虚拟机的性能。但是,如果虚拟化主机上的任何设备都支持单根 I/O 虚拟化(SR-IOV),您可以使用此功能来提高设备性能,并可能还提高虚拟机的整体性能。
单根 I/O 虚拟化(SR-IOV)是一种规范,它允许单个 PCI Express(PCIe)设备向主机系统呈现多个独立的 PCI 设备,称为
虚拟功能
(VF)。这样的每个设备:
提供与原始 PCI 设备相同的或类似的服务。
出现在主机 PCI 总线的不同地址上。
可使用 VFIO 分配分配给不同的虚拟机。
例如,单个具有 SR-IOV 的网络设备可以向多个虚拟机显示 VF。虽然所有 VF 都使用相同的物理卡、相同的网络连接和相同的网线,但每个虚拟机都直接控制其自己的硬件网络设备,并且不使用主机的额外资源。
14.7.2. 将 SR-IOV 网络设备附加到虚拟机
要将 SR-IOV 网络设备附加到 Intel 或 AMD 主机上的虚拟机(VM),您必须从主机上支持 SR-IOV 的网络接口创建一个虚拟功能(VF),并将 VF 作为设备分配给指定虚拟机。详情请查看以下步骤。
您的主机的 CPU 和固件支持 I/O 内存管理单元(IOMMU)。
如果使用 Intel CPU,它必须支持 Intel 的直接 I/O 虚拟化技术(VT-d)。
如果使用 AMD CPU,则必须支持 AMD-Vi 功能。
主机系统使用访问控制服务(ACS)来为 PCIe 拓扑提供直接内存访问(DMA)隔离。与系统供应商一起验证这一点。
如需更多信息,请参阅
实施 SR-IOV 的硬件注意事项
。
物理网络设备支持 SR-IOV。要验证系统上的任何网络设备是否支持 SR-IOV,请使用
lspci -v
命令,并在输出中查找
单根 I/O 虚拟化(SR-IOV)
。
# lspci -v
[...]
02:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
Subsystem: Intel Corporation Gigabit ET Dual Port Server Adapter
Flags: bus master, fast devsel, latency 0, IRQ 16, NUMA node 0
Memory at fcba0000 (32-bit, non-prefetchable) [size=128K]
[...]
Capabilities: [150] Alternative Routing-ID Interpretation (ARI)
Capabilities: [160] Single Root I/O Virtualization (SR-IOV)
Kernel driver in use: igb
Kernel modules: igb
[...]
用于创建 VF 的主机网络接口正在运行。例如:要激活
eth1
接口并验证它正在运行:
# ip link set eth1 up
# ip link show eth1
8: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000
link/ether a0:36:9f:8f:3f:b8 brd ff:ff:ff:ff:ff:ff
vf 0 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
vf 1 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
vf 2 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
vf 3 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
要使 SR-IOV 设备分配正常工作,必须在主机 BIOS 和内核中启用 IOMMU 功能。要做到这一点:
在 Intel 主机上启用 VT-d:
使用
intel_iommu=on
和
iommu=pt
参数重新生成 GRUB 配置:
# grubby --args="intel_iommu=on iommu=pt" --update-kernel=ALL
重启主机。
在 AMD 主机上启用 AMD-Vi:
使用
iommu=pt
参数重新生成 GRUB 配置:
# grubby --args="iommu=pt" --update-kernel=ALL
重启主机。
可选:确认您的网络设备可以使用的最大 VF 数。为此,请使用以下命令,并将
eth1
替换为您的 SR-IOV 兼容的网络设备。
# cat /sys/class/net/eth1/device/sriov_totalvfs
使用以下命令来创建虚拟功能(VF):
# echo VF-number > /sys/class/net/network-interface/device/sriov_numvfs
在命令中,替换:
使用您要在其上创建 PF 的 VF 数替换 VF-number。
使用 VF 要创建的网络接口的名称替换 network-interface。
以下示例从 eth1 网络接口创建 2 个 VF:
# echo 2 > /sys/class/net/eth1/device/sriov_numvfs
确定已添加了 VF:
# lspci | grep Ethernet
82:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
82:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
82:10.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
82:10.2 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
通过为您用于创建 VF 的网络接口创建一个 udev 规则,使创建的 VF 持久化。例如,对于
eth1
接口,创建
/etc/udev/rules.d/eth1.rules
文件,并添加以下行:
ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ATTR{device/sriov_numvfs}="2"
这样可确保使用
ixgbe
驱动程序的两个 VF 在主机启动时可自动对
eth1
接口可用。如果不需要持久性 SR-IOV 设备,请跳过这一步。
目前,当试图在 Broadcom NetXtreme II BCM57810 适配器上保留 VF 时,上述设置无法正常工作。另外,基于这些适配器将 VF 附加到 Windows 虚拟机当前还不可靠。
将新添加的 VF 接口设备热插到正在运行的虚拟机中。
# virsh attach-interface testguest1 hostdev 0000:82:10.0 --managed --live --config
验证
-
如果过程成功,客户机操作系统会检测新的网络接口卡。
并非所有设备都可用于 SR-IOV。在 RHEL 9 中,以下设备已被测试并验证为与 SR-IOV 兼容。
Intel 82599ES 10 千兆以太网控制器 - 使用
ixgbe
驱动程序
Intel 以太网控制器 XL710 系列 - 使用
i40e
驱动程序
Intel 以太网络适配器 XXV710 - 使用
i40e
驱动程序
Intel 82576 千兆以太网控制器 - 使用
igb
驱动程序
Broadcom NetXtreme II BCM57810 - 使用
bnx2x
驱动程序
QSFP 的以太网控制器 E810-C - 使用
ice
驱动程序
SFC9220 10/40G 以太网控制器 - 使用
sfc
驱动程序
FastLinQ QL41000 系列 10/25/40/50GbE 控制器 - 使用
qede
驱动程序
Mellanox ConnectX-5 以太网适配器卡
Mellanox MT2892 系列 [ConnectX-6 Dx]
14.8. 将 DASD 设备附加到 IBM Z 中的虚拟机
通过使用
vfio-ccw
功能,您可以将直接访问存储设备(DASD)作为介质设备分配给 IBM Z 主机上的虚拟机(VM)。例如,虚拟机可以访问 z/OS 数据集,或向 z/OS 机器提供分配的 DASD。
您有一个 FICON 协议支持的具有 IBM Z 硬件架构的系统。
您有一个 Linux 操作系统的目标虚拟机。
driverctl
软件包已安装。
# dnf install driverctl
在主机上已载入了必要的
vfio
内核模块。
# lsmod | grep vfio
这个命令的输出必须包含以下模块:
vfio_ccw
vfio_mdev
vfio_iommu_type1
您有一个备用 DASD 设备供虚拟机独占使用,您知道设备的标识符。
以下流程使用
0.0.002c
作为示例。在执行这些命令时,请使用 DASD 设备的标识符替换
0.0.002c
。
获取 DASD 设备的子通道标识符。
# lscss -d 0.0.002c
Device Subchan. DevType CU Type Use PIM PAM POM CHPIDs
----------------------------------------------------------------------
0.0.002c 0.0.29a8 3390/0c 3990/e9 yes f0 f0 ff 02111221 00000000
在本例中,子频道标识符被检测为
0.0.29a8
。在此流程的以下命令中,将
0.0.29a8
替换为检测到的设备的子通道标识符。
如果上一步中的
lscss
命令只显示标头输出,且没有设备信息,请执行以下步骤:
从
cio_ignore
列表中删除该设备。
# cio_ignore -r 0.0.002c
在客户机操作系统中,
编辑虚拟机的内核命令行
,将带有
!
标记的设备标识符添加到以
cio_ignore=
开头的行(如果它还没有存在)。
cio_ignore=all,!condev,!0.0.002c
在主机上重复第 1 步,以获取子通道标识符。
将子通道绑定到
vfio_ccw
直通驱动程序。
# driverctl -b css set-override 0.0.29a8 vfio_ccw
这会将
0.0.29a8
子通道永久绑定到
vfio_ccw
,这意味着 DASD 在主机上将不可用。如果需要在主机上使用该设备,您必须首先删除到 'vfio_ccw'的自动绑定,并将子通道重新绑定到默认驱动程序:
#
driverctl -b css unset-override
0.0.29a8
定义并启动 DASD 介质设备。
# cat nodedev.xml
<device>
<parent>css_0_0_29a8</parent>
<capability type="mdev">
<type id="vfio_ccw-io"/>
</capability>
</device>
# virsh nodedev-define nodedev.xml
Node device 'mdev_30820a6f_b1a5_4503_91ca_0c10ba12345a_0_0_29a8' defined from 'nodedev.xml'
# virsh nodedev-start mdev_30820a6f_b1a5_4503_91ca_0c10ba12345a_0_0_29a8
Device mdev_30820a6f_b1a5_4503_91ca_0c10ba12345a_0_0_29a8 started
如果虚拟机正在运行,请关闭虚拟机。
显示之前定义的设备的 UUID,并保存它以供下一步使用。
# virsh nodedev-dumpxml mdev_30820a6f_b1a5_4503_91ca_0c10ba12345a_0_0_29a8
<device>
<name>mdev_30820a6f_b1a5_4503_91ca_0c10ba12345a_0_0_29a8</name>
<parent>css_0_0_29a8</parent>
<capability type='mdev'>
<type id='vfio_ccw-io'/>
<uuid>30820a6f-b1a5-4503-91ca-0c10ba12345a</uuid>
<iommuGroup number='0'/>
<attr name='assign_adapter' value='0x02'/>
<attr name='assign_domain' value='0x002b'/>
</capability>
</device>
将介质设备附加到虚拟机。为此,请使用
virsh edit
工具编辑虚拟机的 XML 配置,将以下部分添加到 XML 中,并将
uuid
值替换为您在上一步中获取的 UUID。
<hostdev mode='subsystem' type='mdev' model='vfio-ccw'>
<source>
<address uuid="30820a6f-b1a5-4503-91ca-0c10ba12345a"/>
</source>
</hostdev>
可选:将介质设备配置为在主机启动时自动启动。
# virsh nodedev-autostart mdev_30820a6f_b1a5_4503_91ca_0c10ba12345a_0_0_29a8
验证
-
确保正确配置了介质设备。
# virsh nodedev-info mdev_30820a6f_b1a5_4503_91ca_0c10ba12345a_0_0_29a8
Name: mdev_30820a6f_b1a5_4503_91ca_0c10ba12345a_0_0_29a8
Parent: css_0_0_0121
Active: yes
Persistent: yes
Autostart: yes
-
获取
libvirt
分配给中介 DASD 设备的标识符。为此,可显示虚拟机的 XML 配置,并查找
vfio-ccw
设备。
# virsh dumpxml vm-name
<domain>
[...]
<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-ccw'>
<source>
<address uuid='10620d2f-ed4d-437b-8aff-beda461541f9'/>
</source>
<alias name='hostdev0'/>
<address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0009'/>
</hostdev>
[...]
</domain>
在本例中,分配的设备的标识符是
0.0.0009
。
启动虚拟机并登录到其客户端操作系统。
在客户端操作系统中,确认 DASD 设备已被列出。例如:
# lscss | grep 0.0.0009
0.0.0009 0.0.0007 3390/0c 3990/e9 f0 f0 ff 12212231 00000000
-
在客户端操作系统中,在线设置设备。例如:
# chccwdev -e 0.0009
Setting device 0.0.0009 online
Done
14.9. 使用 web 控制台将 watchdog 设备附加到虚拟机
要强制虚拟机(VM)在停止响应时执行指定的操作,您可以将虚拟 watchdog 设备附加到虚拟机。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
您已在系统上安装了 Web 控制台虚拟机插件。如需更多信息,请参阅
第 8.2 节 “设置 web 控制台以管理虚拟机”
。
在命令行界面中,安装 watchdog 服务。
#
dnf install watchdog
关闭虚拟机。
将 watchdog 服务添加到虚拟机。
#
virt-xml
vmname
--add-device --watchdog action=reset --update
运行虚拟机。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在 web 控制台的
界面中,点您要向其添加 watchdog 设备的虚拟机。
点 Overview 窗格中
Watchdog
字段旁边的
add
。
此时会出现
Add watchdog device type
对话框。
如果虚拟机停止响应,选择您希望 watchdog 设备执行的操作。
点
添加
。
您选择的操作在 Overview 窗格中的
Watchdog
字段旁边可见。
14.10. 将 PCI 设备附加到 IBM Z 上的虚拟机
通过使用
vfio-pci
设备驱动程序,您可以在 pass-through 模式下将 PCI 设备分配给 IBM Z 主机上的虚拟机(VM)。例如,这使虚拟机可以使用 NVMe 闪存磁盘来处理数据库。
您有一个具有 IBM Z 硬件架构的主机系统。
您有一个 Linux 操作系统的目标虚拟机。
在主机上已载入了必要的
vfio
内核模块。
# lsmod | grep vfio
这个命令的输出必须包含以下模块:
vfio_pci
vfio_pci_core
vfio_iommu_type1
获取您要使用的设备的 PCI 地址标识符。
# lspci -nkD
0000:00:00.0 0000: 1014:04ed
Kernel driver in use: ism
Kernel modules: ism
0001:00:00.0 0000: 1014:04ed
Kernel driver in use: ism
Kernel modules: ism
0002:00:00.0 0200: 15b3:1016
Subsystem: 15b3:0062
Kernel driver in use: mlx5_core
Kernel modules: mlx5_core
0003:00:00.0 0200: 15b3:1016
Subsystem: 15b3:0062
Kernel driver in use: mlx5_core
Kernel modules: mlx5_core
打开您要将 PCI 设备附加到的虚拟机的 XML 配置。
# virsh edit vm-name
将以下
<hostdev>
配置添加到 XML 文件的
<devices>
部分。
将
address
行上的值替换为设备的 PCI 地址。例如,如果设备地址是
0003:00:00.0
,请使用以下配置:
<hostdev mode="subsystem" type="pci" managed="yes">
<driver name="vfio"/>
<source>
<address domain="0x0003" bus="0x00" slot="0x00" function="0x0"/>
</source>
<address type="pci"/>
</hostdev>
可选:要修改客户机操作系统如何检测 PCI 设备,您还可以将
<zpci>
子元素添加到
<address>
元素中。在
<zpci>
行中,您可以调整
uid
和
fid
值,这会修改客户机操作系统中设备的 PCI 地址和功能 ID。
<hostdev mode="subsystem" type="pci" managed="yes">
<driver name="vfio"/>
<source>
<address domain="0x0003" bus="0x00" slot="0x00" function="0x0"/>
</source>
<address type="pci">
<zpci uid="0x0008" fid="0x001807"/>
</address>
</hostdev>
在本例中:
uid="0x0008"
将虚拟机中设备的域 PCI 地址设置为
0008:00:00.0
。
fid="0x001807"
将设备的插槽值设置为
0x001807
。因此,虚拟机文件系统中的设备配置被保存到
/sys/bus/pci/slots/00001087/address
中。
如果没有指定这些值,
libvirt
会自动配置它们。
保存 XML 配置。
如果虚拟机正在运行,请将其关闭。
# virsh shutdown vm-name
验证
-
启动虚拟机并登录到其客户机操作系统。
在客户端操作系统中,确认列出了 PCI 设备。
例如,如果设备地址是
0003:00:00.0
,请使用以下命令:
# lspci -nkD | grep 0003:00:00.0
0003:00:00.0 8086:9a09 (rev 01)
虚拟机(VM)与物理机一样,需要用于数据、程序和系统文件的存储。作为虚拟机管理员,您可以将物理或基于网络的存储分配给虚拟机作为虚拟存储。您还可以修改存储是如何呈现给虚拟机的,无论底层硬件是什么。
以下小节提供有关不同类型的虚拟机存储、它们是如何工作的,以及如何使用 CLI 或 Web 控制台管理它们的信息。
如果您对虚拟机(VM)存储不熟悉,或者不确定它是如何工作的,以下章节提供了有关虚拟机存储各个组件的概括介绍、它是如何工作的、管理基础知识以及红帽提供的支持的解决方案。
您可以找到以下相关信息:
使用 libvirt 管理存储
虚拟机存储概述
支持和不支持的存储池类型
存储池是由
libvirt
管理的文件、目录或存储设备,来为虚拟机(VM)提供存储。您可以将存储池划分为存储卷,用于存储虚拟机镜像或作为额外存储附加到虚拟机。
此外,多个虚拟机可以共享同一个存储池,从而更好地分配存储资源。
存储池可以是持久的或临时的:
主机系统重启后,持久性存储池会保留下来。您可以使用
virsh pool-define
来创建持久性存储池。
临时存储池仅在主机重启前存在。您可以使用
virsh pool-create
命令来创建临时性存储池。
存储池可以是本地的也可以基于网络的(共享):
本地存储池
本地存储池直接附加到主机服务器。它们包括本地设备上的本地目录、直接附加磁盘、物理分区和逻辑卷管理器(LVM)卷组。
本地存储池可用于开发、测试,以及不需要迁移或有大量虚拟机的小型部署。
网络(共享)存储池
网络存储池包括使用标准协议在网络上共享的存储设备。
存储池划分为
存储卷
。存储卷是物理分区、LVM 逻辑卷、基于文件的磁盘映像,以及由
libvirt
处理的其他存储类型的抽象。无论底层硬件是什么,存储卷都以本地存储设备(如磁盘)的形式出现在虚拟机中。
在主机上,存储卷通过其名称以及从中派生的存储池的标识符来引用。在
virsh
命令行上,它采用
--pool
storage_pool
volume_name
的形式。
例如:要在
guest_images
池中显示名为
firstimage
的卷信息。
# virsh vol-info --pool guest_images firstimage
Name: firstimage
Type: block
Capacity: 20.00 GB
Allocation: 20.00 GB
15.1.3. 使用 libvirt 进行存储管理
通过使用
libvirt
远程协议,您可以管理虚拟机存储的所有方面。这些操作也可以在远程主机上执行。因此,使用
libvirt
的管理应用程序(如 RHEL web 控制台)可用来执行配置虚拟机存储的所有所需的任务。
您可以使用
libvirt
API 来查询存储池中卷的列表,或者获取有关该存储池中容量、分配和可用存储的信息。对于支持它的存储池,您还可以使用
libvirt
API 来创建、克隆、调整大小和删除存储卷。另外,您可以使用
libvirt
API 来上传数据到存储卷,从存储卷下载数据,或者从存储卷中删除数据。
为了说明用于管理存储的可用选项,以下示例介绍了使用
mount -t nfs nfs.example.com:/path/to/share /path/to/data
的 NFS 服务器的一个示例。
作为存储管理员:
您可以在虚拟化主机上定义 NFS 存储池来描述导出的服务器路径和客户端目标路径。因此,
libvirt
可以在
libvirt
启动时自动挂载存储,或者在
libvirt
运行时根据需要自动挂载存储。
您可以根据名称简单地将存储池和存储卷添加到虚拟机。您不需要添加卷的目标路径。因此,即使目标客户端路径有变化,也不会影响虚拟机。
您可以将存储池配置为自动启动。执行此操作时,
libvirt
会在
libvirt
启动时自动将 NFS 共享磁盘挂载到指定的目录上。
libvirt
将共享挂载到指定的目录上,类似于命令
mount nfs.example.com:/path/to/share /vmdata
。
您可以使用
libvirt
API 查询存储卷路径。这些存储卷基本上是 NFS 共享磁盘中的文件。然后,您可以将这些路径复制到虚拟机 XML 定义中的 部分,该定义描述了虚拟机块设备的源存储。
对于 NFS,您可以使用一个使用
libvirt
API 的应用程序来在存储池中创建和删除存储卷(NFS 共享中的文件),不超过池大小的限制(共享的存储容量)。
请注意,并非所有存储池类型都支持创建和删除卷。
当不再需要时,您可以停止存储池。停止存储池(
pool-destroy
) 可撤销启动操作,在这种情况下,即卸载 NFS 共享。销毁操作不会修改共享中的数据,即使该命令的名称看似象要删除。如需更多信息,请参阅
man virsh
。
支持的存储池类型
以下是 RHEL 支持的存储池类型列表:
基于目录的存储池
基于磁盘的存储池
基于分区的存储池
基于 iSCSI 的存储池
基于 LVM 的存储池
基于 NFS 的存储池
使用 vHBA 设备基于 SCSI 的存储池
基于多路径的存储池
基于 RBD 的存储池
不支持的存储池类型
以下是 RHEL 不支持的
libvirt
存储池类型的列表:
基于 Sheepdog 的存储池
基于 Vstorage 的存储池
基于 ZFS 的存储池
iscsi-direct 存储池
glusterfs 存储池
您可以使用 CLI 管理存储池的以下方面来为虚拟机分配存储:
查看存储池信息
创建存储池
使用 CLI 创建基于目录的存储池
使用 CLI 创建基于磁盘的存储池
使用 CLI 创建基于文件系统的存储池
使用 CLI 创建基于 iSCSI 的存储池
使用 CLI 创建基于 LVM 的存储池
使用 CLI 创建基于 NFS 的存储池
使用 CLI 创建带有 vHBA 设备的基于 SCSI 的存储池
删除存储池
15.2.2. 使用 CLI 创建基于目录的存储池
基于目录的存储池是基于现有挂载的文件系统中的目录。例如,当您想要将文件系统上的剩余空间用于其他用途时,这非常有用。您可以使用
virsh
工具来创建基于目录的存储池。
确定您的管理程序支持目录存储池:
# virsh pool-capabilities | grep "'dir' supported='yes'"
如果命令显示任何输出结果,则代表支持目录池。
创建存储池
使用
virsh pool-define-as
命令来定义和创建目录类型的存储池。例如,要创建使用
/guest_images
目录的名为
guest_images_dir
的存储池:
# virsh pool-define-as guest_images_dir dir --target "/guest_images"
Pool guest_images_dir defined
如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请参阅
基于目录的存储池参数
。
创建存储池目标路径
使用
virsh pool-build
命令,来为事先格式化的文件系统存储池创建存储池目标路径,初始化存储源设备,并定义数据格式。
# virsh pool-build guest_images_dir
Pool guest_images_dir built
# ls -la /guest_images
total 8
drwx------. 2 root root 4096 May 31 19:38 .
dr-xr-xr-x. 25 root root 4096 May 31 19:38 ..
验证是否已创建池
使用
virsh pool-list
命令来验证池是否已被创建。
# virsh pool-list --all
Name State Autostart
-----------------------------------------
default active yes
guest_images_dir inactive no
启动存储池
使用
virsh pool-start
命令来挂载存储池。
# virsh pool-start guest_images_dir
Pool guest_images_dir started
virsh pool-start
命令仅适用于持久性存储池。临时存储池创建时会自动启动。
可选:打开自动启动。
默认情况下,使用
virsh
命令定义的存储池不会被设置为在每次虚拟化服务启动时自动启动。使用
virsh pool-autostart
命令将存储池配置为自动启动。
# virsh pool-autostart guest_images_dir
Pool guest_images_dir marked as autostarted
验证
-
使用
virsh pool-info
命令来验证存储池是否处于
running
状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。
# virsh pool-info guest_images_dir
Name: guest_images_dir
UUID: c7466869-e82a-a66c-2187-dc9d6f0877d0
State: running
Persistent: yes
Autostart: yes
Capacity: 458.39 GB
Allocation: 197.91 MB
Available: 458.20 GB
15.2.3. 使用 CLI 创建基于磁盘的存储池
在基于磁盘的存储池中,池是基于磁盘分区的。例如,当您希望整个磁盘分区专门用于虚拟机(VM)存储时,这非常有用。您可以使用
virsh
工具来创建基于磁盘的存储池。
确定您的管理程序支持基于磁盘的存储池:
# virsh pool-capabilities | grep "'disk' supported='yes'"
如果命令显示任何输出结果,则代表支持基于磁盘的池。
准备一个设备,以此作为存储池的基础。因此,最好使用分区(例如
/dev/sdb1
)或 LVM 卷。如果您提供了一个虚拟机,对整个磁盘或块设备(例如:
/dev/sdb
)具有写权限,则虚拟机可以对其进行分区,或者在其上创建自己的 LVM 组。这可能会导致主机上的系统错误。
但是,如果您需要为存储池使用整个块设备,红帽建议保护设备上的任何重要分区不受
os-prober
功能的影响。要做到这一点,编辑
/etc/default/grub
文件,并应用以下配置之一:
禁用
os-prober
。
GRUB_DISABLE_OS_PROBER=true
防止
os-prober
发现特定的分区。例如:
GRUB_OS_PROBER_SKIP_LIST="5ef6313a-257c-4d43@/dev/sdb1"
在创建存储池前,备份所选存储设备上的任何数据。根据所使用的
libvirt
版本,给存储池指定专用的磁盘可能会重新格式化并擦除当前存储在磁盘设备上的所有数据。
创建存储池
使用
virsh pool-define-as
命令来定义和创建磁盘类型的存储池。以下示例创建一个名为
guest_images_disk
的存储池,它使用
/dev/sdb
设备,并挂载在 /dev 目录。
# virsh pool-define-as guest_images_disk disk --source-format=gpt --source-dev=/dev/sdb --target /dev
Pool guest_images_disk defined
如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请参阅
基于磁盘的存储池参数
。
创建存储池目标路径
使用
virsh pool-build
命令,为事先格式化的文件系统存储池创建存储池目标路径、初始化存储源设备,并定义数据格式。
# virsh pool-build guest_images_disk
Pool guest_images_disk built
只有基于磁盘、基于文件系统和逻辑存储池才需要构建目标路径。如果
libvirt
检测到源存储设备的数据格式与所选存储池类型不同,则构建会失败,除非指定了
overwrite
选项。
验证是否已创建池
使用
virsh pool-list
命令来验证池是否已被创建。
# virsh pool-list --all
Name State Autostart
-----------------------------------------
default active yes
guest_images_disk inactive no
启动存储池
使用
virsh pool-start
命令来挂载存储池。
# virsh pool-start guest_images_disk
Pool guest_images_disk started
virsh pool-start
命令仅适用于持久性存储池。临时存储池创建时会自动启动。
可选:打开自动启动。
默认情况下,使用
virsh
命令定义的存储池不会被设置为在每次虚拟化服务启动时自动启动。使用
virsh pool-autostart
命令将存储池配置为自动启动。
# virsh pool-autostart guest_images_disk
Pool guest_images_disk marked as autostarted
验证
-
使用
virsh pool-info
命令来验证存储池是否处于
running
状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。
# virsh pool-info guest_images_disk
Name: guest_images_disk
UUID: c7466869-e82a-a66c-2187-dc9d6f0877d0
State: running
Persistent: yes
Autostart: yes
Capacity: 458.39 GB
Allocation: 197.91 MB
Available: 458.20 GB
15.2.4. 使用 CLI 创建基于文件系统的存储池
当您要在未挂载的文件系统上创建存储池时,请使用基于文件系统的存储池。此存储池基于给定的文件系统挂载点。您可以使用
virsh
工具来创建基于文件系统的存储池。
确保您的管理程序支持基于文件系统的存储池:
# virsh pool-capabilities | grep "'fs' supported='yes'"
如果该命令显示任何输出结果,则代表支持基于文件的池。
准备一个设备,以此作为存储池的基础。因此,最好使用分区(例如
/dev/sdb1
)或 LVM 卷。如果您提供了一个虚拟机,对整个磁盘或块设备(例如:
/dev/sdb
)具有写权限,则虚拟机可以对其进行分区,或者在其上创建自己的 LVM 组。这可能会导致主机上的系统错误。
但是,如果您需要为存储池使用整个块设备,红帽建议保护设备上的任何重要分区不受
os-prober
功能的影响。要做到这一点,编辑
/etc/default/grub
文件,并应用以下配置之一:
禁用
os-prober
。
GRUB_DISABLE_OS_PROBER=true
防止
os-prober
发现特定的分区。例如:
GRUB_OS_PROBER_SKIP_LIST="5ef6313a-257c-4d43@/dev/sdb1"
流程
-
创建存储池
使用
virsh pool-define-as
命令定义和创建文件系统类型的存储池。例如,要创建一个名为
guest_images_fs
的存储池,它使用
/dev/sdc1
分区,并挂载在 /guest_images 目录上:
# virsh pool-define-as guest_images_fs fs --source-dev /dev/sdc1 --target /guest_images
Pool guest_images_fs defined
如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请参阅
基于文件系统的存储池参数
。
定义存储池目标路径
使用
virsh pool-build
命令,为事先格式化的文件系统存储池创建存储池目标路径、初始化存储源设备,并定义数据格式。
# virsh pool-build guest_images_fs
Pool guest_images_fs built
# ls -la /guest_images
total 8
drwx------. 2 root root 4096 May 31 19:38 .
dr-xr-xr-x. 25 root root 4096 May 31 19:38 ..
-
验证是否已创建池
使用
virsh pool-list
命令来验证池是否已被创建。
# virsh pool-list --all
Name State Autostart
-----------------------------------------
default active yes
guest_images_fs inactive no
-
启动存储池
使用
virsh pool-start
命令来挂载存储池。
# virsh pool-start guest_images_fs
Pool guest_images_fs started
virsh pool-start
命令仅适用于持久性存储池。临时存储池创建时会自动启动。
可选:打开自动启动
默认情况下,使用
virsh
命令定义的存储池不会被设置为在每次虚拟化服务启动时自动启动。使用
virsh pool-autostart
命令将存储池配置为自动启动。
# virsh pool-autostart guest_images_fs
Pool guest_images_fs marked as autostarted
验证
-
使用
virsh pool-info
命令来验证存储池是否处于
running
状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。
# virsh pool-info guest_images_fs
Name: guest_images_fs
UUID: c7466869-e82a-a66c-2187-dc9d6f0877d0
State: running
Persistent: yes
Autostart: yes
Capacity: 458.39 GB
Allocation: 197.91 MB
Available: 458.20 GB
-
验证文件系统的目标路径中存在
lost+found
目录,这表示挂载该设备。
# mount | grep /guest_images
/dev/sdc1 on /guest_images type ext4 (rw)
# ls -la /guest_images
total 24
drwxr-xr-x. 3 root root 4096 May 31 19:47 .
dr-xr-xr-x. 25 root root 4096 May 31 19:38 ..
drwx------. 2 root root 16384 May 31 14:18 lost+found
15.2.5. 使用 CLI 创建基于 iSCSI 的存储池
互联网小型计算机系统接口(iSCSI)是基于 IP 的存储网络标准,用于连接数据存储设施。如果要在 iSCSI 服务器上拥有一个存储池,您可以使用
virsh
工具来创建基于 iSCSI 的存储池。
确定您的管理程序支持基于 iSCSI 的存储池:
# virsh pool-capabilities | grep "'iscsi' supported='yes'"
如果该命令显示任何输出结果,则代表支持基于 iSCSI 的池。
创建存储池
使用
virsh pool-define-as
命令来定义和创建 iSCSI 类型的存储池。例如,要创建一个名为
guest_images_iscsi
的存储池,它使用
server1.example.com
上的
iqn.2010-05.com.example.server1:iscsirhel7guest
IQN,并挂载在
/dev/disk/by-path
路径上:
# virsh pool-define-as --name guest_images_iscsi --type iscsi --source-host server1.example.com --source-dev iqn.2010-05.com.example.server1:iscsirhel7guest --target /dev/disk/by-path
Pool guest_images_iscsi defined
如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看
基于 iSCSI 的存储池参数
。
验证是否已创建池
使用
virsh pool-list
命令来验证池是否已被创建。
# virsh pool-list --all
Name State Autostart
-----------------------------------------
default active yes
guest_images_iscsi inactive no
启动存储池
使用
virsh pool-start
命令来挂载存储池。
# virsh pool-start guest_images_iscsi
Pool guest_images_iscsi started
virsh pool-start
命令仅适用于持久性存储池。临时存储池创建时会自动启动。
可选:打开自动启动。
默认情况下,使用
virsh
命令定义的存储池不会被设置为在每次虚拟化服务启动时自动启动。使用
virsh pool-autostart
命令将存储池配置为自动启动。
# virsh pool-autostart guest_images_iscsi
Pool guest_images_iscsi marked as autostarted
验证
-
使用
virsh pool-info
命令来验证存储池是否处于
running
状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。
# virsh pool-info guest_images_iscsi
Name: guest_images_iscsi
UUID: c7466869-e82a-a66c-2187-dc9d6f0877d0
State: running
Persistent: yes
Autostart: yes
Capacity: 458.39 GB
Allocation: 197.91 MB
Available: 458.20 GB
15.2.6. 使用 CLI 创建基于 LVM 的存储池
如果要拥有一个存储池,其是 LVM 卷组的一部分,您可以使用
virsh
工具来创建基于 LVM 的存储池。
在创建基于 LVM 的存储池前请注意以下几点:
基于 LVM 的存储池不能为 LVM 提供完整的灵活性。
libvirt
支持精简逻辑卷,但不提供精简存储池的功能。
基于 LVM 的存储池是卷组。您可以使用
virsh
工具创建卷组,但使用这种方法,您在创建的卷组中只能有一个设备。要创建具有多个设备的卷组,请使用 LVM 工具,请参阅
如何在 Linux 中 使用 LVM 创建卷组
。
有关卷组的详情,请参考
Red Hat Enterprise Linux Logical Volume Manager Administration Guide
。
基于 LVM 的存储池需要一个完整磁盘分区。如果您使用
virsh
命令激活一个新分区或设备,分区将被格式化,所有数据都被清除。在这些过程中,如果您使用主机的现有卷组,则不会删除任何内容。
确定您的管理程序支持基于 LVM 的存储池:
# virsh pool-capabilities | grep "'logical' supported='yes'"
如果命令显示任何输出结果,则支持基于 LVM 的池。
创建存储池
使用
virsh pool-define-as
命令来定义和创建 LVM 类型的存储池。例如,以下命令创建名为
guest_images_lvm
的存储池,该池使用
lvm_vg
卷组,并挂载在
/dev/lvm_vg
目录上:
# virsh pool-define-as guest_images_lvm logical --source-name lvm_vg --target /dev/lvm_vg
Pool guest_images_lvm defined
如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看
基于 LVM 的存储池参数
。
验证是否已创建池
使用
virsh pool-list
命令来验证池是否已被创建。
# virsh pool-list --all
Name State Autostart
-------------------------------------------
default active yes
guest_images_lvm inactive no
启动存储池
使用
virsh pool-start
命令来挂载存储池。
# virsh pool-start guest_images_lvm
Pool guest_images_lvm started
virsh pool-start
命令仅适用于持久性存储池。临时存储池创建时会自动启动。
可选:打开自动启动。
默认情况下,使用
virsh
命令定义的存储池不会被设置为在每次虚拟化服务启动时自动启动。使用
virsh pool-autostart
命令将存储池配置为自动启动。
# virsh pool-autostart guest_images_lvm
Pool guest_images_lvm marked as autostarted
验证
-
使用
virsh pool-info
命令来验证存储池是否处于
running
状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。
# virsh pool-info guest_images_lvm
Name: guest_images_lvm
UUID: c7466869-e82a-a66c-2187-dc9d6f0877d0
State: running
Persistent: yes
Autostart: yes
Capacity: 458.39 GB
Allocation: 197.91 MB
Available: 458.20 GB
15.2.7. 使用 CLI 创建基于 NFS 的存储池
如果要在网络文件系统(NFS)服务器上拥有一个存储池,您可以使用
virsh
工具来创建基于 NFS 的存储池。
确定您的管理程序支持基于 NFS 的存储池:
# virsh pool-capabilities | grep "<value>nfs</value>"
如果该命令显示任何输出结果,则代表支持基于 NFS 的池。
创建存储池
使用 virsh
pool-define-as
命令来定义和创建 NFS 类型的存储池。例如,要创建一个名为
guest_images_netfs
的存储池,它使用 IP 为
111.222.111.222
的 NFS 服务器,使用目标目录
/var/lib/libvirt/images/nfspool
挂载在服务器目录
/home/net_mount
上:
# virsh pool-define-as --name guest_images_netfs --type netfs --source-host='111.222.111.222' --source-path='/home/net_mount' --source-format='nfs' --target='/var/lib/libvirt/images/nfspool'
如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看
基于 NFS 的存储池参数
。
验证是否已创建池
使用
virsh pool-list
命令来验证池是否已被创建。
# virsh pool-list --all
Name State Autostart
-----------------------------------------
default active yes
guest_images_netfs inactive no
启动存储池
使用
virsh pool-start
命令来挂载存储池。
# virsh pool-start guest_images_netfs
Pool guest_images_netfs started
virsh pool-start
命令仅适用于持久性存储池。临时存储池创建时会自动启动。
可选:打开自动启动。
默认情况下,使用
virsh
命令定义的存储池不会被设置为在每次虚拟化服务启动时自动启动。使用
virsh pool-autostart
命令将存储池配置为自动启动。
# virsh pool-autostart guest_images_netfs
Pool guest_images_netfs marked as autostarted
验证
-
使用
virsh pool-info
命令来验证存储池是否处于
running
状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。
# virsh pool-info guest_images_netfs
Name: guest_images_netfs
UUID: c7466869-e82a-a66c-2187-dc9d6f0877d0
State: running
Persistent: yes
Autostart: yes
Capacity: 458.39 GB
Allocation: 197.91 MB
Available: 458.20 GB
15.2.8. 使用 CLI 创建带有 vHBA 设备的基于 SCSI 的存储池
如果要在小型计算机系统接口(SCSI)设备上有一个存储池,您的主机必须能够使用虚拟主机总线适配器(vHBA)连接到 SCSI 设备。然后,您可以使用
virsh
工具来创建基于 SCSI 的存储池。
确定您的管理程序支持基于 SCSI 的存储池:
# virsh pool-capabilities | grep "'scsi' supported='yes'"
如果该命令显示任何输出结果,则代表支持基于 SCSI 的池。
在使用 vHBA 设备创建基于 SCSI 的存储池前,先创建一个 vHBA。如需更多信息,请参阅
创建 vHBA
。
创建存储池
使用
virsh pool-define-as
命令定义并创建使用 vHBA 的 SCSI 存储池。例如,以下命令会创建一个名为
guest_images_vhba
的存储池,它使用由
scsi_host3
父适配器识别的 vHBA、全球范围的端口号
5001a4ace3ee047d
,以及全球范围的节点号
5001a4a93526d0a1
。存储池挂载在
/dev/disk/
目录上:
# virsh pool-define-as guest_images_vhba scsi --adapter-parent scsi_host3 --adapter-wwnn 5001a4a93526d0a1 --adapter-wwpn 5001a4ace3ee047d --target /dev/disk/
Pool guest_images_vhba defined
如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看
使用 vHBA 设备 的基于 SCSI 的存储池的参数
。
验证是否已创建池
使用
virsh pool-list
命令来验证池是否已被创建。
# virsh pool-list --all
Name State Autostart
-----------------------------------------
default active yes
guest_images_vhba inactive no
启动存储池
使用
virsh pool-start
命令来挂载存储池。
# virsh pool-start guest_images_vhba
Pool guest_images_vhba started
virsh pool-start
命令仅适用于持久性存储池。临时存储池创建时会自动启动。
可选:打开自动启动。
默认情况下,使用
virsh
命令定义的存储池不会被设置为在每次虚拟化服务启动时自动启动。使用
virsh pool-autostart
命令将存储池配置为自动启动。
# virsh pool-autostart guest_images_vhba
Pool guest_images_vhba marked as autostarted
验证
-
使用
virsh pool-info
命令来验证存储池是否处于
running
状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。
# virsh pool-info guest_images_vhba
Name: guest_images_vhba
UUID: c7466869-e82a-a66c-2187-dc9d6f0877d0
State: running
Persistent: yes
Autostart: yes
Capacity: 458.39 GB
Allocation: 197.91 MB
Available: 458.20 GB
要从主机系统中删除存储池,您必须停止池,并删除其 XML 定义。
使用
virsh pool-list
命令列出定义的存储池。
# virsh pool-list --all
Name State Autostart
-------------------------------------------
default active yes
Downloads active yes
RHEL-Storage-Pool active yes
使用
virsh pool-destroy
命令停止您要删除的存储池。
# virsh pool-destroy Downloads
Pool Downloads destroyed
可选:对于某些类型的存储池,您可以使用
virsh pool-delete
命令删除存储池所在的目录。请注意,为此,目录必须为空。
# virsh pool-delete Downloads
Pool Downloads deleted
使用
virsh pool-undefine
命令删除存储池的定义。
# virsh pool-undefine Downloads
Pool Downloads has been undefined
通过使用 RHEL web 控制台,您可以管理存储池,来将存储分配给虚拟机。
您可以使用 Web 控制台:
查看存储池信息
。
创建存储池:
创建基于目录的存储池
。
创建基于 NFS 的存储池
。
创建基于 iSCSI 的存储池
。
创建基于 LVM 的存储池
。
删除存储池
。
取消激活存储池
。
15.3.2. 使用 Web 控制台创建基于目录的存储池
基于目录的存储池是基于现有挂载的文件系统中的目录。例如,当您想要将文件系统上的剩余空间用于其他用途时,这非常有用。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在 RHEL web 控制台中,点
Virtual Machines
选项卡中的
Storage pool
。
此时会出现
存储池
窗口,显示配置的存储池列表(若有)。
单击
Create storage pool
。
此时会出现
Create 存储池
对话框。
输入存储池的名称。
在
Type
下拉菜单中选择
Filesystem directory
。
如果您没有在下拉菜单中选择
Filesystem 目录
选项,则您的管理程序不支持基于目录的存储池。
输入以下信息:
Target path
- 存储池的位置。
启动
」 - 主机引导时是否启动存储池。
点击
Create
。
创建存储池时,
Create Storage Pool
对话框将关闭,新的存储池会出现在存储池列表中。
了解存储池
使用 Web 控制台查看存储池信息
15.3.3. 使用 Web 控制台创建基于 NFS 的存储池
基于 NFS 的存储池是基于服务器上托管的文件系统。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在 RHEL web 控制台中,点
Virtual Machines
选项卡中的
Storage pool
。
此时会出现
存储池
窗口,显示配置的存储池列表(若有)。
单击
Create storage pool
。
此时会出现
Create 存储池
对话框。
输入存储池的名称。
在
Type
下拉菜单中选择
Network File System
。
如果您在下拉菜单中选择
网络文件系统
选项,则您的管理程序不支持基于 NFS 的存储池。
输入其他信息:
目标路径
- 指定目标的路径。这将是用于存储池的路径。
主机
- 挂载点所在的网络服务器的主机名。这可以是主机名或 IP 地址。
源路径
- 网络服务器中使用的目录。
启动
」 - 主机引导时是否启动存储池。
点击
Create
。
已创建存储池。这会关闭
Create storage pool
对话框,新的存储池会出现在存储池列表中。
了解存储池
使用 Web 控制台查看存储池信息
15.3.4. 使用 Web 控制台创建基于 iSCSI 的存储池
基于 iSCSI 的存储池是基于互联网小型计算机系统接口(iSCSI),这是一种基于 IP 的存储网络标准,用于连接数据存储设施。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在 RHEL web 控制台中,点
Virtual Machines
选项卡中的
Storage pool
。
此时会出现
存储池
窗口,显示配置的存储池列表(若有)。
单击
Create storage pool
。
此时会出现
Create 存储池
对话框。
输入存储池的名称。
在
Type
下拉菜单中选择
iSCSI 目标
。
输入其他信息:
目标路径
- 指定目标的路径。这将是用于存储池的路径。
主机
- ISCSI 服务器的主机名或 IP 地址。
源路径
- iSCSI 目标的唯一 iSCSI 限定名称(IQN)。
启动
」 - 主机引导时是否启动存储池。
点击
Create
。
已创建存储池。这会关闭
Create storage pool
对话框,新的存储池会出现在存储池列表中。
了解存储池
使用 Web 控制台查看存储池信息
15.3.5. 使用 Web 控制台创建基于磁盘的存储池
基于磁盘的存储池使用整个磁盘分区。
根据所使用的 libvirt 版本,在存储池中指定一个磁盘可能会重新格式化并清除当前存储在磁盘设备上的所有数据。强烈建议您在创建存储池前备份存储设备中的数据。
当整个磁盘或块设备传递给虚拟机时,虚拟机可能会对其分区或者创建自己的 LVM 组。这可能导致主机机器检测到这些分区或者 LVM 组并导致错误。
在手动创建分区或 LVM 组并将其传递给虚拟机时,也可以发生这些错误。
要避免这些错误,请改为使用基于文件的存储池。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在 RHEL web 控制台中,点
Virtual Machines
选项卡中的
Storage pool
。
此时会出现
存储池
窗口,显示配置的存储池列表(若有)。
单击
Create storage pool
。
此时会出现
Create 存储池
对话框。
输入存储池的名称。
在
Type
下拉菜单中选择
物理磁盘设备
。
如果您在下拉菜单中选择
物理磁盘设备
选项,则您的管理程序不支持基于磁盘的存储池。
输入其他信息:
目标路径
- 指定目标设备的路径。这将是用于存储池的路径。
源路径
- 指定存储设备的路径。例如:
/dev/sdb
。
格式
- 分区表的类型。
启动
」 - 主机引导时是否启动存储池。
点击
Create
。
已创建存储池。这会关闭
Create storage pool
对话框,新的存储池会出现在存储池列表中。
了解存储池
使用 Web 控制台查看存储池信息
15.3.6. 使用 Web 控制台创建基于 LVM 的存储池
基于 LVM 的存储池是基于卷组的,您可以使用逻辑卷管理器(LVM)来管理它。卷组是多个物理卷的组合,它可创建单个存储结构。
基于 LVM 的存储池不能为 LVM 提供完整的灵活性。
libvirt
支持精简逻辑卷,但不提供精简存储池的功能。
基于 LVM 的存储池需要一个完整磁盘分区。如果您使用
virsh
命令激活一个新分区或设备,分区将被格式化,所有数据都被清除。在这些过程中,如果您使用主机的现有卷组,则不会删除任何内容。
要创建具有多个设备的卷组,请使用 LVM 工具,请参阅
如何在 Linux 中 使用 LVM 创建卷组
。
有关卷组的详情,请参考
Red Hat Enterprise Linux Logical Volume Manager Administration Guide
。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在 RHEL web 控制台中,点
Virtual Machines
选项卡中的
Storage pool
。
此时会出现
存储池
窗口,显示配置的存储池列表(若有)。
单击
Create storage pool
。
此时会出现
Create 存储池
对话框。
输入存储池的名称。
在
Type
下拉菜单中选择
LVM 卷组
。
如果您在下拉菜单中选择
LVM 卷组
选项,则您的管理程序不支持基于 LVM 的存储池。
输入其他信息:
源卷组
- 要使用的 LVM 卷组名称。
启动
」 - 主机引导时是否启动存储池。
点击
Create
。
已创建存储池。这会关闭
Create storage pool
对话框,新的存储池会出现在存储池列表中。
了解存储池
使用 Web 控制台查看存储池信息
如果您不再需要存储池,或者要释放主机或网络上的资源以提高系统性能,您可以删除存储池。
除非明确指定,否则删除存储池不会同时删除该池中的存储卷。
如果您只想临时取消激活存储池而不是删除它,
请参阅使用 Web 控制台取消激活存储池
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
从虚拟机中分离磁盘
。
如果要删除关联的存储卷以及池,激活这个池。
点
Virtual Machines
选项卡上的
Storage Pools
。
此时会出现
存储池
窗口,显示配置的存储池列表。
点您要删除的存储池的 Menu 按钮
⋮
,然后点
Delete
。
此时会出现确认对话框。
可选:要删除池中的存储卷,请在对话框中选择相应的复选框。
点击
Delete
。
存储池已删除。如果您已在上一步中选择了复选框,则相关的存储卷也会被删除。
了解存储池
使用 Web 控制台查看存储池信息
如果您不想永久删除存储池,您可以临时取消激活它。
当您取消激活存储池时,无法在那个池中创建新卷。但是,在池中拥有卷的任何虚拟机(VM)将继续运行。例如,如果要限制池中可以创建的卷数量来提高系统性能,这非常有用。
要使用 RHEL web 控制台停用一个存储池,请参阅以下流程。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
点击 Virtual Machines 选项卡顶部的
Storage Pools
。此时会出现存储池窗口,显示配置的存储池列表。
点存储池行中的
Deactivate
。
存储池将停用。
了解存储池
使用 Web 控制台查看存储池信息
根据您需要的存储池类型,您可以修改其 XML 配置文件,并定义特定的存储池类型。本节提供了关于创建各种类型的存储池所需的 XML 参数以及示例。
当您想使用 XML 配置文件创建或修改基于目录的存储池时,您必须包含某些必要的参数。有关这些参数的更多信息,请参阅下表。
您可以使用
virsh pool-define
命令来根据指定文件中的 XML 配置创建存储池。例如:
# virsh pool-define ~/guest_images.xml
Pool defined from guest_images_dir
表 15.1. 基于目录的存储池参数
描述
|
XML
|
存储池的类型
<pool type='dir'>
存储池的名称
<name>
name
</name>
指定目标的路径。这将是用于存储池的路径。
<target>
<path>
target_path
</path>
</target>
以下是一个基于
/guest_images
目录的存储池的 XML 文件示例:
<pool type='dir'>
<name>dirpool</name>
<target>
<path>/guest_images</path>
</target>
</pool>
当您想使用 XML 配置文件创建或修改基于磁盘的存储池时,您必须包含某些必要的参数。有关这些参数的更多信息,请参阅下表。
您可以使用
virsh pool-define
命令来根据指定文件中的 XML 配置创建存储池。例如:
# virsh pool-define ~/guest_images.xml
Pool defined from guest_images_disk
表 15.2. 基于磁盘的存储池参数
描述
|
XML
|
存储池的类型
<pool type='disk'>
存储池的名称
<name>
name
</name>
指定存储设备的路径。例如:
/dev/sdb
。
<source>
<path>
source_path
</path>
</source>
指定目标设备的路径。这将是用于存储池的路径。
<target>
<path>
target_path
</path>
</target>
以下是基于磁盘存储池的 XML 文件示例:
<pool type='disk'>
<name>phy_disk</name>
<source>
<device path='/dev/sdb'/>
<format type='gpt'/>
</source>
<target>
<path>/dev</path>
</target>
</pool>
当您想使用 XML 配置文件创建或修改基于文件系统的存储池时,您必须包含某些必要的参数。有关这些参数的更多信息,请参阅下表。
您可以使用
virsh pool-define
命令来根据指定文件中的 XML 配置创建存储池。例如:
# virsh pool-define ~/guest_images.xml
Pool defined from guest_images_fs
表 15.3. 基于文件系统的存储池参数
描述
|
XML
|
存储池的类型
<pool type='fs'>
存储池的名称
<name>
name
</name>
指定分区的路径。例如:
/dev/sdc1
<source>
<device path=
device_path
/>
文件系统类型,例如
ext4
。
<format type=
fs_type
/>
</source>
指定目标的路径。这将是用于存储池的路径。
<target>
<path>
path-to-pool
</path>
</target>
以下是基于
/dev/sdc1
分区的存储池的一个 XML 文件示例:
<pool type='fs'>
<name>guest_images_fs</name>
<source>
<device path='/dev/sdc1'/>
<format type='auto'/>
</source>
<target>
<path>/guest_images</path>
</target>
</pool>
当您想使用 XML 配置文件创建或修改基于 iSCSI 的存储池时,您必须包含某些必要的参数。有关这些参数的更多信息,请参阅下表。
您可以使用
virsh pool-define
命令来根据指定文件中的 XML 配置创建存储池。例如:
# virsh pool-define ~/guest_images.xml
Pool defined from guest_images_iscsi
表 15.4. 基于 iSCSI 的存储池参数
描述
|
XML
|
存储池的类型
<pool type='iscsi'>
存储池的名称
<name>
name
</name>
主机的名称
<source>
<host name=
hostname
/>
iSCSI IQN
<device path=
iSCSI_IQN
/>
</source>
指定目标的路径。这将是用于存储池的路径。
<target>
<path>
/dev/disk/by-path
</path>
</target>
[可选] iSCSI initiator 的 IQN。只有 ACL 将 LUN 限制为特定发起方时才需要。
<initiator>
<iqn name='
initiator0
' />
</initiator>
可使用
virsh find-storage-pool-sources-as
iscsi 命令确定 iSCSI initiator 的 IQN 。
以下是基于指定 iSCSI 设备的存储池的 XML 文件示例:
<pool type='iscsi'>
<name>iSCSI_pool</name>
<source>
<host name='server1.example.com'/>
<device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
</source>
<target>
<path>/dev/disk/by-path</path>
</target>
</pool>
当您想使用 XML 配置文件创建或修改基于 LVM 的存储池时,您必须包含某些必要的参数。有关这些参数的更多信息,请参阅下表。
您可以使用
virsh pool-define
命令来根据指定文件中的 XML 配置创建存储池。例如:
# virsh pool-define ~/guest_images.xml
Pool defined from guest_images_logical
表 15.5. 基于 LVM 的存储池参数
描述
|
XML
|
存储池的类型
<pool type='logical'>
存储池的名称
<name>
name
</name>
存储池设备的路径
<source>
<device path='
device_path
' />`
<name>
VG-name
</name>
虚拟组格式
<format type='lvm2'/>
</source>
<target>
<path=
target_path
/>
</target>
如果逻辑卷组由多个磁盘分区组成,则可能会列出多个源设备。例如:
<source>
<device path='/dev/sda1'/>
<device path='/dev/sdb3'/>
<device path='/dev/sdc2'/>
</source>
<pool type='logical'>
<name>guest_images_lvm</name>
<source>
<device path='/dev/sdc'/>
<name>libvirt_lvm</name>
<format type='lvm2'/>
</source>
<target>
<path>/dev/libvirt_lvm</path>
</target>
</pool>
当您想使用 XML 配置文件创建或修改基于 NFS 的存储池时,您必须包含某些必要的参数。有关这些参数的更多信息,请参阅下表。
您可以使用
virsh pool-define
命令来根据指定文件中的 XML 配置创建存储池。例如:
# virsh pool-define ~/guest_images.xml
Pool defined from guest_images_netfs
表 15.6. 基于 NFS 的存储池参数
描述
|
XML
|
存储池的类型
<pool type='netfs'>
存储池的名称
<name>
name
</name>
挂载点所在的网络服务器的主机名。这可以是主机名或 IP 地址。
<source>
<host name=
hostname
/>
存储池的格式
下面是其中之一:
<format type='nfs' />
<format type='cifs' />
网络服务器上使用的目录
<dir path=
source_path
/>
</source>
指定目标的路径。这将是用于存储池的路径。
<target>
<path>
target_path
</path>
</target>
以下是基于
file_server
NFS 服务器的
/home/net_mount
目录的存储池的一个 XML 文件示例:
<pool type='netfs'>
<name>nfspool</name>
<source>
<host name='file_server'/>
<format type='nfs'/>
<dir path='/home/net_mount'/>
</source>
<target>
<path>/var/lib/libvirt/images/nfspool</path>
</target>
</pool>
15.4.7. 使用 vHBA 设备的基于 SCSI 的存储池的参数
要为使用虚拟主机适配器总线(vHBA)设备的基于 SCSi 的存储池创建或修改 XML 配置文件,您必须在 XML 配置文件中包括某些必要的参数。有关所需参数的更多信息,请参阅下表。
您可以使用
virsh pool-define
命令来根据指定文件中的 XML 配置创建存储池。例如:
# virsh pool-define ~/guest_images.xml
Pool defined from guest_images_vhba
表 15.7. 使用 vHBA 设备的基于 SCSI 的存储池的参数
描述
|
XML
|
存储池的类型
<pool type='scsi'>
存储池的名称
<name>
name
</name>
vHBA 的标识符。
parent
属性是可选的。
<source>
<adapter type='fc_host'
[parent=
parent_scsi_device
]
wwn='
WWN
'
wwpn='
WWPN
' />
</source>
目标路径。这将是用于存储池的路径。
<target>
<path=
target_path
/>
</target>
当
<path>
字段是
/dev/
时,
libvirt
会为卷设备路径生成一个唯一的短设备路径。例如:
/dev/sdc
。否则会使用物理主机路径。例如:
/dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0
。唯一的短设备路径允许多个存储池在多个虚拟机(VM)中列出相同的卷。如果多个虚拟机使用了物理主机路径,则可能会出现重复的设备类型警告。
可以在
<adapter>
字段中使用
parent
属性来通过不同的路径标识 NPIV LUN 的物理 HBA 父级。此字段
scsi_hostN
与
vports
和
max_vports
属性相结合,以完成父识别。
parent
、
parent_wwnn
、
parent_wwpn
或
parent_fabric_wwn
属性提供了不同程度的保证,确保在主机重启后使用相同的 HBA。
如果没有指定
parent
,
libvirt
将使用支持 NPIV 的第一个
scsi_hostN
适配器。
如果只指定了
parent
,则在配置中添加了额外的 SCSI 主机适配器时可能会出现问题。
如果指定了
parent_wwnn
或
parent_wwpn
,则在主机重启后使用相同的 HBA。
如果使用
parent_fabric_wwn
,则在主机重新启动后,将选择同一结构上的 HBA ,而不考虑所用的
scsi_hostN
。
以下是使用 vHBA 的基于 SCSI 的存储池的 XML 文件示例。
它是 HBA 中唯一存储池的存储池:
<pool type='scsi'>
<name>vhbapool_host3</name>
<source>
<adapter type='fc_host' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
</source>
<target>
<path>/dev/disk/by-path</path>
</target>
</pool>
存储池是使用单个 vHBA 的多个存储池中的一个,并使用
parent
属性来识别 SCSI 主机设备:
<pool type='scsi'>
<name>vhbapool_host3</name>
<source>
<adapter type='fc_host' parent='scsi_host3' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
</source>
<target>
<path>/dev/disk/by-path</path>
</target>
</pool>
您可以使用 CLI 管理存储卷的以下方面来为虚拟机分配存储:
查看存储卷信息
创建存储卷
删除存储卷
要获取磁盘镜像,并将其作为虚拟磁盘附加到虚拟机(VM),请创建一个存储卷,并将其 XML 配置分配到虚拟机。
主机上存在带有未分配空间的存储池。
要验证,列出主机上的存储池:
# virsh pool-list --details
Name State Autostart Persistent Capacity Allocation Available
--------------------------------------------------------------------------------------------
default running yes yes 48.97 GiB 36.34 GiB 12.63 GiB
Downloads running yes yes 175.92 GiB 121.20 GiB 54.72 GiB
VM-disks running yes yes 175.92 GiB 121.20 GiB 54.72 GiB
如果您没有现有的存储池,请创建一个。如需更多信息,请参阅
为虚拟机管理存储
。
使用
virsh vol-create-as
命令创建存储卷。例如,要基于
guest-images-fs
存储池创建一个 20 GB 的 qcow2 卷:
# virsh vol-create-as --pool guest-images-fs --name vm-disk1 --capacity 20 --format qcow2
重要
:特定的存储池类型不支持
virsh vol-create-as
命令,而是需要特定的进程来创建存储卷:
基于 iSCSI
- 事先在 iSCSI 服务器中准备 iSCSI LUN。
基于多路径
- 使用
multipathd
命令来准备或管理多路径。
基于 vHBA
- 事先准备光纤通道卡。
创建一个 XML 文件,并在其中添加以下几行。此文件将用于将存储卷作为磁盘添加到虚拟机。
<disk type='volume' device='disk'>
<driver name='qemu' type='qcow2'/>
<source pool='guest-images-fs' volume='vm-disk1'/>
<target dev='hdk' bus='ide'/>
</disk>
本例指定一个在上一步中创建的
vm-disk1
卷的虚拟磁盘,并将卷设为
ide
总线上的磁盘
hdk
。根据您的环境修改对应的参数。
重要
:对于特定的存储池类型,您必须使用不同的 XML 格式来描述存储卷磁盘。
对于
基于多路径的
池:
<disk type='block' device='disk'>
<driver name='qemu' type='raw'/>
<source dev='/dev/mapper/mpatha' />
<target dev='sda' bus='scsi'/>
</disk>
对于
基于 RBD 存储的
池:
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
<source protocol='rbd' name='pool/image'>
<host name='mon1.example.org' port='6321'/>
</source>
<target dev='vdc' bus='virtio'/>
</disk>
使用 XML 文件为虚拟机分配存储卷。例如,要将
~/vm-disk1.xml
中定义的磁盘分配给
testguest1
虚拟机,请使用以下命令:
# virsh attach-device --config testguest1 ~/vm-disk1.xml
验证
-
在虚拟机的客户机操作系统中,确认磁盘映像已作为未格式化和未分配的磁盘提供。
要从主机系统中删除存储卷,您必须停止池并删除它的 XML 定义。
任何使用您要删除的存储卷的虚拟机都会被关闭。
使用
virsh vol-list
命令列出指定存储池中的存储卷。
# virsh vol-list --pool RHEL-SP
Name Path
---------------------------------------------------------------
.bash_history /home/VirtualMachines/.bash_history
.bash_logout /home/VirtualMachines/.bash_logout
.bash_profile /home/VirtualMachines/.bash_profile
.bashrc /home/VirtualMachines/.bashrc
.git-prompt.sh /home/VirtualMachines/.git-prompt.sh
.gitconfig /home/VirtualMachines/.gitconfig
vm-disk1 /home/VirtualMachines/vm-disk1
可选:使用
virsh vol-wipe
命令擦除存储卷。例如,要擦除与存储池
RHEL-SP
关联的名为
vm-disk1
的存储卷:
# virsh vol-wipe --pool RHEL-SP vm-disk1
Vol vm-disk1 wiped
使用
virsh vol-delete
命令来删除存储卷。例如,要删除与存储池
RHEL-SP
关联的名为
vm-disk1
的存储卷:
# virsh vol-delete --pool RHEL-SP vm-disk1
Vol vm-disk1 deleted
验证
-
再次使用
virsh vol-list
命令来验证存储卷是否已被删除。
# virsh vol-list --pool RHEL-SP
Name Path
---------------------------------------------------------------
.bash_history /home/VirtualMachines/.bash_history
.bash_logout /home/VirtualMachines/.bash_logout
.bash_profile /home/VirtualMachines/.bash_profile
.bashrc /home/VirtualMachines/.bashrc
.git-prompt.sh /home/VirtualMachines/.git-prompt.sh
.gitconfig /home/VirtualMachines/.gitconfig
虚拟磁盘镜像是
虚拟存储卷
的一种类型,以类似于作为硬盘为物理机器提供存储的方式向虚拟机(VM)提供存储。
在创建新虚拟机
时,
libvirt
会自动创建一个新磁盘镜像,除非您另有指定。但是,根据您的用例,您可能希望创建和管理独立于虚拟机的磁盘镜像。
15.6.1. 使用 qemu-img 创建虚拟磁盘镜像
如果您需要一个独立于新虚拟机(VM)的新的虚拟磁盘镜像
创建一个存储卷
对您来说是不可行的,您可以使用
qemu-img
命令行工具。
使用
qemu-img
工具创建一个虚拟磁盘镜像:
# qemu-img create -f <format> <image-name> <size>
例如,以下命令创建一个名为
test-image
的 qcow2 磁盘镜像,大小为 30GB:
# qemu-img create -f qcow2 test-image 30G
Formatting 'test-img', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=32212254720 lazy_refcounts=off refcount_bits=16
验证
-
显示您创建的镜像的信息,并检查它是否具有所需的大小,且没有报告任何损坏:
# qemu-img info <test-img>
image: test-img
file format: qcow2
virtual size: 30 GiB (32212254720 bytes)
disk size: 196 KiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
在将磁盘镜像附加到虚拟机(VM)前,请确保磁盘镜像没有问题,如损坏或碎片太多。为此,您可以使用
qemu-img check
命令。
如果需要,您还可以使用这个命令尝试修复磁盘镜像。
任何使用磁盘镜像的虚拟机(VM)都必须关闭。
对您要测试的镜像使用
qemu-img check
命令。例如:
# qemu-img check <test-name.qcow2>
No errors were found on the image.
327434/327680 = 99.92% allocated, 0.00% fragmented, 0.00% compressed clusters
Image end offset: 21478375424
如果检查在磁盘镜像上发现问题,命令的输出类似如下:
167 errors were found on the image.
Data may be corrupted, or further writes to the image may corrupt it.
453368 leaked clusters were found on the image.
This means waste of disk space, but no harm to data.
259 internal errors have occurred during the check.
Image end offset: 21478375424
要尝试修复检测到的问题,请使用
qemu-img check
命令和
all
选项。但请注意,这可能只修复一些问题。
修复磁盘镜像可能会导致数据损坏或其他问题。在尝试修复前备份磁盘镜像。
# qemu-img check -r all <test-name.qcow2>
[...]
122 errors were found on the image.
Data may be corrupted, or further writes to the image may corrupt it.
250 internal errors have occurred during the check.
Image end offset: 27071414272
此输出显示修复后磁盘镜像上发现的问题数。
如果需要进一步的磁盘镜像修复,您可以在
guestfish
shell
中使用各种
libguestfs
工具。
您系统上的
QEMU-img
和
guestfish
手册页
如果现有磁盘镜像需要额外的空间,您可以使用
qemu-img resize
工具更改镜像的大小,以适合您的用例。
您已创建了磁盘镜像的备份。
任何使用磁盘镜像的虚拟机(VM)都必须关闭。
调整正在运行的虚拟机的磁盘镜像大小可能导致数据损坏或其他问题。
主机的硬盘有足够的空闲空间,用于预期的磁盘镜像大小。
可选:
您确保磁盘镜像没有数据损坏或类似的问题。具体说明请参阅
检查虚拟磁盘镜像的一致性
。
确定您要调整大小的虚拟机的磁盘镜像文件的位置。例如:
# virsh domblklist <vm-name>
Target Source
----------------------------------------------------------
vda /home/username/disk-images/example-image.qcow2
可选:
备份当前磁盘镜像。
# cp <example-image.qcow2> <example-image-backup.qcow2>
使用
qemu-img resize
工具来调整镜像大小。
例如,要将
<example-image.qcow2>
大小增加 10GB:
# qemu-img resize <example-image.qcow2> +10G
调整磁盘镜像中文件系统、分区或物理卷的大小,以使用额外的空间。要在 RHEL 客户机操作系统中这样做,请使用
管理存储设备
和
管理文件系统
中的说明。
显示调整了大小的镜像的信息,并查看它是否有预期的大小:
# qemu-img info <converted-image.qcow2>
image: converted-image.qcow2
file format: qcow2
virtual size: 30 GiB (32212254720 bytes)
disk size: 196 KiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
检查调整了大小的磁盘镜像是否有潜在的错误。具体说明请参阅
检查虚拟磁盘镜像的一致性
。
您系统上的
qemu-img
手册页
管理存储设备
管理文件系统
通过使用 RHEL,您可以管理用来为虚拟机(VM)分配存储的存储卷。
您可以使用 RHEL web 控制台进行:
创建存储卷
。
删除存储卷
。
要创建可正常工作的虚拟机(VM),您需要将本地存储设备分配给虚拟机的,该设备可存储虚拟机镜像及虚拟机相关的数据。您可以在存储池中创建存储卷,并将其分配为作为存储磁盘的虚拟机。
要使用 Web 控制台创建存储卷,请参阅以下流程。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
点击 Virtual Machines 选项卡顶部的
Storage Pools
。此时会出现存储池窗口,显示配置的存储池列表。
在
窗口中,点击您要创建存储卷的存储池。
行会展开,以显示包含所选存储池基本信息的 Overview 窗格。
点展开行中的 Overview 选项卡旁的
Storage Volumes
。
Storage Volume 选项卡会出现有关现有存储卷的基本信息。
点
创建卷
。
此时会出现
Create storage volume
对话框。
在 Create Storage Volume 对话框中输入以下信息:
Name
- 存储卷的名称。
size
- MiB 或 GiB 存储卷的大小。
格式
- 存储卷的格式。支持的类型为
qcow2
和
raw
。
点击
Create
。
存储卷创建后,创建存储卷对话框关闭,新的存储卷会出现在存储卷列表中。
了解存储卷
使用 web 控制台向虚拟机添加新磁盘
您可以删除存储卷来释放存储池中的空间,或删除与失效的虚拟机(VM)相关联的存储条目。
要使用 RHEL web 控制台删除存储卷,请参阅以下流程。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
任何使用您要删除的存储卷的虚拟机都会被关闭。
点击 Virtual Machines 选项卡顶部的
Storage Pools
。此时会出现存储池窗口,显示配置的存储池列表。
在
窗口中,单击您要从中删除存储卷的存储池。
行会展开,以显示包含所选存储池基本信息的 Overview 窗格。
点展开行中的 Overview 选项卡旁的
Storage Volumes
。
Storage Volume 选项卡会出现有关现有存储卷的基本信息。
选择您要删除的存储卷。
单击
Delete 1 Volume
了解存储卷
15.8. 使用 web 控制台管理虚拟机存储磁盘
使用 RHEL,您可以管理附加到虚拟机的存储磁盘。
您可以使用 RHEL web 控制台进行:
查看虚拟机磁盘信息
。
向虚拟机添加新磁盘
。
将磁盘附加到虚拟机
。
从虚拟机中分离磁盘
。
15.8.2. 使用 web 控制台向虚拟机添加新磁盘
您可以通过创建新存储卷,并使用 RHEL 9 web 控制台将其附加到虚拟机来向虚拟机添加新磁盘。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在
界面中,单击要为其创建并附加新磁盘的虚拟机。
此时将打开一个新页面,其中包含关于所选虚拟机基本信息的概述部分,以及用于访问虚拟机的图形界面的控制台部分。
滚动到
。
Disks 部分显示有关分配给虚拟机的磁盘的信息,以及用于
Add
或
Edit
磁盘的选项。
点
Add Disk
。
此时会出现 Add Disk 对话框。
在
界面中,单击要为其创建并附加新磁盘的虚拟机。
此时将打开一个新页面,其中包含关于所选虚拟机基本信息的概述部分,以及用于访问虚拟机的图形界面的控制台部分。
滚动到
。
Disks 部分显示有关分配给虚拟机的磁盘的信息,以及用于
Add
或
Edit
磁盘的选项。
点
Add Disk
。
此时会出现 Add Disk 对话框。
点
使用现有
按钮。
正确的配置字段会出现在 Add Disk 对话框中。
为虚拟机配置磁盘。
Pool
- 选择要从中附加虚拟磁盘的存储池。
Volume
- 选择将被附加的存储卷。
Persistence
- 虚拟机运行时可用。选中
Always attach
复选框,使虚拟磁盘持久可用。清除复选框,使虚拟磁盘为临时磁盘。
其它选项
- 为虚拟磁盘设置附加配置。
Cache
- 选择缓存机制。
Bus
- 选择要模拟的磁盘设备的类型。
Disk Identifier
- 为附加磁盘设置标识符,可用于多路径存储设置。在使用授权给特定磁盘序列号的专有软件时,标识符也很有用。
点
Add
所选虚拟磁盘附加到虚拟机。
在 web 控制台中查看虚拟机磁盘信息
使用 web 控制台向虚拟机添加新磁盘
使用 web 控制台将磁盘从虚拟机中分离
15.8.4. 使用 web 控制台将磁盘从虚拟机中分离
使用 web 控制台,您可以将磁盘从虚拟机(VM)中分离。
Web 控制台 VM 插件
已安装在您的系统上
。
在
界面中,单击您要从中分离磁盘的虚拟机。
此时将打开一个新页面,其中包含关于所选虚拟机基本信息的概述部分,以及用于访问虚拟机的图形界面的控制台部分。
滚动到
。
Disks 部分显示有关分配给虚拟机的磁盘的信息,以及用于
Add
或
Edit
磁盘的选项。
在您要分离的磁盘行的右侧,点菜单按钮
⋮
。
在出现的下拉菜单中,点
Remove
按钮。
此时会出现
Remove disk from VM?
确认对话框。
在确认对话框中,单击
Remove
。可选,如果您还想删除磁盘镜像,请单击
Remove and delete file
。
虚拟磁盘与虚拟机分离。
在 web 控制台中查看虚拟机磁盘信息
使用 web 控制台向虚拟机添加新磁盘
使用 web 控制台将现有磁盘附加到虚拟机
15.9. 使用 libvirt secret 保护 iSCSI 存储池
可以使用
virsh
配置用户名和密码参数,来保护 iSCSI 存储池的安全。您可以在定义池之前或之后配置它,但必须启动池才能使验证设置生效。
以下提供了使用
libvirt
secret 保护基于 iSCSI 的存储池的说明。
如果在创建 iSCSI 目标时定义了
user_ID
和
密码
,则需要这个流程。
确保您已创建了一个基于 iSCSI 的存储池。如需更多信息,请参阅
使用 CLI 创建基于 iSCSI 的存储池
。
创建具有质询握手身份验证协议(CHAP)用户名的 libvirt secret 文件。例如:
<secret ephemeral='no' private='yes'>
<description>Passphrase for the iSCSI example.com server</description>
<usage type='iscsi'>
<target>iscsirhel7secret</target>
</usage>
</secret>
使用
virsh secret-define
命令定义 libvirt secret:
# virsh secret-define secret.xml
使用
virsh secret-list
命令验证 UUID:
# virsh secret-list
UUID Usage
--------------------------------------------------------------
2d7891af-20be-4e5e-af83-190e8a922360 iscsi iscsirhel7secret
使用
virsh secret-set-value
命令,为上一步输出中的 UUID 分配 secret。这样可保证 CHAP 用户名和密码位于由 libvirt 控制的 secret 列表中。例如:
# virsh secret-set-value --interactive 2d7891af-20be-4e5e-af83-190e8a922360
Enter new value for secret:
Secret value set
使用
virsh edit
命令在存储池的 XML 文件中添加一个身份验证条目,并添加
<auth>
元素,指定
authentication type
、
username
和
secret usage
。例如:
<pool type='iscsi'>
<name>iscsirhel7pool</name>
<source>
<host name='192.0.2.1'/>
<device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
<auth type='chap' username='_example-user_'>
<secret usage='iscsirhel7secret'/>
</auth>
</source>
<target>
<path>/dev/disk/by-path</path>
</target>
</pool>
<auth>
子元素位于虚拟机的
<pool>
和
<disk>
XML 元素的不同位置。对于
<pool>
,
<auth>
在
<source>
元素中指定,这描述了在哪里查找池源,因为身份验证是某些池源(iSCSI 和 RBD)的属性。对于是域子元素的
<disk>
,对 iSCSI 或 RBD 磁盘的身份验证是磁盘的一个属性。另外,磁盘的
<auth>
子元素与存储池的 <auth> 子元素不同。
<auth username='redhat'>
<secret type='iscsi' usage='iscsirhel7secret'/>
</auth>
要激活更改,激活存储池。如果池已启动,停止并重启存储池:
# virsh pool-destroy iscsirhel7pool
# virsh pool-start iscsirhel7pool
虚拟主机总线适配器(vHBA)设备将主机系统连接到 SCSI 设备,对于创建基于 SCSI 的存储池是必需的。
您可以通过在 XML 配置文件中定义 vHBA 设备来创建它。
使用
virsh nodedev-list --cap vports
命令定位主机系统上的 HBA。
以下示例显示了支持 vHBA 的两个 HBA 的主机:
# virsh nodedev-list --cap vports
scsi_host3
scsi_host4
使用
virsh nodedev-dumpxml
HBA_device
命令查看 HBA 的详情。
# virsh nodedev-dumpxml scsi_host3
命令的输出列出了用于创建 vHBA 的
<name>
、
<wwnn>
和
<wwpn>
字段。
<max_vports>
显示支持的 vHBA 的最大数。例如:
<device>
<name>scsi_host3</name>
<path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3</path>
<parent>pci_0000_10_00_0</parent>
<capability type='scsi_host'>
<host>3</host>
<unique_id>0</unique_id>
<capability type='fc_host'>
<wwnn>20000000c9848140</wwnn>
<wwpn>10000000c9848140</wwpn>
<fabric_wwn>2002000573de9a81</fabric_wwn>
</capability>
<capability type='vport_ops'>
<max_vports>127</max_vports>
<vports>0</vports>
</capability>
</capability>
</device>
在本例中,
<max_vports>
值显示在 HBA 配置中总共有 127 个虚拟端口可用。
<vports>
值显示当前正在使用的虚拟端口数。这些值在创建 vHBA 后更新。
为 vHBA 主机创建类似如下的 XML 文件。在这些示例中,该文件名为
vhba_host3.xml
。
本例使用
scsi_host3
来描述父 vHBA。
<device>
<parent>scsi_host3</parent>
<capability type='scsi_host'>
<capability type='fc_host'>
</capability>
</capability>
</device>
这个示例使用 WWNN/WWPN 对描述父 vHBA。
<device>
<name>vhba</name>
<parent wwnn='20000000c9848140' wwpn='10000000c9848140'/>
<capability type='scsi_host'>
<capability type='fc_host'>
</capability>
</capability>
</device>
WWNN 和 WWPN 值必须与上一步中 HBA 详情中的值匹配。
<parent>
字段指定与这个 vHBA 设备关联的 HBA 设备。下一步中使用
<device>
标签中的详细信息,来为主机创建新的 vHBA 设备。有关
nodedev
XML 格式的更多信息,请参阅
libvirt 上游页面
。
virsh
命令不提供定义
parent_wwnn
、
parent_wwpn
或
parent_fabric_wwn
属性的方式。
使用
virsh nodev-create
命令,根据上一步中创建的 XML 文件创建 VHBA。
# virsh nodedev-create vhba_host3
Node device scsi_host5 created from vhba_host3.xml
验证
-
使用
virsh nodedev-dumpxml
命令验证新 vHBA 的详情(scsi_host5):
# virsh nodedev-dumpxml scsi_host5
<device>
<name>scsi_host5</name>
<path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3/vport-3:0-0/host5</path>
<parent>scsi_host3</parent>
<capability type='scsi_host'>
<host>5</host>
<unique_id>2</unique_id>
<capability type='fc_host'>
<wwnn>5001a4a93526d0a1</wwnn>
<wwpn>5001a4ace3ee047d</wwpn>
<fabric_wwn>2002000573de9a81</fabric_wwn>
</capability>
</capability>
</device>
要在 RHEL 9 主机上增强虚拟机(VM)的图形性能,您可以将主机 GPU 分配给虚拟机。
您可以从主机中分离 GPU,并将 GPU 直接控制传递给虚拟机。
您可以从物理 GPU 创建多个中介设备,并将这些设备作为虚拟 GPU(vGPU)分配给多个客户机。目前仅支持所选的 NVIDIA GPU,且只能为单个客户机分配一个中介设备。
目前只在 Intel 64 和 AMD64 系统上支持 GPU 分配。
要访问并控制附加到主机系统的 GPU,您必须将主机系统配置为将 GPU 的直接控制传给虚拟机(VM)。
如果您要查找有关分配虚拟 GPU 的信息,请参阅
管理 NVIDIA vGPU 设备
。
您必须在主机机器内核中启用 IOMMU 支持。
在 Intel 主机上,您必须启用 VT-d:
使用
intel_iommu=on
和
iommu=pt
参数重新生成 GRUB 配置:
# grubby --args="intel_iommu=on iommu_pt" --update-kernel DEFAULT
重启主机。
在 AMD 主机上,您必须启用 AMD-Vi。
请注意,在 AMD 主机上,默认启用 IOMMU,您可以添加
iommu=pt
将其切换到直通模式:
使用
iommu=pt
参数重新生成 GRUB 配置:
# grubby --args="iommu=pt" --update-kernel DEFAULT
pt
选项只为直通模式中使用的设备启用 IOMMU,并提供更好的主机性能。但是,并非所有硬件都支持这个选项。即使未启用这个选项,您仍然可以分配设备。
重启主机。
防止驱动程序绑定到 GPU。
识别 GPU 连接到的 PCI 总线地址。
# lspci -Dnn | grep VGA
0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)
防止主机的图形驱动程序使用 GPU。要做到这一点,使用带有 pci-stub 驱动程序的 GPU PCI ID。
例如,以下命令可防止驱动程序绑定到附加在
10de:11fa
总线的 GPU:
# grubby --args="pci-stub.ids=10de:11fa" --update-kernel DEFAULT
重启主机。
可选:如果因为支持限制而无法将某些 GPU 功能(如音频)传递给虚拟机,您可以修改 IOMMU 组中端点的驱动程序绑定,使其只传递必要的 GPU 功能。
将 GPU 设置转换为 XML,并记下要防止附加到主机驱动程序的端点的 PCI 地址。
为此,通过向地址添加
pci_
前缀,将 GPU 的 PCI 总线地址转换为 libvirt 兼容的格式,并将分隔符转换为下划线。
例如,以下命令显示附加在
0000:02:00.0
总线地址的 GPU 的 XML 配置。
# virsh nodedev-dumpxml pci_0000_02_00_0
<device>
<name>pci_0000_02_00_0</name>
<path>/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.0</path>
<parent>pci_0000_00_03_0</parent>
<driver>
<name>pci-stub</name>
</driver>
<capability type='pci'>
<domain>0</domain>
<bus>2</bus>
<slot>0</slot>
<function>0</function>
<product id='0x11fa'>GK106GL [Quadro K4000]</product>
<vendor id='0x10de'>NVIDIA Corporation</vendor>
<iommuGroup number='13'>
<address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
<address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
</iommuGroup>
<pci-express>
<link validity='cap' port='0' speed='8' width='16'/>
<link validity='sta' speed='2.5' width='16'/>
</pci-express>
</capability>
</device>
防止端点附加到主机驱动程序。
在本例中,要将 GPU 分配给虚拟机,防止与音频功能对应的端点
<address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
附加到主机音频驱动程序,请将端点附加到 VFIO-PCI。
# driverctl set-override 0000:02:00.1 vfio-pci
将 GPU 附加到虚拟机
使用 PCI 总线地址为 GPU 创建 XML 配置文件。
例如,您可以使用 GPU 总线地址中的参数创建以下 XML 文件,GPU-Assign.xml。
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
</source>
</hostdev>
将文件保存到主机系统上。
将文件与虚拟机的 XML 配置合并。
例如,以下命令将 GPU XML 文件 GPU-Assign.xml 与
System1
虚拟机的 XML 配置文件合并:
# virsh attach-device System1 --file /home/GPU-Assign.xml --persistent
Device attached successfully.
GPU 是作为辅助图形设备附加到虚拟机的。不支持将 GPU 分配为主图形设备,红帽不建议删除虚拟机 XML 配置中的主模拟图形设备。
该设备会出现在虚拟机 XML 配置的
<devices>
部分中。如需更多信息,请参阅
示例虚拟机 XML 配置
。
可附加到虚拟机的 GPU 数量受分配的 PCI 设备的最大数量限制,在 RHEL 9 中,当前为 64。但是,将多个 GPU 附加到虚拟机可能会导致客户端上内存映射 I/O (MMIO) 出现问题,这可能会导致 GPU 无法对虚拟机使用。
要临时解决这个问题,请设置较大的 64 位 MMIO 空间并配置 vCPU 物理地址位,以使扩展 64 位 MMIO 空间可以寻址。
将 NVIDIA GPU 设备附加到使用 RHEL 9 客户机操作系统的虚拟机当前会禁用该虚拟机上的 Wayland 会话,而改为加载 Xorg 会话。这是因为 NVIDIA 驱动程序和 Wayland 之间的不兼容。
vGPU 功能使得可以将物理 NVIDIA GPU 设备划分为多个虚拟设备,称为
中介设备
。然后可将这些 mediated devices 分配给多个虚拟机(VM)作为虚拟 GPU。因此,这些虚拟机可以共享单个物理 GPU 的性能。
将物理 GPU 分配给使用或不使用中介设备的虚拟机,使主机无法使用 GPU。
16.2.1. 设置 NVIDIA vGPU 设备
要设置 NVIDIA vGPU 功能,您需要为 GPU 设备下载 NVIDIA vGPU 驱动程序,创建介质设备,并将其分配给预期的虚拟机。具体步骤请查看以下说明。
您的 GPU 支持 vGPU 介质设备。有关支持创建 vGPU 的 NVIDIA GPU 的最新列表,请参阅
NVIDIA vGPU 软件文档
。
如果您不知道主机正在使用哪个 GPU,请安装
lshw
软件包,并使用
lshw -C display
命令。以下示例显示系统使用与 vGPU 兼容的 NVIDIA Tesla P4 GPU。
# lshw -C display
*-display
description: 3D controller
product: GP104GL [Tesla P4]
vendor: NVIDIA Corporation
physical id: 0
bus info: pci@0000:01:00.0
version: a1
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress cap_list
configuration: driver=vfio-pci latency=0
resources: irq:16 memory:f6000000-f6ffffff memory:e0000000-efffffff memory:f0000000-f1ffffff
流程
-
下载 NVIDIA vGPU 驱动程序并在您的系统中安装它们。具体步骤请查看
NVIDIA 文档
。
如果 NVIDIA 软件安装程序没有创建
/etc/modprobe.d/nvidia-installer-disable-nouveau.conf
文件,请在
/etc/modprobe.d/
中创建一个任何名称的
conf
文件,并在文件中添加以下行:
blacklist nouveau
options nouveau modeset=0
-
为当前内核重新生成初始 ramdisk,然后重新启动。
# dracut --force
# reboot
-
检查内核是否已加载了
nvidia_vgpu_vfio
模块,
nvidia-vgpu-mgr.service
服务是否正在运行。
# lsmod | grep nvidia_vgpu_vfio
nvidia_vgpu_vfio 45011 0
nvidia 14333621 10 nvidia_vgpu_vfio
mdev 20414 2 vfio_mdev,nvidia_vgpu_vfio
vfio 32695 3 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1
# systemctl status nvidia-vgpu-mgr.service
nvidia-vgpu-mgr.service - NVIDIA vGPU Manager Daemon
Loaded: loaded (/usr/lib/systemd/system/nvidia-vgpu-mgr.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2018-03-16 10:17:36 CET; 5h 8min ago
Main PID: 1553 (nvidia-vgpu-mgr)
[...]
另外,如果基于 NVIDIA Ampere GPU 设备创建 vGPU,请确保为物理 GPU 启用虚拟功能。具体步骤请查看
NVIDIA 文档
。
生成设备 UUID。
# uuidgen
30820a6f-b1a5-4503-91ca-0c10ba58692a
-
根据检测到的 GPU 硬件,使用 mediated 设备配置准备 XML 文件。例如,以下命令会在 0000:01:00.0 PCI 总线上运行的 NVIDIA Tesla P4 卡中配置
nvidia-63
vGPU 类型的介质设备,并使用上一步中生成的 UUID。
<device>
<parent>pci_0000_01_00_0</parent>
<capability type="mdev">
<type id="nvidia-63"/>
<uuid>30820a6f-b1a5-4503-91ca-0c10ba58692a</uuid>
</capability>
</device>
-
根据您准备的 XML 文件定义 vGPU 介质设备。例如:
# virsh nodedev-define vgpu-test.xml
Node device mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 created from vgpu-test.xml
-
可选:验证中介设备是否被列为 inactive。
# virsh nodedev-list --cap mdev --inactive
mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
-
启动您创建的 vGPU 介质设备。
# virsh nodedev-start mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Device mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 started
-
可选:确保介质设备被列为 active。
# virsh nodedev-list --cap mdev
mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
-
将 vGPU 设备设置为在主机重启后自动启动
# virsh nodedev-autostart mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Device mdev_d196754e_d8ed_4f43_bf22_684ed698b08b_0000_9b_00_0 marked as autostarted
-
将 mediated 设备附加到要共享 vGPU 资源的虚拟机。要做到这一点,请将以下行以及之前生成的 UUID 添加到虚拟机 XML 配置的
<devices/>
部分。
<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
<source>
<address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/>
</source>
</hostdev>
请注意,每个 UUID 每次只能分配给一个虚拟机。另外,如果虚拟机没有 QEMU 视频设备,如
virtio-vga
,在
<hostdev>
行中添加
ramfb='on'
参数。
要使 vGPU 中介设备的全部功能在分配的虚拟机上可用,请在虚拟机上设置 NVIDIA vGPU 虚拟机软件许可。有关详情和说明,请参阅
NVIDIA Virtual GPU Software License Server User Guide
。
查询您创建的 vGPU 的功能,并确保它列为 active 和 persistent。
# virsh nodedev-info mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Name: virsh nodedev-autostart mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Parent: pci_0000_01_00_0
Active: yes
Persistent: yes
Autostart: yes
-
启动虚拟机并验证客户端操作系统是否检测到 mediated device 作为 NVIDIA GPU。例如,如果虚拟机使用 Linux:
# lspci -d 10de: -k
07:00.0 VGA compatible controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1)
Subsystem: NVIDIA Corporation Device 12ce
Kernel driver in use: nvidia
Kernel modules: nouveau, nvidia_drm, nvidia
已知问题
-
将 NVIDIA vGPU 中介设备分配给使用 RHEL 9 客户机操作系统的虚拟机当前会禁用该虚拟机上的 Wayland 会话,而改为加载 Xorg 会话。这是因为 NVIDIA 驱动程序和 Wayland 之间的不兼容。
NVIDIA vGPU 软件文档
man virsh
命令
16.2.2. 删除 NVIDIA vGPU 设备
要更改
分配的 vGPU 介质设备
的配置,您需要从分配的虚拟机中删除现有设备。具体步骤请查看以下操作:
要从中删除该设备的虚拟机关闭。
获取您要删除的介质设备的 ID。
# virsh nodedev-list --cap mdev
mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
停止 vGPU mediated 设备的运行实例。
# virsh nodedev-destroy mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Destroyed node device 'mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0'
可选:确保中介设备已被停用。
# virsh nodedev-info mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Name: virsh nodedev-autostart mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Parent: pci_0000_01_00_0
Active: no
Persistent: yes
Autostart: yes
从虚拟机 XML 配置中删除该设备。为此,使用
virsh edit
工具编辑虚拟机的 XML 配置,并删除 mdev 的配置段。这个片段类似如下:
<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
<source>
<address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/>
</source>
</hostdev>
请注意,停止和分离 mediated 设备不会删除它,而是将其保留为
defined
。因此,您可以
重启
并把设备
附加
到不同的虚拟机。
可选:要删除已停止的介质设备,请删除其定义。
# virsh nodedev-undefine mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Undefined node device 'mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0'
验证
-
如果您只停止和分离该设备,请确保介质设备被列为 inactive。
# virsh nodedev-list --cap mdev --inactive
mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
-
如果您也删除了该设备,请确保以下命令不会显示它。
# virsh nodedev-list --cap mdev
16.2.4. 用于 NVIDIA vGPU 的远程桌面流服务
在启用了 NVIDIA vGPU 或 NVIDIA GPU passthrough 的 RHEL 9 管理程序中支持以下远程桌面流服务:
HP ZCentral Remote Boost/Teradici
NICE DCV
Mechdyne TGX
有关支持详情请查看适当的供应商支持列表。
要使虚拟机(VM)通过网络连接到主机、主机上的其他虚拟机以及外部网络中的位置,必须相应地配置虚拟机网络。为了提供虚拟机网络,RHEL 9 管理程序和新创建的虚拟机具有默认网络配置,也可以进一步修改。例如:
您可以使主机上的虚拟机通过主机外的位置被发现和连接,就如同虚拟机与主机位于同一网络中一样。
您可以部分或完全将虚拟机与入站网络流量隔离,以提高其安全性,并将虚拟机出现任何问题而影响主机的风险降至最低。
以下章节解释了各种类型的虚拟机网络配置,并提供了设置所选虚拟机网络配置的说明。
虚拟机(VM)连接到网络上的其他设备和位置必须由主机硬件来提供。以下小节解释了虚拟机网络连接的机制,并描述了默认的虚拟机网络设置。
虚拟网络使用了虚拟网络交换机的概念。虚拟网络交换机是在主机机器中运行的软件构造。VM 通过虚拟网络交换机连接到网络。根据虚拟交换机的配置,虚拟机可以使用由 hypervisor 管理的现有虚拟网络或不同的网络连接方法。
下图展示了将两个虚拟机连接到网络的虚拟网络交换机:
从客户机操作系统的角度来看,虚拟网络连接与物理网络连接是一样的。主机虚拟机将虚拟网络交换机视为网络接口。当
virtnetworkd
服务首次安装并启动时,它会创建
virbr0
,即虚拟机的默认网络接口。
要查看有关此接口的信息,请使用主机上的
ip
工具。
$ ip addr show virbr0
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state
UNKNOWN link/ether 1b:c4:94:cf:fd:17 brd ff:ff:ff:ff:ff:ff
inet 192.0.2.1/24 brd 192.0.2.255 scope global virbr0
默认情况下,单个主机上的所有虚拟机都连接到名为
default
的同一
NAT 类型
虚拟网络,该网络使用
virbr0
接口。详情请参阅
虚拟网络默认配置
。
对于从虚拟机进行基础出站网络访问,通常不需要额外的网络设置,因为默认网络会与
libvirt-daemon-config-network
软件包一起安装,并在启动
virtnetworkd
服务时自动启动。
如果需要不同的虚拟机网络功能,您可以创建额外的虚拟网络和网络接口,并将虚拟机配置为使用它们。除了默认的 NAT 外,这些网络和接口也可以配置为使用以下一种模式:
当在虚拟化主机上安装
virtnetworkd
服务时,它会在网络地址转换(NAT)模式中包含初始虚拟网络配置。默认情况下,主机上的所有虚拟机都连接到同一
libvirt
虚拟网络,名为
default
。这个网络上的虚拟机可以连接到主机上和主机之外的网络位置,但有以下限制:
网络上的虚拟机对主机和主机上的其他虚拟机可见,但网络流量会受到客户机操作系统网络堆栈中的防火墙以及附加到客户机接口的
libvirt
网络过滤规则的影响。
网络上的虚拟机可以连接到主机之外但对它们不可见的位置。出站流量受 NAT 规则以及主机系统的防火墙影响。
下图演示了默认虚拟机网络配置:
17.2. 使用 web 控制台管理虚拟机网络接口
使用 RHEL 9 web 控制台,您可以管理连接到 web 控制台的虚拟机的虚拟网络接口。您可以:
查看网络接口的相关信息并进行编辑
。
向虚拟机添加网络接口
,以及
断开或删除接口
。
17.2.2. 在 web 控制台中添加和连接虚拟网络接口
通过使用 RHEL 9 web 控制台,您可以创建一个虚拟网络接口,并将虚拟机(VM)连接到它。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在
界面中,点击您要查看其信息的虚拟机。
此时将打开一个新页面,其中包含关于所选虚拟机基本信息的概述部分,以及用于访问虚拟机的图形界面的控制台部分。
滚动
。
网络接口部分显示为虚拟机配置的虚拟网络接口的信息,以及
Add
、
Edit
或
Plug
网络接口的选项。
点击您要连接的虚拟网络接口所在行中的
Plug
。
所选虚拟网络接口连接至虚拟机。
17.2.3. 在 web 控制台中断开和删除虚拟网络接口
通过使用 RHEL 9 web 控制台,您可以断开连接到所选虚拟机(VM)的虚拟网络接口。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
登录到 RHEL 9 web 控制台。
详情请参阅
登录到 web 控制台
。
在
界面中,点击您要查看其信息的虚拟机。
此时将打开一个新页面,其中包含关于所选虚拟机基本信息的概述部分,以及用于访问虚拟机的图形界面的控制台部分。
滚动
。
网络接口部分显示为虚拟机配置的虚拟网络接口的信息,以及
添加
、
删除
、
编辑
或
拔掉
网络接口的选项。
在您要断开连接的虚拟网络接口行中点
Unplug
。
所选虚拟网络接口断开与虚拟机的连接。
在很多情况下,默认的 VM 网络配置已经足够了。但是,如果需要调整配置,您可以使用命令行界面 (CLI) 或 RHEL 9 web 控制台进行此操作。以下章节描述了这些情况下所选择的虚拟机网络设置。
17.3.1. 使用命令行界面配置外部可见的虚拟机
默认情况下,新创建的虚拟机连接到使用
virbr0
(主机上默认的虚拟网桥)的 NAT 类型网络。这可确保虚拟机可以使用主机的网络接口控制器(NIC)来连接到外部网络,但无法从外部系统访问虚拟机。
如果需要虚拟机出现在与 hypervisor 相同的外部网络上,您必须使用
桥接模式
。为此,请将虚拟机连接到连接到 hypervisor 物理网络设备的网桥设备。要使用命令行界面,请遵循以下步骤。
带有默认 NAT 设置的
现有虚拟机
。
管理程序的 IP 配置。这随着主机的网络连接而变化。例如,这个流程使用这样一种场景,其中主机使用以太网线连接到网络,主机的物理 NIC MAC 地址被分配给 DHCP 服务器上的一个静态 IP。因此,以太网接口被视为 hypervisor IP。
要获取以太网接口的 IP 配置,请使用
ip addr
工具:
# ip addr
[...]
enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 54:ee:75:49:dc:46 brd ff:ff:ff:ff:ff:ff
inet 192.0.2.1/24 brd 192.0.2.255 scope global dynamic noprefixroute enp0s25
流程
-
为主机上的物理接口创建和设置网桥连接。具体步骤请参阅
配置网络桥接
。
请注意,在使用静态 IP 分配的场景中,您必须将物理以太网接口的 IPv4 设置移到网桥接口。
修改虚拟机的网络,以使用创建的桥接接口。例如,以下设置
testguest
使用
bridge0
。
# virt-xml testguest --edit --network bridge=bridge0
Domain 'testguest' defined successfully.
-
启动虚拟机。
# virsh start testguest
-
在客户机操作系统中,调整系统网络接口的 IP 和 DHCP 设置,就好像虚拟机是与 hypervisor 位于同一网络中的另一台物理系统一样。
具体步骤将因虚拟机使用的客户端操作系统而异。例如,如果客户机操作系统是 RHEL 9,请参阅
配置以太网连接
。
确保新创建的网桥正在运行,并且包含主机的物理接口和虚拟机的接口。
# ip link show master bridge0
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
link/ether 54:ee:75:49:dc:46 brd ff:ff:ff:ff:ff:ff
10: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether fe:54:00:89:15:40 brd ff:ff:ff:ff:ff:ff
-
确保虚拟机出现在与 hypervisor 相同的外部网络上:
在客户机操作系统中,获取系统的网络 ID。例如,如果它是 Linux 客户机:
# ip addr
[...]
enp0s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:09:15:46 brd ff:ff:ff:ff:ff:ff
inet 192.0.2.1/24 brd 192.0.2.255 scope global dynamic noprefixroute enp0s0
-
从连接到本地网络的外部系统,使用获取的 ID 连接到虚拟机。
# ssh [email protected]
[email protected]'s password:
Last login: Mon Sep 24 12:05:36 2019
root~#*
如果连接正常工作,则网络已配置成功。
在某些情况下,比如当虚拟机托管在客户端上时使用客户端到站点的 VPN ,使用桥接模式使您的虚拟机可用于外部位置是不可能的。
要临时解决这个问题,您可以
使用
nftables
为虚拟机设置目标 NAT
。
使用 web 控制台配置外部可见的虚拟机
网桥模式中的虚拟网络
17.3.2. 使用 web 控制台配置外部可见的虚拟机
默认情况下,新创建的虚拟机连接到使用
virbr0
(主机上默认的虚拟网桥)的 NAT 类型网络。这可确保虚拟机可以使用主机的网络接口控制器(NIC)来连接到外部网络,但无法从外部系统访问虚拟机。
如果需要虚拟机出现在与 hypervisor 相同的外部网络上,您必须使用
桥接模式
。为此,请将虚拟机连接到连接到 hypervisor 物理网络设备的网桥设备。要使用 RHEL 9 web 控制台,请遵循以下步骤。
您已安装了 RHEL 9 web 控制台。
具体步骤请参阅
安装并启用 Web 控制台
。
Web 控制台 VM 插件
已安装在您的系统上
。
带有默认 NAT 设置的
现有虚拟机
。
管理程序的 IP 配置。这随着主机的网络连接而变化。例如,这个流程使用这样一种场景,其中主机使用以太网线连接到网络,主机的物理 NIC MAC 地址被分配给 DHCP 服务器上的一个静态 IP。因此,以太网接口被视为 hypervisor IP。
要获取以太网接口的 IP 配置,请转至 web 控制台中的
Networking
选项卡,并查看
接口
部分。
为主机上的物理接口创建和设置网桥连接。具体步骤请参阅
在 web 控制台中配置网络桥接
。
请注意,在使用静态 IP 分配的场景中,您必须将物理以太网接口的 IPv4 设置移到网桥接口。
修改虚拟机的网络,以使用桥接接口。在虚拟机的
网络接口
选项卡中:
点击
Add Network Interface
在
Add Virtual Network Interface
对话框中:
将
Interface Type
设成
Bridge to LAN
Source 到新创建的网桥,比如
bridge0
点
Add
可选:对于连接到虚拟机的所有其他接口,点
Unplug
。
点击
Run
来启动虚拟机。
在客户机操作系统中,调整系统网络接口的 IP 和 DHCP 设置,就好像虚拟机是与 hypervisor 位于同一网络中的另一台物理系统一样。
具体步骤将因虚拟机使用的客户端操作系统而异。例如,如果客户机操作系统是 RHEL 9,请参阅
配置以太网连接
。
在主机 Web 控制台的
Networking
选项卡中,单击新创建的网桥所在的行,以确保它正在运行,并且包含主机的物理接口和虚拟机接口。
确保虚拟机出现在与虚拟机监控程序相同的外部网络中。
在客户机操作系统中,获取系统的网络 ID。例如,如果它是 Linux 客户机:
# ip addr
[...]
enp0s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:09:15:46 brd ff:ff:ff:ff:ff:ff
inet 192.0.2.1/24 brd 192.0.2.255 scope global dynamic noprefixroute enp0s0
从连接到本地网络的外部系统,使用获取的 ID 连接到虚拟机。
# ssh [email protected]
[email protected]'s password:
Last login: Mon Sep 24 12:05:36 2019
root~#*
如果连接正常工作,则网络已配置成功。
在某些情况下,比如当虚拟机托管在客户端上时使用客户端到站点的 VPN ,使用桥接模式使您的虚拟机可用于外部位置是不可能的。
使用命令行界面配置外部可见的虚拟机
网桥模式中的虚拟网络
macvtap
是一个 Linux 网络设备驱动程序,其创建一个虚拟网络接口,虚拟机通过这个网络接口可直接访问主机上的物理网络接口。RHEL 9 支持使用
macvtap
连接。
但是,与其他可用的虚拟机(VM)网络配置相比,macvtap 的性能欠佳,而且更难以正确设置。因此,如果您的用例没有明确需要 macvtap,请使用不同的受支持的网络配置。
如果您在虚拟机中使用 macvtap 模式,请考虑使用以下网络配置:
使用
Linux 网桥
配置,而不是 macvtap 网桥模式。
使用
PCI Passthrough
,而不是 macvtap passthrough 模式。
macvtap 的上游文档
要修改虚拟机的网络属性和行为,更改虚拟机使用的虚拟网络或接口类型。以下小节描述了 RHEL 9 中虚拟机可用的连接类型。
默认情况下,虚拟网络交换机运行在网络地址转换(NAT)模式下。它们使用 IP 伪装而不是源-NAT(SNAT)或目的-NAT(DNAT)。IP 伪装可让连接的虚拟机使用主机机器的 IP 地址与任何外部网络通信。当虚拟网络交换机运行在 NAT 模式时,主机外的计算机无法与主机内的虚拟机进行通信。
虚拟网络交换机使用防火墙规则配置的 NAT。不建议在交换机运行时编辑这些规则,因为不正确的规则可能会导致交换机无法进行通信。
当使用
Routed
模式时,虚拟交换机会连接到连接到主机的物理 LAN 中,并在不使用 NAT 的情况下传输数据。虚拟交换机可以检查所有流量,并使用网络数据包中包含的信息来做出路由决策。使用此模式时,虚拟机(VM)都位于一个子网中,与主机是分开的。虚拟机子网通过虚拟交换机进行路由,该交换机位于主机上。这会启用传入连接,但对外部网络上的系统需要额外的路由表条目。
路由模式使用基于 IP 地址的路由:
使用路由模式的通用拓扑是虚拟服务器托管 (VSH)。VSH 提供程序可能有多个主机计算机,每个都有两个物理网络连接。一个接口用于管理和记帐,另一个用于虚拟机连接。每个虚拟机都有自己的公共 IP 地址,但主机使用私有的 IP 地址,以便只有内部管理员可以管理虚拟机。
在大多数虚拟机网络模式中,虚拟机会自动创建并连接到
virbr0
虚拟网桥。相反,在
桥接
模式中,VM 会连接到主机上的一个已存在的 Linux 网桥。因此,虚拟机可以在物理网络中直接看到。这就可以允许进入的连接,但不需要任何额外的路由表条目。
网桥模式使用基于 MAC 地址的连接切换:
在桥接模式中,虚拟机出现在与主机相同的子网中。同一物理网络中的所有其他物理机器都可以检测虚拟机并访问它。
通过使用
isolated
模式,连接到虚拟交换机的虚拟机可以相互通信,并与主机机器进行通信,但其流量不会通过主机外部,且不能接收来自主机外部的流量。对于基本功能,需要在这个模式中使用
dnsmasq
,如 DHCP。
当对网络使用
开放
模式时,
libvirt
不会为网络生成任何防火墙规则。因此,
libvirt
不会覆盖主机提供的防火墙规则,因此用户可以手动管理虚拟机的防火墙规则。
下表提供了有关所选的虚拟机(VM)网络配置可以连接到的位置的信息,以及它们对哪些位置可见。
表 17.1. 虚拟机连接类型
|
连接到主机
|
连接到主机上的其他虚拟机
|
连接到外部位置
|
可查看外部位置
|
取决于主机的防火墙规则
|
使用预引导执行环境(PXE)的虚拟机可以从网络引导并加载它们的配置。本章描述了如何使用
libvirt
在虚拟或桥接网络上从 PXE 服务器引导虚拟机。
这些流程仅作为示例提供。在操作之前,请确保您有足够的备份。
17.5.1. 在虚拟网络中设置 PXE 引导服务器
这个流程描述了如何配置
libvirt
虚拟网络以提供预启动执行环境(PXE)。这可让主机上的虚拟机被配置为从虚拟网络上提供的引导镜像引导。
本地 PXE 服务器(DHCP 和 TFTP),例如:
libvirt 内部服务器
手动配置 dhcpd 和 tftpd
dnsmasq
Cobbler 服务器
PXE 引导映像,如 Cobbler 配置的
PXELINUX
或手工进行配置。
将 PXE 引导镜像和配置放在
/var/lib/tftpboot
文件夹中。
设置文件夹权限:
# chmod -R a+r /var/lib/tftpboot
设置文件夹所有权:
# chown -R nobody: /var/lib/tftpboot
更新 SELinux 上下文:
# chcon -R --reference /usr/sbin/dnsmasq /var/lib/tftpboot
# chcon -R --reference /usr/libexec/libvirt_leaseshelper /var/lib/tftpboot
关闭虚拟网络:
# virsh net-destroy default
在默认编辑器中打开虚拟网络配置文件:
# virsh net-edit default
编辑
<ip>
元素,来包含合适的地址、网络掩码、DHCP 地址范围和引导文件,其中
example-pxelinux
是引导镜像文件的名称。
<ip address='192.0.2.1' netmask='255.255.255.0'>
<tftp root='/var/lib/tftpboot'/>
<range start='192.0.2.2' end='192.0.2.254' />
<bootp file='example-pxelinux'/>
</dhcp>
启动虚拟网络:
# virsh net-start default
17.5.2. 使用 PXE 和虚拟网络引导虚拟机
要从虚拟网络上的预引导执行环境(PXE)服务器引导虚拟机(VM),您必须启用 PXE 引导。
在虚拟网络上设置 PXE 引导服务器,如
在虚拟网络中设置 PXE 引导服务器
所述。
创建启用了 PXE 引导的新虚拟机。例如,若要从
default
虚拟网络上提供的 PXE 安装一个新的 10 GB qcow2 镜像文件:
# virt-install --pxe --network network=default --memory 2048 --vcpus 2 --disk size=10
-
另外,您可以手动编辑现有虚拟机的 XML 配置文件:
确保
<os>
元素中有一个
<boot dev='network'/>
元素:
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
<boot dev='network'/>
<boot dev='hd'/>
确定客户端网络已配置为使用您的虚拟网络:
<interface type='network'>
<mac address='52:54:00:66:79:14'/>
<source network='default'/>
<target dev='vnet0'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
验证
-
使用
virsh start
命令启动虚拟机。如果正确配置了 PXE,则虚拟机可以从 PXE 服务器上提供的引导镜像启动。
17.5.3. 使用 PXE 和桥接网络启动虚拟机
要从桥接网络上提供的预引导执行环境(PXE)服务器启动虚拟机(VM),您必须启用 PXE 引导。
启用了网络桥接。
网桥网络上提供了 PXE 引导服务器。
创建启用了 PXE 引导的新虚拟机。例如,若要在
breth0
桥接网络上从 PXE 安装一个新的 10 GB qcow2 镜像文件:
# virt-install --pxe --network bridge=breth0 --memory 2048 --vcpus 2 --disk size=10
-
另外,您可以手动编辑现有虚拟机的 XML 配置文件:
确保
<os>
元素中有一个
<boot dev='network'/>
元素:
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
<boot dev='network'/>
<boot dev='hd'/>
确保虚拟机配置为使用桥接网络:
<interface type='bridge'>
<mac address='52:54:00:5a:ad:cb'/>
<source bridge='breth0'/>
<target dev='vnet0'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
验证
-
使用
virsh start
命令启动虚拟机。如果正确配置了 PXE,则虚拟机可以从 PXE 服务器上提供的引导镜像启动。
配置网络桥接
17.6. 在网络绑定上配置网桥,以将虚拟机与网络连接
网桥将虚拟机与主机相同的网络连接。如果要将一个主机上的虚拟机连接到另一个主机上的另一主机或虚拟机,则桥接会在它们之间建立通信。但是,网桥不提供故障转移机制。为了处理通信中的故障,网络绑定会在网络接口失败时处理通信。为保持容错和冗余,
active-backup
绑定机制决定在绑定中只有一个端口处于活跃状态,不需要任何交换机配置。如果活动端口失败,则备用端口将变为活动状态,以保留网络中配置的虚拟机之间的通信。
17.6.1. 使用 nmcli 在网络绑定上配置网络接口
要在命令行上配置网络绑定,请使用
nmcli
工具。
在服务器上安装两个或者两个物理设备,它们不会在任何
NetworkManager
连接配置文件中配置。
创建绑定接口:
# nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup"
这个命令会创建一个使用
active-backup
模式、名为
bond0
的绑定。
为绑定分配以太网接口:
# nmcli connection add type ethernet slave-type bond con-name bond0-port1 ifname enp7s0 master bond0
# nmcli connection add type ethernet slave-type bond con-name bond0-port2 ifname enp8s0 master bond0
这些命令为
enp7s0
和
enp8s0
创建配置文件,并将它们添加到
bond0
连接中。
配置 IPv4 设置:
要使用 DHCP,不需要任何操作。
要为
bond0
连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:
# nmcli connection modify bond0 ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.253 ipv4.dns-search example.com ipv4.method manual
配置 IPv6 设置:
要使用无状态地址自动配置(SLAAC),则不需要任何操作。
要为
bond0
连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:
# nmcli connection modify bond0 ipv6.addresses 2001:db8:1::1/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::fffd ipv6.dns-search example.com ipv6.method manual
可选:如果要在绑定端口上设置任何参数,请使用以下命令:
# nmcli connection modify bond0-port1 bond-port.<parameter> <value>
配置 Red Hat Enterprise Linux 在启用绑定时自动启用所有端口:
# nmcli connection modify bond0 connection.autoconnect-ports 1
激活网桥:
# nmcli connection up bond0
验证
-
从主机中临时删除网络电缆。
请注意,无法使用软件工具正确测试链路失败事件。停用连接的工具(如 nmcli )只显示绑定驱动程序处理端口配置更改的能力,而不是实际链接失败事件。
显示绑定状态:
# cat /proc/net/bonding/bond0
17.6.2. 使用 nmcli 为网络绑定配置网络桥接
网络绑定的网络桥接涉及配置绑定接口,该接口组合了多个网络接口,以改进流量处理。因此,虚拟机可以使用网桥通过绑定的网络接口访问网络。
nmcli
工具从配置所需的命令行中创建和编辑连接文件。
创建网桥接口:
# nmcli connection add type bridge con-name br0 ifname br0 ipv4.method disabled ipv6.method disabled
将
bond0
绑定添加到
br0
网桥:
# nmcli connection modify bond0 master br0
配置 Red Hat Enterprise Linux 在启用桥接时自动启用所有端口:
# nmcli connection modify br0 connection.autoconnect-ports 1
重新激活桥接:
# nmcli connection up br0
验证
-
使用
ip
工具来显示作为特定网桥端口的以太网设备的链接状态:
# ip link show master br0
6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:38:a9:4d brd ff:ff:ff:ff:ff:ff
使用 bridge 工具来显示作为任意网桥设备端口的以太网设备状态:
# bridge link show
6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
要显示特定以太网设备的状态,请使用 bridge link show dev <ethernet_device_name> 命令。
nm-settings(5) 手册页
bridge(8) 手册页
17.6.3. 在带有现有绑定接口的 libvirt 中创建虚拟网络
要启用虚拟机(VM)使用带有绑定的
br0
网桥,首先将虚拟网络添加到使用此网桥的
libvirtd
服务中。
您已安装了
libvirt
软件包。
您已启动并启用了
libvirtd
服务。
您已在 Red Hat Enterprise Linux 中使用绑定配置了
br0
设备。
使用以下内容创建
~/bond0-bridge.xml
文件:
<network>
<name>bond0-bridge</name>
<forward mode="bridge" />
<bridge name="br0" />
</network>
使用
~/bond0-bridge.xml
文件在
libvirt
中创建一个新的虚拟网络:
# virsh net-define ~/bond0-bridge.xml
删除
~/bond0-bridge.xml
文件:
# rm ~/bond0-bridge.xml
启动
bond0-bridge
虚拟网络:
# virsh net-start bond0-bridge
将
bond0-bridge
虚拟网络配置为在
libvirtd
服务启动时自动启动:
# virsh net-autostart bond0-bridge
要将虚拟机配置为使用主机上的绑定接口的网桥设备,请创建一个使用
bond0-bridge
虚拟网络的新虚拟机,或更新现有虚拟机的设置以使用此网络。
在 RHEL 主机上执行此流程。
您已在
libvirtd
中配置了
bond0-bridge
虚拟网络。
要创建新虚拟机并将其配置为使用
bond0-bridge
网络,请在创建虚拟机时将--
network network:bond0-bridge
选项传给
virt-install
工具:
# virt-install ... --network network:bond0-bridge
要更改现有虚拟机的网络设置:
将虚拟机的网络接口连接到
bond0-bridge
虚拟网络:
# virt-xml <example_vm> --edit --network network=bond0-bridge
关闭虚拟机,并重新启动它:
# virsh shutdown <example_vm>
# virsh start <example_vm>
验证
-
显示主机上虚拟机的虚拟网络接口:
# virsh domiflist <example_vm>
Interface Type Source Model MAC
-------------------------------------------------------------------
vnet1 bridge bond0-bridge virtio 52:54:00:c5:98:1c
-
显示附加到
br0
网桥的接口:
# ip link show master br0
18: bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 2a:53:bd:d5:b3:0a brd ff:ff:ff:ff:ff:ff
19: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:c5:98:1c brd ff:ff:ff:ff:ff:ff
请注意,libvirtd 服务会动态更新网桥的配置。当您启动使用 bond0-bridge 网络的虚拟机时,主机上对应的 vnet* 设备会显示为网桥的端口。
virt-install(1) 手册页
virt-xml(1) 手册页
virsh(1) 手册页
arping(8) 手册页
如果您需要对虚拟网络的非特权访问,例如当使用
libvirt
的
会话
连接时,您可以将虚拟机(VM)配置为使用
passt
网络后端。
passt
软件包已安装在您的系统上。
# dnf install passt
流程
-
打开您要在其上使用
passt
连接的虚拟机的 XML 配置。例如:
# virsh edit <testguest1>
-
在
<devices>
部分中,添加一个使用
passt
作为其后端类型的
<interface type='user'>
元素。
例如,以下配置设置一个
passt
连接,它使用从与第一个默认路由关联的主机接口复制的地址和路由:
<devices>
[...]
<interface type='user'>
<backend type='passt'/>
</interface>
</devices>
另外,在使用
passt
时,您可以指定多个
<portForward>
元素,来将主机的传入网络流量转发到此虚拟机接口。您还可以自定义接口 IP 地址。例如:
<devices>
[...]
<interface type='user'>
<backend type='passt'/>
<mac address="52:54:00:98:d8:b7"/>
<source dev='eth0'/>
<ip family='ipv4' address='192.0.2.1' prefix='24'/>
<ip family='ipv6' address='::ffff:c000:201'/>
<portForward proto='tcp'>
<range start='2022' to='22'/>
</portForward>
<portForward proto='udp' address='1.2.3.4'>
<range start='5000' end='5020' to='6000'/>
<range start='5010' end='5015' exclude='yes'/>
</portForward>
<portForward proto='tcp' address='2001:db8:ac10:fd01::1:10' dev='eth0'>
<range start='8080'/>
<range start='4433' to='3444'/>
</portForward>
</interface>
</devices>
这个示例配置建立了一个带有以下参数的
passt
连接:
虚拟机为转发来自
eth0
主机接口的流量复制网络路由。
接口 MAC 设置为
52:54:00:98:d8:b7
。如果未设置,将生成一个随机的。
IPv4 地址设为
192.0.2.1/24
,IPv6 地址设为
::ffff:c000:201
。
主机上的 TCP 端口
2022
将网络流量转发到虚拟机上的端口
22
。
主机接口
eth0
上的 TCP 地址
2001:db8:ac10:fd01::1:10
和端口
8080
将其网络流量转发到虚拟机上的端口
8080
。端口
4433
转发到虚拟机上的端口
3444
。
主机上的 UDP 地址
1.2.3.4
和端口
5000 - 5009
以及
5016 - 5020
将其网络流量转发到虚拟机上的端口
6000 - 6009
和
6016 - 6020
。
保存 XML 配置。
启动或重启使用
passt
配置的虚拟机:
# virsh reboot <vm-name>
# virsh start <vm-name>
如果虚拟机成功引导,则现在使用
passt
网络后端。
libvirt
中的系统和会话连接
|
|
|
|
|
|
|
|
|