お遊び記録

最近の活動記録

FreeBSD-CURRENTを導入してみた (7) Guest Additionを導入してみた

VirtualBox Guest Additionを導入すると、マウスが透過的に扱われ、 キャプチャされなくなります。 つまり、マウスポインタがゲストOSのウィンドウの上にある時にのみ、 ポイント情報がゲストOSに渡され、ウィンドウ外に出たならばそのまま、 Windowsのマウスとして使われます。 そのため、Guest Additionはぜひとも導入したいものです。

本稿では開発版のGuest Additionの導入方法を紹介します。 これで最新版のVirtualBoxの使用にも対応できます。




VirtualBox Guest Addition を導入する

VirtualBox Guest Addition はVirtualBoxのGuest環境用のビデオやマウスの ドライバです。 Guest環境からはホストが実際に使用しているNvidiaATIビデオカード、 Synapticsのタッチパッドといった実際のデバイスが見えるわけではありません。 VirtualBoxが仮想的に提供するビデオやマウスデバイスが見えます。 これらのデバイスは VESAビデオドライバや標準マウスドライバで管理できます。 が、Guest Addition で提供される専用のドライバを使用することで、 例えば以下のような機能を利用できるようになります。

  • 任意の大きさへの画面サイズの変更
  • ホスト環境とゲスト環境感のマウスの透過的な利用

画面サイズが自由になるのも嬉しいのですが、マウスがキャプチャされずに 使用できるのはストレスからの開放になります。 なお、 Guest Additionで提供されるドライバはX Window用のものであり、 通常のコンソールでは使用できません。

Guest Additionの注意点として、使用しているVirtualBoxと同じバージョンの Guest Additionを使用しなければならない、という制約があります。

FreeBSDが2012年12月現在正式にサポートしている版は4.1.22ですので、 通常ならば、このレガシーバージョンである4.1.22のVirtuaBoxを 使用する必要があります。 これは少々悲しいものがあります。

FreeBSDでも最新版のVirtualBoxへの対応作業は行われています。 まだCommitされてはいないようですが、 CFT (Call For Testing) 状態にはあります。 そこでGitHubのリポジトリから最新開発版を入手して、導入しましょう。

開発版Guest Addition ports を入手、展開する

GitHubからリポジトリをcloneします。

# git https://GitHub.com/decke/freebsd-vbox.git
# ls freebsd-vbox
devel	emulators	www

Guest Additionのportsは、チェックアウトしたリポジトリの emulators/virtualbox-ose-additionsにあります。 ただし、これをそのままmakeするならば、ほぼ確実にはまります。

この開発版のportsは、同じリポジトリ内のdevel/kBuild-devel に依存しています。 正確に言えばBUILD_DEPENDという依存で、構築するときに kBuild-develが導入されていなければなりません *1

emulators/virtualbox-ose-additionsをコンパイルする際に、 もしkBuild-develが未導入ならば、自動的に導入されます。 その際に導入されるkBuild-develは/usr/portsの下から導入されます。 チェックアウトしたリポジトリからではありません。

こうした問題の解法はいくつか知られています。

  1. 予め手動でリポジトリのdevel/kBuild-develを導入しておく
    一番シンプルな方法です。Guest Additionの場合依存数が少ないので 問題も起きませんが、依存するports数が多い場合は大変です。
  2. 自動導入するパスを指定する
    kBuild-develをリポジトリの下から探すように変数PORTSDIRを設定する こともできます。

    # make PORTSDIR=/somewhere/freebsd-vbox install

    Guest Additionの場合はこれでも動きますが、kBuild-develがさらに 別のportsに依存するとすると、動かなくなります。

最善の策はリポジトリの内容が/usr/portsの下にあるようにすることです。 VirtualBoxのようなCFT段階にあるportsを/usr/portsの下にあるように するツールは以前から開発されていました。 これはxorgmergeとして知られていて、xorg 7.7の CFT で紹介されています。

ところが、このツールはリポジトリの内容で/usr/ports下を書き換える、 という動作をします。 どうも個人的には破壊的な書き換えに抵抗感を感じます。 そこで、/usr/ports下の内容を破壊せずに、一時的にリポジトリの下の内容が /usr/portsの下にあるように見せかけるツールを作成しています。

