Ubuntu Weekly Recipe

第315回apt-cacher-ngを使ってAPT用キャッシュプロキシの構築

複数台のPCでパッケージのインストールを高速化するためにapt-mirrorを使用している、という例を見かけることがちらほらあります。APT用のキャッシュプロキシがあまり知られていないようなので、今回のレシピでは、APT用のキャッシュプロキシとapt-offlineによるオフライン環境でのインストールについて紹介します。

複数PCでのインストールを高速に行う

Ubuntu搭載のPCや仮想マシンを複数台動かしている場合は、インストールやアップデートの際に各PCで同一のパッケージをダウンロードするため、時間がかかったりネットワーク帯域を浪費しがちだったりします。クラウド環境で、数十台~数百台単位でサーバーを管理している場合ならなおさらです。そういった場合は、リポジトリのミラーを作成するか、キャッシュプロキシを利用すると、パッケージ取得が高速に行えます。

前者は、本連載の第47回でapt-mirrorによるミラーの構築を取り上げているように、完全なリポジトリのミラー(複製)を作成するため、数十~数百Gバイト単位のディスク容量が必要で、構築に時間もかかります。

このため、通常の利用であれば後者のキャッシュプロキシの利用のほうがお勧めです。キャッシュプロキシの利用では、1回ダウンロードしたパッケージを保存しておき2回目以降はそのパッケージを再利用するため、大量のディスク容量は不要で構築の時間もかからず、簡単な設定でプロキシを意識することなく利用できます。

APT用キャッシュプロキシの概要

APT用のキャッシュプロキシとしては以下のパッケージなどがあります。

  • apt-cacher
  • apt-cacher-ng
  • approx
  • squid-deb-proxy(squid-deb-proxy-client)

apt-cacherは古くからある定番パッケージです。apt-cacher-ngはapt-cacherと比べ、新しくてインタプリタ不要のため動作が軽量です。approxは過去に存在したapt-proxyとの互換性を考慮して開発されています。squid-deb-proxyは、有名なプロキシサーバーであるsquidを利用して設定を行うツールで、クライアントではZeroconfが可能で設定の手間が少なくすみます。

どのソフトウェアを選択しても良いのですが、今回はプロビジョニングツールのchef/puppetなどからの利用も多いapt-cacher-ngについて取り上げます。

apt-cacher-ngをローカル環境で試してみよう

まずは、ローカルPC上でAPT用キャッシュプロキシを構築してみましょう。以下のコマンドでapt-cacher-ngをインストールします。

$ sudo apt-get install apt-cacher-ng

インストールが完了すると、キャッシュプロキシとしてapt-cacher-ngデーモンがポート3142で実行されます。また、apt-cacher-ngによってキャッシュされるパッケージは/var/cache/apt-cacher-ng/以下に保存されます。

次に、APT用のプロキシ設定を行います。/etc/apt/apt.conf.d/02proxyなどの名前でファイルを作成し、以下の内容を書いて保存してください。保存する前に、綴り間違いや末尾のセミコロンの付け忘れがないかどうかなど、確認を行ってください。

Acquire::http::Proxy "http://127.0.0.1:3142/";

以上で設定は完了です。

では、apt-cacher-ngの動作を確認するため、任意のソフトウェアをインストールしてみましょう。

$ sudo apt-get install sl

正しく設定できていれば、/var/log/apt-cacher-ng/apt-cacher.logに時刻/入出力/サイズ/IPアドレス/ファイルパスなどのログが書き込まれているはずです。ログが書き込まれていない場合は、プロキシの設定が正しいかどうか確認したり、エラーログ/var/log/apt-cacher-ng/apt-cacher.errを確認してみてください。

$ cat /var/log/apt-cacher-ng/apt-cacher.log
図1 ログファイルapt-cacher.logの確認
図1 ログファイルapt-cacher.logの確認

apt-cacher-ngを他のPCからも利用する

他のPCから利用する場合は、他のPCの環境で、前述した⁠APT用のプロキシ設定⁠のみ行ってください。その際、⁠127.0.0.1」の箇所はapt-cacher-ngをインストールしたPCのIPアドレスに変更してください。また、ufwやiptablesなどによるパケットフィルタリングを行っている場合は、TCP/3142の通信を許可することも忘れないようにしてください。

