【コラム】

OS X ハッキング!

123 パッケージの削除について考える

    海上忍  [2005/02/14]

    先週から配布が開始されたMac OS X 10.3.8だが、アップデートしたところ思わぬ災難に。ふだん使っているApple Wireless Keyboard(US)の「A」の左隣が「caps lock」なので、これを「control」に代えるべくuControlというキーボードカスタマイズツールを利用しているのだが、アップデート直後にKEXTがロードされなくなってしまったのだ。これでは原稿を書けない……と思いきや、先ほど修正版の配布が開始され、事なきを得た次第。皆さん、システムのアップデートは慎重に。

    さて、今回はOS X標準のパッケージ形式(*.pkg)について。システムの更新など"公式"なアップデートは、基本的にこの形式のパッケージが利用されることはご存知のとおり。一般ユーザの立場としてはただ受け入れるのみ、カスタマイズの余地はほとんどないものの、前述のuControlでドキッとしたこともあり、自戒の念を込めてパッケージとの付き合い方を示しておこうという次第だ。

    パッケージの中身は?

    パッケージの実体はバンドルであり、その内部には多数のファイルが収められている。構造はアプリケーションなど他のバンドルとほぼ同じで、Contentsディレクトリの下位にResourcesなどのディレクトリが配置され、そこにドキュメント類や各言語のリソースも収められる。

    パッケージの中身とでも言うべきファイルは、Contentsディレクトリ直下に置かれる「Archive.pax.gz」という名のファイルだ。ファイル名は固定で、内容物のリストが記載されている「Archive.bom」のほか、Info.plistとversion.plistが必ず収録されている。ほかにも、インストールの前/後処理を行うシェルスクリプトが含まれることもあるが、必須ではない。

    行きはよいよい帰りは……

    このパッケージ形式最大の特徴は、アンインストールに対応していないこと。Xcode Toolsのように、アンインストール用のスクリプト(/Developer/Tools/uninstall-devtools.pl)を同梱しているパッケージもあるが、ないことのほうが圧倒的に多い。

    古い話で恐縮だが、NEXTSTEPの時代にはInstaller.appの機能でパッケージを削除できた。手順は簡単、*.pkgのインストール後/NextLibrary/Receiptsに作成されるレシートをInstaller.appで開き、削除ボタンをクリックすればOK。削除せずcompress形式で圧縮するという選択肢も用意されていたので、狭いディスクスペースをやり繰りせねばならなかった当時には重宝したものだ。

    なぜOS Xの時代に入って削除も圧縮もできなくなったかは不明だが、もっぱら(システムに近い)Apple製の配布物に用いられるため削除/圧縮は不要、ということなのだと理解している。アプリケーションの導入/削除はFinderでドラッグ&ドロップ、という様式がデベロッパに推奨されている以上は自然な流れなのかもしれない。

    まずはパッケージの中身を確認

    とはいえど、パッケージを削除する必要にかられることがあるのも確か。いきなり削除する方法はないので、まずは以下の要領でレシート(/Library/Receiptsディレクトリに作成されるパッケージのインストール記録)の内容を確認してみよう。

    $ cd /Library/Receipts
    $ lsbom koffice.pkg/Contents/Archive.bom | less

    この「lsbom」コマンドは、前述したArchive.bomの内容を標準出力に書き出す役割を果たす。それをlessにパイプし、どのようなファイル/ディレクトリがどこへインストールされたのかを確認する、というわけだ。

    削除は慎重に

    ここから先はかなりの危険を伴うので、実際に試すときには慎重に慎重を重ねてトライしてほしい。

    まず、ディレクトリとファイルの見分け方が重要。/Applicationsは「アプリケーション」フォルダのことで、このフォルダを消してしまうと面倒なことになる、ということは理解できるはず。もちろん、/System/Libraryや/usr/binや/usr/libといったディレクトリも絶対に削除してはならない。

    これではあまりに抽象的なので、とあるパッケージをアンインストールしたときの手順を以下に示しておこう。参考にならないかもしれないが、なかなか面倒な作業になることを察するだけでも損はないと思う。

    $ cd /Library/Receipts
    $ cat joinPDF2.2.pkg/Contents/Info.plist | grep -i defaultlocation -A 1
            <key>IFPkgFlagDefaultLocation</key>
            <string>/usr</string>  ←先頭が/usrと判明
    $ lsbom joinPDF2.2.pkg/Contents/Archive.bom 
    .       40755   501/20
    ./.DS_Store     100755  501/20  6148    3974792736
    ./bin   40755   501/20
    ./bin/.DS_Store 100755  501/20  6148    1933275533
    ./bin/joinPDF   100755  501/20  48      3607080585
    ./bin/splitPDF  100755  501/20  47      3273952307
    ./lib   40755   501/20
    ./lib/.DS_Store 100755  501/20  6148    637536176
    ./lib/PDF.jar   100644  501/20  952379  1102059319

    $ sudo rm /usr/bin/joinPDF
    $ sudo rm /usr/bin/splitPDF
    $ sudo rm /usr/lib/PDF.jar

    新着記事

    特設サイトの情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      マイナビニュースマガジン