Automatische Sicherung (Beispiel): Unterschied zwischen den Versionen

Aus wiki.archlinux.de
Keine Bearbeitungszusammenfassung
(25 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{inuse|[[Benutzer:Tuxnix|Tuxnix]] ([[Benutzer Diskussion:Tuxnix|Diskussion]])}}
[[Kategorie:Systemverwaltung]]
[[Kategorie:Services]]
[[Kategorie:Tipps und Tricks]]
[[Kategorie:Scripte]]
{{righttoc}}
{{righttoc}}
Dies ist Beispiel und Anleitung für ein automatisches, rotierendes und inkrementelles Backup.
Dies ist Beispiel und Anleitung für ein automatisches, rotierendes und inkrementelles Backup.
Das hier verwendete Skript von Mike Rubbel baut auf dem [[rsync]] Befehl auf und sichert die Daten auf /home.
Das hier verwendete Skript von Mike Rubbel baut auf dem [[rsync]] Befehl auf und sichert die Daten von /home.
[[Systemd/Timers]] werden genutzt um das Backup täglich, wöchentlich und monatlich automatisch vorzunehmen.
[[Systemd/Timers]] werden genutzt um das Backup täglich, wöchentlich und monatlich automatisch vorzunehmen.


Das Skript fand so viel Anklang, dass es in Perl übersetzt und Einzug in den Befehlspool von Linux gehalten hat.
Das Skript entstand 2004 und fand so viel Anklang, dass es in Perl übersetzt wurde und als [[rsnapshot]] Einzug in den Befehlspool von Linux hielt.
Wer den Befehl dem Skript vorzieht kann auch diesen benutzen. Das Endergebnis dürfte jedoch gleich sein da beide rsync zum Speichern der Dateien einsetzen.
Wer den Befehl diesem Skript vorzieht, kann auch diesen benutzen. Das Endergebnis dürfte jedoch gleich sein da beide rsync zum Speichern der Dateien einsetzen.


