Hallo zusammen,

ich möchte gerne mein selektives Backupskript für /home/$USER etwas schlanker machen und 7zip dazu verwenden.

Bisher hatte ich mit tar die gewünschten Files/Folders/Subfolders mittels der Listen backup_exc und backup_inc ausgewählt und das ganze dann von 7zip komprimieren lassen:
tar -cf - $BACKUP_DIR/$NAME -X /home/htpc/infos/backup/backup_exc -T /home/htpc/infos/backup/backup_inc | 7za a $BACKUP_DIR/$NAME.tar.7z
Das Skript funktioniert fast wie ich es haben will, alle Pfade und Nutzerrechte werden korrekt übernommen, allerdings ist die fertige Backupdatei doppelt gepackt, also in der 7z Datei ist dann noch eine Tar Datei.

Das möchte ich ändern indem ausschliesslich 7zip verwendet wird:
7z a /home/htpc/dok.7z -xr@/home/htpc/temp/bck.exc -ir@/home/htpc/temp/bck.inc

Probleme dabei sind:

  1. Die Datei bck.exc wird nicht verarbeitet/beachtet (alles aus bck.inc wird komprimiert)

  2. Filenames/Foldernames die doppelt sind führen zum Abbruch des Skripts z.B. bei den Pfaden:
    /home/htpc/.config/evolution
    /home/htpc/.local/share/evolution

Kommt diese Fehlermeldung:

ERROR:
Duplicate filename on disk:
evolution
evolution

Wenn ich an das Ende der Pfadangabe ein \setze, kommt keine Fehlermeldung aber der Pfadinhalt wird einfach ausgelassen (nicht mit komprimiert).

  1. Die Pfade aller Files+Folders werden nicht übernommen, alles befindet sich ohne Subfolders in der 7zip Datei.

Kann mir jemand Tipps geben, wie ich 7zip dazu bringe:

  1. die Selektion zu beachten
  2. die Pfade zu übernehmen
  3. die doppelten filenames trotzdem mit zu komprimieren?

Vielleicht hat jemand eine Idee wie ich das mit 7zip realisieren kann?

Kommen in den Include- und Exclude-Dateien Wildcards vor? Möglicherweise sind die beiden Dateien nicht disjunkt. Ich vermute aber, dass man hier nicht sowohl includieren als auch exkluideren kann sonndern mit Pipes arbeiten muss.

Die a-Option von 7z har noch eine Unteroption x, die laut Manpage Archive excludieren soll. Vielleicht verhindert das das doppelte Einpacken.

Aber so richtig kommen wir hier nur weiter, wenn du uns das Skript zeigst.

Hallo Stefan,

die *.inc und *.exc Dateien enthalten zeilenweise Pfadangaben zu Files/Folders/Subfolders, keine wildcards.
Beispiel das ist die bck.exc:
/home/htpc/Dokumente/MRT-LWS-Befund_15.07.2021
/home/htpc/Dokumente/Messe
/home/htpc/Dokumente/uld

Das bisher genutzte Skript funktioniert sehr gut:
#!/bin/sh
DATE=$(date +%d.%B.%Y@%H-%M-%S-Uhr)
NAME="nvme0n1p4-backup-$DATE"
BACKUP_DIR="/home/$USER/mntpoints/backups"
sudo mount /dev/nvme0n1p3 /home/htpc/mntpoints/debian2
cp -r -u /home/htpc/mntpoints/debian2/home/htpc/Downloads/ /home/htpc/auszuege
sudo mount /dev/sda4 /home/htpc/mntpoints/backups
tar -cf - $BACKUP_DIR/$NAME -X /home/htpc/infos/backup/backup_exc -T /home/htpc/infos/backup/backup_inc | 7za a -t7z -si -mhe -pPASSWORD $BACKUP_DIR/$NAME.tar.7z
sudo umount /dev/nvme0n1p3
sudo umount /dev/sda4
rm -r /home/htpc/auszuege

