bitviorでvirtio-net

[この記事はbitvisorのステマ記事です][この記事はBitVisor Advent Calendar 2015の3日目の記事として先輩に書かされました][怖い]

みなさんご存知BitVisorですが、最近virtio-netに対応したことは知ってます?

check it out

BitVisorの最新版はbitvisor.orgじゃなくて、bitvisor / bitvisor — Bitbucketにあります(安定版はない)。 テストも安定版tagもないので運が悪かったらそれまでですが、EDK2とかもそんな感じだしまあいいでしょ(よくない💢)。

 hg clone ssh://hg@bitbucket.org/bitvisor/bitvisor

make config

なんやいろいろありますが、NET_*系があれば機能的にはOK。

defconfig

機能的に足りていても設定されないと動かないのが世の常。 イケてる系だとそんなの起動時オプションとかでサクッとヨユーなんですが、芋いVMMは無理、許して。機能の使い分け・ペリフェラルの設定は config.oとかいう物体に格納された全設定項目入り構造体の実体で制御します、こいつの値はビルド時にdefconfigをいじるといじれる。

もっとdefconfig

defconfigがないとmake時に勝手に作られます、っていうかconfig.cでのincludeもこの名前決め打ちってそれデフォっていうかタダの設定ファイルやんけ!

そういう仕組みなので、手でdefconfig.tmplからコピーしてmakeしたほうが上品だが、makeしてビルド終わってから後で変えてもすぐ反映されます、これは救いっぽい

virtio化について

Q: bitvisorってパラパスじゃねえの、なんでわざわざ準仮想化デバイスすんねん

A: パススルーのほうが楽だけど、VMMのデバッグとか謎機能の実装とかで、VMM側もネット使いたいことあるやろ!

Q: 今までじゃあどうしてたの?

A: 例えば、VMMでもう一本ガメる(別居)とか、あるいは、パススルーっぽくしておきつつも割り込みはVMMに引き込んで自分宛のだけ盗む(同棲)という技を使ってた

Q: え、それって…………

A: デバイスが二度リセットしたりするけど、映画みたいに避けるとなんとかなる

Q: ……

A: 準仮想化いいよね

では

defconfigの下の方に空気を読みつつ以下のようにショドーすべし

                :
                :
        .driver = {
            .pci = "device=pro1000, driver=pro1000, virtio=1, net=pass, tty=1, and,"
                   "device=bnx, virtio=1, net=pass, driver=bnx, tty=1"
        },
                :

こうすると

PRO/1000などのPCIコンフィグ空間が盗まれてvirtioのPCIコンフィグ空間になる

# 速度

どうせGigabit etherしか対応してないし、ベアメタルと同じく931Mbps出る

FAQ

Q: 俺のパソコンで動かない

A: lspciして本当のデバイスが見えてしまっている場合はアレや、アレをみるんや……………

drivers/net/<your-bitch-netcard>.cの下の方の

 .device     = "class_code=020000,id="
              "14e4:165a|" /* BCM5722 */
              "14e4:1682|" /* Thunderbolt - BCM57762 */
              "14e4:1684|" /* BCM5764M */
              "14e4:1686|" /* BCM57766 */
              "14e4:1691|" /* BCM57788 */
              "14e4:16b4", /* BCM57765 */

みたいなとこにアレとアレがないんや………

僕は例えばこれを足しました:

           "14e4:165f|" /* BCM5720 */

そんなときは

lspci -nnk

以上