Onion Information
Debian Snapshot Backup für Server und Workstation PC auf verschlüsselte ZFS USB Festplatte oder ZFS NAS ohne Downtime
Debian Snapshot Backup für Server und Workstation PC auf verschlüsselte ZFS USB Festplatte oder ZFS NAS ohne Downtime Vorwort Diese Anleitung ist für Anfänger eher weniger geeignet und es sei festgehalten, dass ich das für mich als Notiz in...
Onion Details
Page Clicks: 0
First Seen: 03/11/2024
Last Indexed: 10/22/2024
Onion Content
Kontakt Debian Snapshot Backup für Server und Workstation PC auf verschlüsselte ZFS USB Festplatte oder ZFS NAS ohne Downtime Vorwort Diese Anleitung ist für Anfänger eher weniger geeignet und es sei festgehalten, dass ich das für mich als Notiz ins Blog geschrieben habe. In keinem Fall bin ich für Schäden, die Du Deinem System zufügst, verantwortlich. Wenn Du diese Anleitung nicht verstehst, ist es zumindest wichtig, dass Du ein gutes Backup hast. Und ich beantorte nicht kommerzielle Fragen nur im Element-Matrix Messenger Raum #kmj:matrix.ctseuro.com! Kommerzille Unterstützung bietet meine CTS-Solutions ( https://cts-solutions.at ). Diese Anleitung ist ein Follow-up zum Blog Eintrag: http://wmv7y4tehgsvghaabiqvrm76uag7c6vdxufzoorjso3escefkiwo4tid.onion/Migriere_Dein_Debian_System_mit_verschl%C3%BCsseltem_Einzel-SSD-LVM-LUKS_auf_Dual-NVME-nativ-verschl%C3%BCsseltes_ZFS_Raid1,_ohne_Daten_zu_verlieren/ Der Plan Wir müssen das USB-Laufwerk mit einem ZFS-Dateisystem (eine NAS-ZFS-Freigabe funktioniert auch) und einem Pool mit verschiedenen Datasets für die Sicherung der Workstations, auf denen ZFS ausgeführt wird, einrichten. Weiters benötigen wir ein Dataset für dd Sicherungen der Boot-Festplatten und der Live-System-Festplatte. Das Endergebnis sollte etwa so aussehen: Replizieren aller ZFS-Datensätze als Snapshot auf das ZFS-USB-Laufwerk DD der Boot-Festplatter zu einem ZFS-Dataset auf dem USB-Laufwerk DD der Live System Disk zu einem ZFS-Datase auf dem USB-Laufwerk Eine einfache Möglichkeit, die Snapshot- oder DD-Images von der USB Festplatte wiederherzustellen USB-Laufwerk initialisieren Erstelle einen Mount-Punkt auf dem Quell-PC-System, z.B. mkdir /USBBACKUP Erstelle mit gparted eine Partition auf dem USB-Laufwerk Verwende z.B. 2 TB auf dem USB-Laufwerk als ZFS-Partition. in meinem Fall war das /dev/sdd1 als /dev/disk/by-id/ata-ST3000DM001-9YN166_11111111-part1 für die erste USB-Disk. Erstelle einen Zpool mit Verschlüsselung mit zpool create -o ashift=12 -o autotrim=on -O encryption=on -O keylocation=prompt -O keyformat=passphrase -O acltype=posixacl -O xattr=sa -O dnodesize=auto -O compression=lz4 -O normalization=formD -O relatime=on -O canmount=off -O mountpoint=/USBBACKUP zusbbackup /dev/disk/by-id/ata-ST3000DM001-9YN166_11111111-part1 Ich möchte ein zusätzliches Dataset für ein DD-Backup der Boot-Partitionen und des Live-Systems. Also habe ich ein Dataset dafür erstellt: zfs create -o canmount=off -o mountpoint=none zusbbackup/DDBACKUPS zfs create -o canmount=noauto -o mountpoint=/USBBACKUP zusbbackup/DDBACKUPS/USBBACKUP Mounte das Dataset einmal und erstelle mit ’touch backup.info’ die Datei in /USBBACKUP. Dies wird für das Skript benötigt. Dann überprüfe und schließe alles mit zpool status zpool list zpool export zusbbackup Wiederhole diesen Vorgang mit geänderter ID für jedes Sicherungslaufwerk. ZFS importieren, senden und empfangen Für eine VOLLSTÄNDIGE Sicherung müssen wir jeden Befehl oder das Shell-Skript mit sudo ausführen: Wir wählen DISK später im Skript aus einem Array der verfügbaren Festplatten aus. Zum Test Schritt für Schritt in der Shell: DISK="/dev/disk/by-id/ata-ST3000DM001-9YN166_11111111-part1" zpool import -d ${DISK} zusbbackup -N Für ein vollständiges Backup (zroot ist unser Hauptpool, siehe Blogeintrag Debian ZFS Migration). Wir verwenden rekursive Snapshots. zfs snapshot -r zroot@backup Das Skript führt dann alle Datasets aus, aber zunächst versuchen wir es mit einem und prüfen das Ergebnis: zfs send --raw -R zroot/ROOT@backup | zfs receive -vF zusbbackup/ROOT zfs list -t all sync zpool export zusbbackup Komplette Backup Skripts Jetzt fügen wir alle Teile zusammen und ein erstellen die notwendigen Backup Skripts die alles erledigt. Wir führen immer VOLLSTÄNDIGE Backups durch. Für inkrementelle Sicherungen, müssen ein paar Dinge im Skript geändert werden. Annahme: Alle Scripts sind in /home/backupuser/BACKUP usb3_backup_config.sh #!/bin/sh # 20231108 KMJ k.joch@kmj.at V2.1 # Backup Script for ZFS Workstation to ZFS USB Drive # See Migration and Backup log entries in the Blog # of https://KMJ.at # we have very conservativ outputs so we sees everything #add disks sparated by space. ADD YOUR DISKS AND SETTINGS here !!!!! SOURCEPOOL="zroot" TARGETPOOL="zusbbackup" TARGETUSBDISKS="/dev/disk/by-id/ata-ST3000DM001-9YN166_11111111-part1 /dev/disk/by-id/ata-ST3000DM001-9YN166_22222222-part1 /dev/disk/by-id/ata-ST3000DM001-9YN166_33333333-part1 " # this is full disk e.g. sda not sda1 for live system disk but # the boot partiton /dev/nvme1n1p2 as from the migration blog entry # or /dev/nvme0n1p2 . DDSOURCEDISKSDIR="/dev/disk/by-id/" DDSOURCEDISKS="nvme-Samsung_SSD_980_PRO_with_Heatsink_2TB_S6WRNS0W11111111_1-part2 nvme-Samsung_SSD_980_PRO_with_Heatsink_2TB_S6WRNS0W22222222_1-part2 ata-SanDisk_SSD_PLUS_240GB_222222222222 " DDTARGETDS="${TARGETPOOL}/DDBACKUPS/USBBACKUP" DDTARGETMP="/USBBACKUP" usb3_backup.sh #!/bin/sh # 20231108 KMJ k.joch@kmj.at V2.0 # Backup Script for ZFS Workstation to ZFS USB Drive # See Migration and Backup log entries in the Blog # of https://KMJ.at # we have very conservativ outputs so we sees everything # Change your RUNDIR here ! # and edit your config file RUNDIR="/home/backupuser/BACKUP/" . ${RUNDIR}/usb3_backup_config.sh #################################################### # do not change below! #################################################### if [ "x${TARGETUSBDISKS}" = "x" ]; then echo "you need to set TARGETUSBDISKS variable" exit; fi if [ "x${SOURCEPOOL}" = "x" ]; then echo "you need to set SOURCEPOOL variable" exit; fi # If more USB drives are connected the same time we only # use one of these drives BACKUPDRIVE="" echo "####################################################" for USBDISK in ${TARGETUSBDISKS} do #USBDISK="$(echo "$USBDISK"|tr -d '\n')" #USBDISK="$(echo "$USBDISK"|tr -d ' ')" if [ -e $USBDISK ]; then echo "$USBDISK is connected" BACKUPDRIVE=${USBDISK} else echo "$USBDISK is not connected" fi done echo "Selected drive: `ls -l ${BACKUPDRIVE}`" echo "####################################################" zpool import -d ${BACKUPDRIVE} ${TARGETPOOL} -N zpool list zpool status echo "####################################################" # if we have DDSOURCEDISKS we should mount the DDTARGET too # to make this work we must load the key to be able to write onto if [ "x${DDSOURCEDISKSDIR}" != "x" ]; then if [ "x${DDSOURCEDISKS}" = "x" ]; then echo "NO DDSOURCEDISKS variable set. No extra dd actions" else echo "preparing mount to backup DDSOURCEDISKS" # load the key zfs load-key ${TARGETPOOL} if [ -d ${DDTARGETMP} ]; then echo "we already have a mount point" else echo "no ${DDTARGETTMP} Mountpoint available. Please create it! Exiting....." zpool export ${TARGETPOOL} exit 1; fi zfs mount ${DDTARGETDS} # ends in ${TARGETPOOL}/DDBACKUPS/USBBACKUP on /USBBACKUP type zfs (rw,relatime,xattr,posixacl) if [ -e ${DDTARGETMP}/backup.info ]; then echo "${DDTARGETMP} is mounted" else echo "${DDTARGETMP} is not mounted; Exiting....." zfs unmount ${DDTARGETDS} zpool export ${TARGETPOOL} exit 1; fi # Delete and recreate the snapshots zfs destroy -r ${SOURCEPOOL}@backup zfs snapshot -r ${SOURCEPOOL}@backup # we always do full send, so we need t destroy the snapshots on USB too zfs destroy -r ${TARGETPOOL}@backup zfs list -o name,canmount,mounted,mountpoint,creation -t all echo "####################################################" # we need to find the root datase mounts. we can not send a encrypted pool # recursive to the usb drive for CURDS in `zfs list -t all | grep "${SOURCEPOOL}/[^/]* .*$" | grep backup | sed -e 's/@backup.*/@backup/'` do TARGETDS="$(echo "${CURDS}"| sed -e "s#${SOURCEPOOL}/##" | sed -e 's#@backup##')" echo "Destroying ${TARGETPOOL}/${TARGETDS} first." zfs destroy -R -f ${TARGETPOOL}/${TARGETDS} echo "Sending recursive: #${CURDS} -> ${TARGETPOOL}/${TARGETDS}#" zfs send --raw -R ${CURDS} | zfs receive -vF ${TARGETPOOL}/${TARGETDS} done echo "####################################################" # Do extra dd for DDSOURCEDISK in ${DDSOURCEDISKS} do DDSOURCEDISK="$(echo "$DDSOURCEDISK"|tr -d '\n')" DDSOURCEDISK="$(echo "$DDSOURCEDISK"|tr -d ' ')" if [ -e ${DDSOURCEDISKSDIR}${DDSOURCEDISK} ]; then echo "${DDSOURCEDISKSDIR}${DDSOURCEDISK} is connected" echo "${DDSOURCEDISK}.img is dumped" dd bs=1M if=${DDSOURCEDISKSDIR}${DDSOURCEDISK} of=${DDTARGETMP}/${DDSOURCEDISK}.img else echo "$DDSOURCEDISK is not connected" fi done echo "####################################################" echo "DD Images" ls -l ${DDTARGETMP} echo "####################################################" sync zfs unmount ${DDTARGETDS} zpool export ${TARGETPOOL} zpool list #END usb3_export_pool.sh #!/bin/sh # 20231108 KMJ k.joch@kmj.at V2.0 # this script unmounts und exports the pool # useful after crash, or manually importing the pool # NOT needed fur running the backup by itself # Backup Script for ZFS Workstation to ZFS USB Drive # See Migration and Backup log entries in the Blog # of https://KMJ.at # we have very conservativ outputs so we sees everything # Change your RUNDIR here ! # and edit your config file RUNDIR="/home/backupuser/BACKUP/" . ${RUNDIR}/usb3_backup_config.sh #################################################### # do not change below! #################################################### sync zfs unmount ${DDTARGETDS} zpool export ${TARGETPOOL} zpool list usb3_import_pool.sh #!/bin/sh # 20231108 KMJ k.joch@kmj.at V2.1 # this script imports and mounts the pool and dataset # useful after crash, or manually importing the pool # NOT needed fur running the backup by itself # Backup Script for ZFS Workstation to ZFS USB Drive # See Migration and Backup log entries in the Blog # of https://KMJ.at # we have very conservativ outputs so we sees everything # Change your RUNDIR here ! # and edit your config file RUNDIR="/home/backupuser/BACKUP/" . ${RUNDIR}/usb3_backup_config.sh #################################################### # do not change below! #################################################### if [ "x${TARGETUSBDISKS}" = "x" ]; then echo "you need to set TARGETUSBDISKS variable" exit; fi if [ "x${SOURCEPOOL}" = "x" ]; then echo "you need to set SOURCEPOOL variable" exit; fi # If more USB drives are connected the same time we only # use one of these drives BACKUPDRIVE="" echo "####################################################" for USBDISK in ${TARGETUSBDISKS} do #USBDISK="$(echo "$USBDISK"|tr -d '\n')" #USBDISK="$(echo "$USBDISK"|tr -d ' ')" if [ -e $USBDISK ]; then echo "$USBDISK is connected" BACKUPDRIVE=${USBDISK} else echo "$USBDISK is not connected" fi done echo "Selected drive: `ls -l ${BACKUPDRIVE}`" echo "####################################################" zpool import -d ${BACKUPDRIVE} ${TARGETPOOL} -N zpool list zpool status echo "####################################################" # if we have DDSOURCEDIS