Ubuntu 12.04LTS + kvmでPCIパススルー

Ubuntu 12.04 LTS上のkvmでPCIパススルーをしようと思ったら色々躓いたので、その解決策を調べてみた。
自分用メモ。

まず、鼻毛鯖(NEC Express5800/S70 タイプPJ)に標準搭載のCPUである Pentium G6950 はVT-dに対応していないので、Core i5 660に換装した。換装作業自体はとても簡単。参考にしたのはこのブログ

次に、virt-managerを使って、仮想マシンにホストのPCIデバイスを追加した(ここら辺はGUIなので何も考えずに設定できる)。

さて、これだけでPCIパススルー使えるのかと思ったのだが、ちゃんと設定しても仮想マシンが起動してくれない。
実際には以下の設定が必要だった。

1. 起動オプションでiommuを有効にする

/etc/default/grubのGRUB_CMDLINE_LINUX=の行を編集する。

GRUB_CMDLINE_LINUX="intel_iommu=on,igfx_off,pass-through"

igfx_offを指定しておかないと、dmesg |grep DMARで何かエラー吐いてたので指定する。どうやら統合グラフィックスとは相性が悪い模様。これを指定してもホストでは3D使えてるし、指定して損はない? 詳しい人がいれば教えて欲しい。
pass-throughに関しては不明だけど、書いてあるサイトがあったので書いた。

update-grub2を実行して設定を反映させる。

2. カーネルモジュールの設定をする

1をやってみてもまだ仮想マシンが立ち上がらない。
これは本当に分からず丸一日使ってしまったのだけど、以下のようにして解決した。

/etc/modprobe.d/kvm.conf を作成して以下のように記述する。

options kvm allow_unsafe_assigned_interrupts=1

あとは再起動するだけ。

これで問題なくゲストOSからホストのPCIデバイスを認識出来るようになった。
某ボードを試しに認識させてみたら認識して問題なく使えている。本当はSATAボードとか認識させてパフォーマンス計測したいけど、今は持っていないのでまたいつか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です