これもGitHubにあります。

# git git://github.com/Yukimimiya/portmounts.git
# cd portsmounts
# make obj all install clean

このツールはFreeBSDのnullfsとunionfsという機能を使い、 リポジトリ中のportsのディレクトリを/usr/ports下の 対応するディレクトリにmountします。 結果、mountされている間は/usr/ports下の該当portsの 内容は、リポジトリのそれになります。 明示的に、例えば以下のようにunmountすれば、元の 内容に戻ります。

# umount -A -t nullfs,unionfs

あるいはrebootしても同じです。

このツールportmountsは以下のようにして実行します。

# portmounts /somewhere/freebsd-vbox

正常に終了すれば、/usr/ports下が一時的に修正されます。

config設定し、コンパイルする

VirtualBox-OSE版のGuest Addtionを設定します。

# cd
 /usr/ports/emulators/virtualbox-ose-additions
# make config-recursive

再帰的設定をかけていますが、ここで依存するportsの設定は既に終わっているので、 Guest Additionのconfigを入力すれば終わりです。

emulators/virtualbox-ose-additionsの設定 Guest Additionの設定項目は以下のとおりです。 まとめたように、OPENGLX11サポートを有効にしておけばよいでしょう。

設定できたならば、コンパイル、インストールします。

# make install clean

重大な注意!
Guest Additionは入れっぱなしではいけません。カーネルをコンパイルした際には、 必ずGuest Additionも再コンパイル、インストールする必要があります。 xorgを実行しているならばコンソール画面に戻って、以下のように実行します。

# /usr/local/etc/rc.d/vboxservice stop
# /usr/local/etc/rc.d/vboxguest stop
# cd /usr/ports/emulators/virtualbox-ose-additons
# make clean deinstall install clean
# /usr/local/etc/rc.d/vboxguest start
# /usr/local/etc/rc.d/vboxservice start

VirtualBox Guest Addition の設定を行う

Guest Additionsのインストールができたならば、その設定を行います。 まずは、ファイル/etc/rc.confに以下の内容を追記します。

vboxguest_enable="YES"
vboxservice_enable="YES"
vboxservice_flags="--disable-timesync"

vboxguestがカーネルモジュールを、vboxserviceがデーモンを起動します。 vboxservice_flagsはデーモンへのフラグ指定です。 このフラグはゲスト環境上でNTPによる時刻同期を使用する場合に指定します。 ゲスト環境上ではクロックが狂いやすいので時刻同期は必須です。 また、例えばホスト環境がサスペンドしてしまうと、その間クロックが停止する 形となるため、時刻が大幅に狂います。 時刻のずれが一定値をこえるとNTP同期が効かなくなります。 その場合は、NTPにあわせてntpdateも有効にしておきます。 すると、NTPdを起動する前にntpdateで一度時刻修正するようになるので、 NTPdが正しく動作できるようになります。これを実現するために、 ファイル/etc/rc.confに以下の内容も追記します。

ntpdate_enable="YES"
ntpd_enable="YES"

Xorgは入力デバイスの管理にHaldとdbusを使用します。そのため、それらデーモンを 起動する設定もファイル/etc/rc.confに追記します。

hald_enable="YES"
dbus_enable="YES"

次にGuest Additionsで提供される仮想マウスドライバをHald に登録します。 これは、以下の内容でファイル /usr/local/etc/hal/fdi/policy/90-vboxguest.fdi を作成します。

<?xml version="1.0" encoding="UTF-8"?>
<!--
# Sun VirtualBox
# Hal driver description for the vboxmouse driver
# $Id: 90-vboxguest.fdi 21412 2009-07-08 21:18:57Z vboxsync $

     Copyright (C) 2008-2009 Sun Microsystems, Inc.

     This file is part of VirtualBox Open Source Edition (OSE), as
     available from http://www.virtualbox.org. This file is free software;
     you can redistribute it and/or modify it under the terms of the GNU
     General Public License (GPL) as published by the Free Software
     Foundation, in version 2 as it comes in the "COPYING" file of the
     VirtualBox OSE distribution. VirtualBox OSE is distributed in the
     hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.

     Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
     Clara, CA 95054 USA or visit http://www.sun.com if you need
     additional information or have any questions.
