Virtual Machine Additions for Linux を Fedora 9 で使う

はじめに

前回に引き続いて Virtual Server / Virtual PC で Fedora 9 を使用する方法について書きたいと思います。今回は Microsoft が Virtual Server で使用するために公開している Virtual Machine Additions for Linux を Fedora 9 に適用する方法について書いてみたいと思います。

これは前回に書いたメモにおける「付録 – 仮想マシン内の時間の問題」の「カーネルに手を入れる」という部分についての記述に相当します。

2009/11/25追記:Virtual Machine Additions for Linux を Fedora 12 で使うを追加しました。

Virtual Machine Additions for Linux の機能

大きく分けて Virtual Machine Additions for Linux には以下に挙げる4つの機能があります。

  • ゲストとして導入した OS に対して時間の同期、ゲスト OS の生死を伝えるハートビート(鼓動)の生成、ホストと調和してシャットダウンを行う。
  • 仮想マシンと統合されたマウスカーソルの位置を制御するマウスドライバ。
  • 仮想マシンに最適化されたディスプレイドライバ。
  • SCSI ハードディスクをエミュレートするドライバ(Virtual Server 2005 R2 Service Pack 1 を必要とします)。

このうち、今回のメモでは1番目に挙げた時間の同期、ゲストの生死を伝えるハートビート(鼓動)の生成、ホストと調和してシャットダウンを行う機能に関して扱います。マウスドライバとディスプレイドライバは操作上の問題であり必須であるとはいえないことや、後述する制限(問題)があるために除外しました。SCSI ハードディスクのエミュレートは私が必要としていないため除外しました。

ハートビートとシャットダウンについては説明が必要かもしれませんのでここで簡単に説明します。

ハートビートは Virtual Server においてゲスト OS が稼動中であることを示すために、ゲスト OS がホストに対して動いている(=生きている)ことを伝えます。これが一定期間内に行われないようであれば、ホストはゲスト OS が動いていないと判断します。シャットダウンは Virtual Server においてホストからゲスト OS に対してシャットダウンを求めることができるというものです。先ほどのハートビートとシャットダウンを Virtul Server において使用することで、スクリプトによって生死確認やシャットダウン制御を行えるようになります。

Virtual PC ではこれらのスクリプトからの制御によるメリットはありませんが、「閉じる」メニューから「ゲスト オペレーティング システムをシャットダウンして変更を保存する」などを選択できるようになります。また Virtual Server においてもメニューから「ゲスト OS をシャットダウンする」などを選択できるようになります。

免責の宣言

Virtual Machine Additions for Linux は Fedora 9 向けにリリースされたソフトウェアではありません。私が書いた文書によって損害を受けることがあったとしても一切責任を負いません。また Microsoft も筆者とは無関係であり、責任を負う立場にありません。あくまでも自己責任においてのみ、このメモの内容を用いなければなりません。

Virtual Machine Additions for Linux のインストール

Virtual Machine Additions for Linux からインストール・ファイルをダウンロードしてインストールします。この際、インストールに依存するアプリケーションはないため Virtual Server だけではなく Virtual PC のインストールされた環境にもインストールすることができます。インストール先のディレクトリ(デフォルトでは C:\Program Files\Microsoft Virtual Server\Virtual Machine Additions です)の中に ISO イメージであるファイル VMAdditionsForLinux.iso があります。

ゲスト OS へのインストールの手順

ここで説明する手順は Fedora 9 をほぼ全部入りにした状態の環境であることを前提としています。コマンドを入力してエラーが出るなど、足りないパッケージがある場合には別途インストールする必要があります。

まず「端末」(アプリケーション→システムツール→端末)を起動します(もちろん外部から ssh で接続しての操作でも大丈夫です)。その後 su – コマンドでルートに切り替えます。パスワードには root のパスワードを入力します。

[sakaki@localhost ~]$ su -
パスワード:(ここでrootのパスワードを入力する)

Virtual Machine Additions for Linux はカーネル・モジュールを使用します。このためにカーネル・モジュールの make をするためのパッケージを追加でインストールします。そのためのコマンドは yum -y install kernel-devel です。もちろん yum ではなく、別途カーネルに一致する rpm ファイルを入手して rpm コマンドでインストールしてもかまいません。

[root@localhost ~]# yum -y install kernel-devel
Loaded plugins: refresh-packagekit
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package kernel-devel.i686 0:2.6.25.6-55.fc9 set to be installed
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 kernel-devel            i686       2.6.25.6-55.fc9  updates           5.1 M

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 5.1 M
Downloading Packages:
(1/1): kernel-devel-2.6.25.6-55.fc9.i686.rpm              | 5.1 MB     00:32
Running rpm_check_debug
Running Transaction Test
  Installing     : kernel-devel                                      [1/1]

