いさぽん部屋(isapon.com)

ゲーム系プログラマによる特に方針のないブログ。技術系とカレー、ラーメンネタ多めだったはずが、最近はダイエットネタ多め。

Vulkan(vkcube) in FreeBSD on bhyve

目的

f:id:no-operand:20200113190735p:plain

vulkan のプログラムをテストしたいのだけど、メインPCで開発していると失敗したときにフリーズしたりしてちょっと大変なので、仮想環境の中で実行してみようという試みです。


うまくいったのでやり方をまとめておきます。


なお、nVidiaのFreeBSDドライバは vulkan をサポートしていないので、FreeBSDで試すなら AMD か Intel のGPUを使います。


動作環境

  • CPU AMD athlon 200ge (*1)
  • Memory 8G
  • AMD Radeon R7 230/340
  • NVidia GeForce 750Ti (*2)

  • Linux AMD Pro Drive not supported Vega 3 GPU.

  • Not test.

安価な AMT Athlon 200GE で組んだPCでテストしてみました。なにより、今回はあまり例の少ない RADEON を試したかったというのもあります。


準備1・PCI Passthrough

BIOS画面で SVM と IOMMU を有効にしておく。

FreeBSD 12.1

今回の実験でVMを保存しておくディレクトリは /var/vm になっています。

PCI

PCI passthrough で仮想環境内でGPUをダイレクトアクセスできるように準備します。

まずはpassthroughしたいGPUのBUSIDを調べます。テスト機には3つのGPUがありますが、Radeon R7 をテストに使います。

pciconfで調べた結果、BUSID = 6:0:0 であることがわかりました。

# pciconf -lv | grep -B3 display    # Check GPU PCIBUS
vgapci2@pci0:6:0:0:        class=0x030000 card=0xe263174b chip=0x66131002 rev=0x00 hdr=0x00
    vendor     = 'Advanced Micro Devices, Inc. [AMD/ATI]'
    device     = 'Oland PRO [Radeon R7 240/340]'
    class      = display

/boot/loader.conf

loader.conf パススルーであることを設定します。また、今回はAMDのCPUを使っているので loader.conf に hw.vmm.amdvi.enable="1" も追加しておきます。

BUSIDは : ではなく / で区切ります。

GPUは6/0/0ですが、HDMIのAudioデバイスがセットでくっついているのでそれもパススルーに追加しておきます。ほぼ間違いなく3つめの値が1です。

# AMD-VI
hw.vmm.amdvi.enable="1"

vmm_load="YES"
pptdevs="6/0/0 6/0/1"

ここで一回再起動します。

reboot

再起動したらパススルーデバイスになっているか確認します。

# pciconf -lv | grep -B3 display    # Check GPU PCIBUS
ppt0@pci0:6:0:0:        class=0x030000 card=0xe263174b chip=0x66131002 rev=0x00 hdr=0x00
    vendor     = 'Advanced Micro Devices, Inc. [AMD/ATI]'
    device     = 'Oland PRO [Radeon R7 240/340]'
    class      = display

vgapci2 が ppt0 になっています。パススルーするデバイスの数によって ppt1 だったり ppt2 だったりしますがそこは関係ないので気にしないでよいです。

準備2・Virtual Machine

仮想マシンを構築していきます。

vm-bhyve

bhyveをそのまま使うとコマンドを打つのが大変なのでvm-bhyveを使います。vm-bhyveはbhyveを簡単に呼び出すためのシェルスクリプトです。
3行目と4行目の public は仮想マシンが使う仮想ネットワークデバイスの名前です。なんでも良いのですが、多くのサンプルに合わせてpublicにします。
4行目の re0 は使用しているネットワークインターフェースの名前です。
5行目はFreeBSDのインストールメディアのダウンロードです。
6行目のvktestは仮想マシンの名前なので自分で好きなようにつけてください。

# pkg update
# pkg upgrade
# pkg install vm-bhyve
# mkdir /var/vm
# vm init
# vm switch create public
# vm swotch add public re0
# vm iso https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/12.1/FreeBSD-12.1-RELEASE-amd64-disc1.iso
# vm create vktest

/var/vm/vktest/vktest.conf

仮想マシンの設定ファイルをいぢります。ファイルは /var/vm/vktest/vktest.conf です。vktestはさきほどの仮想マシンの名前です。
ポイントは passthru0 です。ここにパススルーしたいBUSIDを記載します。複数ある場合はpassthru0,passthru1のように書いていきます。

loader="bhyveload"
cpu=1
memory=2G
network0_type="virtio-net"
network0_switch="public"
disk0_type="virtio-blk"
disk0_name="disk0.img"
passthru0="6/0/0"
passthru1="6/0/1"
uuid="自動設定されているはず"
network0_mac="自動設定されているはず"

仮想マシン用のハードディスクはデフォルトでは20Gバイト確保されています。

# ls /var/vm/vktest
-rw-------  1 root  wheel  21474836480 Jan 13 19:40 disk0.img

自前で確保したいときは truncate コマンドを使います。以下がそのサンプルです。

# truncate -s 16G /var/vm/vktest/disk0.img

VMの起動

「vm install 仮想マシン名 ISOファイル名」でインストールモードでVMを起動できます。ちなみにISOファイルは /var/vm/.iso ディレクトリ内にあるファイル名になります。

