CloudStack 4.18をUbuntu 22.04 LTSにインストール: GPUパススルー

CloudStack

GPUパススルーとは

パススルーを有効にすると、KVMホストサーバー(物理)に接続されているグラフィックボードをCloudStackで稼働しているVMでする事ができるようになります。
その代わり、パススルーを有効にしたグラフィックボードはKVMホストサーバーから直接利用することはできなくなります。

有効するには、

  • grubでIOMMUを有効化
  • カーネルモジュール設定
  • BIOSでIOMMUを有効化
  • VM設定

をおこないます。

設定したホストには2枚のNVIDIA製チップがのっているグラボが2枚刺さってますが、ZOTAC GAMING GeForce GTX 1650 OC 4GB に対してパススルーを有効にします。
残りの1枚はホストOS管理用としてホストから利用できる状態にします。

grubでIOMMUを有効化

まずはGrub設定をします。
grubの設定ファイルを編集して、GRUB_CMDLINE_LINUX の値を変更します。

$ sudo vi /etc/default/grub
# GRUB_CMDLINE_LINUX="amd_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1 iommu=pt"
GRUB_CMDLINE_LINUX="iommu=pt amd_iommu=on rd.driver.pre=vfio-pci"

変更できしたらgrub-mkconfigコマンドで設定を反映します。

$ sudo grub-mkconfig -o /boot/grub/grub.cfg

grubの設定はこちらを参考にしました。

https://askubuntu.com/questions/1406888/ubuntu-22-04-gpu-passthrough-qemu
https://www.belbel.or.jp/opensuse-manuals_ja/app-gpu-passthru.html

カーネルモジュール設定

まずはGrubの設定ですが、設定する前にパススルーで使用するデバイスを確認します。
チップはNVIDIA製なので、lspciコマンドでデバイスの情報を確認し、PCI IDを調べます。

$ lspci -nn|grep NVIDIA
09:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK208B [GeForce GT 730] [10de:1287] (rev a1)
09:00.1 Audio device [0403]: NVIDIA Corporation GK208 HDMI/DP Audio Controller [10de:0e0f] (rev a1)
0a:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU117 [GeForce GTX 1650] [10de:1f82] (rev a1)
0a:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10fa] (rev a1)

今回は GeForce GTX 1650 を有効化するので、10de:1f8210de:10fa が対象です。
これをvfio.confファイルに登録します。ファイルがない場合は新規に作成してください。

$ sudo vi /etc/modprobe.d/vfio.conf

下の1行を追加します。

options vfio-pci ids=10de:1f82,10de:10fa

設定を反映します。

$ sudo update-initramfs -u

update-initramfsが終わったらリブートします。
リブートついでにBIOSのIOMMUを有効化します。

$ sudo reoot

PCI IDの調べ方はこちらのページを参考にしました。

https://zenn.dev/190ikp/articles/vagrant_libvirt_gpu

BIOSでIOMMUを有効化

BIOSでIOMMUを有効化します。

グラボメーカーによって設定箇所に違いはありますが、IOMMUを有効にしてください。
この設定が有効になっていないと、カーネルやgrubでどんなにがんばってもパススルーは有効になりません。

GPU Passthrow

リブートできたら、CloudStackのマネジメントコンソールからGPUを利用したいVM(インスタンス)の設定を変更します。
設定するにはインスタンスが停止している必要があるので、起動しているようなら停止します。

インスタンスの Settings -> Add setting の順にクリックします。

表示されるこの入力欄(ちっさ)に下の情報を入力します。

Name: extraconfig-1

Value:

<devices>
  <hostdev mode='subsystem' type='pci' managed='yes'>
    <driver name='vfio'/>
    <source>
      <address domain='0x0000' bus='0x0a' slot='0x00' function='0x0'/>
    </source>
    <alias name='geforcegtx1650vga'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x00' function='0x0'/>
  </hostdev>
  <hostdev mode='subsystem' type='pci' managed='yes'>
    <driver name='vfio'/>
    <source>
      <address domain='0x0000' bus='0x0a' slot='0x00' function='0x1'/>
    </source>
    <alias name='geforcegtx1650audio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x00' function='0x1'/>
  </hostdev>
