それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

local apt mirror(apt-cacher-ng) を使って debian/ubuntu のapt インストールを高速化

仮想マシンをインストールしていると、aptの通信ロスが時間ロスになって気になった。

1分程度だけど、何度も実行してると疲れてくるので、apt-cacher-ngを使うことにした。

apt-cacher-ng をdocker で起動する

---
version: '2'
services:
  apt-cacher:
    container_name: proxies-apt-cacher
    image: sameersbn/apt-cacher-ng
    ports:
    - 3142:3142

docker-compose で起動する

sudo docker-compose pull
sudo docker-compose up

apt に設定して使う場合

echo 'Acquire::HTTP::Proxy "http://172.17.0.1:3142";' |sudo tee  /etc/apt/apt.conf.d/01proxy

名前解決ができる場合。

echo 'Acquire::HTTP::Proxy "http://apt-cacher.lan";' |sudo tee  /etc/apt/apt.conf.d/01proxy

preseedで使う場合

preseed.cfg に次のとおりに記載する。(ip は環境依存)

d-i mirror/country string manual
d-i mirror/http/hostname string debian-mirror.sakura.ne.jp
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string http://172.17.0.1:3142

使ってみた結果

ローカルホストでミラーは速いですよね。やっぱり。ボトルネックは純粋にディスクIOだけになった。

docker で作ったapt-cacher-ngの場合、apt-cacherのまれなエラーで自動処理が止まることがある。

proxies-apt-cacher | [warn] Epoll ADD(1) on fd 12 failed. Old events were 0; read change was 1 (add); write change was 0 (none); close change was 0 (none): Bad file descriptor

apt-cacher-ng は概ね良好に起動するが、まれにエラーが出て、APTパッケージの取得に失敗する。再度トライすれば問題なくインストールが終わる。

手作業でインストールするときはもんだ無いが、完全無人だと気づかずにインストールが死ぬので、問題が多い。

無人インストールでapt-cacherを使うなら、手作業で初回キャッシュさせたほうが無難かもしれない。

apt-cache-ng は単なるプロキシ

ちょっと変わったプロキシなので、ubuntu/debian だけでなく、cygwincentos(yum)でも使えるので、ローカルや組織内に1つくらいあってもいいかもしれない。

ubuntu側で指定の仕方 インストール時点

ubuntu の場合、ここでインストールで指定することもできる

指定の仕方 インストール済み

OSが起動後に指定するには

echo 'Acquire::HTTP::Proxy "http://172.17.0.1:3142";' >> /etc/apt/apt.conf.d/01proxy

https の apt のキャッシュ

HTTPS で指定された APTソースのキャッシュをするには、次のようにする。

## brefore 
# deb [arch=arm64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu   jammy stable
## after  https -> http 
deb [arch=arm64 signed-by=/etc/apt/keyrings/docker.gpg] http://download.docker.com/linux/ubuntu   jammy stable

https を http に変えればいい。こうすれば apt::proxy 設定が動くようになる。

しかも apt-cacher が http->https の内部リダイレクトを処理しキャッシュてくれます。(プロキシなんで)

え?httpのセキュリティ?なんのために、gpgを指定すると思ってるのですか?gpg で署名ですよ?gpgで、整合性確保、通信内容の改竄検出ができますよ?

動作チェック( キャッシュの場所)

docker 起動した apt-cacher-ng がキャッシュを溜め込んでくれているかどうかをチェックする。

キャッシュは次のフォルダに溜め込まれる

/var/cache/apt-cacher-ng

なので次のように、キャッシュのフォルダを見れば動作を確認が可能。

docker exec -it  apt-cacher  find /var/cache/apt-cacher-ng

キャッシュを溜め込んでくれてるのがわかる。

