Aktionen

Ubuntu Offline Mirror Repository erstellen

Aus znilwiki

Changelog:

  • 08.02.2024 erste funktionierende Version
  • 18.04.2024 geändert auf zusätzliche Festplatte für das Repository
  • 19.04.2024 Endlich repariert: Reparaturskript ist nicht mehr notwendig!
  • 20.06.2024 Problem mit binary-all gelöst

Vorwort

Wie das so ist habe ich mehrere Anläufe gebaucht bis ich das ganz zum laufen bekommen habe. Unter anderem hatte ich Probleme das mir die Festplatte immer wieder vollgelaufen ist weil er schon vorhandenen Downloads ignorierte, Dinge die nach den Downloads fehlten und wie ich die Quellen auf dem anderen Ubuntu-Servern einstelle.
Klar gibt es viele Anleitungen im Internet, die von mir genutzten habe ich weiter unten auch verlinkt. Aber ohne Anpassungen hatte keine richtig funktioniert.
Die Anleitung unter https://www.linuxtechi.com/setup-local-apt-repository-server-ubuntu/ ist zum Beispiel eigentlich nicht schlecht, die Pfade sind dort aber durcheinander gewürfelt und die Skripte funktionieren nicht wenn man diese einfach nur kopiert. Also habe ich hier meine eigene Version der Anleitung gebaut.
Insbesondere da ich ja verschiedene Paketquellen einbinden wollte.


Grundinstallation

Ihr installiert einen Ubuntu-Server nach dieser Anleitung: Zabbix Server + Agent unter Ubuntu 22.04 LTS installieren
Befolgt die Anleitung bis zu dem Punkt 1.15 Automatische Updates deaktivieren
Achtet darauf das die VM genug Speicherplatz hat. Die obige Anleitung nutzt die ganze Festplatte, aber nur für das Betriebssystem. Diese lässt sich später (z.B. unter VMware) im laufenden Betrieb erweitern, ich nehme immer 32GB, das reicht dafür aus. Die Anleitung dazu findet Ihr auf der gleichen Seite am Ende.
Später hängen wir eine zweite, separate Festplatte mit 500GB an die VM an.
Ich würde mindestens 500GiB Festplattenplatz empfehlen! Stand 18.05.2024 verbrauchte der Mirror 382GiB, mit Betriebssystem, Google Chrome und Zabbix Repo etc. waren dann noch 81GiB frei auf der Festplatte.

Important.png
Hinweis: Ich arbeite hier als root. Mit sudo -i könnte Ihr dauerhaft zum root wechseln. Oder immer schön sudo davor schreiben.

Apache 2 Webserver

Damit später andere Server das Repo nutzen können braucht es einen Webserver.
Ich nehme den Apache2:

apt install php libapache2-mod-php

Das installiert diesen inklusive PHP-Unterstützung. PHP wird hier im ersten Moment nicht gebraucht aber ich wollte es für später haben.


Zusätzliche Festplatte einbinden

Die heruntergeladenen Repository-Daten speichere ich auf einer separaten 500GiB Festplatte.
Diese binden wir an unserem späteren Zielpfad ein.

Fügt dazu eurer VM eine separate 500GiB Festplatte hinzu. Auch ohne Neustart wird diese bei mir sofort gefunden

ls -l /dev/sd*

Ausgabe:

brw-rw---- 1 root disk 8,  0 Apr 18 12:27 /dev/sda
brw-rw---- 1 root disk 8,  1 Apr 18 12:27 /dev/sda1
brw-rw---- 1 root disk 8,  2 Apr 18 12:27 /dev/sda2
brw-rw---- 1 root disk 8, 16 Apr 18 12:34 /dev/sdb

sda ist die erste Festplatte, die Boot-Festplatte auf der auch unserer Betriebssystem ist. sda1 und sda2 sind Partitionen auf dieser.
Wir sehen nur /dev/sdb weil diese noch keine Partitionen hat. Also erstellen wir eine:

