結論から言えばWindows10 – RADEON RX460のGPUパススルー、USBパススルーはできた。
しかし安定性が悪かったので挫折。
どの程度役に立つかはおいておいて、日本語の情報がなくて苦しんだので少しでもアウトプットしておく。
きっかけ
OpenStackってAWSっぽい感じのダッシュボードで仮想マシン管理できるらしいと聞いて、試してみたくなった。メインPC上で集約させて一つのPCしか起動しないようになれば電気代が安くできるのではなどと淡い期待を抱いていた。
これが一週間に及ぶセットアップ地獄の始まりだった。
まずは環境構築
参考になる日本語のページは少ないが、環境構築だけでいえばかなりきっちり書いてくれている人たちがいるのでこの辺りを見つつ入れる。
packstackならこの記事
OpenStack Mitakaの導入 (Win7, Virtual Box, CentOS 7, RDO)
それぞれインストールするならこの記事
VirtualBoxで作成したCentOSにOpenStackを構築する(環境編)
初っ端からログイン画面で最新のChromeだとログインできないという罠。Edgeを使った。
packstackでインストールする場合、SAHARAは使用していなくてもなぜかCPUを使い続ける現象が発生したので要らなければ外したほうがいいかも。
Windowsの仮想マシンを用意
参考:OpenStackで使用可能なWindows10イメージの作成方法
WindowsはvirtioのHDDを認識してくれないので、別途作った仮想マシンのファイルをOpenStackに投げ込む。後々困らないようにvirtio-winの中身はマイドキュメントあたりに移しておいたほうが安心。(一回イーサネットアダプタのドライバをqcow2に含め忘れて詰んだ)
PCIパススルー
GPUもUSBコントローラもPCIデバイスなので、手順はまとめます。
GPUパススルーは言わずもがなですが、USBコントローラもセットでパススルーしてやれば普通のデスクトップ環境のように使えて幸せになれます。
ちゃんと動けば。
grubの上書き
参考: CentOS7 KVMでPCIパススルー(GPU含む)
GRUB_CMDLINE_LINUX_DEFAULT に次を追加(intel_iommuはインテルの場合のみ)
自分はpci-stub.idsはUSBコントローラの物のみ追加しました。
1 |
intel_iommu=on nomodeset pci-stub.ids=(vendor_id):(product_id) |
そのあと、コマンドで
1 |
grub2-mkconfig -o /boot/grub2/grub.cnf |
ブラックリストへの追加も行う。
/etc/nova/nova.confの書き換え
めちゃくちゃハマりポイント
パススルーするデバイスの指定をします。ここではvendor_id,product_idをそれぞれ1002:47ef、1b12:1242とを例にして記述します。
まずはpci_aliasを設定。フレーバーにデバイスを指定するときの名前です。複数ある時は分けて書きます。
1 2 |
pci_alias = { "name":"RX460" , "vendor_id":"1002", "product_id":"67ef" } pci_alias = { "name":"USB1" , "vendor_id":"1b21", "product_id":"1242" } |
次にpci_passthrough_whitelistを設定。複数ある時はJsonのArrayにまとめます。
1 |
pci_passthrough_whitelist= [{ "name":"RX460" , "vendor_id":"1002", "product_id":"67ef" },{ "name":"USB1" , "vendor_id":"1b21", "product_id":"1242" }] |
vendor_id,product_idの16進部分は小文字で書きましょう。
コンフィグファイルのバリデーションには引っかからないのに、インスタンスを起動したタイミングで実行できるホストが無いというエラーが吐かれます。単純に文字列比較してる…?
scheduler_available_filtersの追加
1 2 |
scheduler_available_fitlers=nova.scheduler.filters.allfilters scheduler_available_filters=nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter |
scheduler_default_filtersに追加
1 |
scheduler_available_fitlers=RetryFilter,AvailabilityZoneFilter..(中略).. ,PciPassthroughFilter |
flavorにPCIデバイスを追加するときの書き方
1 |
nova flavor-key (flavor名) set "pci_passthrough:alias"="RX460:1,USB1:1" |
あとは tail /var/log/nova/nova-* 等してERRORを探してください。
スタックトレースが出てるので、ソースを追いましょう。(エラーメッセージでググって情報にたどり着けるのはレアです)