雷禅サーバー構築記(GPUパススルー編)

2019/03/22 2020/05/21

今回はRADEON RX560をMacOS側にパススルーする形を考えました。

ただRYZEN 2700XはGPU内蔵ではないので、
『パススルーする = ホストOSのコンソールは使えない』
という事になります。

とはいえ普通に動いているときのホストOS側はSSHで繋げればコンソールは不要なので、まぁ問題無いでしょとパススルー化を始めました。

で、これはワタシの想定が誤っていたのですがGPUパススルーをしていない時、今回だとMacOSを立ち上げていないときはホストOSのコンソールとして使えると思ってましたのですが、間違いでした。

『パススルー対象のデバイスはホストOSのデバイスとしてに認識(ドライバ読み込み)させてはいけない』
という決まりがあり、認識させない = OS起動時から使えないが正解でした。

これは/etc/modprobe.d配下にvfio.conf等のファイルを作って

blacklist amdgpu

みたいな感じでGPUドライバを読ませないように設定が必要となります。
ただ、これだとまだ足らなくて、コンソール文字表示は出来てしまいます。

この状態でMacOSを起動させようとすると、

(qemu) qemu-system-x86_64: -device vfio-pci,host=08:00.0,multifunction=on: Failed to mmap 0000:08:00.0 BAR 0. Performance may be slow

みたいな内容で立ち上がらす終了します。この対策としてはブートローダーのカーネルパラメーターに

options video=efifb:off

みたいに書いてあげる必要がありました。
最近のLinuxは起動途中に単なるコンソール表示からフレームバッファ表示になるのでそれを切らないとダメなようです。
これでめでたくOSは起動直後から何も表示しなくなりますw

で、これで終わりかと思いきや、もう一つ問題があったりします。
この状態でも起動エラーは起きないもののUEFIの画面がグラフィカルではなく文字で表示され、OS起動しても画面が真っ黒なままになります。
この原因はパススルー時に設定にGPUのビデオBIOS ROMの内容を読み込めていないからのようです。
カード固有情報も持っているようなのでROMの中身をファイルに吸い上げて起動時に指定する形となるようです。

吸い上げは以下でできます。但し、ホストOSにGPUドライバが読み込まれていない事が条件なので、上記のカーネルパラメータ設定をしてSSHで繋ぐ感じになると思います。

echo 0000:08:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind
cd /sys/bus/pci/devices/0000:08:00.0
echo 1 > enable
echo 1 > rom
cat rom > /tmp/vbios.rom
echo 0 > rom
echo 0 > enable
echo 0000:08:00.0 > /sys/bus/pci/drivers/vfio-pci/bind

なお、0000:08:00.0の所はlspciで見れるGPUのIDをセットする形になります。
うちのは

08:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Baffin [Radeon RX 460/560D / Pro 450/455/460/555/555X/560/560X] (rev e5)

てな感じだったので0000:08:00.0で指定しています。

これでパススルー出来た時は超感激でした。1週間位ハマってたので…

つぎはKVM周りとしては最後になります。

関連記事

コメントとトラックバック

    コメントはありません

    コメントを残す

    CAPTCHA


    トラックバックURLhttps://e-tune-mt.net/ylab/2281/trackback