-->
<deviceinfo version="0.2">
  <device>
    <match key="info.subsystem" string="pci">
      <match key="info.product" string="VirtualBox Guest Service">
        <append key="info.capabilities" type="strlist">input</append>
        <append key="info.capabilities" type="strlist">input.mouse</append>
        <merge key="input.x11_driver" type="string">vboxmouse</merge>
        <merge key="input.device" type="string">/dev/vboxguest</merge>
      </match>
    </match>
  </device>
</deviceinfo>

ここまで出来たならば、カーネルモジュールをロードし、 必要なデーモンを起動してゆきましょう。

まずは時刻同期系で、時刻を正しくします。

# /etc/rc.d/ntpdate start
# /etc/rc.d/ntpd start

次にdbus, haldを起動します。

# /etc/rc.d/dbus start
# /etc/rc.d/hald start

最後にGuest Additionのカーネルモジュールを読み込み、デーモンを起動します。

# /etc/rc.d/vboxguest start
# /etc/rc.d/vboxservice start

Xorgの設定を行う

Xorgの設定ファイルxorg.confは、以下のようにコマンドを実行してひな形を生成します。

# Xorg -configure

成功すると、ひな形ファイルが~/xorg.conf.newというパス名で出力されます。 出力されたならば、エディタでその中身を開いて内容を確認しつつ編集します。

# vi ~/xorg.conf.new

まず、マウスの設定を書き換えます。この段階で自動生成されたマウスの設定は 以下のようになっているはずです。

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/sysmouse"
        Option      "ZAxisMapping" "4 5 6 7"
EndSection

これを行頭#でコメントアウトし、Guest Additonの仮想マウスドライバの設定を 挿入します。

# Section "InputDevice"
#         Identifier  "Mouse0"
#         Driver      "mouse"
#         Option      "Protocol" "auto"
#         Option      "Device" "/dev/sysmouse"
#         Option      "ZAxisMapping" "4 5 6 7"
# EndSection
Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "vboxmouse"
        Option      "ZAxisMapping" "4 5"
        Option      "Buttons" "5"
EndSection

最後にビデオドライバの設定を確認します。 この設定は自動認識され、以下の様な内容となっているはずです。

Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz"
        ### [arg]: arg optional
        Identifier  "Card0"
        Driver      "vboxvideo"
        VendorName  "InnoTek Systemberatung GmbH"
        BoardName   "VirtualBox Graphics Adapter"
        BusID       "PCI:0:2:0"
EndSection

実際にこのようになっているか確認します。 Driver行がvesaになってしまっている場合は、正しくGuest Additionの ドライバを認識していません。 インストールが正しく行えているか、 設定が正しいか、 プログラムをきちんと起動したかをチェックしましょう。

xorg.conf.newを正しく修正できたならば、それを定位置にコピーします。

# cp xorg.conf.new /etc/X11/xorg.conf

これで設定は完了です。早速X Windowsを起動してみましょう。

# startx

起動が成功したならば以下の様な画面となるはずです。 X Windowを起動する
マウスが透過的に扱われているかチェックしましょう。 なお、この段階ではxfce4もgnomeKDEも導入されていませんので、 画面は昔ながらのシンプルな標準的X Windowsのものです。 必要ならば、好みのデスクトップ環境を導入しましょう。

ここまでのまとめ

以上で、VirtualBox Guest Additionの最新版を加えた X window環境の導入が完了です。

今回はFreeBSD標準の配布に入る以前の開発版のportsを 使う方法を紹介しました。

標準配布品でも十分な機能を実現できますが、 最新版を使用したいならば、開発版に手を出さねばならない 場合もあります。

なお、開発版ですので、未解決、 あるいは知られていない問題が存在するかもしれません。 問題を発見したならば、あるいは問題の修正をあみだしたならば、 メーリングリストに報告しましょう。

なお、本稿で「FreeBSD-CURRENTで遊んでみた」の、 CURRENT開発環境導入編は一段落します。 これ以降、PandaBoardでFreeBSD-armの稼働を目指す、 「armしてみた」編に入ります。

*1:コンパイルに使用されます。