takuya@docker:~$ docker exec -it  apt-cacher  find /var/cache/apt-cacher-ng
/var/cache/apt-cacher-ng
/var/cache/apt-cacher-ng/_xstore
/var/cache/apt-cacher-ng/_xstore/rsnap
/var/cache/apt-cacher-ng/_xstore/qstats
/var/cache/apt-cacher-ng/_xstore/qstats/i
/var/cache/apt-cacher-ng/_xstore/qstats/o
/var/cache/apt-cacher-ng/raspbian.raspberrypi.org
/var/cache/apt-cacher-ng/raspbian.raspberrypi.org/raspbian
/var/cache/apt-cacher-ng/raspbian.raspberrypi.org/raspbian/pool
/var/cache/apt-cacher-ng/raspbian.raspberrypi.org/raspbian/pool/main
/var/cache/apt-cacher-ng/raspbian.raspberrypi.org/raspbian/pool/main/s
/var/cache/apt-cacher-ng/raspbian.raspberrypi.org/raspbian/pool/main/s/sudo
/var/cache/apt-cacher-ng/raspbian.raspberrypi.org/raspbian/pool/main/s/sudo/sudo_1.9.5p2-3+deb11u2_armhf.deb
/var/cache/apt-cacher-ng/raspbian.raspberrypi.org/raspbian/pool/main/s/sudo/sudo_1.9.5p2-3+deb11u2_armhf.deb.head

キャッシュの削除

キャッシュの削除は、手動・専用コマンド・WebGUI、またはtmpfs 。などにより削除する

apt-cacher-ng のキャッシュを消すとき、docker で起動していると工夫が必要。

キャッシュをtmpfs においておいて、再起動したり。色々と省力化は可能になる。メモリが潤沢にあれば、/var/cache/apt-cacher-ngtmpfs にしておくとか、念の為にスワップしておくのが楽ちんと思う。

docker で起動した場合の注意。

docker のボリュームで/var/cache/apt-cacher-ngをマッピングした場合は、再起動で消えないのでボリュームを明示的に消す必要がある。

例えば以下のように起動した場合

services:
  apt-cacher:
    image: sameersbn/apt-cacher-ng
    container_name: apt-cacher
    volumes:
      - 'apt-cacher-ng-vol:/var/cache/apt-cacher-ng'

上記の設定の場合はボリュームが永続化するので再起動でキャッシュが消えないので、キャッシュを再利用して使い続けることが可能になる。

しかし、再起動で消えないので、キャッシュ期限切れを確認し削除する必要が出てくる。それは専用コマンド(後述)かWebGUI(後述)を使う必要がある。

もしくは、定期的なタイミングでDockerボリュームを削除する必要がある。

tmpfs を使ってしまうのもいい

services:
  apt-cacher:
    image: sameersbn/apt-cacher-ng
    container_name: apt-cacher
    ports:
      - '10.160.195.160:3142:3142'
    # volumes:
    #   - 'tmpfs:/var/cache/apt-cacher-ng'  <-- これはできない   
    # tmpfs こうする。
    tmpfs:
      - /var/cache/apt-cacher-ng

こうすると、インスタンスの再起動にボリュームが消える。しかもtmpfs(メモリ)に書くので速度向上も狙える。

上記のようにtmpfs で起動すると、結果は以下のようになる

$ docker exec  apt-cacher bash -c 'mount | grep tmpfs | grep apt'
tmpfs on /var/cache/apt-cacher-ng type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=2755,inode64)

acngtool キャッシュ管理( 特にdocker 版で注意)

acngtool キャッシュ管理を知る必要がある。とくに aptcacher-ng をdocker で使うなら、真っ先に知っておくべきことだ。

キャッシュは次の場所で期限切れチェックがされる。

cat /etc/cron.daily/apt-cacher-ng 

acngtool で APT のキャッシュの期限切れをチェックしている。またそれは自動で行われる。

自動キャッシュの管理はcron 設定で行われる。そのファイルは /etc/cron.daily/apt-cacher-ng である。

このおかげで自動でキャッシュが管理され、ストレージを浪費せずに住む。

自動管理は、crond から起動される。cron 処理設定の内部にある/usr/lib/apt-cacher-ng/acngtool が作れている。このファイル内部でacngtoolが実行され、apt-cacher の古いキャッシュが削除される。