{{Hinweis|Da die Sicherung auf einer lokalen Festplatte stattfindet, kann sie weder bei Feuer noch bei einem Einbruch vor Datenverlust schützen.
{{Hinweis|Da die Sicherung auf einer lokalen Festplatte stattfindet, kann sie weder bei Feuer noch bei einem Einbruch vor Datenverlust schützen.
Zeile 25: Zeile 19:


=== Die Sicherungs-Festplatte ===
=== Die Sicherungs-Festplatte ===
Einen Datenträger fest in den Rechner einbauen. Bei externen Datenträger sollte die Sicherung besser manuell ausgelöst werden.  
Der Sicherungs-Datenträger sollte fest in den Rechner verbaut werden.
Der Datenträger sollte ausreicht groß sein. Als Format eignet sich ext4. Fat Systeme unterstützen keine Hardlinks.
Der Datenträger sollte ausreichent groß sein. Als Format eignet sich ext4. Fat Systeme unterstützen keine Hardlinks.
Die folgenden Schritte sind als Beispiel zu verstehen. Auch kann statt der hier verwendeten Konsolenbefehlen zur Datenträgereinbindung, mit den GUI Programmen Gparted bzw. KDE Partitionsverwaltung gearbeitet werden.
 
Für die Einbindung externer Sicherung-Datenträger gibt die Seite [[Rdiff-backup]] Anregung.
 
=== Partitionieren ===
Zuerst schaut man, welche Festplatte man überhaupt Partitionieren will:


==== Partitionieren ====
==== 1. Möglichkeit: fdisk ====
$ sudo fdisk -l #listet die Datenträger auf


Bei den folgenden Befehlen muss das X durch den Laufwerksbuchstaben der Sicherung-Festplatte ersetzt werden.
$ sudo fdisk -l      # listet alle Datenträger auf. Hier muss man sich den betreffenden Laufwerksbuchstaben einprägen.
 
Alternativ kann {{ic|lsblk}} verwendet werden:
 
$ lsblk
 
Bei den folgenden Befehl muss jeweils das X durch den Laufwerksbuchstaben der Sicherung-Festplatte ersetzt werden.
 
Falls man mit den Vorschlägen zufrieden ist, einfach die {{ic|Enter-Taste}} drücken drücken.
 
Gegebenfalls {{ic|J}} oder {{ic|n}} eingeben, wenn dies erforderlich ist.
  $ sudo fdisk /dev/sdX
  $ sudo fdisk /dev/sdX
g #Erstellt provisorisch eine neue Partitionstabelle
  m      # listet alle Optionen auf
n #Erstellt provisorisch die neue Partition
  d      # löscht provisorisch eine Partition. Bitte solange wiederholen bis alle vorhandenen Partitionen gelöscht sind.
  w #Schreibt alle Änderungen. Ab hier gibt es keinen Weg mehr zurück.  
  n       # Erstellt provisorisch eine neue Partition
   
 
Nun müssen alle Änderungen durch das Betätigen von {{ic|w}} gespeichert werden.
 
''ACHTUNG'': Danach werden ''alle'' Daten auf der Festplatte ''überschrieben''!
 
  w
 
(Sollte man sich einmal verlaufen haben, kann man mit q jederzeit den fdisk Befehl abbrechen.)
 
==== 2. Möglichkeit gdisk ====
Auch hier müssen wir zuerst schauen, welche Festplatte überhaupt partitioniert werden soll.
 
lsblk
 
liefert beispielsweise
 
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  1,8T  0 disk
├─sda1    8:1    0 886,5G  0 part
└─sda2    8:2    0 976,6G  0 part /windows
sdb      8:16  0 465,8G  0 disk
├─sdb1    8:17  0    16M  0 part
├─sdb2    8:18  0 109,9G  0 part
├─sdb3    8:19  0    1G  0 part /boot
├─sdb4    8:20  0  101G  0 part /
└─sdb20 259:0    0  100G  0 part
sdg      8:96  1  57,3G  0 disk
└─sdg1    8:97  1  57,3G  0 part
sr0      11:0    1  1024M  0 rom
 
Nehmen wir an, wir würden den USB Stick {{ic|sdg}} formatieren wollen.
 
Als erstes wird das mit {{ic|gdisk}} ausgewählt.
 
''HINWEIS:'' '''NICHT''' die Partitionsnummer auswählen, sondern das Gerät an sich! Also '''nicht''' {{ic|/dev/sdg1}} verwenden, sondern {{ic|/dev/sdg}}!
sudo gdisk /dev/sdg1
 
Danach kann man jede Partition durch Eingabe von {{ic|d}} löschen.
 
Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): d
Using 1
Command (? for help):
 
Sollte man mehr als eine Partition auf dem Speichermedium haben, so müssen die Partitionsnummer danach noch eintippen.
 
Wenn alle Partitionen gelöscht wurden, kann man neue Partitionen durch die Eingabe von {{ic|n}} kreieren.
Danach kann die Größe bestimmt werden. Wenn man beispielsweise eine 5GB große Partition erstellen will, kann man als ersten Sektor {{ic|-5G}} einsetzen.
 
Das {{ic|+}} bedeutet, dass er 5 GB ''übrig'' lässt! Da wir stattdessen 5GB ''für'' die Partition geben wollen, wird ein {{ic|-}} benötigt.
 
Danach kann man noch den Typ des Speichermediums eingeben. Hierfür wird als standard das Linuxdateisystem ausgewählt.
 
Das ist nur relevant, wenn man beispielsweise eine Boot-Partition anstatt eine "Speicher"-Partition erstellen möchte.
 
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-120176606, default = 2048) or {+-}size{KMGTP}: -5G
Information: Moved requested sector from 109690846 to 109688832 in
order to align on 2048-sector boundaries.
Use 'l' on the experts' menu to adjust alignment
Last sector (109688832-120176606, default = 120176606) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
  Command (? for help):
 
'''Hinweis:'''
 
Mit {{ic|p}} kann man den aktuellen Stand des USB-Sticks betrachten, sodass man sich versichern kann, dass alles geklappt hat.
 
Command (? for help): p
Disk /dev/sdg: 120176640 sectors, 57.3 GiB
Model: Ultra
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): C823B7F7-D146-477B-B93D-E93975F17030
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 120176606
Partitions will be aligned on 2048-sector boundaries
Total free space is 109688798 sectors (52.3 GiB)
Number  Start (sector)    End (sector)  Size      Code  Name
  1      109688832      120176606  5.0 GiB    8300  Linux filesystem
Command (? for help):
 
Zu guter Letzt muss das alles nur noch auf den Stick, durch das Betätigen von {{ic|w}}, geschrieben werden.
 
{{ic|gdisk}} fragt dafür nochmal nach, ob man sich auch wirklich sicher ist, da es eventuell sein kann, dass man was vergessen hat.
 
Wenn alles passt, die Operation mit {{ic|Y}} bestätigen.
 
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdg.
  The operation has completed successfully.
 
==== Formatieren ====
==== Formatieren ====


mkfs.ext4 -n SICHERUNG /dev/sdX1
Jetzt ist die Partition da, jedoch noch kein Dateisystem.
Die erste Partition auf sdX wird mit ext4 formatiert und bekommt den Namen SICHERUNG.
 
Dafür muss man jedichlich einfach {{ic|mkfs.<Dateisystem>}} verwenden.


==== Festplatte Einbinden ====
Das {{ic|/dev/sdg1}} zeigt diesmal auf die '''Partition''', nicht auf das Speichermedium!


  sudo mkdir SICHERUNG
  [diesen User@I use Arch btw] sudo mkfs.ext4 /dev/sdg1
[sudo] Passwort für diesen User:
mke2fs 1.45.5 (07-Jan-2020)
Ein Dateisystem mit 1310720 (4k) Blöcken und 328320 Inodes wird erzeugt.
UUID des Dateisystems: 2f2dbd1b-b054-49e0-aa10-852fd90764bf
Superblock-Sicherungskopien gespeichert in den Blöcken:
    32768, 98304, 163840, 229376, 294912, 819200, 884736
beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Das Journal (16384 Blöcke) wird angelegt: erledigt
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt
[diesen User@I use Arch btw]


  sudoedit etc/fstab
==== Benennen ====
 
  $ sudo e2label /dev/sdX1 SICHERUNG #Der Datenträger erhält das Label SICHERUNG
 
==== Festplatte Einhängen ====
 
$ sudo mkdir /SICHERUNG #Das Verzeichnis anlegen.
 
$ sudoedit /etc/fstab
und hier folgendes einfügen:
/dev/sdX1 /SICHERUNG ext4 defaults 0 0
Am Ende der Datei muß eine Leerzeile eingefügt werden.
$ sudo mount /dev/sdX1 #Die Festplatte SICHERUNG wird auf /SICHERUNG ins Dateisystem eingebunden.
 
=== Das Backup Skript ===


=== rsync ===
Falls auf dem System noch nicht vorhanden, wird rsync installiert.
Falls auf dem System noch nicht vorhanden, wird rsync installiert.
  sudo pacman -S rsync
  $ sudo pacman -S rsync


=== Das Backup Skript ===
Das folgende Skript wird kopiert und als {{ic|snapshot.sh}} z.B. in {{ic|~/.scripts/}} abgespeichert. Mit einem {{ic|chmod a+rx ~/.scripts/snapshot.sh}} wird es ausführbar gemacht.
Das folgende Skript wird kopiert und als {{ic|snapshot.sh}} z.B. in {{ic|~/scripts/}} abgespeichert und mit {{ic|chmod a+rx ~/scripts/snapshot.sh}} ausführbar gemacht.
Die ''CUSTOMIZING SECTION'' im Skript sollte auf die eigenen Gegebenheiten angepasst werden.
Die ''CUSTOMIZING SECTION'' im Skript sollte auf die eigenen Wünsche und Gegebenheiten angepasst werden. Im diesem Beispiel ist das konkret noch der der Laufwerksbuchstabe der Sicherungs Festplatte anzupassen.  


Die Datei {{ic|snapshot_exclude.txt}} wird ebenfalls kopiert und nach {{ic|~/scripts/}} abgespeichert.
Die Datei {{ic|snapshot_exclude.txt}} wird ebenfalls kopiert und nach {{ic|~/.scripts/}} abgespeichert.
Die in der snapshot_exclude.txt gelisteten Dateien werden von der Sicherung ausgeschlossen.
Alle in der snapshot_exclude.txt gelisteten Dateien und Verzeichnisse werden von einer Sicherung ausgeschlossen.


Danach kann mit folgendem Befehl die Funktion überprüft werden. Das Argument {{ic|-d}} erstellt ein tägliches Backup. Das Backup wird mit Rootrechten ausgeführt.
Danach kann mit folgendem Befehl die Funktion überprüft werden. Das Argument {{ic|-d}} erstellt ein tägliches Backup. Das Backup wird mit Rootrechten ausgeführt.
  sudo ~/scripts/snapshot.sh -d
  $ sudo ~/.scripts/snapshot.sh -d


Bei einem erneuten Aufruf des Befehls erhöht sich der Zähler der jeweils vorangegangenen Sicherungen um 1. Eine dayly-0 Sicherung wird z.B.: in dayly-1 umbenannt, und eine neue dayly-0 Sicherung angelegt. Bei der Angabe von DAYS=6; wird dann jeweils die 7. Sicherung gelöscht, bevor eine neue dayly-0 angelegt wird.  
Bei einem erneuten Aufruf des Befehls erhöht sich der Zähler der jeweils vorangegangenen Sicherungen um 1. Eine dayly.0 Sicherung wird z.B.: in dayly.1 umbenannt, und eine neue dayly.0 Sicherung angelegt. Bei der Angabe von DAYS=6 in der ''CUSTOMIZING SECTION''; wird jeweils die 7. Sicherung gelöscht, bevor eine neue dayly.0 angelegt wird.  
Die wöchentlichen Snapshots werden mit sudo ~/scripts/snapshot.sh -w bzw sudo ~/scripts/snapshot.sh -m ausgelößt.
Die wöchentlichen und monatlichen Snapshots werden mit {{ic|sudo ~/.scripts/snapshot.sh -w}} bzw {{ic|sudo ~/.scripts/snapshot.sh -m}} ausgelöst.
Dabei wird keine neue Sicherung veranlasst, sondern lediglich, und auch nur dann wenn die Anzahl der täglichen Sicherungen komplettiert ist, die älteste der dayly Sicherungen in weekly-0 umbenannt, und auf diese Weise archiviert. Auf diese Weise rotieren die Backups.
Dabei wird keine neue Sicherung veranlasst, sondern lediglich, und auch nur dann wenn die Anzahl der täglichen Sicherungen komplettiert ist, die älteste der daily Sicherungen als weekly.0 kopiert und somit archiviert. Die weekly und monthly backups rotieren in der gleichen Weise wie die dailys.


Das snapshot.sh Script
Das Skript
  <nowiki>#!/bin/bash
  <nowiki>#!/bin/bash
## Datei ~/.scripts/snapshot.sh
##
##
##
##      Mike Rubel 2004.01.04 (http://www.mikerubel.org/computers/rsync_snapshots/)
##      Mike Rubel 2004.01.04 (http://www.mikerubel.org/computers/rsync_snapshots/)
Zeile 138: Zeile 275:
MOUNT_RO=true;                          # For write protection set to true
MOUNT_RO=true;                          # For write protection set to true
SNAPSHOT_RW=/SICHERUNG/;                # where to store the backups - Ziel-Ordner
SNAPSHOT_RW=/SICHERUNG/;                # where to store the backups - Ziel-Ordner
EXCLUDES=/home/scripts/snapshot_exclude.txt;    # Create the backup_exclude file first!
EXCLUDES=/home/<user>.scripts/snapshot_exclude.txt;    # Create the backup_exclude file first!
CHECK_HDMINFREE=true;                  # Check free space
CHECK_HDMINFREE=true;                  # Check free space
HDMINFREE=90;                          # Make a backup up to this percentage
HDMINFREE=90;                          # Make a backup up to this percentage
Zeile 315: Zeile 452:
</nowiki>
</nowiki>


snapshot_exclude.txt
  <nowiki>
  <nowiki>
/home/<user>/.cache/
## Datei ~/.scripts/snapshot_exclude.txt
/home/<user>/.kodi/
##
/home/<user>/.local/share/
<user>/.cache
/home/<user>/.mediathek3/
<user>/.kodi
/home/<user>/.mozilla/
<user>/.local/share
/home/<user>/.tor-browser-de/
<user>/.mediathek3
/home/<user>/.tvbrowser/
<user>/.mozilla
/home/<user>/Videos/
<user>/.tor-browser-de
<user>/.tvbrowser
<user>/Videos
</nowiki>
</nowiki>


=== Die  Service-Units erstellen ===
=== Die  Service-Units erstellen ===
  <nowiki># Datei /etc/systemd/system/snapshot-d.service
  <nowiki>#file /etc/systemd/system/snapshot-d.service


[Unit]
[Unit]
Description=snapshot dayly.service
Description=snapshot daily.service


[Service]
[Service]
ExecStart=/home/<user>/scripts/snapshot.sh -d
ExecStart=/home/<user>/.scripts/snapshot.sh -d
</nowiki>
</nowiki>


Für die wöchentliche und monatliche Sicherung brauchen wir noch entsprechende snapshot-w.service und snapshot-m.service Dateien.
Für die wöchentliche und monatliche Sicherung brauchen wir noch entsprechende snapshot-w.service und snapshot-m.service Dateien.
Das d im der ExecStart= Option ist durch ein w bzw. m zu ersetzen. Bei Description= ist weekly bzw. monthly enzusetzen.
Das -d im der ExecStart= Option ist durch ein -w bzw. -m zu ersetzen. Bei Description= ist weekly bzw. monthly einzusetzen. Alle .service Dateien und auch die nachfolgenden .timer Dateien werden mit Rootrechten nach /etc/systemd/system/ gespeichert.


=== Die Timer-Units erstellen ===
=== Die Timer-Units erstellen ===
 
  <nowiki>#file /etc/systemd/system/snapshot-d.timer
  <nowiki># Datei /etc/systemd/system/snapshot-d.timer


[Unit]
[Unit]
Description=snapshot dayly.timer
Description=snapshot daily.timer


[Timer]
[Timer]
OnBootSec=30min
OnCalendar=daily
OnUnitInactiveSec=1d
RandomizedDelaySec=60
RandomizedDelaySec=60
Persistent=true
Persistent=true
Zeile 358: Zeile 493:
</nowiki>
</nowiki>
Auch hier bedarf es einer weiteren Datei für den wöchentlich und auch einer weiteren Datei für den monatlichen Timer.
Auch hier bedarf es einer weiteren Datei für den wöchentlich und auch einer weiteren Datei für den monatlichen Timer.
Das OnUnitInactiveSec= wird dann den Wert 1w bwz. 1m zugewiesen.
Die Dateien werden entsprechend benannt, dem OnCalendar= wird der Wert weekly bwz. monthly zugewiesen.


=== Die Timer aktivieren ===
=== Die Timer aktivieren ===
Zeile 365: Zeile 500:
  systemctl enable --now snapshot-m.timer
  systemctl enable --now snapshot-m.timer


== Siehe auch ==
*[[rsync]]
*[[Rdiff-backup]]
*[[Rsnapshot]]
*[[Backups]]
*[[sudoedit]]
*[[Systemd/Timers]]
*[[Beispiel_eines_vollautomatisierten_Backups]]


=== Weblinks ===
=== Weblinks ===
*[http://www.mikerubel.org/computers/rsync_snapshots/ Mike Rubel rsync_snapshots] {{sprache|en}}
*[http://www.mikerubel.org/computers/rsync_snapshots/ Mike Rubel rsync_snapshots] {{sprache|en}}
*[http://rsnapshot.org/ rsnapshot.org] {{sprache|en}}
*[http://rsnapshot.org/ rsnapshot.org] {{sprache|en}}
*[[rsync]] ArchWiki {{sprache|de}}
*[[Systemd/Timers]] ArchWiki {{sprache|de}}
*[[Backups]] ArchWiki {{sprache|de}}
*[https://wiki.ubuntuusers.de/rsnapshot/ rsnapshot Ubuntuuser] {{sprache|de}}
*[https://wiki.ubuntuusers.de/rsnapshot/ rsnapshot Ubuntuuser] {{sprache|de}}
*[[Rsnapshot]] ArchWiki {{sprache|de}}
*[https://wiki.archlinux.org/index.php/Synchronization_and_backup_programs Backup Programs] ArchWiki {{sprache|en}}
*[https://wiki.archlinux.org/index.php/Synchronization_and_backup_programs backup_programs] ArchWiki {{sprache|us}}
 
*[[Beispiel_eines_vollautomatisierten_Backups]] ArchWiki {{sprache|de}}
[[Kategorie:Systemverwaltung]]
*[[sudoedit]]
[[Kategorie:Services]]
[[Kategorie:Tipps und Tricks]]
[[Kategorie:Scripte]]

Version vom 24. Februar 2020, 12:02 Uhr

Dies ist Beispiel und Anleitung für ein automatisches, rotierendes und inkrementelles Backup. Das hier verwendete Skript von Mike Rubbel baut auf dem rsync Befehl auf und sichert die Daten von /home. Systemd/Timers werden genutzt um das Backup täglich, wöchentlich und monatlich automatisch vorzunehmen.

Das Skript entstand 2004 und fand so viel Anklang, dass es in Perl übersetzt wurde und als rsnapshot Einzug in den Befehlspool von Linux hielt. Wer den Befehl diesem Skript vorzieht, kann auch diesen benutzen. Das Endergebnis dürfte jedoch gleich sein da beide rsync zum Speichern der Dateien einsetzen.

Hinweis: Da die Sicherung auf einer lokalen Festplatte stattfindet, kann sie weder bei Feuer noch bei einem Einbruch vor Datenverlust schützen. Auch wenn bislang Schädlinge mit Administrationsrechten auf Linux sehr unwahrscheinlich sind, muss hier auf diese Gefahr hingewiesen werden.

Als Backup im privaten Bereich leistet es aber gute Dienste. Durch das automatische Sichern stellen Festplattendefekte und versehentliches Löschen keine Gefahr mehr da. Durch das rotierende Verfahren hat man die Möglichkeit, auf mehrere gesicherte Dateiversionen zuzugreifen. Trotzdem bleibt die Datenmenge gering. Rsync speichert die Daten jeweils nur einmal physisch ab und erstellt die einzelnen Schichten mittels Hardlinks. Da die Daten nur ein mal kopiert werden, ist die Geschwindigkeit des backups hervorragend.

Anleitung

Die Sicherungs-Festplatte

Der Sicherungs-Datenträger sollte fest in den Rechner verbaut werden. Der Datenträger sollte ausreichent groß sein. Als Format eignet sich ext4. Fat Systeme unterstützen keine Hardlinks. Die folgenden Schritte sind als Beispiel zu verstehen. Auch kann statt der hier verwendeten Konsolenbefehlen zur Datenträgereinbindung, mit den GUI Programmen Gparted bzw. KDE Partitionsverwaltung gearbeitet werden.

Für die Einbindung externer Sicherung-Datenträger gibt die Seite Rdiff-backup Anregung.

Partitionieren

Zuerst schaut man, welche Festplatte man überhaupt Partitionieren will:

1. Möglichkeit: fdisk

$ sudo fdisk -l      # listet alle Datenträger auf. Hier muss man sich den betreffenden Laufwerksbuchstaben einprägen.

Alternativ kann lsblk verwendet werden:

$ lsblk

Bei den folgenden Befehl muss jeweils das X durch den Laufwerksbuchstaben der Sicherung-Festplatte ersetzt werden.

Falls man mit den Vorschlägen zufrieden ist, einfach die Enter-Taste drücken drücken.

Gegebenfalls J oder n eingeben, wenn dies erforderlich ist.

$ sudo fdisk /dev/sdX
  m       # listet alle Optionen auf
  d       # löscht provisorisch eine Partition. Bitte solange wiederholen bis alle vorhandenen Partitionen gelöscht sind.
  n       # Erstellt provisorisch eine neue Partition

Nun müssen alle Änderungen durch das Betätigen von w gespeichert werden.

ACHTUNG: Danach werden alle Daten auf der Festplatte überschrieben!

  w 

(Sollte man sich einmal verlaufen haben, kann man mit q jederzeit den fdisk Befehl abbrechen.)

2. Möglichkeit gdisk

Auch hier müssen wir zuerst schauen, welche Festplatte überhaupt partitioniert werden soll.

lsblk

liefert beispielsweise

NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda       8:0    0   1,8T  0 disk
├─sda1    8:1    0 886,5G  0 part
└─sda2    8:2    0 976,6G  0 part /windows
sdb       8:16   0 465,8G  0 disk
├─sdb1    8:17   0    16M  0 part
├─sdb2    8:18   0 109,9G  0 part
├─sdb3    8:19   0     1G  0 part /boot
├─sdb4    8:20   0   101G  0 part /
└─sdb20 259:0    0   100G  0 part
sdg       8:96   1  57,3G  0 disk
└─sdg1    8:97   1  57,3G  0 part
sr0      11:0    1  1024M  0 rom

Nehmen wir an, wir würden den USB Stick sdg formatieren wollen.

Als erstes wird das mit gdisk ausgewählt.

HINWEIS: NICHT die Partitionsnummer auswählen, sondern das Gerät an sich! Also nicht /dev/sdg1 verwenden, sondern /dev/sdg!

sudo gdisk /dev/sdg1

Danach kann man jede Partition durch Eingabe von d löschen.

Partition table scan:
 MBR: protective
 BSD: not present
 APM: not present
 GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): d
Using 1
Command (? for help):

Sollte man mehr als eine Partition auf dem Speichermedium haben, so müssen die Partitionsnummer danach noch eintippen.

Wenn alle Partitionen gelöscht wurden, kann man neue Partitionen durch die Eingabe von n kreieren. Danach kann die Größe bestimmt werden. Wenn man beispielsweise eine 5GB große Partition erstellen will, kann man als ersten Sektor -5G einsetzen.

Das + bedeutet, dass er 5 GB übrig lässt! Da wir stattdessen 5GB für die Partition geben wollen, wird ein - benötigt.

Danach kann man noch den Typ des Speichermediums eingeben. Hierfür wird als standard das Linuxdateisystem ausgewählt.

Das ist nur relevant, wenn man beispielsweise eine Boot-Partition anstatt eine "Speicher"-Partition erstellen möchte.

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-120176606, default = 2048) or {+-}size{KMGTP}: -5G
Information: Moved requested sector from 109690846 to 109688832 in
order to align on 2048-sector boundaries.
Use 'l' on the experts' menu to adjust alignment
Last sector (109688832-120176606, default = 120176606) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help):

Hinweis:

Mit p kann man den aktuellen Stand des USB-Sticks betrachten, sodass man sich versichern kann, dass alles geklappt hat.

Command (? for help): p
Disk /dev/sdg: 120176640 sectors, 57.3 GiB
Model: Ultra
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): C823B7F7-D146-477B-B93D-E93975F17030
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 120176606
Partitions will be aligned on 2048-sector boundaries
Total free space is 109688798 sectors (52.3 GiB)
Number  Start (sector)    End (sector)  Size       Code  Name
  1       109688832       120176606   5.0 GiB     8300  Linux filesystem
Command (? for help):

Zu guter Letzt muss das alles nur noch auf den Stick, durch das Betätigen von w, geschrieben werden.

gdisk fragt dafür nochmal nach, ob man sich auch wirklich sicher ist, da es eventuell sein kann, dass man was vergessen hat.

Wenn alles passt, die Operation mit Y bestätigen.

Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdg.
The operation has completed successfully.

Formatieren

Jetzt ist die Partition da, jedoch noch kein Dateisystem.

Dafür muss man jedichlich einfach mkfs.<Dateisystem> verwenden.

Das /dev/sdg1 zeigt diesmal auf die Partition, nicht auf das Speichermedium!

[diesen User@I use Arch btw] sudo mkfs.ext4 /dev/sdg1
[sudo] Passwort für diesen User:
mke2fs 1.45.5 (07-Jan-2020)
Ein Dateisystem mit 1310720 (4k) Blöcken und 328320 Inodes wird erzeugt.
UUID des Dateisystems: 2f2dbd1b-b054-49e0-aa10-852fd90764bf
Superblock-Sicherungskopien gespeichert in den Blöcken:
    32768, 98304, 163840, 229376, 294912, 819200, 884736
beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Das Journal (16384 Blöcke) wird angelegt: erledigt
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt
[diesen User@I use Arch btw]

Benennen

$ sudo e2label /dev/sdX1 SICHERUNG #Der Datenträger erhält das Label SICHERUNG

Festplatte Einhängen

$ sudo mkdir /SICHERUNG #Das Verzeichnis anlegen.
$ sudoedit /etc/fstab

und hier folgendes einfügen:

/dev/sdX1	/SICHERUNG	ext4	defaults	0	0

Am Ende der Datei muß eine Leerzeile eingefügt werden.

$ sudo mount /dev/sdX1 #Die Festplatte SICHERUNG wird auf /SICHERUNG ins Dateisystem eingebunden.

Das Backup Skript

Falls auf dem System noch nicht vorhanden, wird rsync installiert.

$ sudo pacman -S rsync

Das folgende Skript wird kopiert und als snapshot.sh z.B. in ~/.scripts/ abgespeichert. Mit einem chmod a+rx ~/.scripts/snapshot.sh wird es ausführbar gemacht. Die CUSTOMIZING SECTION im Skript sollte auf die eigenen Gegebenheiten angepasst werden.

Die Datei snapshot_exclude.txt wird ebenfalls kopiert und nach ~/.scripts/ abgespeichert. Alle in der snapshot_exclude.txt gelisteten Dateien und Verzeichnisse werden von einer Sicherung ausgeschlossen.

Danach kann mit folgendem Befehl die Funktion überprüft werden. Das Argument -d erstellt ein tägliches Backup. Das Backup wird mit Rootrechten ausgeführt.

$ sudo ~/.scripts/snapshot.sh -d

Bei einem erneuten Aufruf des Befehls erhöht sich der Zähler der jeweils vorangegangenen Sicherungen um 1. Eine dayly.0 Sicherung wird z.B.: in dayly.1 umbenannt, und eine neue dayly.0 Sicherung angelegt. Bei der Angabe von DAYS=6 in der CUSTOMIZING SECTION; wird jeweils die 7. Sicherung gelöscht, bevor eine neue dayly.0 angelegt wird. Die wöchentlichen und monatlichen Snapshots werden mit sudo ~/.scripts/snapshot.sh -w bzw sudo ~/.scripts/snapshot.sh -m ausgelöst. Dabei wird keine neue Sicherung veranlasst, sondern lediglich, und auch nur dann wenn die Anzahl der täglichen Sicherungen komplettiert ist, die älteste der daily Sicherungen als weekly.0 kopiert und somit archiviert. Die weekly und monthly backups rotieren in der gleichen Weise wie die dailys.

Das Skript

#!/bin/bash
## Datei ~/.scripts/snapshot.sh
##
##
##      Mike Rubel 2004.01.04 (http://www.mikerubel.org/computers/rsync_snapshots/)
##
## License:
##      LGPL  
##
## Disclaimer:
##      Use this software on your own risk, it works for me but there
##      are no guaranties at all
## ----------------------------------------------
##
## make_snapshotLC: 
##      Backup Script based on rsync
##      It creates Generation Backups for the levels daily, weekly and montly
##
## Version:
##      0.3
##
## Synopsis:
##       make_snapshotLC [OPTIONS]
##
## Description:
##      This script was adopted from Mike Rubels documentation from
##      http://www.mikerubel.org/computers/rsync_snapshots/
##      Based on Mikes handy rotating-filesystem-snapshot utility.
##      The basic idea is it makes rotating backup-snapshots of /home whenever called
##      A few elements came from
##      http://www.heinlein-support.de/web/support/wissen/rsync-backup/
##      An exclude list avoids to backup superflous files.
##
## Changes:
##      Instead of hourly, daily and weekly snapshots, daily, weekly and monthly 
##      snapshots are used.
##      Checking the available space on backup media
##      Free configurable number of snapshots for every single level
##      Everything packed into one script
##
## Options:
##      -d make the daily backup plus rotate
##      -w make the weekly backup
##      -m make the monthly backup
##      -h displays a short help text
## 
## Changelog:
##      --------
########################################################################

unset PATH      # suggestion from H. Milz: avoid accidental use of $PATH

# ------------- System Commands used by this script --------------------
ID=/usr/bin/id;
ECHO=/bin/echo;
MOUNT=/bin/mount;
RM=/bin/rm;
MV=/bin/mv;
CP=/bin/cp;
TOUCH=/bin/touch;
RSYNC=/usr/bin/rsync;
DF=/bin/df;
TAIL=/usr/bin/tail;
SED=/bin/sed;
SYNC=/bin/sync;
LOGGER=/usr/bin/logger;
CHMOD=/bin/chmod;
MKDIR=/bin/mkdir;

# ======================= CUSTOMIZING SECTION ==========================
MOUNT_DEVICE=/dev/sdX1;                  # Your Mount device - Ziel
MOUNT_RO=true;                          # For write protection set to true
SNAPSHOT_RW=/SICHERUNG/;                 # where to store the backups - Ziel-Ordner
EXCLUDES=/home/<user>.scripts/snapshot_exclude.txt;    # Create the backup_exclude file first!
CHECK_HDMINFREE=true;                   # Check free space
HDMINFREE=90;                           # Make a backup up to this percentage
DAYS=6;                                 # Number of daily backups -1
WEEKS=3;                                # Number of weekly backups -1
MONTHS=3;                               # Number of monthly backups -1
# ======================================================================

# Make sure we're running as root
if (( `$ID -u` != 0 )); then { $ECHO "Sorry, must be root.  Exiting..."; exit; } fi

# Check Argument
if [ $# != 1 ] ; then { $ECHO "Error: Wrong number of arguments.  \
#Vaild is one out of -d, -w, -m, -h" ; exit; } fi

# Check Customization
if ! [ -b $MOUNT_DEVICE ] ; then { $ECHO "Error: Mount device $EXCLUDES isn't valid" ; exit; } fi
if ! [ -d $SNAPSHOT_RW ] ; then  $MKDIR -p $SNAPSHOT_RW; fi
if ! [ -f $EXCLUDES ] ; then { $ECHO "Error: Exclude File $EXCLUDES missing" ; exit; } fi

# Check free space on disk
GETPERCENTAGE='s/.* \([0-9]\{1,3\}\)%.*/\1/';
if $CHECK_HDMINFREE ; then
        KBISFREE=`$DF /$SNAPSHOT_RW | $TAIL -n1 | $SED -e "$GETPERCENTAGE"`
        if [ $KBISFREE -ge $HDMINFREE ] ; then
                $ECHO "Error: Not enough space left for rotating backups!"
                $LOGGER "Error: Not enough space left for rotating backups!"
                exit
        fi
fi

# ------------- The Script itself --------------------------------------

if $MOUNT_RO ; then
        # Attempt to remount the RW mount point as RW; else abort
        $MOUNT -o remount,rw $MOUNT_DEVICE $SNAPSHOT_RW ;
        if (( $? )); then
                $ECHO "Error: could not remount $SNAPSHOT_RW readwrite";
                exit;
        fi;
fi;


case $1 in
# *********** Daily Backups ********************************************
        -d | -D) $ECHO "Starting Daily Backup..."
           # Rotating daily snapshots of /home  

           # Step 1: Delete the oldest snapshot, if it exists:
           # It is NOT moved to the weekly backups level since you can make hundreds of daily backups
           if [ -d $SNAPSHOT_RW/daily.$DAYS ] ; then
                $RM -rf $SNAPSHOT_RW/daily.$DAYS ;
           fi;

           # Step 2: Shift all other snapshots(s) by one, if they exist (e.g. 6->7...1->2)
           OLD=$DAYS;
           while [ $OLD -ge 2 ] ; do
                OLD=$[$OLD-1]
                if [ -d $SNAPSHOT_RW/daily.$OLD ] ; then
                        NEW=$[ $OLD + 1 ]
                        # Save date
                        $TOUCH $SNAPSHOT_RW/.timestamp -r $SNAPSHOT_RW/daily.$OLD
                        $MV $SNAPSHOT_RW/daily.$OLD $SNAPSHOT_RW/daily.$NEW
                        # Restore date
                        $TOUCH $SNAPSHOT_RW/daily.$NEW/.timestamp \
                                -r $SNAPSHOT_RW/.timestamp
                fi;
           done

           # Step 3: make a hard-link-only (except for dirs) copy of the latest snapshot,
           # If that exists 0->1
           if ! [ -d $SNAPSHOT_RW/daily.0 ] ; then
                $MKDIR -p $SNAPSHOT_RW/daily.0
                $TOUCH $SNAPSHOT_RW/daily.0/.timestamp
           else
                $CP -al $SNAPSHOT_RW/daily.0 $SNAPSHOT_RW/daily.1 ;
           fi;

           # Step 4: rsync from the system into the latest snapshot (notice that
           # rsync behaves like cp --remove-destination by default, so the destination
           # is unlinked first.  If it were not so, this would copy over the other
           # snapshot(s) too!
           $RSYNC                                                               \
                -va --delete --delete-excluded                          \
                --exclude-from="$EXCLUDES"                              \
                /home $SNAPSHOT_RW/daily.0 ;

           # Check return code
           # 0 = ok, 
           # 24 is also ok. It appears if files were changed or deleted while this script runs
           # Other return codes are Error -- see man (1) rsync
           if ! [ $? = 24 -o $? = 0 ] ; then
                $ECHO "Error: rsync finished on $MOUNT_DEVICE with errors!"
                $LOGGER "Error: rsync finished on $MOUNT_DEVICE with errors!"
           fi;

           # Step 5: update the mtime of daily.0 to reflect the snapshot time
           $TOUCH $SNAPSHOT_RW/daily.0 ;

           # Finished!
           $ECHO "Finished rsync backup on $MOUNT_DEVICE..."
           $LOGGER "Finished rsync backup on $MOUNT_DEVICE..."

           # For beeing on the secure site...
           $SYNC;;

           # And thats it for home.

# *********** Weekly Backup ********************************************
        -w | -W)$ECHO "Starting Weekly Backup..."
        
           # Step 1: Delete the oldest snapshot, if it exists
           if [ -d $SNAPSHOT_RW/weekly.$WEEKS ] ; then
                $RM -rf $SNAPSHOT_RW/weekly.$WEEKS ;
           fi;
           
           # Step 2: shift the middle snapshots(s) by one, if they exist 3->4 ..0->1
           OLD=$WEEKS;
           while [ $OLD -ge 1 ] ; do
                OLD=$[$OLD-1]
                if [ -d $SNAPSHOT_RW/weekly.$OLD ] ; then
                        NEW=$[ $OLD + 1 ]
                        $MV $SNAPSHOT_RW/weekly.$OLD $SNAPSHOT_RW/weekly.$NEW ;
                fi;
           done

           # Step 3: Make a hard-link-only (except for dirs) copy of
           # daily.(max), assuming that exists, into weekly.0
           if [ -d $SNAPSHOT_RW/daily.$DAYS ] ; then
                $CP -al $SNAPSHOT_RW/daily.$DAYS $SNAPSHOT_RW/weekly.0 ;
           fi;;

# *********** Monthly Backup *******************************************
        -m | -M)$ECHO "Starting Monthly Backup..."
        
           # Step 1: Delete the oldest snapshot, if it exists
           if [ -d $SNAPSHOT_RW/monthly.$MONTHS ] ; then
                $RM -rf $SNAPSHOT_RW/monthly.$MONTHS ;
           fi;
           
           # Step 2: Shift the middle snapshots(s) by one, if they exist 6->7 ..0->1
           OLD=$MONTHS;
           while [ $OLD -ge 1 ] ; do
                OLD=$[$OLD-1]
                if [ -d $SNAPSHOT_RW/monthly.$OLD ] ; then
                        NEW=$[ $OLD + 1 ]
                        $MV $SNAPSHOT_RW/monthly.$OLD $SNAPSHOT_RW/monthly.$NEW ;
                fi;
           done

           # Step 3: Make a hard-link-only (except for dirs) copy of
           # weekly.(max), assuming that exists, into monthly.0
           if [ -d $SNAPSHOT_RW/weekly.$WEEKS ] ; then
                $CP -al $SNAPSHOT_RW/weekly.$WEEKS $SNAPSHOT_RW/monthly.0 ;
           fi;;

        -h | -H)$ECHO "Usage:
              make_snapshot -d  Initiates daily backup
              make_snapshot -w  Initiates weekly backup
              make_snapshot -m  Initiates monthly backup
              make_snapshot -h  Displays this text."; exit;;
        
        *) $ECHO "Error: Wrong argument. Vaild is one out of -d, -w, -m, -h" ; exit;;

esac

$ECHO "Backup ended"
if $MOUNT_RO ; then
        # Now remount the RW snapshot mountpoint as readonly
        $MOUNT -o remount,ro $MOUNT_DEVICE $SNAPSHOT_RW ;
        if (( $? )); then 
                $ECHO "Error: Could not remount $SNAPSHOT_RW readonly";
                exit;
        fi;
 fi;

## Datei ~/.scripts/snapshot_exclude.txt
##
<user>/.cache
<user>/.kodi
<user>/.local/share
<user>/.mediathek3
<user>/.mozilla
<user>/.tor-browser-de
<user>/.tvbrowser
<user>/Videos

Die Service-Units erstellen

#file /etc/systemd/system/snapshot-d.service

[Unit]
Description=snapshot daily.service

[Service]
ExecStart=/home/<user>/.scripts/snapshot.sh -d

Für die wöchentliche und monatliche Sicherung brauchen wir noch entsprechende snapshot-w.service und snapshot-m.service Dateien. Das -d im der ExecStart= Option ist durch ein -w bzw. -m zu ersetzen. Bei Description= ist weekly bzw. monthly einzusetzen. Alle .service Dateien und auch die nachfolgenden .timer Dateien werden mit Rootrechten nach /etc/systemd/system/ gespeichert.

Die Timer-Units erstellen

#file /etc/systemd/system/snapshot-d.timer

[Unit]
Description=snapshot daily.timer

[Timer]
OnCalendar=daily
RandomizedDelaySec=60
Persistent=true

[Install]
WantedBy=basic.target

Auch hier bedarf es einer weiteren Datei für den wöchentlich und auch einer weiteren Datei für den monatlichen Timer. Die Dateien werden entsprechend benannt, dem OnCalendar= wird der Wert weekly bwz. monthly zugewiesen.

Die Timer aktivieren

systemctl enable --now snapshot-d.timer
systemctl enable --now snapshot-w.timer
systemctl enable --now snapshot-m.timer

Siehe auch

Weblinks