Windows上のVirtualBoxでopenSUSEを動作させる

openSUSEなどを試してみたいが、余っているパソコンはない。という人は仮想化ソフトを使ってみるとよいでしょう。
デスクトップ仮想化ソフトとしてはVirtualPC、VMWarePlayer、VirtualBoxとなりますが、VirtualPCはopenSUSEにネイティブに対応していないので、ちょっと動作が遅いです。

というわけでWindows上でオープンソースのVirtualBoxを使用します。

VirtualBox本家

DownloadからWindows対応版をダウンロードします。

バイナリ版とOSE版(オープンソースエディション)がありますが、特別な思想がない限りバイナリ版でいいです。


Windows版にVirtualBoxをインストールするのはしごく簡単です。
従ってその部分は割愛します。

VirtualBoxインストール後に、仮想マシンを作成します。

新規仮想マシン作成ウィザードから

仮想マシン名とOSタイプ → 名前「任意」 オペレーションシステム「Linux」 バージョン「openSUSE」
メモリ → 512MB以上
起動ディスク → 新規作成
  ハードディスクストレージタイプ → 可変サイズのストレージ
  場所 → ここ注意です。デフォルトではユーザのプロファイル(Cドライブ)に入ります。容量が大きいので、考えましょう。
  サイズ → この後カーネルコンパイルが必要なので、16GB以上を指定します。

仮想マシンを作成したら、ネットワークの設定をブリッジとしておくと、LAN内のほかのパソコンからのアクセスが楽になります。


仮想マシンを起動した後は、デバイスメニューからopenSUSEのインストールISOイメージか、インストールDVDを指定します。
あとは通常のインストールと変わりません。ただし、ホストOSが32bitの場合、ゲストOSに64bitはインストールできません。
なお、後でLinuxのカーネルソースが必要になるので、インストール時に指定しておくと楽です。


次に追加機能(GuestAddtions)をインストールします。メニューから選択すると、メディアが読み込まれます。
(openSUSE11.3はデフォルトでVirtualBoxの追加機能がインストールされていますが、最新版のドライバを使用するという意味で)


ですが時々メディアを接続しても「ブロックデバイスが〜で読み込めません」的なメッセージが表示されることがあります。
なんだかよくわかりませんがCD/DVDを素直に読み込んでくれない気配。
自動でマウントしない場合はしょうがないのでディレクトリを作成し、手作業でマウントします。

>cd /mnt
>su
#mkdir dvd
#mount /dev/sr0 dvd

その中にあるLinuxAdditionsを実行します。


32bitと64bitがあるのでそれぞれ適応したほうを実行します。
この場合は32bitLinuxなので、VBoxLinuxAdditions-x86.runを実行します。


インストールが完了したら再起動します。

インストールに失敗する場合は、Linuxのカーネルソース(現在起動しているのと同じカーネルソース)がないことが原因です。
その場合はカーネルソースをインストールしてから、再度実行します。


カーネルの割り込み回数を抑制して、CPU負荷を下げる
仮想OSを起動した後、やたらCPUを消費している場合があります。
これには二種類の原因が考えられます。

一つは、openSUSEが起動時にmanDBの構築や、ソフトウェアアップデートを確認している場合です。
この場合はopenSUSE内のプロセスマネージャ(Ctrl+Esc)を見れば確認できます。manDBやkupdateappletなどがCPUを多少消費しています。
この場合、処理が終了するまで待てばCPUの使用率は下がっていきます。
しかし仮想OS内でソフトウェアを起動させるたび、ホストCPUが跳ね上がりやすいです。

もう一つはカーネルの割り込みがホストCPUの処理量を上回っている場合です。

この二つのCPUを消費し尽くす症状は、結局どちらも割り込みによって発生します。

カーネルの割り込みとは、一秒間に何回ハードウェアへアクセスに行くか、という間隔です。
openSUSE11.3のデフォルトカーネルである2.6.34.7では、割り込みは250Hzとなっています。(一秒間に250回の割り込み。2.6.13前のカーネルでは1000Hz。そのためCPU100%になる事象が多発しました)
これは物理サーバ想定の設定値なので、仮想ではこれを再現しきれなくなり、CPUを大量に消費している、ということです。

そうでなくても、割り込みが多くなればゲストOSがなにか処理をするたびにホストCPUへ影響しやすいことになります。
CentOSやRedhatならカーネル起動パラメータに割り込み値を設定してやれば良いようですが、openSUSEでは有効でない模様。

これらについては VirtualBoxのマニュアルには「カーネルの割り込み回数を遅くすることをお勧めします」という一文が。

従ってカーネルパラメータを変更し、この事象を回避します。
(これ以外に、OSが半クラッシュした後なぜか半永久的にCPUを100%使用し続けるトラブルに遭遇しましたが、原因不明でした。その時はあきらめて再インストールしました)

カーネルコンパイルのため、カーネルソースはインストールされているでしょうか。
無ければインストールする必要があります。(DVDからデフォルトバージョンのカーネルソースをインストールするか、アップデートリポジトリから新しいバージョンのカーネルソースをインストールするかの問題がありますが、どちらもでいいでしょう)

カーネルパラメータを変更しましょう。

>cd /usr/src/linux
>su
#make menuconfig

カーネルコンフィグで[Processor type and features]を選択します。


[Timer frequency]を選択します。


Timer frequencyのパラメータを100Hzに変更します。


configを変更しますか?の回答にyesと答えます。
確認したい場合はソースのディレクトリに生成された.configファイルの中のCONFIG_HZ_100というパラメータを確認します。

そしてカーネルコンパイルをします。詳しくは別項のカーネルコンパイルを参照してください。

#make
#make modules
#make install
#make modules_install

ちなみにコンパイルの間はホストOSのCPUを消費し続けます。Core2Duo E6400のマシンで4時間ほどでしょうか。
ホストOSの操作に支障をきたす様なら、タスクマネージャでCPUを消費してるVirtualBoxのプロセスの優先度を「通常以下」に下げておきましょう。

コンパイルが終了して、再起動して、無事割り込みが250Hzから100Hzへ変更されると、仮想openSUSEのCPU負荷が、ホストCPUへ影響を与えにくくなります。なるはずです。

というわけで仮想openSUSE内でFirefoxを起動することでホストCPUの変化を比較してみました。(赤枠内)

250Hzの場合


100Hzの場合


ただしこの雑な比較方法にどのくらいの意味があるのかはわかりせんが、気休めにはなるかもしれません。

なおカーネルコンパイルをした場合、もう一度GuestAdditionsをインストールするのが無難です。





prev.gif