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)

Cancel or