12.8. 연결된 Mellanox 가상 기능을 사용하여 가상 머신 실시간 마이그레이션
기술 프리뷰로 Mellanox 네트워킹 장치의 VF(가상 기능)를 사용하여 VM(가상 머신)을 실시간 마이그레이션할 수 있습니다. 현재는 Mellanox CX-7 네트워킹 장치를 사용하는 경우에만 가능합니다. Mellanox CX-7 네트워킹 장치의 VF는 새 mlx5_vfio_pci
드라이버를 사용하여 실시간 마이그레이션에 필요한 기능을 추가하고 libvirt
는 새 드라이버를 VF에 자동으로 바인딩합니다.
제한
현재 Mellanox 가상 기능이 연결된 VM을 실시간 마이그레이션할 때 일부 가상화 기능을 사용할 수 없습니다.
- VM의 더티 메모리 페이지 비율 계산.
- 복사 후 실시간 마이그레이션 사용.
- VM에서 vIOMMU(가상 I/O Memory Management Unit) 장치 사용.
이 기능은 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)
다음 명령을 사용하여
VF_MIGRATION_MODE
를MIGRATION_ENABLED
로 설정할 수 있습니다.# mstconfig -d <device_pci_address> set VF_MIGRATION_MODE=2
openvswitch
패키지는 소스 및 대상 호스트 모두에 설치됩니다.# dnf install openvswitch
호스트의 CPU 및 펌웨어는 I/O Memory Management Unit(IOMMU)을 지원합니다.
- Intel CPU를 사용하는 경우 Directed I/O(VT-d)에 대한 Intel Virtualization Technology를 지원해야 합니다.
- AMD CPU를 사용하는 경우 AMD-Vi 기능을 지원해야 합니다.
호스트 시스템은ACS(Access Control Service)를 사용하여 PCIe 토폴로지에 대한 직접 메모리 액세스(DMA) 격리를 제공합니다. 시스템 벤더에서 이를 확인합니다.
자세한 내용은 SR-IOV 구현을 위한 하드웨어 고려 사항을 참조하십시오.
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 호스트에서 Directed I/O(VT-d)에 대한 Intel Virtualization Technology를 활성화합니다.
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
- 호스트를 재부팅합니다.
- 소스 호스트와 대상 호스트는 모두 KVM 하이퍼바이저를 사용합니다.
-
소스 호스트와 대상 호스트는 네트워크를 통해 서로 연결할 수 있습니다.
ping
유틸리티를 사용하여 이를 확인합니다. 대상 호스트에서 다음 포트가 열려 있습니다.
- SSH를 사용하여 대상 호스트에 연결하려면 포트 22가 필요합니다.
- TLS를 사용하여 대상 호스트에 연결하려면 포트 16509가 필요합니다.
- TCP를 사용하여 대상 호스트에 연결하려면 포트 16514가 필요합니다.
- 메모리 및 디스크 마이그레이션 데이터를 전송하기 위해 QEMU에 포트 49152-49215가 필요합니다.
- 소스 호스트와 대상 호스트는 마이그레이션을 허용하는 운영 체제 및 시스템 유형을 사용하고 있습니다. 이 경우 가상 머신 마이그레이션에 대한 지원되는 호스트를 참조하십시오.
- VM은 대상 호스트의 CPU 기능과 호환되어야 합니다. 이 경우 가상 머신 마이그레이션에 대한 호스트 CPU 호환성 확인을 참조하십시오.
마이그레이션할 VM의 디스크 이미지는 소스 호스트와 대상 호스트 둘 다에 액세스할 수 있는 별도의 네트워크 위치에 있습니다. 오프라인 마이그레이션에는 선택 사항이지만 실행 중인 VM을 마이그레이션하는 데 필요합니다.
이러한 공유 VM 스토리지를 설정하는 방법은 다른 호스트와 가상 머신 디스크 이미지 공유를 참조하십시오.
- 실행 중인 VM을 마이그레이션할 때 네트워크 대역폭은 VM이 더티 메모리 페이지를 생성하는 속도보다 커야 합니다.
연결 프로토콜에 해당하는 가상 네트워크 소켓이 활성화됩니다.
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
프로세스
소스 호스트에서 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 마이그레이션을 위해 OVS(Open vSwitch)를 구성합니다. 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의 통과를 VM의 네트워크 인터페이스로 구성합니다. MAC 주소가 고유한지 확인하고 소스 호스트에서 VF의 PCI 주소를 사용합니다.
소스 호스트에서 VF XML 파일을 VM에 연결합니다.
# virsh attach-device <vm_name> mlx_vf.xml --live --config
이 예제에서
mlx_vf.xml
은 VF 구성이 포함된 XML 파일의 이름입니다. 장치를 실행 중인 VM에 연결하려면--live
옵션을 사용합니다.소스 호스트에서 연결된 VF를 사용하여 실행 중인 VM의 실시간 마이그레이션을 시작합니다.
# virsh migrate --live --domain <vm_name> --desturi qemu+ssh://<destination_host_ip_address>/system
검증
마이그레이션된 VM에서 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
마이그레이션된 VM에서 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