Warning.png
Warnung: Das müsst Ihr nur machen falls Ihr noch keine Partition habt, also kein /dev/sdb1 sondern nur /dev/sdb


Wir tippen ein:

fdisk /dev/sdb

Da kommt dann viel Text und die Aufforderung

Befehl (m für Hilfe):

Wir drücken

n

um eine neue Partition zu erstellen und dann

p

für eine Primäre Partition, dann

1

für die erste Partition.
Dann drückt 2x Enter um die vorgeschlagenen Werte zu übernehmen.
Jetzt sollte da wieder

Befehl (m für Hilfe):

stehen und wir drücken

w

um das ganze auf die Platte zu schreiben.

Das sollte also etwas so aussehen:

root@ubuntu-repo:~# fdisk /dev/sdb

Willkommen bei fdisk (util-linux 2.37.2).
Änderungen werden vorerst nur im Speicher vorgenommen, bis Sie sich
entscheiden, sie zu schreiben.
Seien Sie vorsichtig, bevor Sie den Schreibbefehl anwenden.

Gerät enthält keine erkennbare Partitionstabelle.
Eine neue DOS-Festplattenbezeichnung 0xc22d4902 wurde erstellt.

Befehl (m für Hilfe): n
Partitionstyp
   p   Primär (0 primär, 0 erweitert, 4 frei)
   e   Erweitert (Container für logische Partitionen)
Wählen (Vorgabe p): p
Partitionsnummer (1-4, Vorgabe 1): 1
Erster Sektor (2048-1048575999, Vorgabe 2048):
Letzter Sektor, +/-Sektoren oder +/-Größe{K,M,G,T,P} (2048-1048575999, Vorgabe 1048575999):

Eine neue Partition 1 des Typs „Linux“ und der Größe 500 GiB wurde erstellt.

Befehl (m für Hilfe): w
Die Partitionstabelle wurde verändert.
ioctl() wird aufgerufen, um die Partitionstabelle neu einzulesen.
Festplatten werden synchronisiert.



mit

ls -l /dev/sd*

sehen wir das es nun auch eine Partition /dev/sdb1 gibt:

brw-rw---- 1 root disk 8,  0 Apr 18 12:27 /dev/sda
brw-rw---- 1 root disk 8,  1 Apr 18 12:27 /dev/sda1
brw-rw---- 1 root disk 8,  2 Apr 18 12:27 /dev/sda2
brw-rw---- 1 root disk 8, 16 Apr 18 12:40 /dev/sdb
brw-rw---- 1 root disk 8, 17 Apr 18 12:40 /dev/sdb1

Diese müssen wir nun noch formatieren:

mkfs.ext4 /dev/sdb1

Ausgabe:
mke2fs 1.46.5 (30-Dec-2021)

Ein Dateisystem mit 131071744 (4k) Blöcken und 32768000 Inodes wird erzeugt.
UUID des Dateisystems: 81edfe41-da8b-4b11-b8f9-e64b9eca21b0
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000

beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Das Journal (262144 Blöcke) wird angelegt: fertig
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt

Die UUID die er Anzeigt brauchen wir gleich noch.
Um die Festplatte zu mounten brauchen wir einen leeren Ordner als Platzhalter.
Ich möchte die Festplatte unterhalb von

/var/www

einhängen, dort gibt es ein Unterverzeichnis html welches der Apache Webserver nutzt den wir eben installiert haben.
Den stoppen wir dafür, verschieben die Daten, hängen die neue Festplatte an die Stelle, schieben die Daten zurück und starten den wieder:

systemctl stop apache2.service
mv /var/www/html /tmp/html

Dann die folgende Datei bearbeiten

nano /etc/fstab

und die folgende Zeile anhängen:

# Für Repodaten
/dev/disk/by-uuid/81edfe41-da8b-4b11-b8f9-e64b9eca21b0 /var/www ext4 defaults 0 0

