Dec 17, 2008

VMware Fusion 2.0のヘッドレスモード設定

VMware Fusion 2.0において、VMをVMware FusionのUIアプリやコンソールを使わず、ヘッドレスモード(Headless mode)で運用するためのメモ。

なぜヘッドレスモードが重要かというと、開発サーバのようにデスクトップ環境の不要なVMは、VMware Serverなどと同様、マシン起動時にバックグラウンドで自動的に起動して使用したいから。ついでにUIアプリやコンソールアプリが使うメモリも節約できるというメリットもある。

VMをコマンドラインからヘッドレスモードで操作する

Terminal.appから以下のようにnoguiオプション付きで起動すると、ヘッドレスモードで動作する。

/Library/Application\ Support/VMware\ Fusion/vmrun start   /path/to/vm.vmx nogui

suspend、shutdownしたい場合には以下のコマンドを実行すればよい。

/Library/Application\ Support/VMware\ Fusion/vmrun suspend /path/to/vm.vmx nogui
/Library/Application\ Support/VMware\ Fusion/vmrun stop    /path/to/vm.vmx nogui

他にもreset, pause, unpause, snapshotなどさまざまなオプションが指定できる。詳しくはvmrunをオプションなしで起動したときに表示されるヘルプを参照。

launchdを使ってログイン時にヘッドレスVMを起動する

~/Library/LaunchAgentsというディレクトリを作り、下のようなplistファイルを置く。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
          "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>vm-label.whatever.you.like</string>
    <key>RunAtLoad</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
      <string>/Library/Application Support/VMware Fusion/vmrun</string>
      <string>start</string>
      <string>/path/to/vm.vmx</string>
      <string>nogui</string>
    </array>
  </dict>
</plist>

Labelの値、vmxファイルへのパスは任意に変更すること。

VMをFusion UIアプリからヘッドレスモードで操作する

VMがshutdownされていることを確認して、VMの設定ファイル(*.vmx)に以下の一行を追加する。

gui.viewModeAtPowerOn = "none"

以降は、VMware FusionのUIからVMを起動しても、VMのコンソールウィンドウが開かなくなる。

Fusion UIアプリでヘッドレスモードの設定を行えるようにする

Fusion UIアプリが起動していないことを確認して、Terminal.appから以下のように実行する。

defaults write com.vmware.fusion fluxCapacitor -bool YES

以降は、VMware FusionのUIアプリのメニューバーの「表示」メニューに「ヘッドレスモードで起動」「ヘッドレスモードを終了」が追加される。ヘッドレスモードに変更すると、コンソールウィンドウを閉じ、vmxファイルのgui.viewModeAtPowerOnオプションの値がnoneに変更される。

注: この機能はvmxファイルを自分で編集するつもりならまったく不要。

ヘッドレスVMを安全にshutdown/suspendする

ヘッドレスでないVMはFusion UIが終了するときにshutdownもしくはsuspendされるが、ヘッドレスVMは単なるroot権限のプロセスであるため、たとえ起動したユーザがログアウトしたとしても終了せずにそのまま動作し続ける。したがって、本体Mac OS Xのshutdown時に強制終了されるという問題がある。

vmxファイルに以下のように追加しておくと、VMプロセスにSIGHUPが送られたときにはsuspend、SIGTERMが送られたときにはshutdownまたは電源オフが行われるようになる。

signal.suspendOnHUP = "TRUE"
signal.powerOffOnTERM = "TRUE"

一般的にMac OS Xの終了時にはすべての残留プロセスに対してSIGTERMが送られるはずなので(Mac OSに詳しくないので間違っているかも)、安全にヘッドレスVMのshutdownを実行できる。

注: Mac OS Xのlaunchdでshutdown時に実行されるスクリプトを指定できるのであれば、その仕組みを使ってshutdown/suspendした方がよりrobustにできる。その方法がよく分からないので、ここではSIGTERM受信時にshutdownする方法を説明した。

追記: /etc/rc.shutdown.localやcom.apple.loginwindowのLogoutHookを使うとshutdownスクリプトを書けるようだが、これらを使う方法は美しくない。そもそもVMware Fusion自体が悪いとも言える。VMware Fusionは、ブート時はlaunchdを使って/Library/Application Support/VMware Fusion/boot.shを実行して必要なカーネルモジュールをロードし、vmnet関係のデーモンを起動しているのにも関わらず、シャットダウン時は何もしていない。Mac OS X的にはwatchdogプロセスを走らせておき、それがkillされるタイミングで、生存しているすべてのVMをsuspend/shutdownした後に、vmnetデーモンをkillし、カーネルモジュールをunloadするのが「正しい作法」なのだと思う。このあたりの実装をVMwareがちゃんとやってくれれば(いつかはそうなると信じているのだが)、ヘッドレスVMへの対処もより簡単で確実になるだろう。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com