</devices>

設定したらインスタンスを起動して、VMからグラフィックボードが見えているか確認します。

VMにSSHでアクセスし、lspciで確認します。

$ lspci -nn|grep NVIDIA

こんな風に見えていたらOKです。

00:07.0 VGA compatible controller [0300]: NVIDIA Corporation TU117 [GeForce GTX 1650] [10de:1f82] (rev a1)
00:08.0 Audio device [0403]: NVIDIA Corporation Device [10de:10fa] (rev a1)

インスタンスの設定はこのページを参考にしました。

https://askubuntu.com/questions/1406888/ubuntu-22-04-gpu-passthrough-qemu

CloudStackを4.18.2にした後…

GUIでextraconfigパラメータを追加できなくなったようで、上の操作では設定できなくなりました。
設定するにはグローバル設定で下記を設定し、インスタンスのextraconfigそのものの設定はCloudMonkeyで設定します。

  • enable.additional.vm.configuration
  • allow.additional.vm.configuration.list.kvm

グローバル設定

  • enable.additional.vm.configuration
    • ONに設定
  • allow.additional.vm.configuration.list.kvm
    • devices
    • hostdev
    • driver
    • address
    • alias
    • source

参考にした情報: extraconfig argument in update/deploy virtualmachine does not append existing fields #8847

extraconfig設定

extraconfigの設定はこんな感じにしました。

$ cmk -p whale
> update virtualmachine id=4b42d988-66ec-4b15-8625-0d3169d12269 extraconfig=%3Cdevices%3E%20%20%20%3Chostdev%20mode%3D%22subsystem%22%20type%3D%22pci%22%20managed%3D%22yes%22%3E%20%20%20%20%20%3Cdriver%20name%3D%22vfio%22%20%2F%3E%20%20%20%20%20%3Csource%3E%20%20%20%20%20%20%20%3Caddress%20domain%3D%220x0000%22%20bus%3D%220x0a%22%20slot%3D%220x00%22%20function%3D%220x0%22%20%2F%3E%20%20%20%20%20%3C%2Fsource%3E%20%20%20%20%20%3Calias%20name%3D%22geforcegtx1650vga%22%20%2F%3E%20%20%20%20%20%3Caddress%20type%3D%22pci%22%20domain%3D%220x0000%22%20bus%3D%220x00%22%20slot%3D%220x00%22%20function%3D%220x0%22%20%2F%3E%20%20%20%3C%2Fhostdev%3E%20%20%20%3Chostdev%20mode%3D%22subsystem%22%20type%3D%22pci%22%20managed%3D%22yes%22%3E%20%20%20%20%20%3Cdriver%20name%3D%22vfio%22%20%2F%3E%20%20%20%20%20%3Csource%3E%20%20%20%20%20%20%20%3Caddress%20domain%3D%220x0000%22%20bus%3D%220x0a%22%20slot%3D%220x00%22%20function%3D%220x1%22%20%2F%3E%20%20%20%20%20%3C%2Fsource%3E%20%20%20%20%20%3Calias%20name%3D%22geforcegtx1650audio%22%20%2F%3E%20%20%20%20%20%3Caddress%20type%3D%22pci%22%20domain%3D%220x0000%22%20bus%3D%220x00%22%20slot%3D%220x00%22%20function%3D%220x1%22%20%2F%3E%20%20%20%3C%2Fhostdev%3E%20%3C%2Fdevices%3E

extraconfig=の後にはXMLを入力するのですが、そのままだと通らなかったので、XMLをURL変換して設定しました。
これでなんとかいけました。

CloudMonkeyの詳細は下記にあるので参考にしてください。

CloudMonkey


これでGPUパススルーは設定完了。グラボに限らず、USBデバイスをパススルーする場合もこの方法でOKのはず。
後はドライバを入れて、生成AIや仮想通貨マイニングなんかをやってみたりといろいろ試せるかと思います。

ちなみに、Stable Diffusionを試してみたけど、VRAM少なすぎてめっちゃちっちゃい画像しか出せないし処理は遅いしで微妙でした。文章生成系AIもメモリないとダメっすね。
今なら、入門用にはGeforce RTX 3060 の12GBモデルがいいらしいですね。