Ich möchte gerne auf den Zwischenschritt mit tar verzichten und nur 7zip nutzen.

  • Martin-MS hat auf diesen Beitrag geantwortet.

    fdell Ich möchte gerne auf den Zwischenschritt mit tar verzichten und nur 7zip nutzen.

    7z ist für Sicherungsaufgaben ungeeignet, weil die Eigentümerinformationen auf der Strecke bleiben. Warum verwendest du nicht einfach tar mit einer seiner Kompressionsalgorithmen?

    • fdell hat auf diesen Beitrag geantwortet.

      Martin-MS Das Skript verwendet genau deshalb Tar (und um die Auswahllisten zu verarbeiten) und übergibt die fertige Tar-Datei an 7zip zur Verschlüsselung und Komprimierung (7z bietet eine stärkere Komprimierung als tar.gz oder tar.xz).

      Das solltest du dann auch so beibehalten, denn die Archivierung nur mit 7z unter Umgehung von tar führt dazu, dass der ursprüngliche Eigentümer und die Gruppe nicht in die Sicherung aufgenommen wird. Damit ist 7z für eine korrekte Systemwiederherstellung nicht zu gebrauchen, so wie es auch die manpage dokumentiert.

      • fdell hat auf diesen Beitrag geantwortet.

        Es soll ja nur das Home gesichert werden, da ist der Eigentümer üblicherweise der User selbst.

        find /home/$USER -not -uid $UID

        Wenn die Liste leer ist kann mans - in diesem speziellen Fall - ignorieren.

        Trotzdem sollte man mit 7z l anschauen was 7z da überhaupt produziert hat. Es kann sein, daß du mit relativen Pfaden arbeiten musst, ansonsten bleibt die Ordnerstruktur nicht vollständig erhalten.

        Die Manpage ist leider insgesamt etwas dürftig, da bleibt nur ausprobieren.

        Ansonsten könnte man auch über ein inkrementelles Backuptool nachdenken (borg o.ä.). Du wirst dein Home ja öfters sichern müssen. Da ist es effizienter und insgesamt platzsparender, immer nur die neuen Änderungen mitzunehmen.

          frostschutz Es kann sein, daß du mit relativen Pfaden arbeiten musst, ansonsten bleibt die Ordnerstruktur nicht vollständig erhalten.

          Genau so ist es.

          Wenn der komplette Pfad zum Verzeichnis angegeben wird, dann wird nur die Datei ohne Pfadangabe gesichert. Wenn der Pfad absolut, also ohne führenden slash angegeben wird, dann wird der komplette Pfad in das Archiv aufgenommen.

          In dem angegebenen Beispiel müssten die Eintragungen im responsefile also so aussehen:

          home/htpc/.config/evolution
          home/htpc/.local/share/evolution

          und der Sicherungslauf müsste aus dem root (/) durchgeführt werden, damit die Dateien gefunden werden.

          Martin-MS Es geht nur um Dateien aus /home/$USER da wären diese Eigenschaften nicht so relevant. Allerdings kannst du ja mal die Lösung ausprobieren die ich nun gefunden habe, ich meine die Nutzerrechte und auch andere (Datei-) Eigenschaften wie z.B. "Darf als Programm ausgeführt werden", (allerdings nur getestet für /home/$USER) bleiben erhalten, auch die Pfadangaben.

          frostschutz Das stimmt, denn 7zip produziert leider abweichende Ergebnisse (Dateigröße, Dateianzahl) und ich habe keine Ahnung warum. Deshalb bleibe ich dabei mit Tar die Dateisammlung zu erstellen und diese dann per Pipe an 7zip zu übergeben.

          Nun zu der Lösung die ich gefunden habe, diese erlaubt es include und exclude Listen zu verwenden und die Pfade zu behalten. Zumindest für Dateien im /home/$USER Verzeichnis.

          7za a -t7z -spf -mx5 -mhe -pPASSWORD test.7z -xr@/Pfad/zur/exclude/liste/backup_exc -ir@/Pfad/zur/include/liste/backup_inc

          Der Schalter -spf sichert die Pfadangaben. Somit sind die 3 Punkte die ich hatte erfüllt, leider hat frostschutz recht und 7zip produziert unvorhersehbare Ergebnisse was die inkludierte Dateianzahl und fertig komprimierte Dateigröße angeht.

          Wer es genauer nachlesen möchte:
          https://www.dotnetperls.com/7-zip-examples
          https://sevenzip.osdn.jp/chm/cmdline/index.htm
          https://info.nrao.edu/computing/guide/file-access-and-archiving/7zip/7z-7za-command-line-guide
          https://sourceforge.net/p/sevenzip/discussion/45797/

          EDIT:
          Warum die Variante mit 7zip deutlich mehr Ordner und Dateien speichert als die Variante mit Tar ist mir schleierhaft. Ich denke ich werde da noch etwas testen müssen.

          EDIT2:
          Ich glaube ich habs. Es liegt daran, dass die 7z Variante die versteckten Dateien+Ordner
          (die mit einem Punkt beginnen) mitkopiert.