Installed: kernel-devel.i686 0:2.6.25.6-55.fc9
Complete!

インストールされたパッケージが現在使用中のパッケージと一致するかどうか確認します。一致していないと正しくカーネル・モジュールを make できないので注意が必要です。

続いて Virtual Machine Additions for Linux の ISO イメージ・ファイル VMAdditionsForLinux.iso を仮想マシンにキャプチャします。ローカル・ログインしている状態で ISO イメージをキャプチャすれば自動的にマウントされます。そうではない場合は別途手動でマウントする必要があります。ここでは自動的にマウントされたものとして話を進めます。

マウントした ISO イメージのあるディレクトリにカレント・ディレクトリを切り替えます。

[root@localhost ~]# cd /media/VMAdditionsForLinux/

続いてこの ISO イメージに含まれるカーネル・モジュールをインストールします。

[root@localhost VMAdditionsForLinux]# rpm -ivh vmadd-kernel-module-RHEL-2.0-1.i386.rpm
準備中...                ########################################### [100%]
   1:vmadd-kernel-module-RHE########################################### [100%]
Messages displayed during installation will be logged to /var/log/vmadd-kernel-module.log
cp: cannot stat `/usr/X11R6/lib/modules/drivers/s3_drv.o': そのようなファイルやディレクトリはありません
cp: cannot stat `/usr/X11R6/lib/modules/input/mouse_drv.o': そのようなファイルやディレクトリはありません
cp: cannot stat `/usr/X11R6/lib/modules/input/mouse_drv.so': そのようなファイルやディレクトリはありません

エラーが出ますがこれは無視します。カーネル・モジュールの make を内部で行おうとしますが、これもエラーとなって終わっていません。後の手順でこれを行います。

残りの rpm ファイルもインストールします(今回のインストールに関連するもののみ)。

[root@localhost VMAdditionsForLinux]# rpm -ivh vmadd-heartbeat-2.0-1.i386.rpm
準備中...                ########################################### [100%]
   1:vmadd-heartbeat        ########################################### [100%]
[root@localhost VMAdditionsForLinux]# rpm -ivh vmadd-shutdown-2.0-1.i386.rpm
準備中...                ########################################### [100%]
   1:vmadd-shutdown         ########################################### [100%]
[root@localhost VMAdditionsForLinux]# rpm -ivh vmadd-timesync-2.0-1.i386.rpm
準備中...                ########################################### [100%]
   1:vmadd-timesync         ########################################### [100%]

次はカーネル・モジュールを make します。まず cd /lib/modules/vmadd/module/ と入力してカレント・ディレクトリを変更します。

[root@localhost VMAdditionsForLinux]# cd /lib/modules/vmadd/module/

このディレクトリの中に make に必要なファイルがあります。このうち2つのファイルを修正します。まず vpc-mod.c を修正します。ファイルの先頭1行目に「#include <linux/fs.h>」と書き加えます。次に vpc-utils.c の 105 行目を修正します。

           : "ebx", "ecx", "edx", "esi", "edi", "ebp"

赤い部分「, "ebp"」を削除します(カンマも忘れずに削除しなければなりません)。

ファイルの修正が終わったら make を実行します。

[root@localhost module]# make
make -C /lib/modules/2.6.25.6-55.fc9.i686/build modules SUBDIRS=/lib/modules/vmadd/module M=/lib/modules/vmadd/module
make[1]: ディレクトリ `/usr/src/kernels/2.6.25.6-55.fc9.i686' に入ります
  CC [M]  /lib/modules/vmadd/module/vpc-mod.o
/lib/modules/vmadd/module/vpc-mod.c: In function ‘vpc_open’:
/lib/modules/vmadd/module/vpc-mod.c:188: 警告: assignment discards qualifiers from pointer target type
/lib/modules/vmadd/module/vpc-mod.c:189: 警告: the address of ‘vpc_fops’ will always evaluate as ‘true’
/lib/modules/vmadd/module/vpc-mod.c: In function ‘init’:
/lib/modules/vmadd/module/vpc-mod.c:787: 警告: passing argument 2 of ‘request_irq’ from incompatible pointer type
  CC [M]  /lib/modules/vmadd/module/vpc-utils.o
  LD [M]  /lib/modules/vmadd/module/vmadd.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /lib/modules/vmadd/module/vmadd.mod.o
  LD [M]  /lib/modules/vmadd/module/vmadd.ko
make[1]: ディレクトリ `/usr/src/kernels/2.6.25.6-55.fc9.i686' から出ます

警告が若干出ますが make は成功しています。

ここで構築したカーネル・モジュールをインストールします。インストールの方法は make vmadd-install-module です。

[root@localhost module]# make vmadd-install-module
make -C /lib/modules/2.6.25.6-55.fc9.i686/build modules SUBDIRS=/lib/modules/vmadd/module M=/lib/modules/vmadd/module
make[1]: ディレクトリ `/usr/src/kernels/2.6.25.6-55.fc9.i686' に入ります
  Building modules, stage 2.
  MODPOST 1 modules
