彷徨えるフジワラ

年がら年中さまよってます

あと一息なんだけどなぁ

VirtualBox の詰めが甘い件について。概ね悪くはないのよ、「概ね」は。

即時実行時の権限

MS-Windows ホスト環境で VirtualBox をインストールした際に、すぐさま仮想マシン構築を行うと、次回起動時には一切の設定変更が受け付けられなくなる。何をやっても「Access Denied」に。

真っ更からインストールしたばかりなのに、これは何事か?と落胆しかけたけど、色々追いかけて行くと、どうやら文字通り「権限不足」が原因っぽい。自分のホームディレクトリ配下なのに、所有者が自分じゃない、ってのはどーゆーことよ?

…………あ! Vista だからか?
Vista 上で VirtualBoxインストーラを起動すると:

  1. インストール作業完了
  2. 「このまま実行しますか?」ダイアログが表示
  3. 管理者権限に移行(所謂 su/pfexec)
  4. VirtualBox をインストール
  5. 「このまま仮想マシン作成を行いますか?」ダイアログが表示
  6. 管理者権限のまま仮想マシン作成を実施
  7. 管理者権限でファイルを保存するので、後からのアクセスは権限不正で失敗

という流れっぽい。

っていうか、もう Windows7 が発売されているのに Vista 対応がこれかよ?

ホスト側のネットワーク環境変更が反映されない(@ NAT モード)

ホストのネットワーク環境が変化(e.g.: 別なネットワークに接続)する可能性がある場合に、問い合わせ先 DNS サーバ情報はゲストに見えない方が都合が良いので、ネットワークアダプタを NAT モードで稼動させる際には、DNSProxy を有効にした方が良い、っていうか、DNSProxy ってそのためのものだと個人的には思っていたのだけれど:

  1. ホストをネットワーク未接続状態に
  2. VirtualBox ゲストを起動
  3. ホストをネットワークに接続
  4. ゲストからの DNS 解決は不可能………… orz

という状況。どうやら、VirtualBox の NAT エンジンはホストのネットワーク環境の変化に追従できてない模様(MS-Windows ホスト限定?)。っつーか、これって DNSProxy の意味無くねぇ?

うーん、この仕様だと、ノートPC上でハイバネートとかを挟みつつ使い続ける、とかってできないんだよなぁ。

これって UseHostResolver を有効にしろ、って事?でもこれを有効にすると、最初の段階で DNS 解決できなかったよ?マニュアルで言うところの「ホスト側での名前解決」というのが:

  • ホスト側のネットワーク設定で定められた DNS サーバへの問い合わせ
  • ホストに閉じた情報(LMHOSTS ファイルとか?)での解決

のどちらを指しているか次第なのだけど、挙動を見た限りでは後者っぽいんだよなぁ。

※ 2009/12/22 追記: ここから

条件次第では追従する場合もあることを発見。っていうか、気紛れすぎて、追従可能な条件を追い込むのは面倒なので、当分は「追従できないもの」と思っていることに。気力が満ちてきたら条件を突き止めてみよう。

※ 2009/12/22 追記: ここまで

NAT ネットワーク設定が持続しない

NAT 構成のネットワークアダプタだと、「アダプタの登録順序」に依存したルールでアドレスが割り当てられるのがデフォルト。

つまり、ネットワークアダプタ構成を変えるとアドレス体系が変更されてしまうことを意味する。但し、"VBoxManage modifyvm" で任意のネットワークの使用を指示できるので、自前のルールで固定化することは可能。

で、独自ルール設定後の使用感もすこぶる快調だったのだけれど、ゲストから NAT アダプタ経由での外部アクセスが突然できなくなった。「ホストの外に出て行けない」とかじゃなくて、そもそもホスト上の仮想的なルータ/DNS サーバのアドレスに対する ping が通らないのだ。

「またお前か?> NAT アダプタ」と思ったけど、調べてみたら NAT のアドレス設定が消えていた。

"VBoxManage modifyvm" で NAT アドレス設定をすると、仮想マシンの構成情報を記録する設定ファイル(${HOME}/.VirtualBox/Machines/vmname/vmname.xml 等)中の NAT 要素に対して、以下の様な network 属性が追加される:

      <Network>
        <Adapter slot="0"
         enabled="true"
         MACAddress="080027B21289"
         cable="true" speed="0" type="82540EM"
        >
          <NAT network="10.33.0.0/24"/>
        </Adapter>

で、今回はこれが消えていた=デフォルトの状態に戻っていたのだ。

ははぁーん、ちょっと前に poweroff 操作とかでごちゃごちゃやった際に、構成情報の保存が上手くいって無かったのだな?ということで、気を取り直して再設定。

再度仮想マシンを起動して確認してみると…………あれ?やっぱり ping が通らない?

仮想マシン稼働中は NAT アドレスの設定変更ができないので、一旦シャットダウンして…………あれ?また設定ファイルから NAT アドレス設定が消えているぞ?仮想マシン起動直前まではちゃんとあったのに!

さぁ、それからが試行錯誤祭りの始まり。っていうか、そもそも以前上手く行っていた状態を構築することができない。あの時は白昼夢でも見てたのか?

半ばやけくそで、あらゆる手順の組み合わせを試行錯誤してみたところ、遂に原因を突き止める事に成功。上手く行ってなかったのは:

  1. NAT ネットワーク設定を実施("VBoxManage modifyvm")
  2. 仮想マシンを起動("VBoxManage startvm")

という手順で仮想マシンを起動していたからだった。

って、一見すると「何が問題なの?」という手順なのだが、上手く行かせるためには:

  1. VirtualBox GUI を起動
  2. NAT ネットワーク設定を実施("VBoxManage modifyvm")
  3. 仮想マシンを起動("VBoxManage startvm" あるいは VirtualBox GUI 経由)

という手順で仮想マシンを起動しなければならなかったのだ。つまり:

VirtualBox GUI が起動していないと、NAT ネットワークのアドレス設定のカスタマイズは有効に機能しない

ということらしい。少なくとも MS-Windows ホスト環境ではこのルールは絶対。Solaris 環境だとどうなるかは未検証。っつーか、そんなこといちいち試したく無ぇ〜。

おまけに VirtualBox GUI を終了させると、問答無用で NAT ネットワーク設定がクリアされる始末。つまりそれは:

NAT ネットワーク設定のカスタマイズなんてことはしてくれるな

という意思表示なのか?

他のホスト環境でも同じだとすると、少なくとも headless 運用と NAT ネットワーク設定のカスタマイズは共存不可能ということに………… orz