Heute möchte ich gerne über die Installation und Konfiguration von Apt-Cacher-ng schreiben. Dabei handelt es sich um einen Caching-Server für Debian und Ubuntu Repositories.

Der Clou and der Sache ist, auch Repositories für openSUSE (oder andere Distributionen) können von Apt-Cacher-ng im Cache gehalten werden.

Warum?

Nun, in Zeiten von schnellem Internet könnte sich der ein oder andere fragen, für was man noch einen Cache für Repositories benötigt.

In Unternehmen sieht dies allerdings schon wieder etwas anders aus. Dort teilen sich viele Menschen oder Computer die Bandbreite. Des Weiteren macht einem eventuell der Proxy-Server oder die Firewall Probleme.

Gerade wenn man viele Systeme updaten möchte, ist es sehr bequem, wenn die Anfragen einfach aus dem Cache beantwortet werden.

Warum nicht einen Mirror hosten?

Das letzte mal als ich einen Debian Mirror gebaut habe, hatte das (wenn ich mich richtig erinnere) ca 1TB Speicherplatz gefressen.

Mein produktiver Apt-Cacher-ng wird im Moment von mehr als 50 Systemen genutzt und benötigt dabei ca 12GB Festplattenspeicher mit einer Cache Hit Rate von 89%.

Funktionsweise

Apt-Cacher-ng kommt mit einem Webserver und wird einfach in die sources.list von APT eingetragen.

Alle Pakete, werden dann über Apt-Cacher-ng bezogen, also wie bei einem Proxy-Server. Zusätzlich speichert sich der Apt-Cacher-ng Server jedoch die .deb und .rpm Dateien.

Wenn ein zweites System nun die gleichen Dateien benötigt, werden diese nicht mehr aus dem Internet gezogen, sondern direkt vom Caching-Server ausgeliefert.

Das Betriebssystem, auf dem ihr Apt-Cacher-ng installiert spielt dabei übrigends kleine Rolle.

Installation

Ich installiere bei mir den Apt-Cacher-ng auf einem Ubuntu 16.04. In der Praxis würde ich dafür einen schlanken LXC Container verwenden.

Alle Befehle müssen als root oder über sudo ausgeführt werden!

apt-get update
apt-get install apt-cacher-ng

Konfiguration

Eigentlich gibt es nicht viel, was konfiguriert werden möchte. Alle Einstellungen findet ihr in der Datei /etc/apt-cacher-ng/acng.conf

Für den Cache benötigt ihr etwas Speicherplatz. Den Ort, wo Apt-Cacher-ng seine Daten abspeichern soll, könnt ihr einstellen.

CacheDir: /var/cache/apt-cacher-ng

Im Standard wird der Port 3142 auf allen Interfaces verwendet.

Port:3142

Den Wert, wann Dateien aus dem Cache gelöscht werden sollen, welche nicht mehr in den Paketquelle verfügbar sind, habe ich bei mir auf 120 Tage gestellt. (Man weiß ja nie)

ExTreshold: 120

Wenn ihr einen Proxy benötigt, müsst ihr diesen setzen.

Proxy: http://proxy.example.net:3128

Um die Änderungen zu übernehmen, müssen wir den Dienst einmal neu starten.

systemctl restart apt-cacher-ng.service

In meinem Fall, kann ich Apt-Cacher-ng jetzt über die Adresse http://192.168.1.195:3142 erreichen.

Bei ubuntuusers.de gibt es übrigends noch sehr viele weitere Informationen.

Cache Verwenden

Apt-Cacher-ng kann man auf zwei Arten verwenden. Zum einen könnte man ihn einfach als Proxy-Server für APT eintragen. Alternativ kann man auch jedes Repository einzeln angeben.

Ich gebe in allen Beispielen jedes Repository einzeln an, ich bin kein Freund von der Proxymethode, der Grund ist einfach: Interne Repositories oder PPAs möchte ich nicht im Cache haben.

Der Cache sollte natürlich auf allen Systemen genutzt werden. Wenn ihr eure Server über ein fancy Configuration Management verwaltet, habt ihr Glück

Ubuntu und Debian

Als erstes tragen wir nun den Cache in der Datei /etc/apt/sources.list ein. Dort sind alle standard Repositories aufgelistet, welche Ubuntu/Debian nutzen.

Am einfachsten geht dies mit "Suchen und Ersetzen" in einem Editor wie vim.

Lasst einfach http:// durch http://192.168.1.195:3142/ ersetzen und speichert die Datei.

Original

deb http://de.archive.ubuntu.com/ubuntu/ xenial main restricted

Mit Cache:

deb http://192.168.1.195:3142/de.archive.ubuntu.com/ubuntu/ xenial main restricted

Die IP-Addresse müsst ihr natürlich anpassen. Ich würde hier ja einen DNS Namen empfelen.

Um die Änderungen zu übernehmen, fürt einmal apt-get update aus.

openSUSE

Ich weiß gar nicht, wann ich das letzte mal ein SUSE System gesehen hab. Bin da nicht der Typ für. Hoffe mal es ist nicht komplett falsch, in meinen Tests hatte es funktioniert.

Unter openSUSE werden die Repositories in einzelnen Konfigurationsdateien gespeichert, welche im Ornder /etc/zypp/repos.d/ liegen.

Um uns die Sache etwas zu vereinfachen, nutzen wir Apt-Cacher-ng nur für die Einträge, welche wirklich aktiv sind:

opensuse1:/etc/zypp/repos.d # grep 'enabled=1' *
download.opensuse.org-non-oss.repo:enabled=1
download.opensuse.org-non-oss_1.repo:enabled=1
download.opensuse.org-oss.repo:enabled=1
download.opensuse.org-oss_1.repo:enabled=1
openSUSE-Leap-42.3-0.repo:enabled=1