Die UUID hatte er uns vorhin beim formatieren angezeigt. Per ls -l /dev/disk/by-uuid/ könnt Ihr die auch wieder herausfinden.
Die ist also immer anders, Ihr müsst da eure eintragen!
Wenn wir nun ein

mount -a

eingeben, so schaut er in der /etc/fstab nach was dort ist und mounted ggf. fehlende Laufwerke.
Per

df -h

sollten wir nun sehen das es geklappt hat:
Ausgabe:

Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
tmpfs           794M    1,1M  793M    1% /run
efivarfs        256K     48K  204K   19% /sys/firmware/efi/efivars
/dev/sda2        31G    7,3G   22G   26% /
tmpfs           3,9G       0  3,9G    0% /dev/shm
tmpfs           5,0M       0  5,0M    0% /run/lock
/dev/sda1       1,1G    6,1M  1,1G    1% /boot/efi
tmpfs           794M    4,0K  794M    1% /run/user/0
/dev/sdb1       492G     28K  467G    1% /var/www

Jetzt scheiben wir das html-Verzeichnis zurück uns starten den Apache wieder:

mv /tmp/html /var/www/html
systemctl start apache2.service

Wenn Ihr die IP-Adresse des Servers im Webbrowser eingebt solltet Ihr wieder die Startseite des Apache sehen.


Quellen von Zabbix hinzufügen (bei Bedarf)

Ich will darüber auch die Zabbix-Repo-Pakete zur Verfügung stellen.
Also binde ich diese Quellen auch ein:

Für die Version 6.0.x LTS (Support bis 28.02.2027)
wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-3+ubuntu22.04_all.deb
dpkg -i zabbix-release_6.0-3+ubuntu22.04_all.deb
apt update
rm zabbix-release_*

Quellen von Google Chrome hinzufügen (bei Bedarf)

Wer nach meiner Anleitung den Zabbix-Server installiert, hat auch den Google-Chrome-Browser für die Zabbix-Reporting-Services installiert (der Browser wird per Kommandozeile von Zabbix benutzt um die PDFs zu erstellen).
Bei der Installation wird dann auch gleich das Repository dafür mit installiert damit der Browser auch Updates erhält.
Deshalb füge ich auf dem Repo-Server die Quellen auch hinzu:
Zuerst laden wir den Signierungsschlüssel herunter und installieren diesen damit wir der Quelle später vertrauen:

wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

Dann erstellen wir ein passende Source-Datei für Ubuntu (vermutlich könnten wir diesen Schritt auch weglassen):

sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'

Mit einem

apt update

könnt Ihr testen ob die Quelle funktioniert (ohne das etwas installiert wird).


Mirror installieren

Important.png
Hinweis: Neuerdings gibt es ggf. ein Problem das die Clients dann später ein binary-all Verzeichnis vermissen. Ich hatte das in Verbindung mit dem Zabbix-Repository. Ein Lösung findet Ihr in einem eigenen Abschnitt am Ende, die Einrichtung macht Ihr erst einmal genauso wie diese hier steht

Keine Angst, der lädt nach der Installation noch nicht gleich die Daten herunter:

apt install apt-mirror

Der Standard-Downloadpfad ist /var/spool/apt-mirror den wir aber ändern.
Wir bearbeiten die Datei /etc/apt/mirror.list, weiter unten findet Ihr einmal die komplette Datei falls Ihr einfach alles austauschen wollt!
Tipp: F9 löscht Zeilen, F10 fügt die zuvor am Stück gelöschten Zeilen wieder ein.

nano /etc/apt/mirror.list

In der Datei sind auch die Paketquellen die er runterladen soll hinterlegt.
Früher waren das per Default Quellen für Ubuntu 17.10 (artful)
Bitte kontrollieren und ggf. ändern! Als ich das letzte mal nach dieser Anleitung ein Repo gebaut habe, stimmten die Pfade aber.
Kommentiert aber wie unten stehend alle #deb-src Quellen aus! Spart doch viel Platz! Falls die nicht stimmen, löscht alle Zeilen unterhalb von

