Vulkan(vkcube) in FreeBSD on bhyve
目的
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のデモが見れるはずです。
ESXiとbhyve
最初はVMWare (ESXi)を使っていたのですが、どうやら PCI Passthrough に問題があるらしく…というか実際に使っていたらPCIパススルーまわりでシステムがフリーズしたり…ということが多々ありあまり使い物になりませんでした。
そこで正直あまり期待はしていなかったのですが、FreeBSD bhyve をダメもとで使ってみたところ、思った以上に使いやすい(ホスト環境側にGUIが不要)!安定している!ということで、試しにやってみました。
今後はこれで本格運用をしていこうかなと思います。
テストによさそうなものたち
ASUS AMD Radeon R7 240搭載ビデオカード 防塵ファン R7240-2GD3-L
- 発売日: 2014/04/25
- メディア: Personal Computers
PowerColor社製 AMD Radeon R7 240 GPU搭載ビデオカード (オーバークロックモデル) AXR7 240 2GBK3-HV2E/OC
- メディア: Personal Computers
AMD CPU Athlon 200GE YD200GC6FBBOX Vegaグラフィックス搭載
- 発売日: 2018/09/28
- メディア: Personal Computers
ASRock AMD B450チップ搭載 Micro ATX マザーボード B450M Pro4
- 発売日: 2018/07/31
- メディア: Personal Computers
CORSAIR DDR4-2666MHz デスクトップPC用 メモリモジュール VENGEANCE LPX Series 8GB×2枚キット CMK16GX4M2A2666C16
- 発売日: 2015/08/01
- メディア: Personal Computers
シリコンパワー SSD 256GB 3D NAND採用 SATA3 6Gb/s 2.5インチ 7mm PS4動作確認済 3年保証 A55シリーズ SP256GBSS3A55S25
- 発売日: 2017/10/10
- メディア: 付属品