In diesen Dateien können wir nun wieder http:// durch http://192.168.1.195:3142/ ersetzen

Original

baseurl=http://download.opensuse.org/distribution/leap/42.3/repo/non-oss/

Mit Cache:

baseurl=http://192.168.1.195:3142/download.opensuse.org/distribution/leap/42.3/repo/non-oss/

Die Änderungen übernehmen wir mit dem Befehl zypper refresh (auch für YaST).

Cache Testen

Ubuntu

Für einen kurzen Test, habe ich extra ein altes Ubuntu Image gesucht und zwei VMs damit installiert. Beide verwenden Apt-Cacher-ng über die sources.list und begrüßen mich mit folgender Meldung:

Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-62-generic x86_64)

131 Software-Pakete können aktualisiert werden.
62 Aktualisierungen sind Sicherheitsaktualisierungen.

Nun führe ich ein Update auf der ersten Maschine aus, zu diesem Zeitpunkt ist der Cache noch komplett leer!

root@ubuntu1:~# apt-get dist-upgrade
Paketlisten werden gelesen... Fertig
...
127 aktualisiert, 4 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 167 MB an Archiven heruntergeladen werden.
Nach dieser Operation werden 317 MB Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren? [J/n]

167 MB müssen nun also, aus dem Internet, heruntergeladen werden.

Holen:131 http://192.168.1.195:3142/de.archive.ubuntu.com/ubuntu xenial-updates/main amd64 vlan amd64 1.9-3.2ubuntu1.16.04.3 [30,8 kB]
Es wurden 167 MB in 45 s geholt (3.656 kB/s).

Wie man sehen kann, hat der Download 45 Sekunden gedauert.

Nun führe ich das Update auf der zweiten Maschine aus.

root@ubuntu2:~# apt-get dist-upgrade
Paketlisten werden gelesen... Fertig
...
127 aktualisiert, 4 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 167 MB an Archiven heruntergeladen werden.
Nach dieser Operation werden 317 MB Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren? [J/n]
...
Holen:131 http://192.168.1.195:3142/de.archive.ubuntu.com/ubuntu xenial-updates/main amd64 vlan amd64 1.9-3.2ubuntu1.16.04.3 [30,8 kB]
Es wurden 167 MB in 2 s geholt (82,0 MB/s).

Wie man sehen kann, hat jetzt der Download nur 2 Sekunden benötigt, mit einer Übertragungsrate von 82MB/s, diese Daten kamen also definitiv aus dem Cache. (Habe nur eine 100Mbit/s Internetverbindung)...

openSUSE

Für meinen openSUSE Test kann ich leider nicht einfach ein altes openSUSE nutzen, da ich keins habe. Ich nutze kein SUSE.

Also baue ich wieder zwei identische VMs und installiere auf beiden einfach etwas Software um Traffic zu erzeugen.

Zuerst wieder das System, wo der Cache leer ist und alle Daten aus dem Internet geladen werden müssen.

zypper install apache2 php7 apache2-mod_php7 mariadb screen tmux htop vim mariadb-test kernel-source
...
63 new packages to install.
Overall download size: 181.0 MiB. Already cached: 0 B. After the operation, additional 1.1 GiB will be used.

Leider ist die Ausgabe von Zypper, was die Übertragunsrate angeht, für diesen Test nicht zu gebrauchen. Also habe ich mit vnstat einfach den Traffic für den Zeitraum aufzeichnen lassen.

opensuse1:~ # vnstat -l
Monitoring eth0...    (press CTRL-C to stop)
                           rx         |       tx
--------------------------------------+------------------
  bytes                   189.33 MiB  |        3.92 MiB
--------------------------------------+------------------
          max          109.67 Mbit/s  |     2.19 Mbit/s
      average           24.23 Mbit/s  |   501.16 kbit/s
          min               0 kbit/s  |        1 kbit/s
--------------------------------------+------------------
  time                  1.07 minutes

opensuse1:~ #

Wie man sehen kann, betrug die maximale Übertragunsrate 109Mbit/s.

Nun wiederhole ich den Test auf der zweiten Maschine, hier sollten die Daten jetzt aus dem Cache kommen.

zypper install apache2 php7 apache2-mod_php7 mariadb screen tmux htop vim mariadb-test kernel-source
...
63 new packages to install.
Overall download size: 181.0 MiB. Already cached: 0 B. After the operation, additional 1.1 GiB will be used.

Vnstat sagt dazu:

opensuse2:~ # vnstat -l
Monitoring eth0...    (press CTRL-C to stop)
                           rx         |       tx
--------------------------------------+------------------
  bytes                   189.31 MiB  |         513 KiB
--------------------------------------+------------------
          max          775.12 Mbit/s  |     1.04 Mbit/s
      average           45.61 Mbit/s  |   120.62 kbit/s
          min               0 kbit/s  |        1 kbit/s
--------------------------------------+------------------
  time                    34 seconds

Auch hier wurden die Daten eindeutig von Apt-Cacher-ng bereitgestellt, wie man an der Übertragungsrate von 775Mbit/s erkennen kann.

Monitoring

Aktuell ist das Verzeichnis, in dem der Cache gespeichert wird, natürlich noch sehr klein.

root@aptcacher:/etc/apt-cacher-ng# du /var/cache/apt-cacher-ng/ -sh
373M    /var/cache/apt-cacher-ng/

Dies sollte man allerdings auf jedenfall überwachen.

Des Weiteren kann man über die URL http://192.168.1.195:3142/acng-report.html eine Statusseite aufrufen: Apt-Cacher-ng Status Page