問題なくapt-cacher-ngを使ってアップデートができているか確認するには、上記と同じくログファイルを参照してください。

Webブラウザーからapt-cacher-ngを管理

apt-cacher-ngにはWebブラウザーから利用できる管理機能があり、利用状況のレポートを確認したりキャッシュの管理を行うことができます。

Webブラウザーで以下のように入力して、apt-cacher-ngをインストールしたPCにアクセスします。

  • http://127.0.0.1:3142/
図2 apt-cacher-ngの管理画面
図2 apt-cacher-ngの管理画面

では、利用状況のレポートを確認してみましょう。下にある「Statistics report and configuration page」にアクセスすると、管理画面に移動できます。⁠Transfer Statistics」の表にある「Count Data」ボタンを押すと、データを集計して表が出力されます。この内容は、リクエスト数とデータサイズごとのHits(ヒット)とMisses(見逃し)とTotal(合計)となっており、ヒットの割合が高いほどキャッシュが効率的に使われていることになります。

図3 パッケージキャッシュの利用状況
図3 パッケージキャッシュの利用状況

また、同ページの下ではキャッシュファイルを確認したり削除することもできます。⁠Start Scan and/or Expiration」ボタンで不要になったパッケージにマークを付けて数日以内に削除されるように指定でき、⁠Show unreferenced」⁠Delete unreferenced」ボタンでは、直接不要になったパッケージを表示/削除することができます。

図4 apt-cacher-ngのキャッシュファイルの管理
図4 apt-cacher-ngのキャッシュファイルの管理

apt-offlineによるオフライン環境でのインストール

インターネットに接続できない事情があり、アップデートが行えないオフライン環境のUbuntuもあるかと思います。そういったPCでも、apt-offlineを利用してオンライン環境にあるPCでダウンロードしUSBメモリなどの媒体を使ってやり取りすれば、手軽に最新の状態にアップグレードしたり新しいソフトウェアをインストールすることができます。

オンライン環境のPCでは、以下のコマンドでapt-offlineをインストールします。

$ sudo apt-get update
$ sudo apt-get install apt-offline

オフライン環境のPCでは、一時的にインターネットに接続して上記のコマンドを実行するか、同一バージョンのUbuntu環境でapt-offlineをインストールし、/var/cache/apt/archives以下にあるapt-offlineのdebパッケージをUSBメモリなどで移動してから、以下の例のようにdpkg コマンドでインストールしてください。

$ dpkg -i apt-offline_1.3.1_all.deb

では、インターネットに接続されていない、オフライン環境のPCで以下のコマンドを実行します。これで、パッケージのダウンロードに必要な情報が記録されたシグニチャファイルapt-offline.sigがホームディレクトリ以下に保存されます。

$ sudo apt-offline set ~/apt-offline.sig

新規にインストールしたいパッケージがある場合は、以下のようなコマンドを実行してください。この例ではgimpパッケージのインストールを指定しています。

$ sudo apt-offline set --install-packages gimp --update ~/apt-offline.sig

次に、オフライン環境のPCでapt-offline.sigファイルをUSBメモリなどの媒体を使って、オンライン環境のPCにコピーしてください。以下の例のようなコマンドを実行すると、必要なパッケージなどがダウンロードされbundle.zipにまとめられます(/path/to/apt-offline.sigはUSBメモリなどのパスに置き換えてください⁠⁠。

$ apt-offline get --bundle bundle.zip /path/to/apt-offline.sig
図5 apt-offlineによるパッケージ等の取得
図5 apt-offlineによるパッケージ等の取得

作成されたbundle.zipをUSBメモリなどの媒体を使ってオフライン環境のPCにコピーし、以下のようなコマンドを実行してください(/path/to/bundle.zipはUSBメモリなどのパスに置き換えてください⁠⁠。

$ sudo apt-offline install /path/to/bundle.zip

これで、必要なパッケージがオフライン環境のPCでローカルリポジトリに同期されたので、以下のようなコマンドでパッケージをインストールしてください。

$ sudo apt-get install gimp

以上でオフライン環境でのインストールは完了です。

まとめ

パッケージのインストールを高速化する際は、ミラー構築またはキャッシュプロキシ利用のどちらが自分の利用方法に向いているか考えたうえで、行うことをお勧めします。

おすすめ記事

記事・ニュース一覧