############# end config ##############

und fügt das hier ein für Ubuntu 22.04 (jammy):

# jammy = Ubuntu 22.04 LTS
deb http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu jammy-proposed main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse

#deb-src http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu jammy-security main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu jammy-proposed main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse
clean http://archive.ubuntu.com/ubuntu

Für Zabbix hängen wir noch diese Zeilen mit dran:

# Zabbix main repository
deb https://repo.zabbix.com/zabbix/6.0/ubuntu jammy main
# deb-src https://repo.zabbix.com/zabbix/6.0/ubuntu jammy main
deb [arch=amd64] https://repo.zabbix.com/zabbix-agent2-plugins/1/ubuntu jammy main
# deb-src [arch=amd64] https://repo.zabbix.com/zabbix-agent2-plugins/1/ubuntu jammy main
clean https://repo.zabbix.com/zabbix/6.0/ubuntu
clean https://repo.zabbix.com/zabbix-agent2-plugins/1/ubuntu

Für Google Chrome (brauchen wir wenn wir Zabbix-Reports versenden wollen zur PDF-Erzeugung):

# Google Chrome
deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main
clean https://dl.google.com/linux/chrome/deb/

Wie Ihr sicher bemerkt habt, habe ich alle Source-Code Quellen auskommentiert. Falls Ihr später doch davon etwas brauchen solltet könnte Ihr bei den betreffenden Quellen den Kommentar wieder entfernen.

Zusätzlich ändern wir den Download-Pfad:

set base_path    /var/www/html/ubuntu



Hier noch einmal die ganze Datei nach den Änderungen, das da viel auskommentiert ist, ist Absicht!:

############# config ##################
#
# set base_path    /var/spool/apt-mirror
#
# set mirror_path  $base_path/mirror
# set skel_path    $base_path/skel
# set var_path     $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch  <running host architecture>
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set base_path    /var/www/html/ubuntu
set nthreads     20
set _tilde 0
#
############# end config ##############

deb http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu jammy-proposed main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse

#deb-src http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu jammy-security main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu jammy-proposed main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse

clean http://archive.ubuntu.com/ubuntu

# Zabbix main repository
deb https://repo.zabbix.com/zabbix/6.0/ubuntu jammy main
# deb-src https://repo.zabbix.com/zabbix/6.0/ubuntu jammy main
deb [arch=amd64] https://repo.zabbix.com/zabbix-agent2-plugins/1/ubuntu jammy main
# deb-src [arch=amd64] https://repo.zabbix.com/zabbix-agent2-plugins/1/ubuntu jammy main

clean https://repo.zabbix.com/zabbix/6.0/ubuntu
clean https://repo.zabbix.com/zabbix-agent2-plugins/1/ubuntu

# Google Chrome
deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main
clean https://dl.google.com/linux/chrome/deb/

Zielordner erstellen

Der Webserver sollte schon laufen, das Zielverzeichnis fehlt aber noch:

mkdir -p /var/www/html/ubuntu
mkdir -p /var/www/html/ubuntu/var/
chown www-data:www-data /var/www/html/ubuntu

Post-Skript erstellen

Damit es am Ende des Downloads keine Fehlermeldung gibt erstellen wir das postmirror.sh-Skript. Das ruft auch gleich die clean.sh auf die nicht mehr notwendige Dateien löscht:

nano /var/www/html/ubuntu/var/postmirror.sh
#!/bin/bash -e
## Anything in this file gets run AFTER the mirror has been run.
## Put your custom post mirror operations in here (like rsyncing the installer
## files and running clean.sh automatically)!
/var/www/html/ubuntu/var/clean.sh

Und noch ausführbar machen:

chmod +x /var/www/html/ubuntu/var/postmirror.sh

