先日macOSのVMware Fusionを更新してみたところ、ゲストOSを起動する際「内部エラー」というメッセージが表示されて、一切起動できなくなっていることに気がつきました。
ゲストOSはWindowsだけではなく、LinuxやmacOSでも同様です。
最初はVMware Fusion自体の不具合だと思って調査をはじめたのですが、最終的にはmacOS自体のセキュリティに関連した、とある設定によって発生している問題らしいという結論に落ち着きました。
今回はこのVMware Fusionで発生する「内部エラー」を解消する方法を説明します。環境は記事執筆時それぞれ最新版であるmacOS Sierra 10.12.4とVMware Fusion 8.5.6です。
com.apple.quarantineのせい?
解決方法としてまず見つかったのは、VMware公式フォーラムの「Having problems with "Internal error" on newly installed Mac OSX」というスレッドです。
最後の方に以下のようなコマンドを実行すると良いというコメントがみつかりました。
sudo xattr -r -d com.apple.quarantine /Applications/VMware\ Fusion.app
半信半疑で試してみたところ見事問題は解決し、ゲストOSが起動できるようになったのですが、なぜこれで問題が解決できたのか謎は残ります。
com.apple.quarantineというのはMacのセキュリティシステムであるGatekeeperが使用するファイルの拡張属性で、この属性が設定されているファイルは起動時にGatekeeperによるチェックが行われます。
com.apple.quarantineを削除することによってGatekeeprのチェックがバイパスされ、結果VMware Fusionが正常に動作するようになるらしいのですが、なぜその作業が必要なのか根本的な原因が不明なのです。
そもそも不具合が発生したMacはGatekeeperの設定はデフォルト状態のままで、かつ他のMacではVMware Fusionが問題なくアップデートできていたため謎が深まります。
隠し設定のせいだった
さらに調べていくと、そもそもVMware Fusionが正常に更新できないMacでは、ダウンロードしたアプリを起動する際に表示されるはずの、Gatekeeperによる警告ダイアログが表示されないことに気がつきました。
アプリケーションの実行許可を「App Store」に変更しても、ノーチェックでインターネットからダウンロードしたアプリが実行できてしまうのです。
この原因を調べるのにはかなり苦労しましたが、最終的には以下のコマンドをいつの間にか実行していたのが原因ということがわかりました。
defaults write com.apple.LaunchServices LSQuarantine -bool NO
上のコマンドは、ダウンロードしたアプリを実行する際に警告ダイアログを表示しない隠し設定として、あちこちのサイトに掲載されている情報です。あれこれテストしているうちに実行してそのままにしていたのかもしれません。
この状態でVMware FUsionをインストールすると、macOS Sierraから導入された、AppTranslocationという仕組みが有効になり、ゲストOSがうまく起動できなくなってしまうようなのです(画像のように/Application/VMware Fusion.appが/private/var/folders以下にマウントされていることがわかります)。
defaults write com.apple.LaunchServices LSQuarantine -bool YES
試しに、上記コマンドによって設定を元に戻し、VMware Fusionを再インストールしたところ見事正常に完了し、内部エラーなくゲストOSを起動できることが確認できました。
まとめ
AppTranslocationはアプリのパスをランダム化してセキュリティを高める仕組みですが設定によっては、VMware Fusionの内部エラーのように分かりづらい不具合の原因となる可能性があるようです。
特に以下の設定を有効にしている方は
defaults write com.apple.LaunchServices LSQuarantine -bool NO
元の設定に戻しておいたほうが無難かもしれません。
defaults write com.apple.LaunchServices LSQuarantine -bool YES
問題が発生していないかどうか確認するためにはdfコマンドによってAppTranslocationが動いていないかどうか確認するのも有効だと思います。