Ubuntu Weekly Recipe

第331回 パッケージ管理のハウツー集

この記事を読むのに必要な時間:およそ 6 分

古いバージョンを使いつづけたい

パッケージシステムでアップグレードすると,インストールされているすべてのパッケージが最新バージョンに更新されます。しかし,何らかの理由により特定のパッケージだけ古いバージョンを使いつづけたいこともあるでしょう。

そんなときは,Pinを設定します。たとえばFirefoxの状態が次のような内容だったとします。

$ apt-cache policy firefox
firefox:
  インストールされているバージョン: 30.0+build1-0ubuntu0.14.04.3
  候補:               30.0+build1-0ubuntu0.14.04.3
  バージョンテーブル:
 *** 30.0+build1-0ubuntu0.14.04.3 0
        500 http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
        100 /var/lib/dpkg/status
     28.0+build2-0ubuntu2 0
        500 http://jp.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

ここで候補となるパッケージは,上からtrusty-updatesとtrusty-securityの30.0+build1-0ubunt0.14.04.3(優先度500)⁠インストール済みの同じパッケージ(優先度100)⁠trustyにある28.0+build2-0ubunt2(優先度500)の4つが存在します。aptではもっとも高い優先度のうち,バージョンが新しいものがインストールされますので,上記の例ですと優先度500のうち,一番新しい30.0がインストールされることになります(trusty-updatesとtrusty-securityはこの場合,中身が同じです)⁠

もし28.0を使いつづけたい場合は,次のように設定します。

$ sudo editor /etc/apt/preferences.d/firefox
Package: firefox*
Pin: version 28.0*
Pin-Priority: 1001
$ sudo apt update
$ sudo apt upgrade

Pin-Priorityが1000以上の場合,現在のバージョンよりバージョンが古くても,そのバージョンへのアップグレード(つまりダウングレード)を行います。

単純にバージョンを指定してインストールしたいだけであれば,次のようにインストール時にバージョンを指定する方法もあります。

$ sudo apt install firefox=28.0+build2-0ubuntu2

より実用的な要望として特定のPPAのパッケージは,Ubuntuの公式リポジトリのパッケージより優先度を上げたいことがあるでしょう。

$ sudo add-apt-repository ppa:foo/bar
$ sudo editor /etc/apt/preferences.d/ppa-foo-bar
Package: *
Pin: release o=LP-PPA-foo-bar
Pin-Priority: 600

これにより公式リポジトリのパッケージのアップデートにより,一時的に公式リポジトリのバージョンがPPAより新しくなったとしても,PPA側が更新されるまではアップグレードされなくなります。また,逆にPin-Priorityを500より小さくしておけば,明示的にPPAのパッケージを指定しない限りは,インストールされなくなります。これはUbuntu Backportsで指定されている設定と同じです。

どうしても古いリリースを使いたい

UbuntuはLTSで5年,通常リリースで9ヶ月というサポート期間を設けています注4)⁠サポート期間を終了すると(EOL:End Of Lifeを迎えると)⁠公式のアーカイブサーバーからはそのリリース用のパッケージが順次削除され,aptコマンドによる公式リポジトリからのインストールやアップグレードもできなくなってしまいます。

しかしなんらかの理由により,EOLを迎えたUbuntuをインストールし,場合によってはaptコマンドでパッケージをインストールする必要が出てくることもあるでしょう。そんな用途向けに,old-releases.ubuntu.comが存在します。

/etc/apt/sources.listの⁠jp.archive.ubuntu.com⁠などを⁠old-releases.ubuntu.com⁠に置き換えれば,サポート期間を終了したリリースであっても,パッケージのインストールやアップグレードを行えます。また,4.10以降のインストールイメージも配布しています

当然のことながら,これらのリポジトリにはサポート期間終了後のセキュリティアップデートは提供されていません。これらを利用するPCをインターネットに直接接続することは危険な行為であることを理解したうえで利用してください。

注4)
昨年10月にリリースされた13.10も,7月17日にEOLを迎える予定です。余談ではありますが,これによりUbuntu史上初の「LTSリリースのみサポート」という期間が発生します。

パッケージを整理したい

バイナリパッケージのキャッシュを削除する

Aptを使ってパッケージをインストール/アップグレードするとき,リポジトリからダウンロードしたバイナリパッケージファイルが/var/cache/apt/archives以下にローカルリポジトリとして保存されます。ローカルリポジトリはパッケージの再インストールの際にキャッシュとして使われるため便利ではあるのですが,放っておくとどんどんと容量が増えていきます。

apt-getのcleanコマンドやautocleanコマンドを使うとこのリポジトリを整理できます。

$ sudo apt-get autoclean

autocleanコマンドは,ローカルリポジトリのうち(より新しいバージョンがリリースされたために)公式リポジトリに存在しないバイナリパッケージのみを削除します。cleanコマンドはすべてのバイナリパッケージを削除します。

autocleanは設定によって定期的に実行することが可能です。

$ sudo editor /etc/apt/apt.conf.d/10periodic
(中略)
Apt::Periodic::AutocleanInterval "0";

AutocleanIntervalの値を0から,任意の数字に変更してください。cronによって,その指定した数字の日数ごとに,autocleanがバックグラウンドで実行されます。

使われなくなったパッケージを削除する

autocleanと似たような名前のコマンドにautoremoveも存在します。こちらは,⁠依存関係にしたがって暗黙的にインストールされたものの,依存元のパッケージが存在しなくなったために,不要であると思われる」パッケージをアンインストールします。clean/autocleanがキャッシュファイルの削除なのに対して,autoremoveは実際にパッケージのアンインストールが発生します。

推奨パッケージをインストールしない

そもそも自動的にインストールするパッケージを抑制するという方法も存在します。Ubuntuは8.10から,インストールしようとしているソフトウェアが依存しているパッケージだけでなく「推奨パッケージ」一緒にインストールするようになりました。これは大抵の場合はユーザーにとって便利ではあるものの,たまに必要以上に多くのパッケージが一緒にインストールされてしまうこともあります。

aptコマンドに--no-install-recommendsオプションを渡すことで,推奨パッケージのインストールを抑制できます。

$ sudo apt install texlive-lang-cjk
(中略)
アップグレード: 0 個,新規インストール: 143 個,削除: 0 個,保留: 16 個。
866 MB のアーカイブを取得する必要があります。
この操作後に追加で 1,683 MB のディスク容量が消費されます。

$ sudo apt install --no-install-recommends texlive-lang-cjk
(中略)
アップグレード: 0 個,新規インストール: 50 個,削除: 0 個,保留: 16 個。
139 MB のアーカイブを取得する必要があります。
この操作後に追加で 575 MB のディスク容量が消費されます。

サーバー環境などで恒常的に--no-install-recommendsオプションを付けたい場合は,/etc/apt/apt.confに「Apt::Install-Recommends "false";」と記述してください。ちなみに提案パッケージも「Apt::Install-Suggests」で同じようにコントロールできます。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入