Download starten

Warning.png
Warnung: Falls Ihr noch einen Snapshot auf der VM habt, wäre das jetzt ein guter Zeitpunkt den vorher zu löschen!

Das geht per

apt-mirror

und dann warten.
Die Ausgabe sieht wie folgt aus:

Downloading 156 index files using 20 threads...
Begin time: Thu Apr 18 13:16:09 2024
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]...
End time: Thu Apr 18 13:18:25 2024

Processing translation indexes: [TTTTTT]

Downloading 558 translation files using 20 threads...
Begin time: Thu Apr 18 13:18:25 2024
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]...
End time: Thu Apr 18 13:19:10 2024

Processing DEP-11 indexes: [DDDDDD]

Downloading 64 dep11 files using 20 threads...
Begin time: Thu Apr 18 13:19:10 2024
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]...
End time: Thu Apr 18 13:19:25 2024

Processing cnf indexes: [CCCCCC]

Downloading 24 cnf files using 20 threads...
Begin time: Thu Apr 18 13:19:25 2024
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]...
End time: Thu Apr 18 13:19:26 2024

Processing indexes: [PPPPPP]

352.1 GiB will be downloaded into archive.
Downloading 91876 archive files using 20 threads...
Begin time: Thu Apr 18 13:19:31 2024
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]...
End time: Fri Apr 19 01:13:23 2024

0 bytes in 0 files and 0 directories can be freed.
Run /var/www/html/ubuntu/var/clean.sh for this purpose.

Running the Post Mirror script ...
(/var/www/html/ubuntu/var/postmirror.sh)

Removing 0 unnecessary files [0 bytes]...
done.

Removing 0 unnecessary directories...
done.


Post Mirror script has completed. See above output for any possible errors.

Hier waren es also 352GiB (mit Zabbix und Chrome).
Wenn Ihr das Abrechen wollt um z.B. doch noch an den Repos zu schrauben könnte ihr den Mirror-Cache einfach löschen und neu Anfangen:

rm -R /var/www/html/ubuntu*

Neu anfangen heißt dabei alles neu herunterladen ... also um die 300 bis 400GiB
Der Befehl löscht auch das postmirror.sh Skript samt Verzeichnis! Also ggf. wieder neu erstellen!


Manuelle Prüfung

Wenn Ihr nun in einem Webbrowser die IP-Adresse eures eigenen Repo-Servers + /ubuntu eingebt solltet Ihr das Repo sehen können:

http://IP-Eures-Repos/Ubuntu
ClipCapIt-240208-115405.PNG

Im Unterordner mirror finden wir die beiden Paketquellen die wir für Ubuntu und Zabbix angegeben haben:

ClipCapIt-240208-115536.PNG

Und in den entsprechenden Unterordnern sind z.B. nun auch die cnf-Vezeichnisse vorhanden:

ClipCapIt-240208-115707.PNG

Das hatte bisher nicht funktioniert und ist erst kurz vor der Veröffentlichung von 24.04 LTS behoben worden. Vorher musste man dazu noch ein extra Reparaturskript laufen lassen.


Automatisches Update von apt-mirror

Damit er die Paketquellen automatisch auf Stand hält bauen wir - als Benutzer root - einen Cronjob:

crontab -e

und fügen folgende Zeile ein:

0  1  *  *  *  /usr/bin/apt-mirror 2>&1 >/var/log/apt-mirror-cron.log

Nun wird jede Nacht um 01:00 Uhr nach Updates gesucht.
Das Ergebnis schreibt er dabei in eine Logdatei die wir ggf. auf Fehler kontrollieren können:

cat /var/log/apt-mirror-cron.log

Der Inhalt sollte sieht genauso aus wie weiter oben beim ersten Download. Nur das er erheblich weniger runterladen und ggf. auch etwas löschen wird (weniger als man denkt).
Die Log-Datei wird jedes mal überschrieben weshalb ich hier auf ein Logrotate verzichte.


