windows7-backup

Windows 7 Backup

Das Ziel ist ein Backup meines Windows-7-Clients auf einen Linuxserver mit Debian Jessie zu sichern. Dabei soll der komplette Vorgang vom Server durch einzelnes Bash-Script gesteuert werden, möglichst ohne zusätzliche Installationen oder Konfiguration auf dem Client.

Dieses Script soll

  1. Den Windows-7-Rechner über Wake-on-Lan einschalten.
  2. Zum Backup benötigte Ressourcen bereitstellen.
  3. Die Sicherung auf dem Windows-7-Rechner ausführen.
  4. Die gesicherten Daten verwalten.
  5. Den Windows-7-Rechner wieder herunterfahren.

Ich möchte diese Lösung hier auszugsweise vorstellen.

Backup-Kommando

Beim Ziel eines Komplett-Backups eines Windows-Rechners kommt man um ein Image-Backup nicht herum. Glücklicherweise kann dies Windows 7 mit den eingebauten Backup-Mechanismen selbst anfertigen. Dies lässt sich auch von der Kommandozeile (CMD-Shell) ausführen:

WBADMIN START BACKUP -backupTarget:'\\SERVER\winbkp\rechner -user:winbackup -password:**** -allCritical -vssCopy -quiet

Dieses Kommando speichert Images die zum Betrieb notwendigen Partitionen auf die Samba-Freigabe des Servers \\SERVER\winbkp im Unterverzeichnis rechner. Zum Zugriff auf die Freigabe werden Benutzername und Passwort angegeben.

Das Backup überträgt lediglich differenzielle Änderungen, wenn vom vorherigen Backup eine gültige Shadow-Kopie existiert. Dies ist wichtig, weil es Speicherplatz und Zeit spart. Deshalb sollte man für die zu sichernden Laufwerke in der Systemsteuerung → System → Computerschutz den „Computerschutz“ einschalten und etwas (5%) Speicherplatz reservieren.

Kommando-Aufruf

Das Backup-Kommando auf dem Windows-7-Rechner soll natürlich vom Linux-Server Aufgerufen werden. Dazu wird die Linux-psexec-Alternative Winexe verwendet.

Leider ist dieses Programm immer noch nicht in Debian enthalten. Wer das für Debian nicht selbst kompilieren will kann sie hier Packages für i386 und Amd64 herunterladen.

Der folgende Befehl führt das Backup-Kommando auf dem Windows7-Rechner als temporärer Dienst aus. Dazu sind auf diesem Rechner Admin-Rechte notwendig, die mit dem angegeben Benutzernamen Win7Admin und zugehörigen Passwort beschafft werden:

/usr/bin/winexe -U Win7Admin%Passwort "//rechner" "<Backup-Kommando>"

Backup-Verwaltung

Installation

Durch den oben angegebenen Windows-Befehl wird genau ein Image gesichert. Bei einem erneutem Ausruf wird dieses Image aktualisiert. Dies funktioniert angenehm schnell, hat aber den Nachteil, dass nur genau eine Sicherung vorhanden ist. Ich will aber ein revisioniertes Backup mit Zugriff auf verschiedene Versionen.

Der Umgang mit zum Testzeitpunkt 60 GByte großen Images erwies sich Leider als nicht durchführbar. Bereits eine simple Kopie strapazierte meine Geduld übermäßig. Versuche mit rdiff-backup wurden nach mehreren Stunden Laufzeit abgebrochen. Vermutlich ist rdiff-backup nicht für größere Dateien ausgelegt.

Die Lösung ist mit LVM2 einen Thinly-Provisioned-Datenpool anzulegen. Der Pool enthält das Volume (Partition) indem das Image gesichert wird. Von diesem Volume werden nach der Sicherung Snapshots (thin Snapshot-Volumes) angelegt, die den aktuellen Zustand versionieren.

Wer Thin-Provisioning zum ersten Mal einsetzt sollte die thin-provisioning-tools installieren:

# apt-get install thin-provisioning-tools

Anlegen des Thinly-Provisioned-Datenpools winbkppool mit 800 GByte auf dem Physical Volume raid1:

# lvcreate -L 800G -T raid1/winbkppool
  Logical volume "lvol0" created
  Logical volume "winbkppool" created

Anlegen des Backup-Volumes winbkpvolume, in das gesichert wird:

