Rocky Repo auf www: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| (13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
| − | =Platte vergrössern= | + | = Lokales Repo aus DVD-ISO erstellen = |
| − | *Virtualbox | + | |
| − | **Werkzeuge | + | ;Ziel: Der www-Server stellt den Inhalt der Rocky-9-Installations-DVD als lokales dnf-Repo bereit, damit Client-VMs im abgeschotteten DMZ-Netz ohne Internetzugang installieren können. |
| − | ***Burgermenu | + | |
| − | ****Medien | + | = Platte vergrössern = |
| − | *****www.vdi auswählen | + | ;Die DVD ist 14 GB gross, die bestehende Root-Partition hat dafür nicht genug Platz – die virtuelle Disk muss erst vergrössert werden |
| − | ******50GB | + | * Virtualbox |
| − | =Booten= | + | ** Werkzeuge |
| − | *fdisk -l | + | *** Burgermenu |
| − | =Partition vergrössern= | + | **** Medien |
| − | *dnf install -y cloud-utils-growpart | + | ***** www.vdi auswählen |
| − | *growpart /dev/sda 2 | + | ****** 50GB |
| − | *fdisk -l | + | |
| − | =LV vergrössern= | + | = Booten = |
| − | *lvextend -r -l +100%FREE /dev/rlm/root | + | ;Nach dem Vergrössern in VirtualBox sieht die VM die neue Disk-Grösse erst nach einem Neustart |
| − | =Checken= | + | * fdisk -l |
| − | *lvs | + | ;Zeigt: Disk ist jetzt 50 GiB, aber die LVM-Partition (sda2) ist noch auf der alten Grösse |
| − | *lvdisplay | + | |
| + | = Partition vergrössern = | ||
| + | ;growpart erweitert die Partitionstabelle auf die neue Disk-Grösse | ||
| + | * dnf install -y cloud-utils-growpart | ||
| + | * growpart /dev/sda 2 | ||
| + | * fdisk -l | ||
| + | ;Kontrolle – sda2 reicht jetzt bis ans Ende der Disk. growpart zieht bei einer LVM-Partition automatisch ein pvresize nach, das PV meldet danach schon die neue Grösse | ||
| + | |||
| + | = LV vergrössern = | ||
| + | ;Freien Platz komplett dem root-LV zuschlagen. -l (klein) rechnet in Extents/Prozent statt in fester GB-Zahl – bei "alles" ist +100%FREE genauer als eine geschätzte GB-Angabe. Das -r löst automatisch xfs_growfs mit aus | ||
| + | * lvextend -r -l +100%FREE /dev/rlm/root | ||
| + | |||
| + | = Checken = | ||
| + | * lvs | ||
| + | * lvdisplay | ||
| + | * df -h / | ||
| + | ;Root-Partition zeigt jetzt die volle Grösse | ||
| + | |||
| + | = Daten besorgen = | ||
| + | ;DVD einlegen | ||
| + | * mount /dev/sr0 /mnt/ | ||
| + | |||
| + | =Index Datei entfernen= | ||
| + | * rm -f /var/repo/index.php | ||
| + | |||
| + | = Kopieren = | ||
| + | * cp -vr /mnt/* /var/repo/ | ||
| + | ;Kopiert den kompletten DVD-Inhalt (BaseOS, AppStream, repodata etc.) direkt in die DocumentRoot | ||
| + | |||
| + | = Directory-Listing erlauben = | ||
| + | ;Damit Unterverzeichnisse wie /BaseOS/ ohne eigene index.html als Listing angezeigt werden (sonst 403). Options +Indexes im bestehenden Directory-Block ergänzen | ||
| + | * vi /etc/httpd/conf.d/www.conf | ||
| + | <pre> | ||
| + | <Directory /var/www/html> | ||
| + | Options +Indexes | ||
| + | AllowOverride None | ||
| + | Require all granted | ||
| + | </Directory> | ||
| + | </pre> | ||
| + | * apachectl configtest | ||
| + | * systemctl restart httpd | ||
| + | |||
| + | = SELinux = | ||
| + | ;Kopierte Dateien können vom cp-Vorgang einen falschen Kontext mitbringen | ||
| + | * semanage fcontext -a -t httpd_sys_content_t "/var/repo/(.*)?" | ||
| + | * restorecon -Rv /var/repo | ||
| + | |||
| + | = Test auf dem Server = | ||
| + | * curl -k https://www.it2XX.int/ | ||
| + | ;Zeigt Directory-Listing mit BaseOS/, AppStream/ usw. | ||
| + | |||
| + | = Repo-Metadaten = | ||
| + | ;repodata/ ist bereits fertig auf der DVD enthalten (repomd.xml, primary/filelists/other, comps) – kein eigenes createrepo_c nötig | ||
| + | * ls /var/repo/BaseOS/repodata/ | ||
| + | * ls /var/repo/AppStream/repodata/ | ||
| + | |||
| + | = Client-Konfiguration = | ||
| + | ;Auf jeder Client-VM das lokale Repo eintragen. https statt http verwenden – der Server leitet HTTP automatisch auf HTTPS um, und dnf folgt diesem Redirect bei Metadaten nicht zuverlässig | ||
| + | * vi /etc/yum.repos.d/local.repo | ||
| + | <pre> | ||
| + | [local-baseos] | ||
| + | name=Local BaseOS | ||
| + | baseurl=https://www.it2XX.int/BaseOS/ | ||
| + | enabled=1 | ||
| + | gpgcheck=0 | ||
| + | |||
| + | [local-appstream] | ||
| + | name=Local AppStream | ||
| + | baseurl=https://www.it2XX.int/AppStream/ | ||
| + | enabled=1 | ||
| + | gpgcheck=0 | ||
| + | </pre> | ||
| + | ;gpgcheck=0 reicht für den Kurs – kein GPG-Key-Import nötig. Die KIT-CA ist bereits im System-Trust-Store der Client-VMs verankert, TLS läuft ohne Zertifikatswarnung | ||
| + | |||
| + | = Standard-Repos deaktivieren = | ||
| + | ;Damit dnf sichtbar nur noch die lokalen Repos nutzt und nicht parallel vom (in der DMZ ohnehin nicht erreichbaren) Internet zieht | ||
| + | * dnf config-manager --set-disabled baseos appstream extras epel epel-cisco-openh264 | ||
| + | |||
| + | = Test auf dem Client = | ||
| + | * dnf clean all | ||
| + | * dnf repolist | ||
| + | * dnf install -y mc | ||
| + | ;local-baseos und local-appstream erscheinen in der Liste, Installation läuft über das lokale Repo | ||
| + | |||
| + | = Demo: Repo isoliert testen = | ||
| + | ;Alle Standard-Repos deaktivieren, damit nur noch die lokalen Repos übrig bleiben – zeigt dass die Installation tatsächlich über das eigene Repo läuft und nicht übers Internet | ||
| + | * dnf config-manager --set-disabled baseos appstream extras epel epel-cisco-openh264 | ||
| + | * dnf repolist | ||
| + | ;Nur noch local-baseos und local-appstream sichtbar | ||
| + | |||
| + | ;Installation testen – funktioniert nur über das lokale Repo | ||
| + | * dnf install -y mc | ||
| + | |||
| + | ;Standard-Repos wieder aktivieren | ||
| + | * dnf config-manager --set-enabled baseos appstream extras epel epel-cisco-openh264 | ||
| + | * dnf repolist | ||
| + | ;Alle Repos wieder sichtbar | ||
| + | = Repo live ziehen (reposync statt DVD) = | ||
| + | ;Alternative zur DVD-Kopie: Repo direkt von einem Mirror synchronisieren. Der Rechner, der reposync ausführt, braucht dafür Internetzugang – im Gegensatz zum DMZ-www-Server selbst | ||
| + | * dnf install -y dnf-plugins-core createrepo_c | ||
| + | * mkdir -p /var/repo/{BaseOS,AppStream} | ||
| + | |||
| + | * dnf reposync --repoid=baseos --download-metadata -p /var/repo/BaseOS --newest-only | ||
| + | * dnf reposync --repoid=appstream --download-metadata -p /var/repo/AppStream --newest-only | ||
| + | ;--download-metadata zieht repodata/ gleich mit, sonst müsste createrepo_c manuell nachlaufen. | ||
| + | ;--newest-only verhindert, dass alte Paketversionen mitgeschleppt werden | ||
| + | |||
| + | = Repo synchronisieren (aktuell halten) = | ||
| + | ;Gleicher Befehl mit --delete, damit ausgemusterte Pakete auch lokal entfernt werden | ||
| + | * dnf reposync --repoid=baseos --download-metadata -p /var/repo/BaseOS --newest-only --delete | ||
| + | * dnf reposync --repoid=appstream --download-metadata -p /var/repo/AppStream --newest-only --delete | ||
| + | |||
| + | = Automatisierung per systemd-Timer = | ||
| + | ;Statt cron.weekly – Persistent=true holt einen verpassten Lauf (z. B. VM war aus) beim nächsten Boot nach | ||
| + | * vi /usr/local/bin/repo-sync.sh | ||
| + | <pre> | ||
| + | #!/bin/bash | ||
| + | dnf reposync --repoid=baseos --download-metadata -p /var/www/html/BaseOS --newest-only --delete | ||
| + | dnf reposync --repoid=appstream --download-metadata -p /var/www/html/AppStream --newest-only --delete | ||
| + | restorecon -Rv /var/www/html | ||
| + | </pre> | ||
| + | * chmod +x /usr/local/bin/repo-sync.sh | ||
| + | |||
| + | * vi /etc/systemd/system/repo-sync.service | ||
| + | <pre> | ||
| + | [Unit] | ||
| + | Description=Sync lokales Rocky-Repo (BaseOS/AppStream) | ||
| + | Wants=network-online.target | ||
| + | After=network-online.target | ||
| + | |||
| + | [Service] | ||
| + | Type=oneshot | ||
| + | ExecStart=/usr/local/bin/repo-sync.sh | ||
| + | </pre> | ||
| + | |||
| + | * vi /etc/systemd/system/repo-sync.timer | ||
| + | <pre> | ||
| + | [Unit] | ||
| + | Description=Wöchentlicher Sync des lokalen Rocky-Repos | ||
| + | |||
| + | [Timer] | ||
| + | OnCalendar=weekly | ||
| + | Persistent=true | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=timers.target | ||
| + | </pre> | ||
| + | |||
| + | * systemctl daemon-reload | ||
| + | * systemctl enable --now repo-sync.timer | ||
| + | |||
| + | = Test = | ||
| + | * systemctl list-timers repo-sync.timer | ||
| + | ;Zeigt nächsten geplanten Lauf und ob NEXT/LEFT korrekt gesetzt sind | ||
Aktuelle Version vom 8. Juli 2026, 13:02 Uhr
Lokales Repo aus DVD-ISO erstellen
- Ziel
- Der www-Server stellt den Inhalt der Rocky-9-Installations-DVD als lokales dnf-Repo bereit, damit Client-VMs im abgeschotteten DMZ-Netz ohne Internetzugang installieren können.
Platte vergrössern
- Die DVD ist 14 GB gross, die bestehende Root-Partition hat dafür nicht genug Platz – die virtuelle Disk muss erst vergrössert werden
- Virtualbox
- Werkzeuge
- Burgermenu
- Medien
- www.vdi auswählen
- 50GB
- www.vdi auswählen
- Medien
- Burgermenu
- Werkzeuge
Booten
- Nach dem Vergrössern in VirtualBox sieht die VM die neue Disk-Grösse erst nach einem Neustart
- fdisk -l
- Zeigt
- Disk ist jetzt 50 GiB, aber die LVM-Partition (sda2) ist noch auf der alten Grösse
Partition vergrössern
- growpart erweitert die Partitionstabelle auf die neue Disk-Grösse
- dnf install -y cloud-utils-growpart
- growpart /dev/sda 2
- fdisk -l
- Kontrolle – sda2 reicht jetzt bis ans Ende der Disk. growpart zieht bei einer LVM-Partition automatisch ein pvresize nach, das PV meldet danach schon die neue Grösse
LV vergrössern
- Freien Platz komplett dem root-LV zuschlagen. -l (klein) rechnet in Extents/Prozent statt in fester GB-Zahl – bei "alles" ist +100%FREE genauer als eine geschätzte GB-Angabe. Das -r löst automatisch xfs_growfs mit aus
- lvextend -r -l +100%FREE /dev/rlm/root
Checken
- lvs
- lvdisplay
- df -h /
- Root-Partition zeigt jetzt die volle Grösse
Daten besorgen
- DVD einlegen
- mount /dev/sr0 /mnt/
Index Datei entfernen
- rm -f /var/repo/index.php
Kopieren
- cp -vr /mnt/* /var/repo/
- Kopiert den kompletten DVD-Inhalt (BaseOS, AppStream, repodata etc.) direkt in die DocumentRoot
Directory-Listing erlauben
- Damit Unterverzeichnisse wie /BaseOS/ ohne eigene index.html als Listing angezeigt werden (sonst 403). Options +Indexes im bestehenden Directory-Block ergänzen
- vi /etc/httpd/conf.d/www.conf
<Directory /var/www/html>
Options +Indexes
AllowOverride None
Require all granted
</Directory>
- apachectl configtest
- systemctl restart httpd
SELinux
- Kopierte Dateien können vom cp-Vorgang einen falschen Kontext mitbringen
- semanage fcontext -a -t httpd_sys_content_t "/var/repo/(.*)?"
- restorecon -Rv /var/repo
Test auf dem Server
- curl -k https://www.it2XX.int/
- Zeigt Directory-Listing mit BaseOS/, AppStream/ usw.
Repo-Metadaten
- repodata/ ist bereits fertig auf der DVD enthalten (repomd.xml, primary/filelists/other, comps) – kein eigenes createrepo_c nötig
- ls /var/repo/BaseOS/repodata/
- ls /var/repo/AppStream/repodata/
Client-Konfiguration
- Auf jeder Client-VM das lokale Repo eintragen. https statt http verwenden – der Server leitet HTTP automatisch auf HTTPS um, und dnf folgt diesem Redirect bei Metadaten nicht zuverlässig
- vi /etc/yum.repos.d/local.repo
[local-baseos] name=Local BaseOS baseurl=https://www.it2XX.int/BaseOS/ enabled=1 gpgcheck=0 [local-appstream] name=Local AppStream baseurl=https://www.it2XX.int/AppStream/ enabled=1 gpgcheck=0
- gpgcheck=0 reicht für den Kurs – kein GPG-Key-Import nötig. Die KIT-CA ist bereits im System-Trust-Store der Client-VMs verankert, TLS läuft ohne Zertifikatswarnung
Standard-Repos deaktivieren
- Damit dnf sichtbar nur noch die lokalen Repos nutzt und nicht parallel vom (in der DMZ ohnehin nicht erreichbaren) Internet zieht
- dnf config-manager --set-disabled baseos appstream extras epel epel-cisco-openh264
Test auf dem Client
- dnf clean all
- dnf repolist
- dnf install -y mc
- local-baseos und local-appstream erscheinen in der Liste, Installation läuft über das lokale Repo
Demo: Repo isoliert testen
- Alle Standard-Repos deaktivieren, damit nur noch die lokalen Repos übrig bleiben – zeigt dass die Installation tatsächlich über das eigene Repo läuft und nicht übers Internet
- dnf config-manager --set-disabled baseos appstream extras epel epel-cisco-openh264
- dnf repolist
- Nur noch local-baseos und local-appstream sichtbar
- Installation testen – funktioniert nur über das lokale Repo
- dnf install -y mc
- Standard-Repos wieder aktivieren
- dnf config-manager --set-enabled baseos appstream extras epel epel-cisco-openh264
- dnf repolist
- Alle Repos wieder sichtbar
Repo live ziehen (reposync statt DVD)
- Alternative zur DVD-Kopie
- Repo direkt von einem Mirror synchronisieren. Der Rechner, der reposync ausführt, braucht dafür Internetzugang – im Gegensatz zum DMZ-www-Server selbst
- dnf install -y dnf-plugins-core createrepo_c
- mkdir -p /var/repo/{BaseOS,AppStream}
- dnf reposync --repoid=baseos --download-metadata -p /var/repo/BaseOS --newest-only
- dnf reposync --repoid=appstream --download-metadata -p /var/repo/AppStream --newest-only
- --download-metadata zieht repodata/ gleich mit, sonst müsste createrepo_c manuell nachlaufen.
- --newest-only verhindert, dass alte Paketversionen mitgeschleppt werden
Repo synchronisieren (aktuell halten)
- Gleicher Befehl mit --delete, damit ausgemusterte Pakete auch lokal entfernt werden
- dnf reposync --repoid=baseos --download-metadata -p /var/repo/BaseOS --newest-only --delete
- dnf reposync --repoid=appstream --download-metadata -p /var/repo/AppStream --newest-only --delete
Automatisierung per systemd-Timer
- Statt cron.weekly – Persistent=true holt einen verpassten Lauf (z. B. VM war aus) beim nächsten Boot nach
- vi /usr/local/bin/repo-sync.sh
#!/bin/bash dnf reposync --repoid=baseos --download-metadata -p /var/www/html/BaseOS --newest-only --delete dnf reposync --repoid=appstream --download-metadata -p /var/www/html/AppStream --newest-only --delete restorecon -Rv /var/www/html
- chmod +x /usr/local/bin/repo-sync.sh
- vi /etc/systemd/system/repo-sync.service
[Unit] Description=Sync lokales Rocky-Repo (BaseOS/AppStream) Wants=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/usr/local/bin/repo-sync.sh
- vi /etc/systemd/system/repo-sync.timer
[Unit] Description=Wöchentlicher Sync des lokalen Rocky-Repos [Timer] OnCalendar=weekly Persistent=true [Install] WantedBy=timers.target
- systemctl daemon-reload
- systemctl enable --now repo-sync.timer
Test
- systemctl list-timers repo-sync.timer
- Zeigt nächsten geplanten Lauf und ob NEXT/LEFT korrekt gesetzt sind