# vm install vktest FreeBSD-12.1-RELEASE-amd64-disc1.iso
# vm list
NAME      DATASTORE  LOADER     CPU  MEMORY  VNC  AUTOSTART  STATE
vktest    default    bhyveload  2    2G      -    No         BootLoader(1751)

これで起動しているはずなので、仮想マシンのシリアルコンソールに入ります。環境によってはレイアウトがおかしなことになっていることもありますが、そこは気にせずインストール作業をしてみてください。
なお、vm consoleから抜ける方法はないのでssh経由で操作することをお勧めします。

# vm console vktest

FreeBSDを仮想マシンにインストールしたら、仮想マシン内でsshなどを起動しておくとよいでしょう。
ここからはすべて仮想マシン内での作業になります。


仮想マシン・Desktop

PCIのBUSIDを確認しておきます。
BUSID = 6:0:0 でGPUが見えているのがわかります。ちなみに、ホスト環境と異なることもあるので必ず確認しましょう。

# pciconf -lv | grep -B3 display
vgapci0@pci0:0:6:0:     class=0x030000 card=0xe263174b chip=0x66131002 rev=0x00 hdr=0x00
    vendor     = 'Advanced Micro Devices, Inc. [AMD/ATI]'
    device     = 'Oland PRO [Radeon R7 240/340]'
    class      = display

ソフトウェアのインストール

1行目は基本的なデスクトップ環境です。xorgとx11vncだけあればとりあえずテストはできますが、ウィンドウマネージャをインストールしてちょっと使いやすくしておきます。
2行目はdrm-kmodがGPUドライバ、xf86-video-amdgpuがx11からamdgpuを使うためのソフトです。

# pkg update
# pkg upgrade
# pkg install xorg mate lightdm lightdm-gtk-greeter x11vnc
# pkg install drm-kmod xf86-video-amdgpu

ドライバの読み込み

Radeonの場合はamdgpuというモジュールになります。

# kldload amdgpu
# dmesg
[drm] amdgpu: 2048M of VRAM memory ready
[drm] amdgpu: 1504M of GTT memory ready.
(略)
[drm] size 14745600
[drm] fb depth is 24
[drm]    pitch is 10240

Xの設定

今回はxorg.confを直接書きます。
/usr/local/etc/X11/xorg.conf を作成し、以下のように編集します。
ポイントは Section Device の BusID と、Section Screen の Virtual の項目です。

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
EndSection

Section "Module"
        Load  "glx"
EndSection


Section "Monitor"
        Identifier   "Monitor0"
EndSection

Section "Device"
        Identifier  "Card0"
        Driver      "amdgpu"
        BusID       "PCI:0:6:0"
        Option      "DRI3" "true"
        Option      "TearFree" "true"
EndSection

Section "Screen"
        Identifier      "Screen0"
        Device          "Card0"
        Monitor         "Monitor0"
        DefaultDepth    24
        SubSection "Display"
                Virtual         1280 1024
                Depth           24
        EndSubSection
EndSection

ユーザーを video グループに追加する

作業するユーザーを video グループに追加し、一般ユーザーに戻ってください。

# pw usermod USERNAME -G video

Xを起動する

今回はわかりやすいようにサービス化せずに直接Xを起動します。

% startx
もしくは
% lightdm

VNCを起動する

SSHなどで接続し、今度はx11vncを起動します。

% x11vnc -storepasswd test.passwd
VNC用パスワードを適当に決める
% x11vnc -auth guess -display :0 -rfbport 5900 -forever -loop -noxdamage -repeat -rfbauth test.passwd

VNC Viewerで接続する

Windowsなどから VNCで接続し、vulkan-toolsなどをインストールしてからvkcube を実行すればVulkanのデモが見れるはずです。

f:id:no-operand:20200113190658p:plain

ESXiとbhyve

最初はVMWare (ESXi)を使っていたのですが、どうやら PCI Passthrough に問題があるらしく…というか実際に使っていたらPCIパススルーまわりでシステムがフリーズしたり…ということが多々ありあまり使い物になりませんでした。


そこで正直あまり期待はしていなかったのですが、FreeBSD bhyve をダメもとで使ってみたところ、思った以上に使いやすい(ホスト環境側にGUIが不要)!安定している!ということで、試しにやってみました。


今後はこれで本格運用をしていこうかなと思います。

テストによさそうなものたち

ASUS AMD Radeon R7 240搭載ビデオカード 防塵ファン R7240-2GD3-L

ASUS AMD Radeon R7 240搭載ビデオカード 防塵ファン R7240-2GD3-L

  • 発売日: 2014/04/25
  • メディア: Personal Computers

AMD CPU Athlon 200GE YD200GC6FBBOX Vegaグラフィックス搭載

AMD CPU Athlon 200GE YD200GC6FBBOX Vegaグラフィックス搭載

  • 発売日: 2018/09/28
  • メディア: Personal Computers

ASRock AMD B450チップ搭載 Micro ATX マザーボード B450M Pro4

ASRock AMD B450チップ搭載 Micro ATX マザーボード B450M Pro4

  • 発売日: 2018/07/31
  • メディア: Personal Computers