Bearbeiten der Paketquellen auf dem Client

Um nun unsere internes Repository nutzen zu können müssen wir den Quellen überall ein

http://192.168.157.19/ubuntu/mirror/

voranstellen - die IP-Adresse müsst Ihr natürlich an eure Adresse anpassen.
Aus

http://archive.ubuntu.com/ubuntu/

wird also

http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/

Zusätzlich stellen wir überall ein

[trusted=yes]

voran - damit unterbinden wir Signaturprüfungen und lassen diese Quelle als sicher aktzeptieren.
Zuerst bearbeiten die Quellen für Ubuntu:

nano /etc/apt/sources.list
# newer versions of the distribution.
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy main restricted
# deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-updates main restricted
# deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy universe
# deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy universe
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-updates universe
# deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy multiverse
# deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy multiverse
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-updates multiverse
# deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
# deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse

deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-security main restricted
# deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-security main restricted
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-security universe
# deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-security universe
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-security multiverse
# deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/archive.ubuntu.com/ubuntu/ jammy-security multiverse

Alle Vorkommen von 192.168.157.19 müsst Ihr dabei mit der IP-Adresse eures Repo-Servers ersetzen.

Nun das gleiche noch für die Zabbix-Quellen:

nano /etc/apt/sources.list.d/zabbix.list
# Zabbix main repository
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/repo.zabbix.com/zabbix/6.0/ubuntu jammy main
#deb-src [trusted=yes] http://192.168.157.19/ubuntu/mirror/repo.zabbix.com/zabbix/6.0/ubuntu jammy main

und die Plugins des Zabbix-Agent2:

nano /etc/apt/sources.list.d/zabbix-agent2-plugins.list
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/repo.zabbix.com/zabbix-agent2-plugins/1/ubuntu jammy main
#deb-src [arch=amd64] https://repo.zabbix.com/zabbix-agent2-plugins/1/ubuntu jammy main


Und zuletzt noch für Google Chrome:

nano /etc/apt/sources.list.d/google-chrome.list
deb [trusted=yes] http://192.168.157.19/ubuntu/mirror/dl.google.com/linux/chrome/web stable main


Wenn Ihr jetzt ein

apt update

eingebt, sollte er sich die Daten von der internen Quelle holen.
Eventuelle Ign: / Ignore-Meldungen könnt Ihr ignorieren, bei einem 2. Aufruf sollten diese verschwinden. Diese werden aber immer wenn es neue Updates gibt einmal wieder auftauchen. Daran arbeite ich noch, der Funktion tut es aber keinen Abbruch.
Je nachdem wie der Client vorher installiert wurde gibt es ggf. noch andere Fehlermeldungen beim ersten mal:

E: Einige Indexdateien konnten nicht heruntergeladen werden. Sie wurden ignoriert oder alte an ihrer Stelle eingesetzt

Wiederholt den apt update ggf. mehrmals bis keine Fehler mehr kommen.


Weitere Quellen hinzufügen

Weitere Quellen fügt Ihr wie weiter oben bei Zabbix und Google-Chrome hinzu.
Also erst die Paketquelle lokal hinzufügen und mit

apt update

testen ob man auf diese Zugreifen kann. Dann sucht Ihr euch unterhalb von

/etc/apt/sources.list.d/

Die passende Datei mit der Downloadquelle heraus und kopiert was darin steht unten an die Datei

/etc/apt/mirror.list

zum Beispiel bei Google Chrome:

# Google Chrome
deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main
clean https://dl.google.com/linux/chrome/deb/

Das [arch=amd64] sorgt dafür das er nur die 64 Bit Version herunterlädt und die i386/32 Bit Varianten weglässt.
Das clean wird mit der gleichen URL aufgerufen und sorgt für das löschen ggf. veralteter Versionen.
Beim nächsten Aufruf von

apt-mirror

