Lokales Repository (Rocky Linux 9)
Lokales Repository (Rocky Linux 9)
In abgeschotteten oder eingeschränkten Netzen (kein bzw. nur gefilterter Internet-Zugang) steht der Standard-Spiegel mirrors.rockylinux.org nicht zur Verfügung. Ein lokales Repository stellt die Pakete von BaseOS, AppStream und Extras im internen Netz bereit – Voraussetzung für Updates, Software-Installation und automatisierte Provisionierung (Kickstart).
ℹ️ Hinweis: Dieser Artikel bezieht sich bewusst auf Rocky Linux 9. Rocky 10 wird im Kurs (noch) nicht eingesetzt.
Voraussetzungen
- Ein Server mit ausreichend Plattenplatz (siehe Achtung-Box)
- Paket
httpd(Apache) für die Bereitstellung im Netz dnf-plugins-core(liefertdnf reposync) undcreaterepo_c- Einmaliger Internet-Zugang ODER ein vollständiges DVD-ISO zum Befüllen
⚠️ Achtung: Ein vollständiger Spiegel von BaseOS + AppStream + Extras belegt grob 25–40 GB und wächst mit jedem Update. Die VM-Platte entsprechend dimensionieren.
Werkzeuge installieren
dnf install -y dnf-plugins-core createrepo_c httpd
Pakete spiegeln
- Verzeichnis und Spiegelung (auf dem Spiegel-Server, mit Internet-Zugang)
REPODIR=/var/www/html/repo/rocky/9
for repo in baseos appstream extras; do
dnf reposync --repoid=$repo \
--download-metadata \
--downloadcomps \
--newest-only \
-p "$REPODIR"
done
ℹ️ Hinweis:
--download-metadatalädt die fertigerepodatagleich mit – ein nachträglichescreaterepo_cist dann nicht nötig.--downloadcompsholt die Gruppen-Definitionen (fürdnf group installbzw.@^Minimal Installin Kickstart).--newest-onlyspart Platz, indem nur die jeweils aktuellste Paketversion gespiegelt wird. Für ein Archiv mit Versionsverlauf weglassen.
ℹ️ Hinweis: {{{1}}}
Offline-Befüllung aus dem ISO
Im echt abgeschotteten Netz lässt sich der Spiegel nicht aus dem Internet befüllen. Das Installations-ISO liefert die Pakete inklusive fertiger repodata/ – damit läuft der Spiegel sofort, ganz ohne Internet und ohne reposync:
mount -o loop,ro /pfad/Rocky-9.x-x86_64-dvd1.iso /mnt/iso
rsync -av /mnt/iso/BaseOS/ /var/www/html/repo/rocky/9/baseos/
rsync -av /mnt/iso/AppStream/ /var/www/html/repo/rocky/9/appstream/
ℹ️ Hinweis: Die DVD enthält kein eigenes Extras-Repo. Für Updates später per reposync (siehe oben) nachziehen, sobald einmalig Internet-Zugang besteht.
Eigenes Repo aus einzelnen RPMs (optional)
Für eine selbst zusammengestellte Paketsammlung (z. B. interne RPMs) die Metadaten manuell erzeugen:
mkdir -p /var/www/html/repo/custom
cp *.rpm /var/www/html/repo/custom/
createrepo_c /var/www/html/repo/custom/
Nach jeder Änderung an den RPMs createrepo_c --update auf das Verzeichnis anwenden.
Bereitstellung über Apache
- Dienst starten und aktivieren
systemctl enable --now httpd
- Firewall öffnen (firewalld)
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
- SELinux-Kontext (nur falls das Repo NICHT unterhalb von /var/www/html liegt)
semanage fcontext -a -t httpd_sys_content_t "/srv/repo(/.*)?"
restorecon -Rv /srv/repo
ℹ️ Hinweis: Liegt das Repo wie hier unter /var/www/html, stimmt der SELinux-Kontext (httpd_sys_content_t) bereits – kein Eingriff nötig.
- GPG-Schlüssel für Clients bereitstellen
Damit Clients schon vor der Installation prüfen können, den Rocky-Schlüssel in den Webroot legen:
cp /etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9 /var/www/html/repo/
Client-Konfiguration
Datei /etc/yum.repos.d/local.repo auf den Clients (Hostname/IP des Spiegels anpassen, hier repo.it2XX.lab):
[baseos-local] name=Rocky 9 - BaseOS (Lokaler Spiegel) baseurl=http://repo.it2XX.lab/repo/rocky/9/baseos/ enabled=1 gpgcheck=1 gpgkey=http://repo.it2XX.lab/repo/RPM-GPG-KEY-Rocky-9 [appstream-local] name=Rocky 9 - AppStream (Lokaler Spiegel) baseurl=http://repo.it2XX.lab/repo/rocky/9/appstream/ enabled=1 gpgcheck=1 gpgkey=http://repo.it2XX.lab/repo/RPM-GPG-KEY-Rocky-9 [extras-local] name=Rocky 9 - Extras (Lokaler Spiegel) baseurl=http://repo.it2XX.lab/repo/rocky/9/extras/ enabled=1 gpgcheck=1 gpgkey=http://repo.it2XX.lab/repo/RPM-GPG-KEY-Rocky-9
⚠️ Achtung: Die mitgelieferten Standard-Repos zeigen auf mirrors.rockylinux.org und schlagen im abgeschotteten Netz fehl. Vor dem ersten dnf-Lauf deaktivieren:
dnf config-manager --set-disabled baseos appstream extras crb
dnf clean all
dnf repolist
dnf makecache
Spiegel aktuell halten
Den Spiegel regelmäßig nachziehen – per systemd-Timer (passt zum Units-Thema):
- Service-Unit
/etc/systemd/system/reposync.service
[Unit] Description=Rocky 9 Repo-Spiegel aktualisieren Wants=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/usr/local/sbin/reposync-rocky9.sh
- Timer-Unit
/etc/systemd/system/reposync.timer
[Unit] Description=Repo-Spiegel taeglich aktualisieren [Timer] OnCalendar=*-*-* 03:00:00 Persistent=true [Install] WantedBy=timers.target
- Skript
/usr/local/sbin/reposync-rocky9.sh
#!/bin/bash
REPODIR=/var/www/html/repo/rocky/9
for repo in baseos appstream extras; do
dnf reposync --repoid=$repo --download-metadata --downloadcomps --newest-only -p "$REPODIR"
done
- Aktivieren
chmod +x /usr/local/sbin/reposync-rocky9.sh
systemctl daemon-reload
systemctl enable --now reposync.timer
Test und Fehlersuche
- Erreichbarkeit und Inhalt prüfen
curl -s http://repo.it2XX.lab/repo/rocky/9/baseos/repodata/repomd.xml | head
dnf repolist
dnf makecache
dnf install -y tree
| Symptom | Ursache / Lösung |
|---|---|
Status code: 404 beim repomd.xml |
Pfad in baseurl falsch oder repodata/ fehlt → bei eigenem Repo createrepo_c ausführen
|
GPG check FAILED |
Falscher/fehlender Schlüssel → gpgkey-URL prüfen, ggf. rpm --import
|
Cannot prepare internal mirrorlist |
Standard-Repos noch aktiv und nicht erreichbar → --set-disabled nicht ausgeführt
|
403 Forbidden |
SELinux-Kontext oder Dateirechte → restorecon -Rv, Apache-Logs (/var/log/httpd/error_log) prüfen
|
Integration mit Kickstart
Im Kickstart-Profil den lokalen Spiegel als Installationsquelle nutzen:
url --url="http://repo.it2XX.lab/repo/rocky/9/baseos/" repo --name="appstream" --baseurl="http://repo.it2XX.lab/repo/rocky/9/appstream/" repo --name="extras" --baseurl="http://repo.it2XX.lab/repo/rocky/9/extras/"
ℹ️ Hinweis: Siehe auch Kickstart und Softwareverwaltung mit dnf.