本連載の第312回 で、パッケージ管理に関する様々なレシピをお届けしました。今回はその中からPPA(Personal Package Archive)に着目して、その登録及び抹消操作に関するレシピをお届けします。
パッケージの配布元
ツールの説明の前に、パッケージの配布元に関して説明します。
普通にUbuntuを使っている場合、システムにインストールされるパッケージは、一定の手続き及びUbuntu開発者の合意を経たうえで作成されたものです。こういったパッケージはUbuntuの公式リポジトリから配布されます。
このUbuntu公式リポジトリから配布されているパッケージですが、第312回で説明したように、Ubuntuの正式リリース後、ソフトウェア自体のバージョンが上がるような更新は提供されません[1] 。
これを受けて、不便を感じた個人が、新しいバージョンのソフトウェアのパッケージを提供することがあります。また上流の開発者が、広くテスターを集めたい、現在主流の環境におけるテストを行いたい、色んなソフトウェアと組み合わせて試すことで予期せぬバグを洗い出したい、などの理由で、最新のソフトウェアのパッケージを提供することもあります。
これらのパッケージは一定の手続きを経ていないため、Ubuntu公式リポジトリから提供されません。個人が別な手段を用意して提供します[2] 。
手段の1つとして、Ubuntu公式リポジトリと同じように振る舞うリポジトリが挙げられます。配布者はリポジトリを用意してパッケージを置いておきます。利用者はそれをシステムに登録することで、リポジトリ内のパッケージを利用可能にします。
Personal Package Archive(PPA)は、このような手段の1つとして使われます。
なお、このようなパッケージを利用する場合、利用者側は注意する必要があります。つまり、Ubuntu開発者の合意を経ないパッケージをシステムにインストールすることになるため、そのパッケージに起因する不具合が発生したとしても、Ubuntu開発者にバグを報告できないということです。筋としてはパッケージの配布者に対して行うことになります。
Personal Package Archive(PPA)
PPAはlaunchpad.netに用意された、個人用リポジトリです。配布者はlaunchpad.netにアカウントを作成すると、PPAに自由にパッケージを置くことができるようになります。利用者はPPAをシステムに登録することで、PPAで配布されているパッケージをインストールすることができます。
PPAの身近な例として、Ubuntu Japanese TeamのPPAが挙げられます。Ubuntu Japanese Teamでは、Ubuntu 13.10の日本語入力環境のセットアップを簡便にするソフトウェア を開発し、PPAを通じてパッケージを配布しています。また、unzipに対してパッチを当て、日本語環境で一般的に使われる文字符号化方式を正しく検出して処理できるようにしたパッケージも配布しています。
PPAの登録
PPAはシステムに登録しなければ利用できません。そこでここでは、software-propeties-gtkとapt-add-repositoryを紹介します。
software-properties-gtk
これは「ソフトウェアとアップデート」としてGUI画面で操作するソフトウェアです。「 ソフトウェアとアップデート」を使いPPAを登録する手順は、本連載の第46回 で既にお伝えしていますが、ここではもう少し文字を費やして説明します。
図1 「 ソフトウェアとアップデート」の「他のソフトウェア」タブ
「ソフトウェアとアップデート」を起動する方法はいくつかあります。
UnityのDashで「ソフトウェアとアップデート」を検索して起動する
「Ubuntuソフトウェアセンター」を開き、メニューで編集、ソフトウェアソース、とたどる
「ソフトウェアの更新」を開き、設定ボタンを押す
「ソフトウェアとアップデート」を使ってPPAを登録するには、「 他のソフトウェア」タブでボタン「追加」を選択します。ダイアログが開き、「 リポジトリの完全なAPTライン」の入力を求められます。「 APTライン」に関する説明は今回の趣旨ではないので省略します。
PPAであれば、正しいAPTラインの代わりに、PPA特有の表記を使うことができます。Ubuntu Japnese TeamのPPAを登録するには、以下を入力します[3] 。
ppa:japaneseteam/ppa
登録を完了したら「ソフトウェアとアップデート」の「閉じる」ボタンを押します。登録されているリポジトリ情報を変更したため、パッケージ情報を更新するかどうかの選択を求められます。とくに事情がなければ「再読み込み」ボタンを押します。
ここまで操作を終えると、UbuntuソフトウェアセンターなどでPPAのパッケージをインストール可能になります。Ubuntu公式リポジトリのパッケージよりも新しいパッケージが利用可能になった場合は、適当なタイミングで「ソフトウェアの更新」が自動起動するはずです。
PPAを無効にするには、同じく「他のソフトウェア」タブでPPAのエントリーのチェックボックスを外します。登録を抹消するにはエントリーを選択した状態で「削除」ボタンを押します。いずれの操作もリポジトリ情報の変更を伴うので、「 ソフトウェアとアップデート」を閉じようとすると、パッケージ情報の更新を求められます。
これ以外にも「ソフトウェアとアップデート」は、リポジトリの登録に関する重要な機能を持ちます。ですが、これは今回の趣旨ではないので省略します。
apt-add-repository
apt-add-repositoryは新規リポジトリの登録、リポジトリの登録解除をするソフトウェアで、標準でインストールされていますす。GUI画面での操作ではなく、コマンドラインから操作します。software-properties-gtk同様、このツールも、PPAのみならず、登録済みリポジトリの削除操作ができてしまう点に注意してください。
Ubuntu Japanese Teamのリポジトリをインストールするには、以下を実行します。
$ sudo apt-add-repository ppa:japaneseteam/ppa
Providing packages which are useful for Japanese Ubuntu users and are not accepted into the Ubuntu archive for some reason. This PPA will be mirrored by servers located in Japan.
詳しい情報: https://launchpad.net/~japaneseteam/+archive/ppa
[ENTER] を押すと続行します。ctrl-c で追加をキャンセルできます
gpg: 鍵輪「/tmp/tmpytva_o/secring.gpg」ができました
gpg: 鍵輪「/tmp/tmpytva_o/pubring.gpg」ができました
gpg: 鍵CDC1D865をhkpからサーバーkeyserver.ubuntu.comに要求
gpg: /tmp/tmpytva_o/trustdb.gpg: 信用データベースができました
gpg: 鍵CDC1D865: 公開鍵“Launchpad PPA for Ubuntu Japanese Team”を読み込みました
gpg: 処理数の合計: 1
gpg: 読込み: 1 (RSA: 1)
OK
リポジトリの情報を更新したので、以下のコマンドを実行してパッケージ情報を更新すると、リポジトリ内のパッケージがインストール可能になります。
$ sudo apt-get update
PPAを削除するには、-rオプションを使います。
$ sudo apt-add-repository -r ppa:japaneseteam/ppa
ppa-purge
さて、software-properties-gtkもapt-add-repositoryも、PPAの登録を抹消することができます。このとき、PPAからインストールしたパッケージはそのまま保持されます。これは困った事態を引き起こします。
パッケージ管理システムが、PPAからインストールしたパッケージと、それ以外からインストールできるパッケージを比較した結果、PPAからインストールしたパッケージをそのまま維持してしまうことがあります。この場合、Ubuntu公式リポジトリのアップデートを利用することができなくなります。該当するパッケージを一旦アンインストールして再インストールするという方法が思いつきますが、パッケージの依存関係により芋づる式に重要パッケージもアンインストールしてしまうという事態を考えることができます。
そこで登場するのが、ppa-purgeというソフトウェアです。ppa-purgeは指定したPPAの登録を抹消する機能を持つソフトウェアです[4] 。削除と同時に、PPAからインストールしたパッケージを「可能な限り」現在有効なリポジトリにあるパッケージに置きかえます。
ppa-purgeをインストールするには、Ubuntuソフトウェアセンターで「ppa-purge」を検索し、インストールしてください。端末で操作する場合は、以下のコマンドを実行します。
$ sudo apt-get install ppa-purge
ppa-purgeはGUI画面で操作できないので、端末から操作します。基本的には以下のコマンドとなります。
$ sudo ppa-purge ppa:ppaのowner名/ppaの名前
たとえば、先ほど有効にしたjapaneseteamのppaリポジトリを削除するには以下を実行します。
$ sudo ppa-purge ppa:japaneseteam/ppa
Updating packages lists
PPA to be removed: japaneseteam ppa
Package revert list generated:
im-setup-helper/saucy ubuntu-defaults-ja/saucy unzip/saucy
Disabling japaneseteam PPA from
/etc/apt/sources.list.d/japaneseteam-ppa-saucy.list
Updating packages lists
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: 'im-setup-helper' のリリース 'saucy' が見つかりませんでした
E: 'ubuntu-defaults-ja' のリリース 'saucy' が見つかりませんでした
"im-setup-helper" パッケージのアーカイブ "saucy" が見つかりません
"ubuntu-defaults-ja" パッケージのアーカイブ "saucy" が見つかりません
"im-setup-helper" パッケージのアーカイブ "saucy" が見つかりません
"ubuntu-defaults-ja" パッケージのアーカイブ "saucy" が見つかりません
以下のパッケージがダウングレードされます:
unzip
0 個のパッケージを更新、 0 個を新たにインストール、 1 個をダウングレード、 0 個を削除予定、0 個が更新されていない。
アーカイブ 193 k バイト中 0 バイトを取得する必要があります。 展開後に 35.8 k バイトのディスク領域が新たに消費されます。
dpkg: 警告: unzip を 6.0-10~5.52~ja1 から 6.0-9ubuntu1 にダウングレードしています
(データベースを読み込んでいます ... 現在 453291 個のファイルとディレクトリがインストールされています。)
unzip 6.0-10~5.52~ja1 を (.../unzip_6.0-9ubuntu1_amd64.deb で) 置換するための準備をしています ...
unzip を展開し、置換しています...
mime-support のトリガを処理しています ...
man-db のトリガを処理しています ...
unzip (6.0-9ubuntu1) を設定しています ...
PPA purged successfully using aptitude fallback
出力からは、PPAでしか提供されていない「im-setup-helper」 、「 ubuntu-defaults-ja」は維持され、「 unzip」はUbuntu公式リポジトリのものがインストールされていることがわかります。
[4] ppa-pargeそのものはbashスクリプトです。内部ではオプションのパース、インストールされているパッケージの一覧の作成、削除対象となるパッケージ名の抽出、配列の処理など、役立つ技が使われています。興味のある方は/usr/sbin/ppa-purgeを見てみると良いでしょう。
まとめ
Ubuntuのパッケージは通常、Ubuntuの公式リポジトリで配布されています。これに対し、様々な事情で有志がパッケージを提供していることがあります。launchpad.netにはPPAという仕組みがあり、このようなパッケージの配布元として利用することができます。システムにPPAを登録したり、登録を抹消するソフトウェアとして、software-properties-gtk、apt-add-repository、ppa-purgeを使うことができます。