cronがないと自動管理されない。特に注意すべきなのが dockerだ。

「*docker インスタンス では cron 処理されずキャッシュがたまり続ける**」のだ。

特に、docker run sameersbn/docker-apt-cacher-ng で使っている場合は sameersbn/docker-apt-cacher-ngに crond が含まれない。

docker インスタンスに crondが含まれるはずもない。

だって docker は再起動したらインスタンスのデータ消すじゃん?

その時点でキャッシュも消えるわけ。だからdocker build 時に使うならともかく、サーバ郡の内部プロキシとして常時起動で使うなら キャッシュの削除が必要になる。

dockerの場合は、手動で動かすか、定期的なdockerインスタンス再起動でボリューム削除が必要になることをお忘れなく。

docker exec apt-cacher  /etc/cron.daily/apt-cacher-ng

または、手作業で、コマンドからacngtoolを実行する

# acngtoolは cron-daily から実行する
docker exec apt-cacher  /etc/cron.daily/apt-cacher-ng

または、管理画面のキャッシュ期限切れチェックを定期的に実行する

curl 'http://apt-cacher.lan/acng-report.html?abortOnErrors=aOe&doExpire=Start+Scan+and%2For+Expiration&calcSize=cs&asNeeded=an'

または、docker volumeを使い捨てにして、docker インスタンスを再起動

## 永続化ストレージをつかわない
docker kill apt-cacher  

または、docker volume を使って、ボリュームも削除する

docker-compose down
docker volume rm $vol_name
docker-compose up -d --remove-orphans

など、docker で起動すると考慮する事が増えて面倒も多い。

cacher は遅い?そりゃキャッシュするまでは遅い。事前キャッシュしろ

初回は遅いです。キャッシュの効果が得られるのは2度目からです。効果が出てくるのは ubuntudebian が複数台存在したリ、何度もインストールを繰り返す場合です。当たり前なのに「やってみたけど、遅かった。。。」とか書いてるのを見つけて、例のAAが思い浮かぶ。

せめて事前にバックグラウンドでaptをミラー化しとけよ。pre-cache設定あるだろ。

管理画面がある。

http://apt-cacher.lan:3142/acng-report.html のように アクセスすると、状況を見ることができる。

キャッシュの削除や特定レポジトリのミラーリングなど管理画面を使ったほうが楽な場合も多い。

HTTPS の問題解決の方法

https のレポジトリをいい感じに、apt-cacher を通すにはhttp:// を使う。

https:// -> http://とすれば、apt-cacher がレポジトリ取得時にWEBサーバーから https へリダイレクト要求に従ってくれる(稀にリダイレクトせずに404を返してくるレポジトリがある)

http で プロキシ側でリダイレクトする例

## https -> http にする
deb [signed-by=..] http://packages.gitlab.com/gitlab/gitlab-ce/debian/ bookworm main
deb-src [signed-by=..] http://packages.gitlab.com/gitlab/gitlab-ce/debian/ bookworm main

https を使うようなレポジトリだと、キャッシュする必要がないことも多い。

そのようなときは、以下のように HTTPS はプロキシを通さないようにする。

Acquire::HTTP::Proxy "http://apt-cacher.lan";
Acquire::HTTPS::Proxy "DIRECT";

キャッシュする必要がない理由として、 再利用をしないことが多いことが挙げられる。

複数台のインストール時に apt udpate で 何度も参照される debian / ubuntu の公式レポジトリはキャッシュしておけば楽になる。

それとは違い、HTTPSするようなレポジトリはシステム固有でインストールしたソフトが多いので、キャッシュしておく必要性が乏しいことが多い。

個人的には node source をキャッシュしてるが、gitlab.com や docker.io 自体をキャッシュする必要を感じない。

過去の関連記事

apt-cacherで docker buildを速くする - それマグで!

更新履歴

  • 2025-10-01 キャッシュ利用の確認について
  • 2025-10-01 キャッシュ削除について
  • 2025-10-01 管理画面ついて
  • 2025-10-09 HTTPs に付いて。