AIDEMOIRE

【アイデモワール】

VMware DirectPath I/Oでビデオカードを使ってみました

2013/10/08:その後、別のマシンで再度試したました。⇒ VMware DirectPath I/Oでビデオカードを使ってみました - その2 - AIDEMOIRE


VMware ESXi 5.1の“DirectPath I/O”(または“Device Passthrough”)の機能を使ってビデオカードをゲストOSから使う実験をしてみました。

パスワード クラックの実験をするためにGPGPUを使いたいと言うのが動機です。物理PCより仮想マシンで環境を整えた方が何かと便利なのでDirectPath I/Oにトライしました。実は、半年ほど前に目的は違いますが同じ実験をして失敗しています。その時はGPGPUとして使うのではなく、ゲストOSの画面をビデオカードに出力してESXiを動かしているPC1台でWindowsも使える環境を構築しようと思いました。

結果から言うと、本当に偶然と言うか、殆ど事故的にKali Linuxの画面をDirectPath I/Oを使って表示することができました。でも、そこまでです。

目的はGPGPUとは言え、ビデオカードのドライバを使う事には変わりありませんから、その前段階として少なくともビデオ出力ができなければいけません。そこで、まずはDirectPath I/Oを使ってビデオ出力が可能か改めて試しました。まずは、DirectPath I/Oが機能するのか確認する意味で以前購入した廉価なビデオカードで実験してみました。

そしたらKali LinuxのデスクトップをRadeon HD 6450を使ってモニタに表示できました。

本当はWindows 7Windows 8の画面を出したく、色々とトライしてみましたがダメでした。Linuxも同じDebian系のUbuntu(13.04)で同様の方法で試してみましたが、やはりダメでした。今のところ成功したのはKali Linux(1.0.4)だけです。

ハードウェア環境

MBO:ASRock Q77M vPro
CPU:Intel Core i7 3770
Video:Sapphire HD 6450 1GB DDR3

ソフトウェア環境

ハイパーバイザ:VMware ESXi 5.1.0
ゲストOS:Kali Linux 1.0.4 amd64

DirectPath I/Oを使うためにはハードウェアとしてIO仮想化(IntelのVT-dまたはAMDAMD-Vi)が有効になっている必要があります。そのためにVT-d/AMD-Vi機能を持つCPU、またVT-d/AMD-Viをサポートするチップセット(Intel Q77やZ77など)、そして起動時にVT-d/AMD-Viを初期化できるBIOSを揃える必要があります。データセンタ等で使うIBMやHP製のマシンであれば大体要件を満たしていますが、コンシューマ向けでそれを満たすとなると、かなり限定されてしまいます。私は上のMBOとCPUの組合せで実験しました。

手順

  1. ESXiのDirectPass I/O機能を有効にしてHD 6450をパススルー・デバイスとして登録します。
  2. ゲストマシンに仮想PCIのボードとしてHD 6450を追加してブートします。
  3. Kali Linuxで次のコマンドを実行し、リブートします。
apt-get install fglrx-control
aticonfig --initial

すると、grubのブートメニューからブート途中までのメッセージはVMwareの仮想ビデオカードに出力されますが、Xウィンドウが起動したところでビデオ出力がHD 6450側へ切り替わります。(VMwareの仮想ビデオカードはXウィンドウが終了するまで真っ暗になります。)

だけど

Kali Linuxのデスクトップは問題なく使えます。しかし、操作しているとちょっと気になることがありました。ウィンドウをドラッグして移動するとチラついたり、再描画が目で確認で確認できます。廉価版とは言えSapphire HD 6450は一応はグラフィックボードですから、そんな性能ではありません。どうもSVGAモードで動いているような感じです。残念ながらビデオカードは既にESXiのマシンから撤去して、/var/log/Xorg.0.logを残し忘れたので原因は分かりません。(その内、機会があれば再度試してみますが....。)

そう言う状況なので、Kali LinuxのXウィンドウは表示できましが、Radeonチップとしてちゃんと認識できていないためか、OpenCLなどのライブラリをインストールしても該当するグラフィック・コアが無いと出てきます。

更にゲストOSとして幾つか試してました。まとめると以下のような感じです。

lspciの結果:PCIeカードして認識している
Radeonドライバ:表示せず、ビデオカードを認識せず
リポジトリのfglrxドライバ:表示可、ただしSVGA程度の認識
AMDのfglrxドライバ:表示せず。ビデオカードを認識せず

lscpiの結果:PCIeカードとして認識している
Radeonドライバ:表示せず。ビデオカードを認識せず
リポジトリのfglrxドライバ:表示せず。ビデオカードを認識でず
AMDのfglrxドライバ:表示せず。ビデオカードを認識せず

なお、64bit LinuxAMD社からダウンロードしたfglrxドライバをインストールすると、ライブラリパスがおかしく、環境変数などで明示的に64bitライブラリへのパスを指定しないと動ないコマンドが有りました。ドライバのコアな部分は良いのでしょうが、ユーティリティなどを含めて何か真面目に作っていない感じがあります。やはりLinux系はnVidiaの方が良いのかも知れません。

デバイスマネージャの表示:PCIeカードとしては認識。更にビデオカードとしては認識している。ただし利用不可の状態。
AMDのfglrxドライバ:ビデオカードとして認識されるものの、ディスプレとしては認識ぜず。ATI CCCユーティリティでもディスプレとして認識せず。

DirectPath I/Oでアタッチして起動すると、OSが起動せず。“PCに問題があります”というメッセージが出て何回かリブートを繰り返した後、解決方法を聞いてくるが、メニューに有効な方法は見当たらず。

不明なデバイスの場合、OSを起動してからドライバをインストールしますが、OSが通常通り起動しません。何か矛盾しているような気がします。ただ、PCに問題がありますとしてOSが起動しないという事はPCIのドライバのレベル(ビデオカードドライバよりももっと基本のレベル)で、通常のPCIとは違う挙動を察知しているのかも知れません。

標準ドライバでもディスプレとしても認識するが、画面に表示しようとすると完全フリーズ。

という、状況でした。

考察

DirectPath I/Oについての考察です。
*OSレベルではPCIeボードしては認識できているのでDirectPath I/Oとして基本的な機能は動作している。
*しかし、ドライバに依って、ビデオカードとして認識できない、ビデオカードしては認識するがディスプレを認識できない、一応ディスプレに表示はできるが機能が限定的、と様々だった。
*DirectPath I/OはゲストOSドライバの許容度(?)に大きく依存すると考える。ハイパーバイザのオーバーヘッドなどで物理PCとはタイミングやレスポンスが大きく異なると思われるので、そこまで考慮している(もしくは許容度の高い)ドライバでないと利用は難しいかも知れない。特にビデオカードの様に高速動作するものはドライバにより挙動が大きく異なると考えれられる。
*ハードウェア、BIOSレベルの作りでもDirectPath I/Oの利用可否に影響するとも考えられる。

これらの仮定を実証するには、かなりの時間を割かないと難しいため、今回はこれ以上は深入りしません。物理マシンで使う方向で考えます。(でも、限定的とは言え、Kali Linixの画面をビデオカードに出力できたのは一応の“成果”でした。)