# lvcreate -V400G -T raid1/winbkppool -n winbkpvolume
  Logical volume "winbkpvolume" created

Nach jeder Image-Sicherung wird ein Snapshot erstellt:

lvcreate -s --name "snapshotname"  raid1/winbkpvolume

Backup-Rollback

Um fehlgeschlagene Backups auszuräumen zuerst den neuesten Snapshot mit dem fehlgeschlagenen Backup löschen:

lvremove raid1/winbkp-2016-02-01
  Logical volume "winbkp-2016-02-01" successfully removed

Den zweitneuesten Snapshot mit dem fehlerfreien Backup in die Hauptpartition einpflegen. Der Snapshot wird dabei gelöscht:

 lvconvert --merge raid1/winbkp-2016-01-18

Den nun gelöschten Snapshot wieder aus der Hauptpartition wieder erstellen:

lvcreate -s --name winbkp-2016-01-18 raid1/winbkpvolume
  Logical volume "winbkp-2016-01-18" created

Samba-Freigabe

Die Samba-Freigabe auf dem Mount-Point wird vor dem Backup mit folgendem Befehl erstellt:

net usershare add "$share" "$mountpoint" "backup" "$sambauser:f"

Der Zugriff auf $share ist auf dem Benutzer $sambauser eingeschränkt. Dieser muss natürlich vorher angelegt werden und ein Samba-Passwort mit dem Befehl smbpasswd zugewiesen werden.

Nach dem Backup wird die Freigabe wieder gelöscht:

net usershare delete "$share"

Script

Das folgende Scriptteil implementiert die vorher besprochenen Ideen. Er ist nicht portabel, das heißt auf anderen Rechnern lauffähig, sondern soll hier nur als Basis für eigene Anpassungen dienen:

Click to display ⇲

Click to hide ⇱

Click to hide ⇱

winexeimg ()
{
   # Partition einbinden
   if ! egrep -q " $mountpoint " /proc/mounts; then
      mount -v $mountpoint
      erg=$?
      if [[ $erg != 0 ]] ; then
         echo "winexeimg: Mount fehlgeschlagen!"
         return 1
      fi
   fi
 
   # Prüfen ob Hostverzeichnis vorhanden
   pdir="$mountpoint/$hostname"
   if [ ! -d "$pdir" ]; then
        echo "winexeimg: Verzeichnis $pdir existiert nicht."
        return 1
   fi
 
   # Samba Share erstellen
   net usershare add "$share" "$mountpoint" "backup" "$sambauser:f"
   erg=$?
   if [[ $erg != 0 ]] ; then
      echo "winexeimg: Samba Share erstellen fehlgeschlagen!"
      return 1
   fi
 
   # Hostverzeichnis erstellen
   echo "winexeimg: Image-Start:" $(date)
   smbtarget='\\'"$server"'\'"$share"'\'"$hostname"
   /usr/bin/winexe -U "$winadmin%$passwd" "//$hostname" "WBADMIN START BACKUP -backupTarget:$smbtarget -user:$sambauser -password:$sambapasswd -allCritical -vssCopy -quiet"
 
   # Warten auf Device-Freigabe
   while fuser -m "$mountpoint" > /dev/null; do sleep 5; done
 
   # Samba Share löschen
   net usershare delete "$share"
   erg=$?
   if [[ $erg != 0 ]] ; then
      echo "winexeimg: Samba Share löschen fehlgeschlagen!"
      return 1
   fi
 
   # Partition ausbinden
   umount -v "$mountpoint"
   erg=$?
   if [[ $erg != 0 ]] ; then
      echo "winexeimg: Umount fehlgeschlagen!"
      return 1
   fi
 
   # Backup-Snapshot anlegen
   sstname="winbkp-$(date -I)"
   if ! lvscan|egrep -q "'/dev/$pvolume/$sstname'"; then
      lvcreate -s --name "$sstname" "$pvolume/$ovolume"
      erg=$?
      if [[ $erg != 0 ]] ; then
         echo "winexeimg: Snapshot erstellen fehlgeschlagen!"
         return 1
      fi
   else
      echo "winexeimg: Snapshot existiert bereits!"
      return 1
   fi
 
   return 0
}

Zugriff von Windows

Zugriff von Linux

windows7-backup.txt · Zuletzt geändert: 2016/06/04 14:15 von michael

Seiten-Werkzeuge