Inhaltsverzeichnis
ArchLinux - Repository spiegeln
Der Paketmanager pacman ist eines der wichtigsten Unterscheidungsmerkmale von ArchLinux. Er kombiniert ein einfaches Format für Binärpakete mit einem leicht zu bedienenden Build-System. Das Ziel von pacman ist es, die einfache Verwaltung von Paketen zu ermöglichen, unabhängig davon, ob sie aus den offiziellen Repositories oder aus eigenen Builds stammen.
Pacman hält das System auf dem neuesten Stand, indem es die Paketlisten mit dem „Master-Server“ synchronisiert. Dieses Server/Client-Modell erlaubt es dem Benutzer auch, Pakete mit einem einfachen Befehl herunterzuladen/zu installieren, komplett mit allen erforderlichen Abhängigkeiten.
Ab hier werden zur Ausführung nachfolgender Befehle root
-Rechte benötigt. Um der Benutzer root
zu werden, melden Sie sich bitte als root
-Benutzer am System an, oder wechseln mit nachfolgendem Befehl zum Benutzer root
:
$ su - Password:
Vorbereitungen
Nachfolgend soll beschrieben werden, wie ein Spiegel eines offiziellen Repositories, erstellt werden kann und aktuell gehalten werden kann.
Der Datentransfer soll von einem öffentlichen Spiegel des ArchLinux-Repository täglich aktualisiert werden. Eine Auswahl an öffentlichen ArchLinux-Repository-Spiegeln kann unter nachfolgendem Link ermittelt und deren Status eingesehen werden:
Im konkreten Fall hier, sollen die Daten von nachfolgendem Server der Friedrich-Alexander-Universität Erlangen-Nürnberg transferiert werden:
Ziel Verzeichnisstruktur erstellen
Bevor mit den Spiegeln eines ArchLinux-Repository von einem öffentlichen Spiegel begonnen werden kann, sollte zuerst die Verzeichnisstruktur erstellt werden, in die der Inhalt des ArchLinux-Repository auf der lokalen Festplatte gespeichert werden soll, was mit nachfolgenden Befehlen durchgeführt werden kann:
# mkdir -p /srv/repository/archlinux
HINWEIS - Die Option -p
beim Befehl mkdir
legt alle Unterverzeichnisse ebenfalls an, wenn diese nicht bereits bestehen!
Installation
rsync
Zur Synchronisation eines ArchLinux-Repository von einem öffentlichen Spiegel, soll der Befehl
rsync
zum Einsatz kommen.
Falls der oben genannte Befehl noch nicht Bestandteil des installierten Betriebssystems ist, wird nachfolgendes Paket benötigt und kann mit nachfolgendem Befehl installiert werden:
Mit nachfolgendem Befehl, wird das Paket rsync
installiert:
# pacman --noconfirm -S rsync
Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket rsync
installiert wurden.
# pacman -Qil rsync
logrotate
Da das später zum Einsatz kommenden Skript eine LOG-Schreibung durchführt und dieses LOG nicht ins unendliche anwachsen soll, soll der Mechanismus
logrotate
zum Einsatz kommen, um nach gewissen Vorgaben die entstehenden LOG-Dateien zu rotieren.
Falls der oben genannte Befehl noch nicht Bestandteil des installierten Betriebssystems ist, wird nachfolgendes Paket benötigt und kann mit nachfolgendem Befehl installiert werden:
Mit nachfolgendem Befehl, wird das Paket logrotate
installiert:
# pacman --noconfirm -S logrotate
Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket logrotate
installiert wurden.
# pacman -Qil logrotate
Da ein LOG-Rotate via systemd
-Timer-job ausgeführt wird, ist es erforderlich, den systemd
-Timer-job dafür mit nachfolgendem Befehl zu aktivieren:
# systemctl enable --now logrotate.timer Created symlink /etc/systemd/system/timers.target.wants/logrotate.timer → /usr/lib/systemd/system/logrotate.timer.
Befehl: rsync
Mit nachfolgendem Befehl, könnte nun ein komplettes ArchLinux-Repository von einem öffentlichen Spiegel transferiert und synchronisiert werden:
HINWEIS - !!! Bitte nur mit Bedacht ausführen, da hier, je nach eigener Anbindung an das Internet, eine sehr lange Datentransferzeit zu erwarten ist !!!
# /usr/bin/rsync -varlHt --progress --delete-after --delay-updates --timeout=300 --exclude community-staging/ --exclude community-testing/ --exclude gnome-unstable/ --exclude images/ --exclude iso/ --exclude kde-unstable/ --exclude multilib-staging/ --exclude multilib-testing/ --exclude staging/ --exclude testing/ ftp.fau.de::archlinux/ /srv/repository/archlinux/
Agenda der verwendeten Optionen
-v
-–verbose
- Ausgabe von Laufzeitinformationen-a
-–archive
- Archiv-Modus-r
-–recursive
- Die Verzeichnisse rückwärts durchsuchen-l
-–links
- Kopiere symbolische Links als symbolische Links-H
-–hard-links
- Erhalte „hard“ Links-t
-–times
- Erhalte ursprüngliche Zeitangaben–progress
- Fortschrittsanzeige anzeigen–delete-after
- Führe Löschungen erst nach den Änderungen durch, nicht vorher–delay-updates
- Führe alle Änderungen erst am Ende des Datentransfers durch (Zwischenspeicherung in.~tmp~
)–timeout=300
- Zeitablauf für Operationen in Sekunden–exclude SRPMS/
- Nachfolgende AngabeSRPMS/
nicht mit einbeziehen
HINWEIS - Zum Test der Verbindung, kann nachfolgender Befehl verwendet werden, welcher nur nachfolgende Dateien
lastsync
lastupdate
transferiert und alle anderen Verzeichnisse und Dateien mittels „exclude“ - „ausschliesst“:
# /usr/bin/rsync -varlHt --progress --delete-after --delay-updates --timeout=300 --exclude community-staging/ --exclude community-testing/ --exclude gnome-unstable/ --exclude images/ --exclude iso/ --exclude kde-unstable/ --exclude multilib-staging/ --exclude multilib-testing/ --exclude multilib/ --exclude pool/ --exclude staging/ --exclude testing/ --exclude community/ --exclude core/ --exclude extra/ ftp.halifax.rwth-aachen.de::archlinux/ /srv/repository/archlinux/
Script: /usr/local/bin/rsync_archlinux.sh
Mit nachfolgendem Script, kann nun z.B. Zeitgesteuert durch einen systemd
Timer-Job die Synchronisation durchgeführt werden.
HINWEIS - !!! Bitte bei der ERSTEN Ausführung bedenken, dass je nach eigener Anbindung an das Internet, eine sehr lange Datentransferzeit zu erwarten ist !!!
WICHTIG - Bei einer eignen Internetanbindung mit hoher Bandbreite könnte noch der rsync
-Parameter (RSYNC_CMDOPTS)
--bwlimit=1000
= Max. Datentransfer Geschwindigkeit 1000 KB
hinzugefügt werden, um in diesem Beispiel die Friedrich-Alexander-Universität Erlangen-Nürnberg nicht zu sehr zu belasten!!!
Der Inhalt des Scripts, sieht wie folgt aus:
#!/bin/bash ############################################################################## # Script-Name : rsync_archlinux.sh # # Description : Script to sync via rsync command repositorys from official # # mirror servers. On successful execution only a LOG file will # # be written. On error while execution, a LOG file and a error # # message will be send by e-mail. # # # # Last update : 22.09.2022 # # Version : 1.00 # # # # Author : Klaus Tachtler, <klaus@tachtler.net> # # DokuWiki : http://www.dokuwiki.tachtler.net # # Homepage : http://www.tachtler.net # # # # +----------------------------------------------------------------------+ # # | This program is free software; you can redistribute it and/or modify | # # | it under the terms of the GNU General Public License as published by | # # | the Free Software Foundation; either version 2 of the License, or | # # | (at your option) any later version. | # # +----------------------------------------------------------------------+ # # # # Copyright (c) 2022 by Klaus Tachtler. # # # ############################################################################## ############################################################################## # H I S T O R Y # ############################################################################## # Version : x.xx # # Description : <Description> # # -------------------------------------------------------------------------- # # Version : x.xx # # Description : <Description> # # -------------------------------------------------------------------------- # ############################################################################## ############################################################################## # >>> Please edit following lines for personal command and/or repositorys. ! # ############################################################################## # CUSTOM - Script-Name. SCRIPT_NAME='rsync_archlinux.sh' # CUSTOM - Command-Line. RSYNC_CMDOPTS='-varlHt --progress --delete-after --delay-updates --timeout=300' RSYNC_EXCLUDE='--exclude community-staging/ --exclude community-testing/ --exclude gnome-unstable/ --exclude images/ --exclude iso/ --exclude kde-unstable/ --exclude multilib-staging/ --exclude multilib-testing/ --exclude staging/ --exclude testing/' # CUSTOM - Repository-Mirrors. REPO_SOURCE='ftp.fau.de::archlinux/' REPO_TARGET='/srv/repository/archlinux/' # CUSTOM - Mail-Recipient. MAIL_RECIPIENT='root@example.com' # CUSTOM - Status-Mail [Y|N]. MAIL_STATUS='N' ############################################################################## # >>> Normaly there is no need to change anything below this comment line. ! # ############################################################################## # Variables. RSYNC_COMMAND=$(command -v rsync) TOUCH_COMMAND=$(command -v touch) RM_COMMAND=$(command -v rm) CAT_COMMAND=$(command -v cat) DATE_COMMAND=$(command -v date) MKDIR_COMMAND=$(command -v mkdir) PROG_SENDMAIL=$(command -v sendmail) FILE_LOCK='/tmp/'$SCRIPT_NAME'.lock' FILE_LOG='/var/log/'$SCRIPT_NAME'.log' FILE_LAST_LOG='/tmp/'$SCRIPT_NAME'.log' FILE_MAIL='/tmp/'$SCRIPT_NAME'.mail' VAR_HOSTNAME=$(uname -n) VAR_SENDER='root@'$VAR_HOSTNAME VAR_EMAILDATE=$($DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%Z)') # Functions. function log() { echo "$1" echo "$($DATE_COMMAND '+%Y/%m/%d %H:%M:%S')" " INFO:" "$1" >>"${FILE_LAST_LOG}" } function retval() { if [ ! "$?" ]; then case "$?" in 1) log "ERROR: Syntax or usage error" ;; 2) log "ERROR: Protocol incompatibility" ;; 3) log "ERROR: Errors selecting input/output files, dirs" ;; 4) log "ERROR: Requested action not supported: an attempt was made to manipulate 64-bit files on a platform that cannot support them; or an option was specified that is supported by the client and not by the server." ;; 5) log "ERROR: Error starting client-server protocol" ;; 6) log "ERROR: Daemon unable to append to log-file" ;; 10) log "ERROR: Error in socket I/O" ;; 11) log "ERROR: Error in file I/O" ;; 12) log "ERROR: Error in rsync protocol data stream" ;; 13) log "ERROR: Errors with program diagnostics" ;; 14) log "ERROR: Error in IPC code" ;; 20) log "ERROR: Received SIGUSR1 or SIGINT" ;; 21) log "ERROR: Some error returned by waitpid()" ;; 22) log "ERROR: Error allocating core memory buffers" ;; 23) log "ERROR: Partial transfer due to error" ;; 24) log "ERROR: Partial transfer due to vanished source files" ;; 25) log "ERROR: The --max-delete limit stopped deletions" ;; 30) log "ERROR: Timeout in data send/receive" ;; *) log "ERROR: Unknown error $?" ;; esac fi } function movelog() { $CAT_COMMAND "$FILE_LAST_LOG" >> "$FILE_LOG" $RM_COMMAND -f "$FILE_LAST_LOG" $RM_COMMAND -f "$FILE_LOCK" } function sendmail() { case "$1" in 'STATUS') MAIL_SUBJECT='Status execution '$SCRIPT_NAME' script.' ;; *) MAIL_SUBJECT='ERROR while execution '$SCRIPT_NAME' script !!!' ;; esac $CAT_COMMAND <<MAIL >"$FILE_MAIL" Subject: $MAIL_SUBJECT Date: $VAR_EMAILDATE From: $VAR_SENDER To: $MAIL_RECIPIENT MAIL $CAT_COMMAND "$FILE_LAST_LOG" >> "$FILE_MAIL" $PROG_SENDMAIL -f "$VAR_SENDER" -t "$MAIL_RECIPIENT" < "$FILE_MAIL" $RM_COMMAND -f "$FILE_MAIL" } function error () { # Parameters. CODE_ERROR="$1" sendmail ERROR movelog exit "$CODE_ERROR" } function headerblock () { # Parameters. TEXT_INPUT="$1" LINE_COUNT=68 # Help variables. WORD_COUNT="${#TEXT_INPUT}" CHAR_AFTER=$((LINE_COUNT - WORD_COUNT - 5)) LINE_SPACE=$((LINE_COUNT - 3)) # Format placeholder. if [ "$CHAR_AFTER" -lt "0" ]; then CHAR_AFTER="0" fi printf -v char '%*s' $CHAR_AFTER '' printf -v line '%*s' $LINE_SPACE '' log "+${line// /-}+" log "| $TEXT_INPUT${char// /.} |" log "+${line// /-}+" } function logline () { # Parameters. TEXT_INPUT="$1" TRUE_FALSE="$2" LINE_COUNT=70 # Help variables. WORD_COUNT=${#TEXT_INPUT} CHAR_AFTER=$((LINE_COUNT - WORD_COUNT - 9)) # Format placeholder. if [ "$CHAR_AFTER" -lt "0" ]; then CHAR_AFTER="0" fi printf -v char '%*s' $CHAR_AFTER '' if [ "$TRUE_FALSE" == "true" ]; then log "$TEXT_INPUT${char// /.}[ OK ]" else log "$TEXT_INPUT${char// /.}[FAILED]" fi } function checkcommand () { # Parameters. CHECK_COMMAND="$1" if [ ! -s "$1" ]; then logline "Check if command '$CHECK_COMMAND' was found " false error 10 else logline "Check if command '$CHECK_COMMAND' was found " true fi } # Main. log "" headerblock "Start synchronisation from official repository server (mirror)." log "" log "Run script with following parameter:" log "" log "SCRIPT_NAME...: $SCRIPT_NAME" log "" log "RSYNC_CMDOPTS.: $RSYNC_CMDOPTS" log "RSYNC_EXCLUDE.: $RSYNC_EXCLUDE" log "" log "REPO_SOURCE...: $REPO_SOURCE" log "REPO_TARGET...: $REPO_TARGET" log "" log "MAIL_RECIPIENT: $MAIL_RECIPIENT" log "MAIL_STATUS...: $MAIL_STATUS" log "" # Check if command (file) NOT exist OR IS empty. checkcommand "$RSYNC_COMMAND" checkcommand "$TOUCH_COMMAND" checkcommand "$RM_COMMAND" checkcommand "$CAT_COMMAND" checkcommand "$DATE_COMMAND" checkcommand "$MKDIR_COMMAND" checkcommand "$PROG_SENDMAIL" # Check if LOCK file NOT exist. if [ ! -e "$FILE_LOCK" ]; then logline "Check if script is NOT already runnig " true $TOUCH_COMMAND "$FILE_LOCK" else logline "Check if script is NOT already runnig " false log "" log "ERROR: The script was already running, or LOCK file already exists!" log "" sendmail ERROR movelog exit 20 fi # Check if REPO_TARGET Directory NOT exists. if [ ! -d "$REPO_TARGET" ]; then logline "Check if REPO_TARGET exists " false log "" log " INFO: Creating REPO_TARGET!" log " INFO: --> $REPO_TARGET" log "" $MKDIR_COMMAND -p "$REPO_TARGET" else logline "Check if REPO_TARGET exists " true fi # Start syncing. log "" headerblock "Run synchronizing $SCRIPT_NAME repository " log "" log "$RSYNC_COMMAND $RSYNC_CMDOPTS $RSYNC_EXCLUDE $REPO_SOURCE $REPO_TARGET" eval "$RSYNC_COMMAND" --log-file="$FILE_LAST_LOG" "$RSYNC_CMDOPTS" "$RSYNC_EXCLUDE" "$REPO_SOURCE" "$REPO_TARGET" if [ ! "$?" ]; then retval $? log "" $RM_COMMAND -f "$FILE_LOCK" sendmail ERROR movelog exit 99 else log "" headerblock "End synchronizing $SCRIPT_NAME repository " log "" fi # Finish syncing. headerblock "Finish " log "" # Status e-mail. if [ "$MAIL_STATUS" = 'Y' ]; then sendmail STATUS fi # Move temporary log to permanent log movelog # Normal exit code exit 0
Das Script hat folgende WICHTIGE Merkmale:
- Konfigurierbare Parameter
- Überprüfung ob alle Befehle zur erfolgreichen Ausführung verfügbar sind (Evtl. wichtig für Portierungen)
- Ausführungsschutz, kein doppelte, gleichzeitige Ausführen des Scripts
- Ausgabe von Laufzeitinformationen
- auf dem Bildschirm zur Laufzeit
- als LOG-Datei
- als e-Mail
- e-Mail Benachrichtigung im Fehlerfall
- optional e-Mail Benachrichtigung bei erfolgreicher Ausführung
Nachfolgende Parameter können bzw. sollten im oberen Bereiches des Skripts ggf. angepasst werden:
# CUSTOM - Script-Name. SCRIPT_NAME='rsync_archlinux.sh'
Name des Skripts und auch der Name unter welchem Namen die Log-Dateien mit der Ergänzung .log
gespeichert werden.
# CUSTOM - Command-Line. RSYNC_CMDOPTS='-varlHt --progress --delete-after --delay-updates --timeout=300' RSYNC_EXCLUDE='--exclude community-staging/ --exclude community-testing/ --exclude gnome-unstable/ --exclude images/ --exclude iso/ --exclude kde-unstable/ --exclude multilib-staging/ --exclude multilib-testing/ --exclude staging/ --exclude testing/'
Variablen für den Befehl rsync
-
RSYNC_CMDOPTS
- Steuerungsoptionen für den BefehlRSYNC_EXCLUDE
- Verzeichnisse, welche von der Synchronbisation ausgenommen werden sollen
# CUSTOM - Repository-Mirrors. REPO_SOURCE='ftp.fau.de::archlinux/' REPO_TARGET='/srv/repository/archlinux/'
Angaben für den Befehl rsync
-
REPO_SOURCE
- Woher die Daten trasnferiert bzw. synchronisiert werden sollenREPO_SOURCE
- Wohin z.B. auf dem (lokalen) Datenträger, die Daten gespeichert werden sollen
# CUSTOM - Mail-Recipient. MAIL_RECIPIENT='root@example.com'
E-Mail-Adresse für Benachrichtigungen.
# CUSTOM - Status-Mail [Y|N]. MAIL_STATUS='N'
Schalter für E-Mail Benachrichtigunen auch bei erfolgreichem Abschluss des Skripts versenden.
Einbindung als systemd-Timer-job
Damit das Skript als systemd
-Timer-job eingebunden werden kann, sind zwei Konfigurationsdatei in nachfolgendem Verzeichnis mit nachfolgenden Namen wie folgt zu erstellen:
/etc/systemd/system/rsync_archlinux.sh.service
/etc/systemd/system/rsync_archlinux.sh.timer
/etc/systemd/system/rsync_archlinux.sh.service
Die systemd
-Konfigurationsdatei beinhaltet die Informationen, was durch den systemd
-Timer-job ausgeführt werden soll und benötigt z.B. nachfolgenden Inhalt:
[Unit] Description=Run rsync_archlinux.sh service. [Service] Type=oneshot ExecStart=/usr/local/bin/rsync_archlinux.sh
Hier wird das Skript aufgerufen - vom Typ oneshot
, wobei das hier keine Rolle spielt auch der Typ simple
wäre möglich, da es keine weiteren Abhängigkeiten gibt.
/etc/systemd/system/rsync_archlinux.sh.timer
Die systemd
-Konfigurationsdatei beinhaltet die Informationen, wann und z.B. in welchem Intervall durch den systemd
-Timer-job etwas ausgeführt und benötigt z.B. nachfolgenden Inhalt:
[Unit] Description=Run rsync_archlinux.sh daily timer. [Timer] OnCalendar=*-*-* 3:00:00 Persistent=true [Install] WantedBy=timers.target
Die Ausführung wird hier, einmal am Tag, jeweils um 03:00 Uhr durchgeführt.
Um den systemd
-Timer-job zu aktivieren, ist nachfolgender Befehl erforderlich:
# systemctl enable --now rsync_archlinux.sh.timer Created symlink /etc/systemd/system/timers.target.wants/rsync_archlinux.sh.timer → /etc/systemd/system/rsync_archlinux.sh.timer.
Falls eine Änderung an einer oder auch beiden systemd
-Timer-job-Konfigurationsdateien durchgeführt wurde, können diese mit nachfolgenden Befehlen übernommen werden:
# systemctl daemon-reload # systemctl reenable --now rsync_archlinux.sh.timer Removed "/etc/systemd/system/timers.target.wants/rsync_archlinux.sh.timer". Created symlink /etc/systemd/system/timers.target.wants/rsync_archlinux.sh.timer → /etc/systemd/system/rsync_archlinux.sh.timer.
Eine Auflistung aller systemd
-Timer-jobs, kann mit nachfolgendem Befehl erreicht werden:
# systemctl list-timers --all NEXT LEFT LAST PASSED > Tue 2022-12-20 00:00:00 CET 4h 38min left Mon 2022-12-19 17:27:39 CET 1h 53min > Tue 2022-12-20 03:00:00 CET 7h left Mon 2022-12-19 17:27:39 CET 1h 53min > Tue 2022-12-20 11:59:05 CET 16h left Mon 2022-12-19 19:20:40 CET 48s ago > Tue 2022-12-20 17:38:16 CET 22h left Mon 2022-12-19 17:38:16 CET 1h 43min > Tue 2022-12-20 17:43:16 CET 22h left Mon 2022-12-19 17:43:16 CET 1h 38min > Sat 2022-12-24 05:45:17 CET 4 days left Sat 2022-12-03 09:11:31 CET 2 weeks 2> Mon 2022-12-26 00:00:00 CET 6 days left Mon 2022-12-19 17:27:39 CET 1h 53min > 7 timers listed.
Eine Auflistung eines bestimmten systemd
-Timer-jobs, kann mit nachfolgendem Befehl durchgeführt werden:
# systemctl list-timers rsync_archlinux.sh.timer NEXT LEFT LAST PASSED UN> Tue 2022-12-20 03:00:00 CET 7h left Mon 2022-12-19 17:27:39 CET 1h 55min ago rs> 1 timers listed. Pass --all to see loaded but inactive timers, too.
Der aktuelle Status des systemd
-Timer-jobs, kann wie bei jeder anderen systemd
-Unit auch, wie folgt abgefragt werden:
# systemctl status rsync_archlinux.sh.timer ● rsync_archlinux.sh.timer - Run rsync_archlinux.sh daily timer. Loaded: loaded (/etc/systemd/system/rsync_archlinux.sh.timer; enabled; pre> Active: active (waiting) since Mon 2022-12-19 17:27:39 CET; 1h 56min ago Until: Mon 2022-12-19 17:27:39 CET; 1h 56min ago Trigger: Tue 2022-12-20 03:00:00 CET; 7h left Triggers: ● rsync_archlinux.sh.service Dec 19 17:27:39 vmtest systemd[1]: Started Run rsync_archlinux.sh daily timer..
Auch die entsprechenden systemd
-Journal-Einträge des systemd
-Timer-jobs, kann wie bei jeder anderen systemd
-Unit auch, wie folgt abgefragt werden:
# journalctl -u rsync_archlinux.sh.timer -- Boot 523e2a121a0d420e9693fc99ef6d58ab -- Dec 19 17:27:39 vml040 systemd[1]: Started Run rsync_archlinux.sh daily timer..
Logrotate
Das Script /usr/local/bin/rsync_archlinux.sh
erzeugt eine LOG-Datei mit nachfolgender Bezeichnung und folgendem Speicherort:
/var/log/rsync_archlinux.sh.log
Um das stetige Anwachsen und die Größe dieser LOG-Datei nicht ins unendliche zu treiben, wäre es sinnvoll die LOG-Datei mit Linux-Bordmitteln in regelmäßigen Abständen zu rotieren.
Dies kann durch die Anlage eines neuen, nachstehend gezeigten Scripts, erfolgen. Der Speicherort muss hier:
/etc/logrotate.d
sein und das Script kann folgenden Namen tragen:
rsync_archlinux.sh
Der Inhalt des Scripts /etc/logrotate.d/rsync_archlinux.sh
sieht folgendermaßen aus:
/var/log/rsync_archlinux.sh.log { weekly rotate 4 compress delaycompress missingok notifempty }
Demnach wird die LOG-Datei nach nachfolgenden Regeln rotiert:
weekly
- wöchentlichrotate 4
- die letzten 4 LOG-Dateien sollen jeweils erhalten bleibencompress
- Alte Versionen der LOG-Datei werden komprimiertdelaycompress
- Verschiebt die Kompression der letzten LOG-Datei auf den nächsten Rotationszyklusmissingok
- Das nicht vorhanden sein der LOG-Datei soll zu keinem Fehler führennotifempty
- Nicht rotieren, wenn die LOG-Datei leer ist
Apache Webserver
Nachfolgend soll ein Apache HTTPD Webserver zur Auslieferung des synchronisierten Repositorys verwendet werden.
Dazu ist es erforderlich einen Apache HTTPD Webserver, wie unter nachfolgendem internen Link zu installieren:
/etc/httpd/conf/vhosts/repository.conf
Zusätzlich ist die Einrichtung eines virtuellen Host mit nachfolgender Konfiguration erforderlich. Die Konfigurationsdatei sollte unter nachfolgendem Verzeichnis mit nachfolgendem Namen neu erstellt werden:
# mkdir /etc/httpd/conf/vhosts
# vim /etc/httpd/conf/vhosts/repository.conf
Der Inhalt der so neu erstellten Konfigurationsdatei für den virtuellen Host des Apache HTTPD Webserver könnt in etwa wie folgt aussehen:
<VirtualHost *:80> ServerAdmin webmaster@tachtler.net ServerName repository.tachtler.net ServerPath / # ---------------------------------------------------------- # Rewrite settings # Rewrite the requestet URI - PERMANENT - to HTTPS and leave # this virtual Host to the HTTPS variant of it. # ---------------------------------------------------------- <IfModule rewrite_module> RewriteEngine On RewriteCond "%{HTTPS}" "!=on" RewriteRule "^(.*)$" "https://%{HTTP_HOST}%{REQUEST_URI}" [R=301,L] </IfModule> # ---------------------------------------------------------- # Logging settings # ---------------------------------------------------------- <IfModule log_config_module> ErrorLog /var/log/httpd/repository.tachtler.net_error.log SetEnvIF User-Agent "HAProxy" dontlog=yes SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded=yes <IfModule logio_module> CustomLog /var/log/httpd/repository.tachtler.net_access.log combined_deflate_ssl "expr=(reqenv('forwarded') != 'yes' && reqenv('dontlog') != 'yes')" CustomLog /var/log/httpd/repository.tachtler.net_access.log combined_deflate_proxypass_ssl "expr=(reqenv('forwarded') == 'yes' && reqenv('dontlog') != 'yes')" </IfModule> </IfModule> </IfModule> </VirtualHost> <VirtualHost *:443> ServerAdmin webmaster@tachtler.net ServerName repository.tachtler.net ServerPath / # ---------------------------------------------------------- # SSL settings # ---------------------------------------------------------- <IfModule ssl_module> SSLEngine On SSLCertificateFile /etc/letsencrypt/live/tachtler.net/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/tachtler.net/privkey.pem <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory "/srv/http/cgi-bin"> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-5]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 </IfModule> # ---------------------------------------------------------- # Rewrite settings # Rewrite the requestet URI - PERMANENT - to HTTPS and leave # this virtual Host to the HTTPS variant of it. # ---------------------------------------------------------- <IfModule rewrite_module> RewriteEngine On RewriteCond "%{HTTPS}" "!=on" RewriteRule "^(.*)$" "https://%{HTTP_HOST}%{REQUEST_URI}" [R=301,L] </IfModule> # ---------------------------------------------------------- # Alias settings - The "/" must be at the end! # ---------------------------------------------------------- <IfModule alias_module> Alias /icons/ "/usr/share/httpd/icons/" Alias / "/srv/repository/" </IfModule> # ---------------------------------------------------------- # Directory access settings # URL of https://servername/ # ---------------------------------------------------------- <Directory "/srv/repository"> Options +Indexes +FollowSymLinks AllowOverride None Require all granted </Directory> # ---------------------------------------------------------- # Logging settings # ---------------------------------------------------------- <IfModule log_config_module> ErrorLog /var/log/httpd/repository.tachtler.net_error.log SetEnvIF User-Agent "HAProxy" dontlog=yes SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded=yes <IfModule logio_module> CustomLog /var/log/httpd/repository.tachtler.net_access.log combined_deflate_ssl "expr=(reqenv('forwarded') != 'yes' && reqenv('dontlog') != 'yes')" CustomLog /var/log/httpd/repository.tachtler.net_access.log combined_deflate_proxypass_ssl "expr=(reqenv('forwarded') == 'yes' && reqenv('dontlog') != 'yes')" </IfModule> </IfModule> </VirtualHost>
/etc/httpd/conf/httpd.conf
Damit die zuvor unter
neu erstellte Konfigurationsdatei auch durch den Apache HTTPD Webserver eingelesen wird, ist nachfolgende Ergänzung in der bereits bestehnden Konfigurationsdatei
/etc/httpd/conf/httpd.conf
wie folgt am Ende der Konfigurationsdatei hinzuzufügen:
# Load *.conf files in the "conf/vhost" directory, if any.
IncludeOptional conf/vhost/*.conf
Neustart: Apache HTTPD Webserver
Bevor weitere Konfigurationsschritte erfolgen, sollte ein Neustart erfolgen, was mit nachfolgendem Befehl durchgeführt werden kann:
# systemctl restart httpd.service
HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Start erfolgreich war !
Aufruf: Apache HTTPD Webserver
Jetzt kann durch Aufruf von nachfolgenden URL im Browser das Repository eingesehen werden und somit auch den Zugang zu diesem überprüft werden:
Es sollte eine Ausgabe im Browser in etwa wie nachfolgende zum Vorschein kommen:
Pacman
/etc/pacman.d/mirrorlist
Um vom eigenen gespiegeltenArchLinux-Repository die Paket-Updates zu erhalten, muss die nachfolgende Konfigurationsdatei des ArchLinux-Paketmamnagers Pacman wie folgt angepasst werden:
/etc/pacman.d/mirrorlist
# vim /etc/pacman.d/mirrorlist
################################################################################ ########################### Arch Linux private mirror ########################## ################################################################################ Server = https://repository.tachtler.net/archlinux/$repo/os/$arch