どうもみむらです。
今回の内容は、需要がニッチすぎるだとか激コワだとか、なんかいろいろと言われていますが、
自己満足の内容です。
みむらさんLinuxKernelをHyper-Vの動的メモリに対応させててマジコワ
— かー何とかさん (@carme16d) 2013年4月9日
・・こわくないよ!
動的メモリというのは、Hyper-V 上において、
ゲストマシン(仮想で動かしているマシン)のメモリ需要にあわせてホストで確保するメモリの量を変化させるというものでしょうか。
早い話が、ゲストでメモリを使っていなければホスト上でメモリを解放して、
使いそうならホストに空きがあればより多くのメモリを割り当てる、とそんな感じ。
結論とすると、
こんな感じで動くように。
勿論、普通の Linux を動かしますと、
こんな感じで対応していませんので動作することはありません。
その他、Linux のカーネルを作る際に Hyper-V のゲストモジュールを組み込んだとしても、
執筆時最新の Version 3.8.7 でもこんな感じですので、ホスト側にメモリの利用状況は伝えられますが、
縮小、拡大処理は行われません。
その他、
こういう感じのスナップショット系・・なんですかね中身はまだ見てないのでアレですが、
そういうのを追加してみたり、
Hyper-V 用の Framebuffer ドライバを入れてみたり。 いろいろといじりました。
あとはやっぱり、こんな感じで Gnome を Hyper-V で動かしてみたり。
今回は Gentoo で行い、 Linux Kernel は 3.8.6 を用いました。
1. いろいろなドライバやら、動的メモリを有効にする:
動的メモリを動かしても動かないというところから始まり、
いろいろと探していく上で、
https://patchwork.kernel.org/patch/2257661/
このパッチを見つけて是非とも適用したいと思い、そこから始まりました。
そしていろいろと探してみると、
http://gitorious.org/opensuse/kernel-source/commits/SLE11-SP3
openSUSE のソースにこれが適用されているブランチを見つけて、これは行ける! と。
でも clone して Makefile を見てみると 3.7.1 向けらしく、今 Gentoo に入れてあるのは 3.8.6
ということで、まぁ、普通の考えなら(ここ重要)
こんだけ揃ってるなら頑張って適用しようという気になりますよね。 (ぉ
ということでやってみる。
patchwork.kernel.org を参照して、元のパッチを見ながら、 3.8.6 に手書きで書き込んだり、
そのままコピーできるところは openSUSE の方からコピーする。
いろいろと見てみると、 Xen の balloon driver と Hyper-V の balloon ドライバってなんか似てるんですよね。
たぶん真似したんじゃないかなぁと思うんですが、 Xen の方はまた開発が進んでいて、
今回使った 3.8.6 に入っているゲストドライバと最新のを比較するといろいろと書き方が違っているんですよね。(特に動的メモリに関する部分の記述。
あとは、Kernel に仕掛けてある XEN_HBM_EVTCHN_CALLBACK というメッセージがあるんですが
こいつを HYPERVISOR_CALLBACK_VECTOR と名前を変更して、 Xen と Hyper-V で共有してたり
なんかいろいろとやってました。
後はこういう感じでコードいじいじ。
そうそう。動的メモリが動いた とは言ったのですが、
「初期メモリ」の枠内での加減はできるのですが、それを上回る量となると動作しませんでした。
./drivers/hv/hv_balloon.c の 600 行目付近にある wait_for_completion_timeout でタイムアウトしてしまい、
失敗となってしまうようで。
でもそこをコメントアウトしても add_memory 関数が失敗するのでなんだかなーとは思うのですが。
xen のゲストドライバの作りを見てみると、 Hyper-V のように細切れに確保していく必要ってあるのかなと思うのですがどうなんでしょうか。
・・・何となくこの辺で。
Framebuffer のドライバについては、 drivers/video/hyperv.c あたりに。
Makefile と Kconfig ファイルを適当に書き換えておしまい。
Userspace VESA Support がどうも hyper-v と相性がわるいので、
Hyper-V の framebuffer を入れる時はこいつを非表示に。
・・VESA も非表示にするようにすればよかったのかもしれない。
これを使う場合は、
video=hyperv_fb:1024×768
みたいな感じで解像度が指定できるらしいです。
あとはネットワークドライバやらを含めてカーネルビルド。。
・・そういえば、これよく忘れますよね・・。重要。
なんだかんだいろいろとグダグダ書きましたが、
何を書き換えたのかとか、実際に試してみたい人向けに :
http://mimumimu.net/software/blogup/linux-3.8.6-gentoo-hyperv.patch
emerge =sys-kernel/gentoo-sources-3.8.6
で得られるものにこのパッチをあてると、たぶん私と同じものができあがります。
2. X を使えるようにする:
カーネルビルドする際に、 “Graphics Support” の “Support for frame buffer devices” にチェックを入れて、フレームバッファを使えるようにする。
この際、 VESA を使う場合は “VESA VGA graphics support” にチェックを入れる。
上記の Hyper-V の Framebuffer ドライバを使う場合はそれだけにチェックを入れる。
またもう一つ、 “Device Drivers” の “Input device support” にある、
”Event Interface” も有効にする。
/etc/portage/make.conf :
INPUT_DEVICES="evdev mouse keyboard" VIDEO_CARDS="fbdev"
make.conf をいじって、 Framebuffer を使うようにして emerge
X の設定で、 マウスやキーボードについては、
Section "InputDevice" Identifier "Keyboard0" Driver "evdev" Option "Protocol" "auto" Option "Device" "/dev/input/event1" EndSection
Section "InputDevice" Identifier "Mouse0" Driver "evdev" Option "Protocol" "auto" Option "Device" "/dev/input/event3" EndSection
こんな感じで、 evdev を使って、 event を見に行くようにする。
Section "ServerLayout" Identifier "X.org" Screen 0 "Screen0" 0 0 InputDevice "Mouse0" "Always Core" InputDevice "Keyboard0" "Always Core" EndSection
後はこういう感じで紐付けて、 X を立ち上げると、ウィンドウ内に入ると追尾して、出るとポインタの動きが止まる理想的なマウスが手に入ります。
キーボードはウィンドウがアクティブな間入力されます。
ってことで、超誰得な記事ではありますが、
もし Hyper-V 上で Gentoo install battle をやっているような不思議な方がおりましたら、
活用して頂けたらと思います。
・・・いるとはあまり思えないんですけれども。。