wird er die Quelle mit herunterladen - das können wenige Megabyte oder viele Gigabyte sein, macht das beim ersten mal also lieber einmal von Hand und prüft ob das passt.
Die Quelle erscheint dann im Webbrowser als eigener Zweig unterhalb von

http://192.168.157.19/ubuntu/mirror/

mit dem DNS-Names des Original-Repos. Die Einbindung auf den Zielservern erfolgt dann genauso wie auch bei den anderen Quellen oben beschrieben.


binary-all fehlt

Ggf. gibt es bei euch eine Fehlermeldung wie diese:

Fehlschlag beim holen von http://192.168.157.19/ubuntu/mirror/repo.zabbix.com/zabbix/6.0/ubuntu/dists/jammy/main/binary-all/Packages 404  Not Found [IP: 192.168.157.19 80]

Grund ist das es tatsächlich neben dem binary-amd64 Verzeichnis ein binary-all Verzeichnis gibt. Das holt aber apt-mirror nicht mit ab.

ClipCapIt-240620-104711.PNG

Eine direkte Lösung habe für apt-mirror habe ich - Stand 24.04.2024 - nicht gefunden, es gibt zwar ein Issue auf Github

https://github.com/apt-mirror/apt-mirror/issues/188

Es gibt einen Pull-Request der ermöglichen würde das zu beheben (es liegt wohl daran das Prüfsummen-Dateien fehlen und mit dem Fix könnte man das Fehlen ignorieren), aber der wurde noch nicht übernommen.
Die progierte Lösung ist das man statt dessen apt-mirror2 verwenden soll: https://gitlab.com/apt-mirror2/apt-mirror2
Ich habe das getestet und es schein zu funktionieren.
apt-mirror2 nutzt die gleichen Konfigurationsdateien wie apt-mirror, man kann es einfach installieren und starten.
Unter Ubuntu 22.04 funktioniert das noch als root und für alle (ab 24.04 müsste man vorher ein Venv-Enviroment bauen und vorher laden):

apt install python3-pip

und dann

pip install apt-mirror

Ihr habt danach 2x apt-mirror auf der Festplatte:

/usr/bin/apt-mirror        => Version 1, wurde per apt install apt-mirror installiert
/usr/local/bin/apt-mirror  => Version 2, wurde per pip install apt-mirror installiert

Ubuntu nimmt automatisch die Version 2, das Verzeichnis wird zuerst nach dem Befehl durchsucht.
Testen könnt Ihr das mit

apt-mirror --help

Die Version 2 gibt dann die Hilfe aus, die Version 1 eine Fehlermeldung da es den Hilfe-Parameter nicht kennt.
Per

apt-mirror

einmal die Suche durchlaufen lassen, er überspringt alles was er schon hat und kopiert fehlendes herunter. Wenn er fertig ist gibt es auch im lokalen Repository die binary-all Ordner.
Die Ausgabe des Befehls ist etwas gesprächiger :-)
Den CronJob passen wir auf den neuen Pfad an:

crontab -e

Und ändern den Pfad wie folgt:

# m h  dom mon dow   command
0  1  *  *  *  /usr/local/bin/apt-mirror 2>&1 >/var/log/apt-mirror-cron.log


Die Clients meckern dann ggf. mit

WARNUNG: Die folgenden Pakete können nicht authentifiziert werden!

Wo Ihr dann bestätigen könnt das diese trotzdem installiert werden sollen.
Bei der Verwendung von -y geht das so

apt upgrade -y --allow-unauthenticated

Das Problem könnte man wohl umgehen indem man die [by-hash:xxx] Option in der /etc/apt/mirror.list setzen würde. Ich habe aber im Moment noch keinen Schimmer was genau ich da reinschreiben müsste, laut Quellcode erwartet apt-mirror2 da einen Hash-Wert von dem ich - noch - nicht weis wo der herkommt.


Linksammlung

Quellen die ich verwendet habe:


Kommentare

Loading comments...