make[1]: ディレクトリ `/usr/src/kernels/2.6.25.6-55.fc9.i686' から出ます
mkdir -p /lib/modules/2.6.25.6-55.fc9.i686/misc
install -m 0400 -o 0 -g 0 vmadd.ko /lib/modules/2.6.25.6-55.fc9.i686/misc

続いてカーネル・モジュールを認識させるため depmod コマンドを実行します。

[root@localhost module]# depmod

インストールしたカーネル・モジュールのファイルを SELinux のための属性を他のカーネル・モジュールと同様に変更します。

[root@localhost module]# chcon system_u:object_r:modules_object_t:s0 /lib/modules/`uname -r`/misc
[root@localhost module]# chcon system_u:object_r:modules_object_t:s0 /lib/modules/`uname -r`/misc/vmadd.ko

これで Virtual Machine Additions for Linux のインストールが完了しました。

試しに /etc/rc.d/init.d/vmadd start と実行してカーネル・モジュールを起動してみます。

[root@localhost module]# /etc/rc.d/init.d/vmadd start
Starting VM additions                                      [  OK  ]

OK が表示されれば問題はありません。続いて他のデーモンも起動してみます。

[root@localhost module]# /etc/rc.d/init.d/vmadd-heartbeat start
Starting heartbeat                                         [  OK  ]
[root@localhost module]# /etc/rc.d/init.d/vmadd-timesync start
Starting timesync                                          [  OK  ]
[root@localhost module]# /etc/rc.d/init.d/vmadd-shutdown start
Starting shutdown                                          [  OK  ]

全て問題なく起動できることを確認したら「サービス」(システム→管理→サービス)で「vmadd」「vmadd-heartbeat」「vmadd-timesync」「vmadd-shutdown」を選択して上の方にある緑の「Enable」ボタンを押して次回からは自動で起動するように設定するとよいでしょう。

サービスの設定

マウスドライバ と ディスプレイドライバを除外した理由について

この2つのドライバは Virtual Machine Addtions for Linux のコアを形成するカーネル・モジュールを必要とします。Fedora 9 は起動中に xorg の機能を用いますが、この段階ではカーネル・モジュールは読み込まれておらず、マウスによる操作が行えないという問題が生じます。このことから、この制限を考えると統一の操作性よりは起動時から操作が行えることの方が大事であると判断して導入を行いませんでした。この制限よりも統一のある操作性が必要と思われるようでしたら、インストールしてみるとよいかもしれません。

カスタマイズしたカーネルを用いている場合の注意

/lib/modules/`uname -r`/ ディレクトリにある build のシンボリック・リンク先をカスタマイズしたカーネルのソースのディレクトリに行くように設定しておかないと Virtual Machine Additions for Linux の make がうまく通らないので注意が必要です。

カーネルをバージョンアップする場合の注意

カーネル・モジュールはカーネルに依存します。このためカーネルのバージョン・アップによって動作しなくなることがあります。その場合には対応する kernel-devel を入れてカーネル・モジュールの make および make vmadd-install-module してから depmod をすれば再び動くようになります。

終わりに

このモジュールを導入することできちんと時間が合うようになります。またハートビート(鼓動)を検出できるようになることとシャットダウンの指示を受けられるようになるため、Virtual Server 上においてスクリプトによる処理を行えるようになります。このため特に Virtual Server で便利に使えるようになるでしょう。

ところで、この Virtual Machine Additions for Linux の開発元は InnoTek Systemberatung GmbH というドイツの会社なのですが、気付くと Sun Microsystems一部門になってるのですね。これにちょっと驚きました。さらに VirtualBox という仮想化ソフトの開発元であるということで、この手の技術に非常に深い理解のある会社だったということも、今回調べて初めて知りました。というか、VirtualBox の存在は知っていたのですが、その会社が Virtual Machine Additions for Linux の開発元でもあって、さらに今年になってから Sun Microsystems に買収されているということの理解がなくて、今回一つに繋がって驚いたという感じです。

2008年6月18日追記

色々と試してみたところ、時間の同期についてはある程度新しい仮想マシンでなければ行えないようです。具体的には Virtual PC 2004 や Windows Server 2005(無印) では時間の同期を行えないようです。シャットダウンやハートビート、OS の種別通知などは成功していることを確認しました。

セキュリティ上の更新や性能の改善などの利点もありますので、できる限り新しい仮想マシン・ソフトウェアを用いた方がよいようです。

2008年6月25日追記

間違いと記述抜けを少々修正しました。

コメントを残す

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