Skip to content

Restic - Ein Backupkonzept

Angeheftet Restic
1 1 1.2k
  • Wie viele, stehe ich auch immer wieder vor dem Problem einige wichtige Daten zu sichern. Mein System sicher ich nicht, nur die Daten unter /home

    Aber, es gibt ja auch wichtige Daten, die man nicht zu Hause speichern möchte. Doch in der Cloud? Nö, das ist nicht mein Stil, da lesen mir zu viele mit 🙂 Ok, also muss man die Daten verschlüsselt irgendwo ablegen. Dafür habe ich auch schon so einige Sachen durch. Boxcryptor, Cryptonator und wie sie alle heißen. Doch irgendwas ist immer, was mich daran stört. In meinem Twitter-Account bin ich doch letztens wieder über Restic gestolpert. Da war doch mal was!?

    Restic - Backuptool vorgestellt

    Armbian - Backupscript mit Restic anlegen

    Die Grundlagen sind also schon erarbeitet. Dann schauen wir uns das nochmal an und erarbeiten ein Konzept um gewisse Daten verschlüsselt auf einem Datenspeicher abzulegen. Los geht's....

    Restic

    Was ist Restic? Mit meinen eigenen Worten, ein Backup-Tool 😋 Gut, es hat keine grafische Oberfläche, es ist ein reines Kommandozeilen-Tool. Es sichert Daten, und diese AES-256 verschlüsselt. Das sollte reichen um die Daten irgendwo außerhalb der eigenen Wohnung zu lagern. (Denkt an das PW, bei einem schlechten PW braucht man auch gar nicht verschlüsseln!)

    Hier die Links zum Projekt:

    GO

    Restic ist in GO geschrieben. GO ist eine Programmiersprache die von Mitarbeitern von Google entwickelt wurde. Mit GO kompiliert man ausführbare Dateien. Hier mal das typische Hello World Beispiel.

    package main
    
    import "fmt"
    
    func main() {
    fmt.Println("Hallo Welt")
    }
    

    Der Link zum Projekt GO https://golang.org

    Installation GO

    Unter meinem Linux Mint Cinnamon 18.3 gibt es leider kein aktuelles Paket. Das Paket was man installieren kann ist für Restic nicht nutzbar 😠

    go run build.go
    Go 1.6.2 detected, this program requires at least Go 1.8.0
    exit status 1
    

    Ok, das bringt so nix. Also das Paket wieder entfernt, dann müssen wir da anders ran gehen. Also müssen wir das Repository vom Entwickler benutzen.

    sudo add-apt-repository ppa:longsleep/golang-backports
    

    Nach der Eingabe erscheint folgendes:

    Sie sind dabei das folgende PPA hinzuzufügen:
    Golang 1.8 and 1.9 PPA for Ubuntu 16.04 Xenial
    Mehr Informationen: https://launchpad.net/~longsleep/+archive/ubuntu/golang-backports
    Zum Fortfahren bitte Eingabetaste drücken oder Strg+C zum Abbrechen
    

    Danach ein

    apt-get update
    apt-get install golang-go
    

    Nach der Installation eben die Version checken.

    go version
    go version go1.9.4 linux/amd64
    

    Gut, damit haben wir die Grundvoraussetzung für Restic erst mal auf dem System. Nun können wir uns das aktuelle Restic halt selber bauen.

    Wenn man mal mit dem o.g. Probleme hat, kann man sich hier fertige Pakete runterladen.
    https://golang.org/dl/

    Installation Restic

    Wir holen uns mal eben das Programm von Github.

    git clone https://github.com/restic/restic
    

    Danach ins Verzeichnis wechseln

    cd restic
    

    Und nun bauen wir

    go run build.go
    

    Nach Beendigung kopieren wir uns das Programm nach /usr/bin damit wir es von überall aufrufen können.

    sudo cp restic /usr/bin
    

    Nun bekommen wir beim Aufruf von Restic die Hilfe angezeigt.

    restic
    
    restic is a backup program which allows saving multiple revisions of files and
    directories in an encrypted repository stored on different backends.
    
    Usage:
    restic [command]
    
    Available Commands:
    backup Create a new backup of files and/or directories
    cat Print internal objects to stdout
    check Check the repository for errors
    diff Show differences between two snapshots
    dump Print a backed-up file to stdout
    find Find a file or directory
    forget Remove snapshots from the repository
    generate Generate manual pages and auto-completion files (bash, zsh)
    help Help about any command
    init Initialize a new repository
    key Manage keys (passwords)
    list List objects in the repository
    ls List files in a snapshot
    migrate Apply migrations
    mount Mount the repository
    prune Remove unneeded data from the repository
    rebuild-index Build a new index file
    restore Extract the data from a snapshot
    snapshots List all snapshots
    tag Modify tags on snapshots
    unlock Remove locks other processes created
    version Print version information
    
    Flags:
    --cacert stringSlice path to load root certificates from (default: use system certificates)
    --cache-dir string set the cache directory
    --cleanup-cache auto remove old cache directories
    -h, --help help for restic
    --json set output mode to JSON for commands that support it
    --limit-download int limits downloads to a maximum rate in KiB/s. (default: unlimited)
    --limit-upload int limits uploads to a maximum rate in KiB/s. (default: unlimited)
    --no-cache do not use a local cache
    --no-lock do not lock the repo, this allows some operations on read-only repos
    -o, --option key=value set extended option (key=value, can be specified multiple times)
    -p, --password-file string read the repository password from a file (default: $RESTIC_PASSWORD_FILE)
    -q, --quiet do not output comprehensive progress report
    -r, --repo string repository to backup to or restore from (default: $RESTIC_REPOSITORY)
    --tls-client-cert string path to a file containing PEM encoded TLS client certificate and private key
    
    Use "restic [command] --help" for more information about a command.
    

    Somit können wir nun das Backup-Tool einsetzen.

    Backup einrichten

    Um ein Backup einzurichten, müssen wir folgenden Befehl eingeben.

    restic -r /tmp/repo init
    enter password for new repository: 
    enter password again: 
    created restic repository c2f4383c89 at /tmp/repo
    

    -r /tmp/repo definiert den Pfad des Backups
    init dient zur Initialisierung des Backups. Danach fragt das Programm das Passwort für das Backup ab!

    Wichtig!

    Please note that knowledge of your password is required to access
    the repository. Losing your password means that your data is
    irrecoverably lost.
    

    Backup anlegen

    Um ein Backup anzulegen wird folgendes eingegeben

    restic -r /tmp/repo backup /home/frank/Bilder
    enter password for repository: 
    password is correct
    scan [/home/frank/Bilder]
    scanned 4 directories, 64 files in 0:00
    [0:00] 100.00%  91.252 MiB / 91.252 MiB  68 / 68 items  0 errors  ETA 0:00 
    duration: 0:00
    snapshot c38a4ceb saved
    

    -r /tmp/repo ist der Pfad zum Backup - Zielverzeichnis
    backup - legt ein Backup von Files /Ordner an
    /home/frank/Bilder ist das Quellverzeichnis welches gesichert werden soll.

    Vor Anlegen des Backups, wird das Passwort abgefragt, wenn das richtig ist geht's los. Es kommen einige Ausgaben was passiert und am Ende die Zeile

    snapshot c38a4ceb saved
    

    die uns anzeigt, das das Backup (Snapshot) unter dem Namen c38a4ceb angelegt wurde.

    Backup's auflisten

    Ein Backup kann viele Snapshot's enthalten. Um mit diesen arbeiten zu können, müssen wir wissen wie der Name lautet. Um diese aufzulisten, gibt es einen Befehl

    restic -r /tmp/repo snapshots
    enter password for repository: 
    password is correct
    ID        Date                 Host           Tags        Directory
    ----------------------------------------------------------------------
    c38a4ceb  2018-02-18 16:47:08  frank-XX-XXXX              /home/frank/Bilder
    ----------------------------------------------------------------------
    1 snapshots
    

    Hier wird der nun bekannte Befehl restic -r /tmp/repo um den Befehl snapshots erweitert. Dieser gibt dann, nachdem wir das korrekte Passwort eingegeben haben, alle Snapshots aus. Im Beispiel gibt es nur einen Snapshot.

    Snapshot wieder herstellen

    Um einen Snapshot wieder herzustellen brauchen wir den Namen (ID) des Snapshots und folgenden Befehl.

    restic -r /tmp/repo restore -t /tmp/restore c38a4ceb
    

    -r /tmp/repo ist der Pfad zum Backup - Zielverzeichnis
    restore Befehl zum Auspacken des Snapshots
    -t /tmp/restore Das Zielverzeichnis (Target)
    c38a4ceb Der Name(ID) des Snapshots

    Restic Hilfe

    Man kann sich zu den einzelnen Befehlen auch eine ausführlichere Hilfe anzeigen lassen.

    restic restore --help
    
    The "restore" command extracts the data from a snapshot from the repository to
    a directory.
    
    The special snapshot "latest" can be used to restore the latest snapshot in the
    repository.
    
    Usage:
      restic restore [flags] snapshotID
    
    Flags:
      -e, --exclude pattern   exclude a pattern (can be specified multiple times)
      -h, --help              help for restore
      -H, --host string       only consider snapshots for this host when the snapshot ID is "latest"
      -i, --include pattern   include a pattern, exclude everything else (can be specified multiple times)
          --path path         only consider snapshots which include this (absolute) path for snapshot ID "latest"
          --tag taglist       only consider snapshots which include this taglist for snapshot ID "latest" (default [])
      -t, --target string     directory to extract data to
    
    Global Flags:
          --cacert stringSlice       path to load root certificates from (default: use system certificates)
          --cache-dir string         set the cache directory
          --cleanup-cache            auto remove old cache directories
          --json                     set output mode to JSON for commands that support it
          --limit-download int       limits downloads to a maximum rate in KiB/s. (default: unlimited)
          --limit-upload int         limits uploads to a maximum rate in KiB/s. (default: unlimited)
          --no-cache                 do not use a local cache
          --no-lock                  do not lock the repo, this allows some operations on read-only repos
      -o, --option key=value         set extended option (key=value, can be specified multiple times)
      -p, --password-file string     read the repository password from a file (default: $RESTIC_PASSWORD_FILE)
      -q, --quiet                    do not output comprehensive progress report
      -r, --repo string              repository to backup to or restore from (default: $RESTIC_REPOSITORY)
          --tls-client-cert string   path to a file containing PEM encoded TLS client certificate and private key
    

    Dort findet man auch den Schalter -t

    Snapshot mounten

    Man kann ein Snapshot auch eben mal schnell mounten.

    mkdir /mnt/restic
    restic -r /tmp/backup mount /mnt/restic
    enter password for repository:
    Now serving /tmp/backup at /mnt/restic
    Don't forget to umount after quitting!
    

    Im nächsten Teil werden wir einen bestimmten Ordner automatisch sichern und das Ganze automatisieren, so das wir uns nicht mehr drum kümmern müssen.

    https://forum.frank-mankel.org/topic/27/restic-ein-backupkonzept-automatisieren

  • FrankMF FrankM hat dieses Thema am angepinnt
  • 0 Stimmen
    1 Beiträge
    14 Aufrufe
    Niemand hat geantwortet
  • Crowdsec - Ein fail2ban Ersatz?

    Linux crowdsec linux fail2ban
    2
    1
    0 Stimmen
    2 Beiträge
    954 Aufrufe
    FrankMF
    Ich kann jetzt hier von meiner ersten Erfahrung berichten und wie CrowdSec mich gebannt hat Was war passiert? Ich war gestern sehr intensiv mit der Konfiguration von Nextcloud <-> Collabora Online beschäftigt. Nachdem ich irgendwie nicht weiterkam habe ich mich der Erstellung eines Dokumentes gewidmet. Nach einiger Zeit war die Nextcloud nicht mehr erreichbar. Ok, hatte ich bei der Konfiguration auch schon mal, den Server einmal neugestartet und fertig. Doch jetzt kam es, Server neugestartet - hilft nicht. Gut, schauen wir mal nach, Der SSH Login ging auch nicht Jetzt war guter Rat gefragt. Zu diesem Zeitpunkt ging ich noch davon aus, das auf diesem Server kein CrowdSec installiert war, sondern fail2ban. Und fail2ban hatte eine sehr kurze Bantime vom 10M. Also blieb wohl nur noch das Rescue System von Hetzner. [image: 1694411392066-488866bc-3dcf-4abc-9e98-6107d65aa4c7-grafik.png] Da hatte ich ja so gut wie gar keine Erfahrung mit. Also mal kurz den Nico angetriggert und es kam folgender Link. https://docs.hetzner.com/de/robot/dedicated-server/troubleshooting/hetzner-rescue-system/ Das Laufwerk war schnell bestimmt und schnell nach /tmp gemountet. Danach musste man sich noch mit chroot in diese Umgebung anmelden. chroot-prepare /mnt chroot /mnt Nachdem das klappte, habe ich eben fail2ban disabled. sysmctl disable fail2ban Danach das Rescue beendet. Der Server startete wieder und ich kam wieder per SSH drauf. Puuh. Bei meiner ersten Kontrolle fiel mir was auf root@:~# pstree systemd─┬─2*[agetty] ├─atd ├─cron ├─crowdsec─┬─journalctl │ └─8*[{crowdsec}] ├─crowdsec-firewa───9*[{crowdsec-firewa}] Wie? Da läuft CrowdSec? Da ich dabei bin die Server auf CrowdSec umzustellen, war das wohl hier schon gemacht, aber leider nicht vernünftig. fail2ban hätte mindestens disabled werden müssen und in meiner Dokumentation war das auch nicht enthalten. 6 setzen! CrowdSec besteht ja aus zwei Diensten, CrowdSec und dem Firewall-Bouncer. Der CrowdSec Dienst lief aber nicht, der war irgendwie failed. Ok, starten wir ihn und schauen was passiert. Nachdem er gestarte war mal die Banliste angeschaut. cscli decisions list ergab diesen Eintrag. 2551501 │ crowdsec │ Ip:5.146.xxx.xxx │ crowdsecurity/http-crawl-non_statics │ ban │ │ │ 53 │ 1h5m55.391864693s │ 1671 Meine IP war gebannt. Dann wissen wir ja , woher die Probleme kamen. cscli decisions delete --id 2551501 Nach Eingabe war der Ban entfernt. Na gut, aber da ich aktuell immer noch an der richtigen Konfiguration von NC <-> CODE bastel, könnte das ja wieder passieren. Was machen? Kurz gegoogelt. Es gibt eine Whitelist. Aha! /etc/crowdsec/parsers/s02-enrich/whitelists.yaml name: crowdsecurity/whitelists description: "Whitelist events from private ipv4 addresses" whitelist: reason: "private ipv4/ipv6 ip/ranges" ip: - "127.0.0.1" - "::1" - "5.146.XXX.XXX" cidr: - "192.168.0.0/16" - "10.0.0.0/8" - "172.16.0.0/12" # expression: # - "'foo.com' in evt.Meta.source_ip.reverse" Danach den Dienst neustarten. Jetzt hoffen wir mal, das es hilft. Zum Schluss noch was, was mir aufgefallen war und was mich auch sehr verwirrt hatte. CrowdSec hatte wegen einem crowdsecurity/http-crawl-non_statics gebannt. Dadurch konnte ich meine subdomain.<DOMAIN> nicht erreichen. Ok, logisch, wenn der Ban von da ausgeht. Ich konnte aber gleichzeitig eine andere subdomain mit derselben <DOMAIN> auch nicht erreichen. Komplett verwirrte es mich dann, als ich eine andere <DOMAIN> auf dem selben Server erreichen konnte. Und zum Schluss ging auch der SSH nicht. Also, wieder viel gelernt..
  • Restic v0.16.0 released

    Restic restic linux
    1
    0 Stimmen
    1 Beiträge
    140 Aufrufe
    Niemand hat geantwortet
  • Debian 13 - Trixie

    Linux linux debian
    1
    0 Stimmen
    1 Beiträge
    184 Aufrufe
    Niemand hat geantwortet
  • Restic - Passwortübergabe

    Restic restic
    1
    0 Stimmen
    1 Beiträge
    232 Aufrufe
    Niemand hat geantwortet
  • ZFS - Wichtige Befehle

    Linux zfs linux
    3
    0 Stimmen
    3 Beiträge
    887 Aufrufe
    FrankMF
    Heute mal drüber gestolpert, das es auch so was geben kann. root@pve2:~# zpool status pool: pool_NAS state: ONLINE status: Some supported and requested features are not enabled on the pool. The pool can still be used, but some features are unavailable. action: Enable all features using 'zpool upgrade'. Once this is done, the pool may no longer be accessible by software that does not support the features. See zpool-features(7) for details. scan: scrub repaired 0B in 00:20:50 with 0 errors on Sun Apr 13 00:44:51 2025 config: NAME STATE READ WRITE CKSUM pool_NAS ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-WDC_WDS100T1R0A-68A4W0_230520800733 ONLINE 0 0 0 ata-WDC_WDS100T1R0A-68A4W0_230520801376 ONLINE 0 0 0 errors: No known data errors Was machen? Als erstes mal ein Backup angestoßen. Danach root@pve2:~# zpool get all pool_NAS | grep feature pool_NAS feature@async_destroy enabled local pool_NAS feature@empty_bpobj active local pool_NAS feature@lz4_compress active local pool_NAS feature@multi_vdev_crash_dump enabled local pool_NAS feature@spacemap_histogram active local pool_NAS feature@enabled_txg active local pool_NAS feature@hole_birth active local pool_NAS feature@extensible_dataset active local pool_NAS feature@embedded_data active local pool_NAS feature@bookmarks enabled local pool_NAS feature@filesystem_limits enabled local pool_NAS feature@large_blocks enabled local pool_NAS feature@large_dnode enabled local pool_NAS feature@sha512 enabled local pool_NAS feature@skein enabled local pool_NAS feature@edonr enabled local pool_NAS feature@userobj_accounting active local pool_NAS feature@encryption enabled local pool_NAS feature@project_quota active local pool_NAS feature@device_removal enabled local pool_NAS feature@obsolete_counts enabled local pool_NAS feature@zpool_checkpoint enabled local pool_NAS feature@spacemap_v2 active local pool_NAS feature@allocation_classes enabled local pool_NAS feature@resilver_defer enabled local pool_NAS feature@bookmark_v2 enabled local pool_NAS feature@redaction_bookmarks enabled local pool_NAS feature@redacted_datasets enabled local pool_NAS feature@bookmark_written enabled local pool_NAS feature@log_spacemap active local pool_NAS feature@livelist enabled local pool_NAS feature@device_rebuild enabled local pool_NAS feature@zstd_compress enabled local pool_NAS feature@draid enabled local pool_NAS feature@zilsaxattr disabled local pool_NAS feature@head_errlog disabled local pool_NAS feature@blake3 disabled local pool_NAS feature@block_cloning disabled local pool_NAS feature@vdev_zaps_v2 disabled local Das kommt von neuen Funktionen, die zu ZFS hinzugefügt wurden und bei Erstellung des Pools nicht vorhanden waren. Dann upgraden wir mal root@pve2:~# zpool upgrade pool_NAS This system supports ZFS pool feature flags. Enabled the following features on 'pool_NAS': zilsaxattr head_errlog blake3 block_cloning vdev_zaps_v2 Kontrolle root@pve2:~# zpool status pool: pool_NAS state: ONLINE scan: scrub repaired 0B in 00:20:50 with 0 errors on Sun Apr 13 00:44:51 2025 config: NAME STATE READ WRITE CKSUM pool_NAS ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-WDC_WDS100T1R0A-68A4W0_230520800733 ONLINE 0 0 0 ata-WDC_WDS100T1R0A-68A4W0_230520801376 ONLINE 0 0 0 errors: No known data errors Features kontrollieren root@pve2:~# zpool get all pool_NAS | grep feature pool_NAS feature@async_destroy enabled local pool_NAS feature@empty_bpobj active local pool_NAS feature@lz4_compress active local pool_NAS feature@multi_vdev_crash_dump enabled local pool_NAS feature@spacemap_histogram active local pool_NAS feature@enabled_txg active local pool_NAS feature@hole_birth active local pool_NAS feature@extensible_dataset active local pool_NAS feature@embedded_data active local pool_NAS feature@bookmarks enabled local pool_NAS feature@filesystem_limits enabled local pool_NAS feature@large_blocks enabled local pool_NAS feature@large_dnode enabled local pool_NAS feature@sha512 enabled local pool_NAS feature@skein enabled local pool_NAS feature@edonr enabled local pool_NAS feature@userobj_accounting active local pool_NAS feature@encryption enabled local pool_NAS feature@project_quota active local pool_NAS feature@device_removal enabled local pool_NAS feature@obsolete_counts enabled local pool_NAS feature@zpool_checkpoint enabled local pool_NAS feature@spacemap_v2 active local pool_NAS feature@allocation_classes enabled local pool_NAS feature@resilver_defer enabled local pool_NAS feature@bookmark_v2 enabled local pool_NAS feature@redaction_bookmarks enabled local pool_NAS feature@redacted_datasets enabled local pool_NAS feature@bookmark_written enabled local pool_NAS feature@log_spacemap active local pool_NAS feature@livelist enabled local pool_NAS feature@device_rebuild enabled local pool_NAS feature@zstd_compress enabled local pool_NAS feature@draid enabled local pool_NAS feature@zilsaxattr enabled local pool_NAS feature@head_errlog active local pool_NAS feature@blake3 enabled local pool_NAS feature@block_cloning enabled local pool_NAS feature@vdev_zaps_v2 enabled local So, alle neuen Features aktiviert. Jetzt kann der Pool weiterhin seine Arbeit machen.
  • Kopia - HTTP/S Server

    Verschoben Kopia kopia linux
    3
    2
    0 Stimmen
    3 Beiträge
    2k Aufrufe
    FrankMF
    Ich hatte ein paar Probleme, die ich mir teilweise nicht erklären kann Ich möchte den Kopia Server gerne über systemd steuern. SystemD [Unit] Description=Kopia Server After=syslog.target After=network.target [Service] Type=simple User=kopia Group=kopia ExecStart=/usr/bin/kopia server --tls-cert-file /home/kopia-server/fullchain.pem --tls-key-file /home/kopia-server/privkey.pem --htpasswd-file /home/kopia-server/.htpasswd --address <IPv4>:51515 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target Danach systemctl daemon-reload systemctl start kopia-server Mit systemctl status kopia-server kann man sich den Status anzeigen lassen. Client Rechner Auf dem Client, der das Backup zum Server schicken soll, machen wir dann folgendes. USER@HOSTNAME:~$ kopia repo connect server --url=https://<DOMAIN>:51515 --override-username=USER --override-hostname=HOSTNAME Enter password to open repository: Connected to repository API Server. NOTICE: Kopia will check for updates on GitHub every 7 days, starting 24 hours after first use. To disable this behavior, set environment variable KOPIA_CHECK_FOR_UPDATES=false Alternatively you can remove the file "/home/frank/.config/kopia/repository.config.update-info.json". Danach steht die Verbindung und wir können Backups hochschieben. kopia snapshot create $HOME Damit wird das Homeverzeichnis gesichert. Das initiale Backup, hat 30 Minuten gebraucht. created snapshot with root kb9e50ff5xxxxxxxxxx265d40a5d0861 and ID cda5c0ffxxxxxxxxxxxxxxa4cb4a367b in 30m28s Ein späteres Backup, sieht so aus. USER@HOSTNAME:~$ kopia snapshot create $HOME Snapshotting USER@HOSTNAME:/home/frank ... * 0 hashing, 51 hashed (324.8 MB), 8524 cached (6.6 GB), 0 uploaded (0 B), 0 errors 100.0% Created snapshot with root kc20a4xxxxxxxxxxxx745c6c7b37c and ID d7a96eaxxxxxxxxxxx0961018eacffa in 3m12s Nach 3 Minuten durch. Zu diesem Zeitpunkt hat sich aber auch nicht wirklich was geändert! Fazit Das Tool macht immer noch einen sehr guten Eindruck. Die Geschwindigkeit ist sehr gut. Die Anleitung ist leider unzureichend. Da gibt es so viele Möglichkeiten, da braucht es sehr lange, bis man da mal durchsteigt. Zum Glück, ist das was man normalerweise braucht, recht überschaubar. Bis zum produktiven Einsatz braucht das aber bei mir noch eine Menge mehr Tests. Was ich noch testen möchte Verzeichnis mounten Backup testweise wieder herstellen (zumindestens teilweise) Der Test läuft mit Standard Einstellungen, also z.B. ohne Kompression. Das sollte man dann auch mal testen.. Bitte achtet auf gleiche Versionen auf dem Clienten, wie auf dem Server. Ich meine da ein paar Probleme festgestellt zu haben...
  • Kernel-Log 4.20

    Linux linux
    1
    0 Stimmen
    1 Beiträge
    342 Aufrufe
    Niemand hat geantwortet