Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:archlinux_-_repository_spiegeln

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:

  • rsync - ist im extras-Repository von ArchLinux enthalten.

Mit nachfolgendem Befehl, wird das Paket rsync installiert:

# pacman --noconfirm -S rsync

Installationsverlauf

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket rsync installiert wurden.

# pacman -Qil rsync

Installationsinhalt

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:

  • logrotate - ist im core-Repository von ArchLinux enthalten.

Mit nachfolgendem Befehl, wird das Paket logrotate installiert:

# pacman --noconfirm -S logrotate

Installationsverlauf

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket logrotate installiert wurden.

# pacman -Qil logrotate

Installationsinhalt

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 Angabe SRPMS/ 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/

Transferverlauf

Script: /usr/local/bin/rsync_archlinux.sh

Mit nachfolgendem Script, kann nun z.B. Zeitgesteuert durch einen systemdTimer-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 Befehl
  • RSYNC_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 sollen
  • REPO_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öchentlich
  • rotate 4 - die letzten 4 LOG-Dateien sollen jeweils erhalten bleiben
  • compress - Alte Versionen der LOG-Datei werden komprimiert
  • delaycompress - Verschiebt die Kompression der letzten LOG-Datei auf den nächsten Rotationszyklus
  • missingok - Das nicht vorhanden sein der LOG-Datei soll zu keinem Fehler führen
  • notifempty - 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:

ArchLinux Repository spiegeln - Browser Aufruf

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
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/archlinux_-_repository_spiegeln.txt · Zuletzt geändert: 2023/01/03 16:03 von klaus