{"id":60,"date":"2025-08-17T13:53:00","date_gmt":"2025-08-17T11:53:00","guid":{"rendered":"https:\/\/blog.phome.at\/?p=60"},"modified":"2025-08-17T19:20:46","modified_gmt":"2025-08-17T17:20:46","slug":"rsnapshot-die-clevere-backup-loesung-fuer-linux-systeme","status":"publish","type":"post","link":"https:\/\/blog.phome.at\/?p=60","title":{"rendered":"RSnapshot: Die clevere Backup-L\u00f6sung f\u00fcr Linux-Systeme"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">RSnapshot ist ein leistungsstarkes und platzsparendes Backup-Tool f\u00fcr Linux-Systeme, das auf bew\u00e4hrten Unix-Tools basiert und dabei eine elegante L\u00f6sung f\u00fcr inkrementelle Backups bietet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist RSnapshot und wie funktioniert es?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">RSnapshot kombiniert die St\u00e4rken mehrerer Unix-Tools zu einer effizienten Backup-Strategie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>RSYNC<\/strong> f\u00fcr den eigentlichen Datentransfer und Synchronisation<\/li>\n\n\n\n<li><strong>Hardlinks<\/strong> (cp -al) f\u00fcr platzsparende inkrementelle Backups &#8211; mehrere Dateinamen zeigen auf dieselbe physische Datei im Dateisystem<\/li>\n\n\n\n<li><strong>Inkrementelle Backups<\/strong> die nur ge\u00e4nderte Dateien \u00fcbertragen, aber vollst\u00e4ndige Snapshot-Verzeichnisse erstellen<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Das Geniale an RSnapshot: Obwohl jeder Snapshot wie ein vollst\u00e4ndiges Backup aussieht, werden unver\u00e4nderte Dateien durch Hardlinks referenziert. Ein Hardlink ist dabei ein zus\u00e4tzlicher Dateiname der auf dieselben Datenbl\u00f6cke im Dateisystem zeigt &#8211; die Datei existiert physisch nur einmal, kann aber unter verschiedenen Namen und Pfaden erreicht werden. Erst wenn eine Datei tats\u00e4chlich ge\u00e4ndert wird, erstellt RSnapshot eine echte Kopie, w\u00e4hrend alle anderen &#8222;Kopien&#8220; weiterhin als Hardlinks auf die urspr\u00fcnglichen Daten zeigen. Dadurch ben\u00f6tigt ein neuer Snapshot nur den Speicherplatz der tats\u00e4chlich ge\u00e4nderten Dateien.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Installation unter Debian\/Ubuntu ist denkbar einfach:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get update\nsudo apt-get install rsnapshot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das Hauptkonfigurationsfile befindet sich unter <code>\/etc\/rsnapshot.conf<\/code>. F\u00fcr mehrere Backup-Jobs k\u00f6nnen separate Konfigurationsdateien erstellt werden (z.B. <code>\/etc\/rsnapshot-nextcloud.conf<\/code>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Konfiguration<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Grundkonfiguration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hier die wichtigsten Konfigurationsparameter:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em># Basis-Verzeichnis f\u00fcr alle Snapshots<\/em>\nsnapshot_root   \/mnt\/backup\/snapshots\/\n\n<em># WICHTIG: Verhindert Backup-Erstellung wenn Ziel nicht gemountet<\/em>\nno_create_root  1\n\n<em># Aufbewahrungsrichtlinien - wie lange werden Snapshots aufbewahrt?<\/em>\nretain  daily   365    <em># 365 t\u00e4gliche Backups (ca. 1 Jahr)<\/em>\n<em>#retain weekly  52     # 52 w\u00f6chentliche Backups (1 Jahr)<\/em>\n<em>#retain monthly 12     # 12 monatliche Backups (1 Jahr)<\/em>\n\n<em># Logging und Verbosity<\/em>\nverbose         2\nloglevel        5\nlogfile         \/var\/log\/rsnapshot.log\n\n<em># Wiederholung bei SSH-Verbindungsproblemen<\/em>\nrsync_numtries  100<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtiger Hinweis zu <code>no_create_root<\/code><\/strong>: Diese Option ist essentiell! Ohne sie w\u00fcrde RSnapshot bei nicht-gemounteten Backup-Zielen im lokalen Verzeichnis Backups erstellen &#8211; ein h\u00e4ufiger und gef\u00e4hrlicher Fallstrick.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Passwortlose SSH-Authentifizierung f\u00fcr Remote-Backups einrichten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bevor wir ein automatisiertes Remote-Backup aufsetzen, m\u00fcssen wir daf\u00fcr sorgen, dass sich der Backup-Server ohne Passwortabfrage mit dem Zielserver verbinden kann. Daf\u00fcr richten wir eine <strong>passwortlose SSH-Authentifizierung<\/strong> ein.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. SSH-Konfigurationsdatei anlegen<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">In der Datei <code>~\/.ssh\/config<\/code> k\u00f6nnen wir eigene Verbindungsprofile definieren. Das macht den Umgang mit SSH deutlich einfacher, da wir uns nicht jedes Mal IP-Adresse, Port oder Benutzer merken m\u00fcssen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Host phils-pve\n    HostName 192.168.1.100\n    User backup-user\n    Port 22\n    IdentityFile ~\/.ssh\/backup_rsa\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd0d Was bedeutet das?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Host phils-pve<\/strong><br>Das ist ein Alias, den wir uns frei aussuchen. Statt jedes Mal die IP-Adresse einzugeben, reicht sp\u00e4ter <code>ssh phils-pve<\/code>.<\/li>\n\n\n\n<li><strong>HostName 192.168.1.100<\/strong><br>Die tats\u00e4chliche IP-Adresse oder Domain des Zielservers.<\/li>\n\n\n\n<li><strong>User backup-user<\/strong><br>Der Benutzer, mit dem wir uns am Zielserver anmelden.<\/li>\n\n\n\n<li><strong>Port 22<\/strong><br>Standardport f\u00fcr SSH (kann angepasst werden, falls der Server auf einem anderen Port lauscht).<\/li>\n\n\n\n<li><strong>IdentityFile ~\/.ssh\/backup_rsa<\/strong><br>Hier geben wir an, welcher SSH-Schl\u00fcssel f\u00fcr die Anmeldung genutzt wird.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">2. SSH-Key auf den Zielserver kopieren<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Damit wir uns ohne Passwort anmelden k\u00f6nnen, m\u00fcssen wir unseren <strong>\u00f6ffentlichen Schl\u00fcssel<\/strong> auf den Zielserver \u00fcbertragen. Das geht mit einem einzigen Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-copy-id -i ~\/.ssh\/backup_rsa backup-user@192.168.1.100\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Befehl macht Folgendes:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Nimmt den \u00f6ffentlichen Schl\u00fcssel (<code>~\/.ssh\/backup_rsa.pub<\/code>).<\/li>\n\n\n\n<li>Meldet sich beim Zielserver (hier: <code>phils-pve<\/code> (backup-user@192.168.1.100) an.<\/li>\n\n\n\n<li>Wir k\u00f6nnen hier noch nicht einfach phils-pve nehmen weil der Key f\u00fcr die Authentifizierung noch nicht am Remote-System vorhanden ist -&gt; daher backup-user@192.168.1.100<\/li>\n\n\n\n<li>F\u00fcgt den Schl\u00fcssel in die Datei <code>~\/.ssh\/authorized_keys<\/code> des Benutzers <code>backup-user<\/code> ein.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Ab jetzt reicht ein einfaches:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh phils-pve\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2013 und die Verbindung wird ohne Passwort aufgebaut, da die Authentifizierung \u00fcber den privaten Schl\u00fcssel auf der Quellmaschine funktioniert.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Warum ist das wichtig f\u00fcr Backups?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Automatisierte Backups laufen meist \u00fcber Cronjobs oder Backup-Skripte. W\u00fcrde jedes Mal ein Passwort verlangt werden, w\u00e4re das unpraktisch oder gar nicht umsetzbar. Mit der Schl\u00fcssel-basierten Authentifizierung sorgen wir daf\u00fcr, dass die Verbindung sicher und ohne Benutzereingriff aufgebaut wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Aufbewahrungsrichtlinien verstehen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die <code>retain<\/code>-Direktiven definieren, wie viele Snapshots jeder Kategorie aufbewahrt werden:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>retain  daily   365    <em># H\u00e4lt 365 t\u00e4gliche Snapshots (daily.0 bis daily.364)<\/em>\nretain  weekly  52     <em># H\u00e4lt 52 w\u00f6chentliche Snapshots (weekly.0 bis weekly.51)  <\/em>\nretain  monthly 12     <em># H\u00e4lt 12 monatliche Snapshots (monthly.0 bis monthly.11)<\/em><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtiges Verhalten<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jede Ebene &#8222;rotiert&#8220; automatisch &#8211; das \u00e4lteste Backup wird gel\u00f6scht wenn die maximale Anzahl erreicht wird<\/li>\n\n\n\n<li>Higher-Level Snapshots (weekly, monthly) werden aus lower-level Snapshots (daily) erstellt<\/li>\n\n\n\n<li>Du musst f\u00fcr jede Ebene einen separaten Crontab-Eintrag erstellen<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Beispiel einer mehrstufigen Strategie<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>T\u00e4glich<\/strong>: Letzte 30 Tage f\u00fcr schnelle Wiederherstellung<\/li>\n\n\n\n<li><strong>W\u00f6chentlich<\/strong>: Letzte 12 Wochen f\u00fcr mittelfristige Historie<\/li>\n\n\n\n<li><strong>Monatlich<\/strong>: Letzte 12 Monate f\u00fcr Langzeitarchivierung<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em># Remote-Backup (SSH-Host aus ~\/.ssh\/config)<\/em>\nbackup  phils-pve:\/etc\/                    .\/pve\/\n\n<em># Lokales Backup<\/em>\nbackup  \/mnt\/nextcloud-backup\/next-config\/  .\/nextcloud\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtig<\/strong>: Die Zielpfade (z.B. <code>.\/pve\/<\/code>, <code>.\/nextcloud\/<\/code>) sind relativ zum <code>snapshot_root<\/code>. Das bedeutet, die Backups landen in <code>\/mnt\/backup\/snapshots\/pve\/<\/code> bzw. <code>\/mnt\/backup\/snapshots\/nextcloud\/<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Crontab-Automation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Automatische Backups werden \u00fcber Crontab eingerichtet:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em># T\u00e4glich um 2:00 Uhr<\/em>\n0 2 * * * \/usr\/bin\/rsnapshot -c \/etc\/rsnapshot-nextcloud.conf daily\n\n<em># W\u00f6chentlich sonntags um 1:00 Uhr<\/em>\n0 1 * * 0 \/usr\/bin\/rsnapshot -c \/etc\/rsnapshot-nextcloud.conf weekly<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Tipp<\/strong>: Falls die Crontab-Syntax verwirrend ist, hilft <a href=\"https:\/\/crontab.guru\/\">crontab.guru<\/a> beim Verstehen der Zeitangaben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Backup-Struktur verstehen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">RSnapshot erstellt eine klare, chronologische Verzeichnisstruktur:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@nextbkp:\/mnt\/rsnapshot-test<em># ls -la<\/em>\ntotal 24\ndrwxr-xr-x 15 root root 15 Jan 25  2025 .\ndrwxr-xr-x  9 root root  9 Aug  4 22:08 ..\ndrwxr-xr-x  3 root root  3 Jan 25  2025 daily.0\ndrwxr-xr-x  3 root root  3 Jan 24  2025 daily.1\ndrwxr-xr-x  3 root root  3 Jan 15  2025 daily.10\ndrwxr-xr-x  3 root root  3 Jan 14  2025 daily.11\ndrwxr-xr-x  3 root root  3 Jan 23  2025 daily.2\ndrwxr-xr-x  3 root root  3 Jan 22  2025 daily.3\ndrwxr-xr-x  3 root root  3 Jan 21  2025 daily.4\ndrwxr-xr-x  3 root root  3 Jan 20  2025 daily.5\ndrwxr-xr-x  3 root root  3 Jan 19  2025 daily.6\ndrwxr-xr-x  3 root root  3 Jan 18  2025 daily.7\ndrwxr-xr-x  3 root root  3 Jan 17  2025 daily.8\ndrwxr-xr-x  3 root root  3 Jan 16  2025 daily.9\ndrwxr-xr-x  3 root root  3 Jan 12  2025 weekly.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtige Regel<\/strong>: <code>daily.0<\/code> ist immer das neueste Backup. Bei jedem neuen Backup wird die Nummerierung rotiert (daily.0 \u2192 daily.1 \u2192 daily.2, usw.).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Konfiguration testen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vor dem produktiven Einsatz sollte die Konfiguration getestet werden:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em># Konfiguration auf Syntax-Fehler pr\u00fcfen<\/em>\nrsnapshot configtest\n\n<em># Testlauf ohne tats\u00e4chliches Backup (Dry-run)<\/em>\nrsnapshot -t daily\n\n<em># Mit spezifischer Konfigurationsdatei<\/em>\nrsnapshot -t daily -c \/etc\/rsnapshot-nextcloud.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der <code>-t<\/code> Parameter zeigt genau an, welche Befehle ausgef\u00fchrt w\u00fcrden, ohne sie tats\u00e4chlich auszuf\u00fchren &#8211; ideal zum Debuggen und Verifizieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">RSnapshot bietet eine elegante L\u00f6sung f\u00fcr das Backup-Problem: Es kombiniert die Einfachheit und Zuverl\u00e4ssigkeit bew\u00e4hrter Unix-Tools mit moderner Effizienz. Durch die Nutzung von Hardlinks entstehen scheinbar vollst\u00e4ndige Backups, die aber nur minimal zus\u00e4tzlichen Speicherplatz ben\u00f6tigen. Die klare Verzeichnisstruktur und die flexible Konfiguration machen RSnapshot zu einem idealen Tool sowohl f\u00fcr kleine Heimserver als auch f\u00fcr gr\u00f6\u00dfere Infrastrukturen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit der richtigen Konfiguration und regelm\u00e4\u00dfigen Tests ist RSnapshot ein zuverl\u00e4ssiger Partner f\u00fcr eine solide Backup-Strategie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>RSnapshot ist ein leistungsstarkes und platzsparendes Backup-Tool f\u00fcr Linux-Systeme, das auf bew\u00e4hrten Unix-Tools basiert und dabei eine elegante L\u00f6sung f\u00fcr inkrementelle Backups bietet. Was ist RSnapshot und wie funktioniert es? RSnapshot kombiniert die St\u00e4rken mehrerer Unix-Tools zu einer effizienten Backup-Strategie: Das Geniale an RSnapshot: Obwohl jeder Snapshot wie ein vollst\u00e4ndiges Backup aussieht, werden unver\u00e4nderte Dateien [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,3,4],"tags":[],"class_list":["post-60","post","type-post","status-publish","format-standard","hentry","category-backup","category-home-server","category-linux"],"_links":{"self":[{"href":"https:\/\/blog.phome.at\/index.php?rest_route=\/wp\/v2\/posts\/60","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.phome.at\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.phome.at\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.phome.at\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.phome.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=60"}],"version-history":[{"count":3,"href":"https:\/\/blog.phome.at\/index.php?rest_route=\/wp\/v2\/posts\/60\/revisions"}],"predecessor-version":[{"id":101,"href":"https:\/\/blog.phome.at\/index.php?rest_route=\/wp\/v2\/posts\/60\/revisions\/101"}],"wp:attachment":[{"href":"https:\/\/blog.phome.at\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=60"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.phome.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=60"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.phome.at\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=60"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}