Live-Image der SD-Karte auf externem Medium erstellen und Mounten
Wer kennt es nicht, mal eben schnell einen Linuxbefehl getippt und schon ist etwas verbogen.
Jetzt wäre eine Sicherung nicht schlecht.....
Mit wenigen Handgriffen ermöglicht Linux das Erstellen einer Image-Datei auf einer angeschlossener Festplatte oder auf einer Netzwerkfreigabe.
Beim Crash der Karte kann man so eine neue mit dem Inhalt vom Vortag erstellen.
Aber was wenn man nur mal eine versehendlich gelöschte Datei zurück haben möchte?
Hier wäre die komplette Rücksicherung ein wenig zu viel des Guten.
Auch hier bietet Linux eine Möglichkeit das gesicherte Image in das laufende System zu mounten.
Eine mögliche Variante könnte jetzt das automatische Sichern des SD-Karten-Images an jedem Wochentag sein.
So stehen immer die letzten 7 Tage zu Verfügung.
Vorbereiten der Verzeichnisstruktur
Speicherort für die tägliche Sicherung anlegen, in diesem Fall ist es eine CIFS-Freigabe auf einem NAS-Server.
mkdir /mnt/NetBackup
Speicherort für den Imagemountpunkt anlegen, hier ist später das gemountete Image zu finden.
mkdir /mnt/NetBackup/ImageMount
Skript für die Erstellung des Live-Image anlegen
Für das automatische erstellen des Images wird ein kleines Skript genutzt.
Das Skript erstellt je nach Wochentag ein Image.
Vorher muss aber noch der Devicename der SD-Karte nachgesehen werden.
fdisk -l
Disk /dev/mmcblk0: 15.7 GB, 15720251392 bytes
4 heads, 16 sectors/track, 479744 cylinders, total 30703616 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0009bf4f
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA)
/dev/mmcblk0p2 122880 30703615 15290368 83 Linux
Jetzt eine neue Datei anlegen und den Inhalt hinein kopieren.
nano /bin/scripts/backup.sh
#!/bin/bash
# /bin/scripts/backup.sh
Weekday=$(date +%A)
EventDate=$(date +%e.%m.%Y-%T)
BackUpFile="/mnt/NetBackup/$Weekday.img"
echo "$EventDate | start backup: $BackUpFile" 2>&1 >> /tmp/cron.log
#/dev/mmcblk0 ist in diesem Fall die SD-Karte, das kann aber variieren!
dd if=/dev/mmcblk0 of=$BackUpFile bs=1M 2>&1 >> /tmp/cron.log
echo "$EventDate | backup done" 2>&1 >> /tmp/cron.log
Skript ausführbar machen:
chmod +x /bin/scripts/backup.sh
Backup-Skript in die Crontab einbinden
Das Backup soll jede Nacht um 4.00h automatisch gestartet werden.
Hierzu wird das Skript in die user-crontab eingebunden.
crontab -e
0 4 * * * /bin/scripts/backup.sh
Der user-crontab wird automatisch unter /var/spool/cron/crontabs abgelegt
Zusätzlich legt das Skript einen LOG-Eintrag im /tmp/cron.log an.
4.10.2015-13:04:01 | start backup: /mnt/NetBackup/Sunday.img
4.10.2015-13:04:01 | backup done
Jetzt wird jede Nacht um 4.00h im Ordner /mnt/NetBackup ein Image der SD-Karte abgelegt.
Optional kann der Crondienst neu gestartet werden und das LOG angezeigt werden.
service cron restart
grep CRON /var/log/syslog
Mounten des gesicherten Images
Das gemountete Image kann jetzt in das bestehende Dateisystem der SD-Karte gemountet werden.
Der erste Versuch schlug jedoch fehl. Ein superblock error. Klar, das Image enthält ja nicht nur die gewünschte Partition, sondern den gesamten Karteninhalt.
Aber das schöne an Linux ist ja gerade, dass man es trotzdem bewerkstelligen kann. Ein kurzer Besuch beim Onkel Google verrät auch wie es geht.
Zuerst werfen wir das Image dem fdisk vor die Füße:
fdisk -lu /mnt/NetBackup/Wednesday.img
Disk /mnt/NetBackup/Wednesday.img: 15.7 GB, 15720251392 bytes
255 heads, 63 sectors/track, 1911 cylinders, total 30703616 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0009bf4f
Device Boot Start End Blocks Id System
/mnt/NetBackup/Wednesday.img1 8192 122879 57344 c W95 FAT32 (LBA)
/mnt/NetBackup/Wednesday.img2 122880 30703615 15290368 83 Linux
Jetzt kann man den Offset des Partitionsanfangs ausrechnen:
Sectorgröße * Startsektor = (in diesemFall) 512 * 122880 = 62914560
Vorbereiten des Images zum Mounten.
losetup -o 62914560 /dev/loop0 /mnt/NetBackup/Wednesday.img
Wenn man schon dabei ist kann man auch mal testen ob das Image in Ordnung ist:
fsck -fv /dev/loop0
fsck from util-linux 2.20.1
e2fsck 1.42.5 (29-Jul-2012)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
96707 inodes used (25.17%, out of 384272)
61 non-contiguous files (0.1%)
90 non-contiguous directories (0.1%)
# of inodes with ind/dind/tind blocks: 0/0/0
Extent depth histogram: 80470/26
998426 blocks used (65.00%, out of 1536000)
0 bad blocks
1 large file
71985 regular files
7931 directories
56 character device files
25 block device files
0 fifos
1172 links
16701 symbolic links (16122 fast symbolic links)
0 sockets
------------
97870 files
Sieht gut aus, der Rest ist einfach.
Mounten des Images
mount /dev/loop0 /mnt/NetBackup/ImageMount
Der Mountpunkt sollte jetzt im System eingebunden sein.
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 4G 0 disk
└─sda1 8:1 1 4G 0 part /media/usb0
loop0 7:0 0 14.6G 0 loop /mnt/NetBackup/ImageMount
mmcblk0 179:0 0 14.7G 0 disk
├─mmcblk0p1 179:1 0 56M 0 part /boot
└─mmcblk0p2 179:2 0 14.6G 0 part /
Noch schneller wird man den Mount auf das gesicherte Image wieder los.
umount /mnt/NetBackup/ImageMount
losetup -d /dev/loop0
Automatisches mounten und lösen mit Skripten
Um nicht jedes Mal alles von Hand einzutippen kann man das auch über Skipte lösen.
Mit dem ersten Skript kann eine der sieben Wochentagssicherungen ausgewählt und automatisch gemountet werden.
/bin/scripts/mountbackup.sh
Welches Image soll gemountet werden?
Montag (1)
Dienstag (2)
Mittwoch (3)
Donnerstag (4)
Freitag (5)
Samstag (6)
Sonntag (7)
Auswahl:3
mounting File: /mnt/NetBackup/Wednesday.img to /mnt/NetBackup/ImageMount/
done....
Das Image vom Mittwoch steht jetzt zur Verfügung.
Nach Gebrauch einfach wieder lösen.
/bin/scripts/umountbackup.sh
unmount: /mnt/NetBackup/ImageMount/
done....
Um einen Überblick zu haben was gerade gemountet ist werden die Skiptereignisse geloggt.
cat /tmp/cron.log
4.10.2015-13:04:01 | start backup: /mnt/NetBackup/Sunday.img
4.10.2015-13:04:01 | backup done
4.10.2015-17:36:53 | unmounting DIR: /mnt/NetBackup/ImageMount/
4.10.2015-17:37:44 | mounting File: /mnt/NetBackup/Wednesday.img to /mnt/NetBackup/ImageMount/
4.10.2015-17:38:17 | unmounting DIR: /mnt/NetBackup/ImageMount/
4.10.2015-20:02:27 | unmounting DIR: /mnt/NetBackup/ImageMount/
4.10.2015-20:02:47 | mounting File: /mnt/NetBackup/Wednesday.img to /mnt/NetBackup/ImageMount/
4.10.2015-20:06:02 | unmounting DIR: /mnt/NetBackup/ImageMount/
4.10.2015-20:18:04 | mounting File: /mnt/NetBackup/Wednesday.img to /mnt/NetBackup/ImageMount/
4.10.2015-20:23:22 | unmounting DIR: /mnt/NetBackup/ImageMount/
mountbackup.sh
#!/bin/bash
EventDate=$(date +%e.%m.%Y-%T)
#Pfad zum BackupDirectory
#die Images müssen unter /mnt/NetBackup gesichert werden
#das Image wird dann nach /mnt/NetBackup/ImageMount gemountet
ImageDIR="/mnt/NetBackup/"
MountDIR="/mnt/NetBackup/ImageMount/"
#Offset angeben, mit --> "fdisk -lu /image.img" Startsektor ermitteln
#Offset = Startsector * Sektorgröße
#z.B. 122880 * 512 = 62914560
StartSector="62914560"
#Image auswählen
echo ""
echo "Welches Image soll gemountet werden?"
echo "Montag (1)"
echo "Dienstag (2)"
echo "Mittwoch (3)"
echo "Donnerstag (4)"
echo "Freitag (5)"
echo "Samstag (6)"
echo "Sonntag (7)"
read -p "Auswahl:" Weekday
case $Weekday in
1) Weekday="Monday";;
2) Weekday="Tuesday";;
3) Weekday="Wednesday";;
4) Weekday="Thursday";;
5) Weekday="Friday";;
6) Weekday="Saturday";;
7) Weekday="Sunday";;
esac
echo ""
Image="$ImageDIR$Weekday.img"
echo "mounting File: $Image to $MountDIR"
echo "$EventDate | mounting File: $Image to $MountDIR" 2>&1 >> /tmp/cron.log
#Image Mounten
losetup -o $StartSector /dev/loop0 $Image 2>&1 >> /tmp/cron.log
mount /dev/loop0 $MountDIR 2>&1 >> /tmp/cron.log
echo "done...."lsblk
unmountbackup.sh
#!/bin/bash
EventDate=$(date +%e.%m.%Y-%T)
#Pfad zum MountDirectory
MountDIR="/mnt/NetBackup/ImageMount/"
echo "$EventDate | unmounting DIR: $MountDIR" 2>&1 >> /tmp/cron.log
#Image UnMounten
umount $MountDIR 2>&1 >> /tmp/cron.log
losetup -d /dev/loop0 2>&1 >> /tmp/cron.log
echo "unmount: $MountDIR"
echo "done...."lsblk
Rücksicherung des Images
Wenn denn doch mal zuviel murks passiert ist kann das gesicherte Image natürlich jederzeit mit Programmen wie dem Win32DiskImager wieder zurück auf die SD-Karte gespielt werden.
Aber auch die Live-Rücksicherung ist mit dd möglich.
dd if=/mnt/NetBackup/Wednesday.img of=/dev/mmcblk0
Da dd leider keine Fortschritsanzeige hat kann man in einem zweiten Terminalfenster folgen Befehl eingeben:
pkill -USR1 -x dd
In der ersten Konsole sollte jetzt der Fortschritt zu sehen sein.
354+0 records in
353+0 records out
370147328 bytes (370 MB) copied, 23.305 s, 15.9 MB/s
1226+0 records in
1226+0 records out
1285554176 bytes (1.3 GB) copied, 133.502 s, 9.6 MB/s
1240+0 records in
1240+0 records out
1300234240 bytes (1.3 GB) copied, 135.486 s, 9.6 MB/s
Nach der Rücksicherung muss der PI einmal durchgestartet werden..........
Links zum Thema
https://linuxundich.de/raspberry-pi/linux-images-fuer-den-raspberry-pi-auf-sd-karte-installieren/https://www.bitblokes.de/2013/03/sd-karte-des-raspberry-pi-sichern-dd-oder-partclone/http://raspberry.tips/raspberrypi-einsteiger/cronjob-auf-dem-raspberry-pi-einrichten/
https://wiki.ubuntuusers.de/ddhttp://madduck.net/blog/2006.10.20:loop-mounting-partitions-from-a-disk-image/
http://www.pcwelt.de/ratgeber/Linux-Praxis-Konsolen-Know-how-8298473.htmlhttps://freetux.wordpress.com/2007/12/23/systembackup-mit-dd/http://www.forum-raspberrypi.de/Thread-von-8gb-image-auf-2gb-image-verkleinernhttp://sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/
Kommentare (0)