この数カ月で、日本円が米ドルに対し20%ほど安くなりました。これだけ円安に振れれば、Apple製品が価格改定される可能性大ですね。そろそろ新製品の発売があっていい時期、機能だけでなく価格にも注目です。

さて、今回は「インストーラパッケージの削除」について。ありそうだがなさそうなこの機能、Leopardのとき提供されたがLionで取り除かれる、といういわくつきの存在だ。その経緯と対策について解説してみよう。

悩ましい「インストーラパッケージ」

OS Xでは、システム深部にインストールするプログラムや一部のアプリケーションは「インストーラパッケージ」の体裁をとる。開いた箱のアイコンと拡張子「.pkg」を持ち、専用ツール「インストーラ(Installer.app)」で導入処理を行うことは、ほとんどのユーザが知っているはずだ。

しかし、どういうわけか、パッケージの内容に関心を持たないユーザが多い。KEXTのようにカーネルに近いレイヤーで動作するプログラムや、インストールしたことすら失念してしまいがちなUNIXコマンドは、不正なものが混じっていればシステムに深刻なダメージを及ぼしかねないにもかかわらずだ。見てもよくわからないから、という答えが返ってきそうだが、調べる方法すら知られていないことはいかがなものか。

インストーラパッケージのフォーマットは、Leopardのとき刷新された。それまではバンドル形式であり、cpio形式で圧縮したアーカイブなどから構成されていたが、現在ではプレインなファイルとして提供されるようになった。だから、インストーラを起動する前にTerminal(のUNIXコマンド)を駆使して収録されたPDFを確認する、といったワザが使えなくなった。

インストーラパッケージの内容物は、インストーラで開いているときメニューバーから「ファイル」→「ファイルを表示」を選択すると表示できる。問題は、インストール後(かつパッケージの削除後)にはその情報を確認できるGUIツールが見当たらないということだ。しかもインストーラは一方通行のツール、インストールはできるがアンインストールには対応しない。内容はよくわからない、導入できるが取り除く機能はない……このままでいいのか?

ファイルコピー開始前に「ファイル」→「ファイルを表示」を選択すると、パッケージの内容を確認できる

インストーラパッケージを取り除くには

Leopard以降、パッケージはフォーマットが変更されただけでなく、データベース化して管理されるようになった。そのためのコマンドが「pkgutil」で、これ1つでlsbomなど旧来のコマンドの働きを兼ねる優れモノだ。まずは、そのあたりのしくみから説明しよう。 Leopard以降、新フォーマットのパッケージには「ID」が付くようになった。IDはパッケージのインストール時にシステム領域(/private/var/db/receiptsディレクトリ)へ保存され、以降IDを使えばパッケージの情報(レシート)を確認できる。

目的のIDを調べるには、オプション「--pkgs」ですべてのIDを出力し、それをgrepでフィルタする方法が手っ取り早い。「--pkgs=正規表現」の形で抽出することもできるので、正規表現を理解していればそうしてもいいだろう。以下の実行例では、アプリケーション名の一部を頼りにIDを探しているが、「Microsoft」のように会社名を含むものも多いので、いろいろ変えて試してみよう。

$ pkgutil --pkgs | grep -i twonky
com.pv.TwonkyInstaller   ←検出されたID

次に、grepでヒットしたIDが目的のパッケージのものかどうか検証するため、そのパッケージに収録されているファイルリストを表示する。書式は単純、「--files」オプションに続けて探し出したIDを指定するだけだ。

$ pkgutil --files com.pv.TwonkyInstaller

ビンゴ! とわかれば、いよいよパッケージの削除へ進むことになるが、そこからはかなりの"度胸"が必要。というのも、当初のpkgutilコマンドには削除用のオプション「--unlink」が用意されていたのだが、Snow Leopard以降は無効化されてしまったからだ(トラブルが多発したのだろうか)。

だから、他のコマンドにパイプするというUNIXの流儀で処理することになるが、それにはsudoコマンドでrmコマンドを実行するという、一歩間違えばシステムごと削除してしまう危険を伴う。ファイル消失の危険を避けるため、必ずTime Machineでバックアップを済ませたうえで、自己責任のもと進めてほしい。

以下のコマンド実行例の1行目ではパッケージ内容物のリストをもとに削除用シェルスクリプトを生成し、2行目で削除、3行目でそのパッケージをデータベースから削除している。ID部分を変えれば、他のパッケージにも流用できるはずだ。

$ pkgutil --files com.pv.TwonkyInstaller | sed 's:^:rm -f \"/:;s:$:\":' | sort -r > uninstall.sh
$ sudo sh uninstall.sh
$ sudo pkgutil --forget com.pv.TwonkyInstaller

なお、この作業だけで完全な削除はできない。/System/Library/LaunchAgentsや/System/Library/LaunchDaemonsに起動用エントリがある場合、/Libraryや~/Libraryに一時ファイルが作成された場合、あるいはホームディレクトリにドットファイルが置かれた場合……結局は手動での削除が必要となってしまう。専用アンインストーラのようにいかないことは了承いただきたい。

パッケージの「レシート」には、内容物のリストなどの情報が記録されている