xenserver pgu pass-through 구현하기
작성자 : 서진우 (alang@clunix.com)
XenServer 6.2 환경에서 Physical Graphic Board를 passthrough 하는 방법에 대해 알아보자
간단한 절차는 아래와 같다.
Xenserver 6.2 설치 > Hotfix XS62E004 적용 > Hotfix XS62ETP001 적용(GRID K 이용시) >
Nvidia-vgx-xenserver 설치 (GRID K 이용 시) > Windows 7 VM 생성 (생성 시 VM 자동 시작 안함) >
vGPU 생성 및 VM mapping > VM 에 Windows 7 운영체제 설치 > HP RGS설치 > NVIDIA GPU driver 설치
> Xentools 설치
Xenserver 6.2 에서 GPU Passthrough 하는 방법은 크게 2가지로 나눈다.
하나는 Quadro나 Kepler 와 같이 일반적인 pGPU를 passthrough 를 통해 VM에 직접 할당하는
방법이다. 다른 하나는 GRID K2, K1 같이 NVIDIA VGX 기술을 이용한 vGPU를 VM에 할당하는
방법이다.
우선 pGPU를 VM에 제공하는 방법이다.
먼저 서버의 BIOS상에서 Intel VT-d 기능을 활성화 시킨다.
XenServer 상에서 Intel VT-d 기능이 적용되었는지를 확인다.
# xl dmesg | grep VT
————————————————————————
(XEN) Intel VT-d iommu 0 supported page sizes: 4kB.
(XEN) Intel VT-d iommu 1 supported page sizes: 4kB.
(XEN) Intel VT-d Snoop Control enabled.
(XEN) Intel VT-d Dom0 DMA Passthrough enabled.
(XEN) Intel VT-d Queued Invalidation enabled.
(XEN) Intel VT-d Interrupt Remapping enabled.
(XEN) Intel VT-d Shared EPT tables not enabled.
————————————————————————
XenServer 상에 인식되어 있는 GPU 장치를 확인한다.
# lspci | grep VGA
————————————————————————
02:00.0 VGA compatible controller: NVIDIA Corporation GF110GL [Tesla C2050 / C2075] (rev a1)
03:00.0 VGA compatible controller: NVIDIA Corporation GF110GL [Tesla C2050 / C2075] (rev a1)
07:01.0 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200eW WPCM450 (rev 0a)
83:00.0 VGA compatible controller: NVIDIA Corporation GK104GL [Quadro K5000] (rev a1)
84:00.0 VGA compatible controller: NVIDIA Corporation GF110GL [Tesla C2050 / C2075] (rev a1)
————————————————————————
# xe pgpu-list
————————————————————————
uuid ( RO) : 5c89f6b2-3921-d8b5-a847-d85e882ef22f
vendor-name ( RO): Matrox Electronics Systems Ltd.
device-name ( RO): MGA G200eW WPCM450
gpu-group-uuid ( RO): bc73dd4e-35aa-14ad-94a5-35c7b37b3253
uuid ( RO) : db3dbbdd-dd90-7000-79f6-fc10d23b8859
vendor-name ( RO): NVIDIA Corporation
device-name ( RO): GF110GL [Tesla C2050 / C2075]
gpu-group-uuid ( RO): f7197a87-ea53-556c-274c-c12c09fb20b4
uuid ( RO) : 14648feb-5603-7020-3ed1-5a866222d035
vendor-name ( RO): NVIDIA Corporation
device-name ( RO): GF110GL [Tesla C2050 / C2075]
gpu-group-uuid ( RO): f7197a87-ea53-556c-274c-c12c09fb20b4
uuid ( RO) : 4dfacb43-d8a8-6aa1-382b-06b97be79fbf
vendor-name ( RO): NVIDIA Corporation
device-name ( RO): GK104GL [Quadro K5000]
gpu-group-uuid ( RO): 74aa44ad-ac92-d451-c490-9c89bb5c0c59
uuid ( RO) : dda1942f-7edd-90fb-0b6d-4bb612ad1836
vendor-name ( RO): NVIDIA Corporation
device-name ( RO): GF110GL [Tesla C2050 / C2075]
gpu-group-uuid ( RO): f7197a87-ea53-556c-274c-c12c09fb20b4
————————————————————————
다음으로는 Xenserver 상에서 인식하고 있는 GPU group 정보를 확인하다.
Citrix Xenserver 는 open Xen 가는 달라 동일한 사양의 GPU가 여러개 있는 경우 이를 하나의
그룹으로 인식을 하고, GPU 그룹을 여러 VM에 할당하면, 그룹내에 존재하는 GPU를 자동으로
개별 VM에 할당하도록 되어 있다. 즉 GPU 별로 pci id 를 일일이 파악하여 VM별로 개별 지정
할 필요가 없다.
# xe gpu-group-list
————————————————————————
uuid ( RO) : f7197a87-ea53-556c-274c-c12c09fb20b4
name-label ( RW): Group of NVIDIA Corporation GF110GL [Tesla C2050 / C2075] GPUs
name-description ( RW):
uuid ( RO) : 74aa44ad-ac92-d451-c490-9c89bb5c0c59
name-label ( RW): Group of NVIDIA Corporation GK104GL [Quadro K5000] GPUs
name-description ( RW):
uuid ( RO) : bc73dd4e-35aa-14ad-94a5-35c7b37b3253
name-label ( RW): Group of Matrox Electronics Systems Ltd. MGA G200eW WPCM450 GPUs
name-description ( RW):
————————————————————————
일단 XenCenter 에서 GPU를 할당할 Windows 7 VM의 Metadata만 생성해 둔다. 기본적으로
VM Metadata 생성 시 자동으로 VM을 시작하여 운영체제 설치가 바로 진행되는데, 바로 시작하지
않은 상태에서 Meta정보만 생성한다.
이제 생성된 VM 정보를 확인한다.
# xe vm-list
————————————————————————
uuid ( RO) : 755b8431-066d-b42d-260e-3f7e8a38c132
name-label ( RW): win7-01
power-state ( RO): halted
uuid ( RO) : 41072988-71d3-7f20-b781-47235fff93fc
name-label ( RW): win7-02
power-state ( RO): halted
uuid ( RO) : 1828ec5a-42bf-48ca-ab85-382288282df1
name-label ( RW): Control domain on host: xen-alang
power-state ( RO): running
uuid ( RO) : b627fb12-ef0e-4347-8588-48353d961c33
name-label ( RW): win7-01s
power-state ( RO): halted
uuid ( RO) : ea006743-5185-6130-4dc7-85d2535a3c4e
name-label ( RW): win7-03
power-state ( RO): halted
# xe vm-list name-label=win7-01
uuid ( RO) : 755b8431-066d-b42d-260e-3f7e8a38c132
name-label ( RW): win7-01
power-state ( RO): halted
————————————————————————
이제 xe gpu-group-list 에서 확인된 GPU group을 특정 win7-03 VM에 할당해 보도록 하자
우선 기존에 할당된 gpu_group이 없는지 확인한다.
# xe vgpu-list vm-uuid=ea006743-5185-6130-4dc7-85d2535a3c4e
그럼 아무런 정보가 출력되지 않아야 한다. 만일 기존에 할당된 GPU가 있다면 아래와 같이
할당된 gpu-group-uuid 가 출력이 될것이다.
# xe vgpu-list vm-uuid=755b8431-066d-b42d-260e-3f7e8a38c132
uuid ( RO) : 3dab6b01-c202-f723-8474-4529e030a00e
vm-uuid ( RO): 755b8431-066d-b42d-260e-3f7e8a38c132
gpu-group-uuid ( RO): f7197a87-ea53-556c-274c-c12c09fb20b4
만일 새롭게 gpu-group을 할당하고자 하면 아래와 같은 방법으로 기존 할당된 gpu-group
을 제거한다.
# xe vgpu-destroy uuid=3dab6b01-c202-f723-8474-4529e030a00e
# xe vgpu-list vm-uuid=755b8431-066d-b42d-260e-3f7e8a38c132
이제 win7-03 VM 에 Quadro K5000 의 pGPU를 할당한다.
pGPU를 할당하기 위해서는 win7-01의 uuid 와 Quadro K5000 GPU가 포함된 gpu_group의 uuid
정보가 필요하다. xe vm-list, xe gpu-group-list 명령으로 확인이 가능하다.
pGPU 할당은 xe vgpu-create 명령으로 가능하다.
# xe vgpu-create vm-uuid=ea006743-5185-6130-4dc7-85d2535a3c4e gpu-group-uuid=74aa44ad-ac92-d451-c490-9c89bb5c0c59
————————————————————————
7bdd7660-28da-31b2-b538-53c8bea68ec5
————————————————————————
xe vgpu-create 명령으로 VM 에 PGPU를 정상적으로 할당하면 XenServer레벨에서 인식하는
vgpu uuid 가 출력된다.
이제 win7-03 VM에 GPU가 정상적으로 할당되었는지 확인한다.
# xe vgpu-list vm-uuid=ea006743-5185-6130-4dc7-85d2535a3c4e
————————————————————————-
uuid ( RO) : 7bdd7660-28da-31b2-b538-53c8bea68ec5
vm-uuid ( RO): ea006743-5185-6130-4dc7-85d2535a3c4e
gpu-group-uuid ( RO): 74aa44ad-ac92-d451-c490-9c89bb5c0c59
————————————————————————-
정상 할당이 되어지면 위와 같이 vgpu uuid 가 출력되어야 한다.
XenCenter 프로그램에서 해당 VM의 속성으로 들어가서 GPU 정보를 보면 Quadro K5000 GPUs 그룹이
할당되어 있는 것을 확인할 수 있다.
이제 위에서 설명한 바와 같이 Windows 7 운영체제를 설치하고, 원격접속툴(RGS, VNC)설치 ,
K5000에 대한 Nvidia Driver를 설치 한다.
Nvidia Driver 설치 완료 후 reboot 하면 다음 부터는 K5000 GPU 를 가상머신에서 기본 VGA로
인식하게 된다. 이때 XenCenter 프로그램의 VNC console 에도 화면이 나타날 수 있는데,
이는 Nvidia GPU를 인식하기 전까지 그래픽 화면을 표현할때 사용되는 가상 VGA장치를 생성
하기 때문에다. GPU passthrough 되면 가상 console 에 대한 VGA는 제거하는 것이 좋다.
아래는 기본 가상 VGA를 제거하는 방법이다.
# xe vm-param-set uuid=755b8431-066d-b42d-260e-3f7e8a38c132 platform:vgpu_vnc_enabled=false
OpenXen 에서는 hvm config 에 gfx_passthru=1 에 해당하는 명령이라 볼수 있다.
이제 정상적으로 GPU가 VM에 할당되어 동작하면 XenCenter의 console 화면에는 Black Screen
만 나타나게 된다.
VM 에는 원격 3D 그래픽 전송이 가능한 프로토콜(Citrix HDX3Dpro, HP RGS, TightVNC+DF Mirage,
RealVNC)을 이용하여 원격에서 고속의 3D 환경을 구현할 수 있다.