Backup mit duply

Seit geraumer Zeit sichere ich meine Linuxserver am liebsten mit der Software duply. Der Name duply ist die Abkürzung von „simple duplicity“. Wie der Name schon verrät, wurde diese Software entwickelt, um das komplexe aber gleichzeitig auch leistungsfähige Backupframework duplicity einfach bedienbar zu machen. Und dies ist meiner Meinung nach auch hervorragend gelungen.dsc_9889

In diesem Artikel blogge ich die einzelnen Schritte, mit denen ich ein duply auf einem Debian 8 oder Ubuntu 16.04 einrichte.

Als erstes muss duply und ein brauchbares FTP-Programm für die Datenübertragung installiert werden.

apt-get install duply
apt-get install lftp

Danach muss ein zentrales Verzeichnis für die Konfiguration unter /etc angelegt und danach eine Backup-Konfiguration erstellt werden. Es ist wichtig, dass das Verzeichnis als erstes angelegt wird, da duply die Konfiguration sonst in das home-Verzeichnis und nicht unter /etc ablegt. Als Namen für die Konfiguration wähle ich immer den vollen Hostnamen. Dies ist zumeist eindeutig und läßt sich im Nachhinein leichter Skripten.

mkdir /etc/duply
duply hostname.domain.de create

Danach erzeugt man sich einen GPG-Schlüssel.

gpg --gen-key

Sofern man einen bereits existierenden GPG-Schlüssel verwenden möchte, kann man natürlich auch Schlüssel in GPG importieren. Dabei sollte man dann aber nicht vergessen, neben dem öffentlichen auch den privaten Schlüssel und die Ownertrusts zu importieren. Ich habe die beiden Schlüssel und die Ownertrusts für diese Zwecke immer in drei Dateien mit den Namen backup-key.asc, backup-secret-key.asc und backup-ownertrusts.asc. Diese brauche ich dann nur übermitteln und importieren.

gpg --import backup-key.asc
gpg --import backup-secret-key.asc
gpg --import-ownertrust backup-ownertrusts.asc

Sobald man den Schlüssel angelegt oder importier hat, läßt man sich die Public-Key-ID des GPG-Schlüssels anzeigen. Diese muss man nämlich später in die Konfiguration von duply eintragen, damit die Backups mit GPG verschlüsselt werden. Dies führt zu einer zusätzlichen Datensicherheit, die gerade bei FTP-Servern im Internet zu empfehlen ist.

gpg --list-keys

Danach passt man die Konfiguration von duply entsprechend an.

cd /etc/duply/hostname.domain.de/
vi conf

Die Datei sollte ungefähr wie folgt aussehen. Dabei muss die Schlüssel-ID und die FTP-VErbindung natürlich auf die eigene Umgebung angepasst werden.

# gpg encryption settings, simple settings:
#  GPG_KEY='disabled' - disables encryption alltogether
#  GPG_KEY='<key1>[,<key2>]'; GPG_PW='pass' - encrypt with keys,
#   sign if secret key of key1 is available use GPG_PW for sign & decrypt
#  Note: you can specify keys via all methods described in gpg manpage,
#        section "How to specify a user ID", escape commas (,) via backslash (\)
#        e.g. 'Mueller, Horst', 'Bernd' -> 'Mueller\, Horst, Bernd'
#        as they are used to separate the entries
#  GPG_PW='passphrase' - symmetric encryption using passphrase only
GPG_KEY='1234567'
GPG_PW='Hier kommt das Passwort fuer den eigenen key hin'
# gpg encryption settings in detail (extended settings)
#  the above settings translate to the following more specific settings
#  GPG_KEYS_ENC='<keyid1>[,<keyid2>,...]' - list of pubkeys to encrypt to
#  GPG_KEY_SIGN='<keyid1>|disabled' - a secret key for signing
#  GPG_PW='<passphrase>' - needed for signing, decryption and symmetric
#   encryption. If you want to deliver different passphrases for e.g.
#   several keys or symmetric encryption plus key signing you can use
#   gpg-agent. Simply make sure that GPG_AGENT_INFO is set in environment.
#   also see "A NOTE ON SYMMETRIC ENCRYPTION AND SIGNING" in duplicity manpage
# notes on en/decryption
#  private key and passphrase will only be needed for decryption or signing.
#  decryption happens on restore and incrementals (compare archdir contents).
#  for security reasons it makes sense to separate the signing key from the
#  encryption keys. https://answers.launchpad.net/duplicity/+question/107216
#GPG_KEYS_ENC='<pubkey1>,<pubkey2>,...'
#GPG_KEY_SIGN='<prvkey>'
# set if signing key passphrase differs from encryption (key) passphrase
# NOTE: available since duplicity 0.6.14, translates to SIGN_PASSPHRASE
#GPG_PW_SIGN='<signpass>'
 
# uncomment and set a file path or name force duply to use this gpg executable
# available in duplicity 0.7.04 and above (currently unreleased 06/2015)
#GPG='/usr/local/gpg-2.1/bin/gpg'
 
# gpg options passed from duplicity to gpg process (default='')
# e.g. "--trust-model pgp|classic|direct|always"
#   or "--compress-algo=bzip2 --bzip2-compress-level=9"
#   or "--personal-cipher-preferences AES256,AES192,AES..."
#   or "--homedir ~/.duply" - keep keyring and gpg settings duply specific
#   or "--pinentry-mode loopback" - needed for GPG 2.1+ _and_
#      also enable allow-loopback-pinentry in your .gnupg/gpg-agent.conf
#GPG_OPTS=''
 
# disable preliminary tests with the following setting
#GPG_TEST='disabled'
 
# backend, credentials & location of the backup target (URL-Format)
# generic syntax is
#   scheme://[user[:password]@]host[:port]/[/]path
# eg.
#   sftp://bob:secret@backupserver.com//home/bob/dupbkp
# for details and available backends see duplicity manpage, section URL Format
#   http://duplicity.nongnu.org/duplicity.1.html#sect7
# NOTE:
#   some backends (eg. cloudfiles) need additional env vars to be set to
#   work properly, when in doubt consult the man page mentioned above.
# ATTENTION:
#   characters other than A-Za-z0-9.-_.~ in the URL have to be
#   replaced by their url encoded pendants, see
#     http://en.wikipedia.org/wiki/Url_encoding
#   if you define the credentials as TARGET_USER, TARGET_PASS below duply
#   will try to url_encode them for you if the need arises.
#TARGET='scheme://user[:password]@host[:port]/[/]path'
TARGET='ftp://user:passwort@ftphost.domain.de/'
# optionally the username/password can be defined as extra variables
# setting them here _and_ in TARGET results in an error
#TARGET_USER='_backend_username_'
#TARGET_PASS='_backend_password_'
# alternatively you might export the auth env vars for your backend here
# when in doubt consult (if existing) the NOTE section of your backend on
#  http://duplicity.nongnu.org/duplicity.1.html for details
# eg. for cloud files backend it might look like this (uncomment for use!)
#export CLOUDFILES_USERNAME='someuser'
#export CLOUDFILES_APIKEY='somekey'
#export CLOUDFILES_AUTHURL ='someurl'
 
# base directory to backup
SOURCE='/'
 
# a command that runs duplicity e.g.
#  shape bandwidth use via trickle
#  "trickle -s -u 640 -d 5120" # 5Mb up, 40Mb down"
#DUPL_PRECMD=""
 
# override the used python interpreter, defaults to "python2"
#   e.g. "python" or "/usr/bin/python2.7"
#PYTHON="python2"
 
# exclude folders containing exclusion file (since duplicity 0.5.14)
# Uncomment the following two lines to enable this setting.
#FILENAME='.duplicity-ignore'
#DUPL_PARAMS="$DUPL_PARAMS --exclude-if-present '$FILENAME'"
 
# Time frame for old backups to keep, Used for the "purge" command.
# see duplicity man page, chapter TIME_FORMATS)
MAX_AGE=3M
 
# Number of full backups to keep. Used for the "purge-full" command.
# See duplicity man page, action "remove-all-but-n-full".
MAX_FULL_BACKUPS=3
 
# Number of full backups for which incrementals will be kept for.
# Used for the "purge-incr" command.
# See duplicity man page, action "remove-all-inc-of-but-n-full".
#MAX_FULLS_WITH_INCRS=1
 
# activates duplicity --full-if-older-than option (since duplicity v0.4.4.RC3)
# forces a full backup if last full backup reaches a specified age, for the
# format of MAX_FULLBKP_AGE see duplicity man page, chapter TIME_FORMATS
# Uncomment the following two lines to enable this setting.
#MAX_FULLBKP_AGE=1M
#DUPL_PARAMS="$DUPL_PARAMS --full-if-older-than $MAX_FULLBKP_AGE "
 
# sets duplicity --volsize option (available since v0.4.3.RC7)
# set the size of backup chunks to VOLSIZE MB instead of the default 25MB.
# VOLSIZE must be number of MB's to set the volume size to.
# Uncomment the following two lines to enable this setting.
#VOLSIZE=50
#DUPL_PARAMS="$DUPL_PARAMS --volsize $VOLSIZE "
 
# verbosity of output (error 0, warning 1-2, notice 3-4, info 5-8, debug 9)
# default is 4, if not set
#VERBOSITY=5
 
# temporary file space. at least the size of the biggest file in backup
# for a successful restoration process. (default is '/tmp', if not set)
#TEMP_DIR=/tmp
 
# Modifies archive-dir option (since 0.6.0) Defines a folder that holds
# unencrypted meta data of the backup, enabling new incrementals without the
# need to decrypt backend metadata first. If empty or deleted somehow, the
# private key and it's password are needed.
# NOTE: This is confidential data. Put it somewhere safe. It can grow quite
#       big over time so you might want to put it not in the home dir.
# default '~/.cache/duplicity/duply_<profile>/'
# if set  '${ARCH_DIR}/<profile>'
#ARCH_DIR=/some/space/safe/.duply-cache
 
# DEPRECATED setting
# sets duplicity --time-separator option (since v0.4.4.RC2) to allow users
# to change the time separator from ':' to another character that will work
# on their system.  HINT: For Windows SMB shares, use --time-separator='_'.
# NOTE: '-' is not valid as it conflicts with date separator.
# ATTENTION: only use this with duplicity < 0.5.10, since then default file
#            naming is compatible and this option is pending depreciation
#DUPL_PARAMS="$DUPL_PARAMS --time-separator _ "
 
# DEPRECATED setting
# activates duplicity --short-filenames option, when uploading to a file
# system that can't have filenames longer than 30 characters (e.g. Mac OS 8)
# or have problems with ':' as part of the filename (e.g. Microsoft Windows)
# ATTENTION: only use this with duplicity < 0.5.10, later versions default file
#            naming is compatible and this option is pending depreciation
#DUPL_PARAMS="$DUPL_PARAMS --short-filenames "
 
# more duplicity command line options can be added in the following way
# don't forget to leave a separating space char at the end
#DUPL_PARAMS="$DUPL_PARAMS --put_your_options_here "

Bei Bedarf, kann man dann noch Verzeichnisse vom Backup ausschließen.

vi exclude

Anzeige der bereits gelaufenen Backups:

duply $(hostname -f) status

Starten eines Full-Backups:

duply $(hostname -f) full

Löschen veralteter Backups:

duply $(hostname -f) purge-full --force

Einrichtung einer täglichen, inkrementellen Sicherung mit anschließendem löschen der veralteten Backups:
Um duply jede Nacht ein Backup machen zu lassen, muss ein Cron-Job angelegt werden. Dazu legt man am besten die Datei /etc/cron.d/duply mit dem folgenden Befehlt an.

vi /etc/cron.d/duply

Wenn man jede Nacht um 2 Uhr eine Sicherung machen möchte, sollte in dieser Datei die folgende Zeile eingetragen werden.

0 2 * * * root /usr/sbin/duply.sh >/dev/null 2>&1

Danach muss die Datei /usr/sbin/duply.sh angelegt werden, die vom Cron-Job aufgerufen wird.

vi /usr/sbin/duply.sh

In dieser sollte dann das folgende stehen.

#!/bin/sh
#
# Script created on 04-10-2015 KPU
#
# This script was created to make Duplicity backups.
#
# 05.01.2016 K.Purrucker
# Ergaenzung: Es wird immer der Hostname als Konfigname verwendet
#
 
duply $(hostname -f) backup >>/var/log/duply.log
duply $(hostname -f) purge-full --force >>/var/log/duply.log
 
exit 0

Danach muss noch cron neu gestartet, die Datei ausführbar gemacht und das Log-File angelegt werden.

chmod a+x /usr/sbin/duply.sh
service cron restart
touch /var/log/duply.log

Beispiel: Rücksicherung einer 7 Tage alten Version der Datei etc/fstab in das Verzeichnis /root/:
duply $(hostname -f) fetch etc/fstab /root/fstab 7D

0x0000007B: Windows XP Bluescreen nach Rücksicherung

Wenn man Windows XP (bzw. Windows 2000) nach einem Ausfall auf eine andere Hardware zurück sichert, landet man beim Starten des Betriebssystems oft in einem Bluescreen mit der Fehlermeldung 0x0000007B. Diese Fehlernummer steht für INACCESSIBLE_BOOT_DEVICE und bedeutet, dass Windows den passenden Treiber für den Festplattencontroller nicht findet. Nähere Informationen kann man in der Knowledge Base von Microsoft finden. Dort ist auch der folgende Patch für die Registry zu finden. Wenn man diesen vor der Migration in einer Datei mit dem Namen Mergeide.reg speichert und in das Systems einspielt, findet Windows XP zumindest schon mal die Standard-Treiber.

Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\primary_ide_channel]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\secondary_ide_channel]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\*pnp0600]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\*azt0502]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\gendisk]
"ClassGUID"="{4D36E967-E325-11CE-BFC1-08002BE10318}"
"Service"="disk"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#cc_0101]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_0e11&dev_ae33]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1039&dev_0601]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1039&dev_5513]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1042&dev_1000]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_105a&dev_4d33]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0640]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0646]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0646&REV_05]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0646&REV_07]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0648]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0649]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1097&dev_0038]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10ad&dev_0001]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10ad&dev_0150]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5215]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5219]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5229]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_1106&dev_0571]
"Service"="pciide"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_1222]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_1230]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_2411]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_2421]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7010]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7111]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7199]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
;Treiber für Atapi hinzufügen (erfordert Atapi.sys im Verzeichnis Drivers)
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\atapi]
"ErrorControl"=dword:00000001
"Group"="SCSI miniport"
"Start"=dword:00000000
"Tag"=dword:00000019
"Type"=dword:00000001
"DisplayName"="Standard IDE/ESDI Hard Disk Controller"
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\ 
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,61,00,74,00,61,00,70,00,69,00,2e,\ 
  00,73,00,79,00,73,00,00,00
 
;Treiber für intelide hinzufügen (erfordert intelide.sys im Verzeichnis Drivers)
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IntelIde]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Tag"=dword:00000004
"Type"=dword:00000001
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\ 
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,69,00,6e,00,74,00,65,00,6c,00,69,\ 
  00,64,00,65,00,2e,00,73,00,79,00,73,00,00,00
 
 
;Treiber für Pciide hinzufügen (erfordert Pciide.sys und Pciidex.sys im Verzeichnis Drivers)
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PCIIde]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Tag"=dword:00000003
"Type"=dword:00000001
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\ 
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,70,00,63,00,69,00,69,00,64,00,65,\ 
  00,2e,00,73,00,79,00,73,00,00,00

Wenn man den Patch auf dem alten System nicht mehr einspielen kann (z.B. weil es defekt ist) kann man die Festplatte in einen anderen PC mit Windows 2000/XP einbauen oder sich mit BartPE behelfen. Mit diesem Programm kann man sich eine Boot-CD mit Windows XP basteln.

Wenn man die Festplatte in einem anderen laufenden System angeschlossen hat muss zunächst die Registry angepasst werden. Dazu startet man Regedit, markiert HKEY_LOCAL_MACHINE und wählt im Menü unter Datei den Punkt Struktur laden ... aus. In dem sich öfnenden Dateidialog wählen man die Datei System aus dem Verzeichnis \System32\Config der entsprechenden Fetplatte bzw. Windows-Installation aus. Danach klickt man auf „Öffnen“ und gibt den Schlüsselnamen test ein. Der Registry-Zweig HKEY_LOCAL_MACHINE\SYSTEM erscheint danach als HKEY_LOCAL_MACHINE\test. Jetzt kann man die Datei Mergeide.reg mit Datei --> Importieren in die Registry einlesen, wobei zu beachten ist, dass die Pfade der Schlüssel angepasst werden müssen. Die Datei sollte also wie folgt aussehen.

Windows Registry Editor Version 5.00
;Welche Kopie des ControlSets gerade aktiv ist erfahren Sie unter
;HKEY_LOCAL_MACHINE\SYSTEM\Select über den Wert von "Current".
;Steht dieser auf "1", müssen Sie hier weiter nichts ändern.
;Bei "2" müssen Sie ControlSet001 durch ControlSet002 ertsetzen
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\primary_ide_channel]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\secondary_ide_channel]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\*pnp0600]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\*azt0502]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="atapi"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\gendisk]
"ClassGUID"="{4D36E967-E325-11CE-BFC1-08002BE10318}"
"Service"="disk"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#cc_0101]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_0e11&dev_ae33]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1039&dev_0601]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1039&dev_5513]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1042&dev_1000]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_105a&dev_4d33]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0640]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1095&dev_0646]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1097&dev_0038]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_10ad&dev_0001]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_10ad&dev_0150]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5215]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5219]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_10b9&dev_5229]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="pciide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_1106&dev_0571]
"Service"="pciide"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_1222]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_1230]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_2411]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_2421]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7010]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7111]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7199]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Services\atapi]
"ErrorControl"=dword:00000001
"Group"="SCSI miniport"
"Start"=dword:00000000
"Tag"=dword:00000019
"Type"=dword:00000001
"DisplayName"="Standard IDE/ESDI Hard Disk Controller"
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\ 
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,61,00,74,00,61,00,70,00,69,00,2e,\ 
  00,73,00,79,00,73,00,00,00
 
 
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Services\IntelIde]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Tag"=dword:00000004
"Type"=dword:00000001
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\ 
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,69,00,6e,00,74,00,65,00,6c,00,69,\ 
  00,64,00,65,00,2e,00,73,00,79,00,73,00,00,00
 
[HKEY_LOCAL_MACHINE\test\ControlSet001\Services\PCIIde]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Tag"=dword:00000003
"Type"=dword:00000001
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\ 
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,70,00,63,00,69,00,69,00,64,00,65,\ 
  00,2e,00,73,00,79,00,73,00,00,00

Nach dem einspielen sollte man mit Datei --> Struktur entfernen den Registry-Zweig Test wieder entfernen.

Nachdem die Registry angepasst wurde, müssen manchmal auch noch die Dateien ATAPI.SYS, PCIIDE.SYS, PCIIDEx.SYS und PCI.SYS und Intelide.sys im Verzeichnis \%SystemRoot%\System32\Drivers durch die Originalversionen aus dem Archiv „%SystemRoot%\Driver Cache\i386\Driver.CAB“ ersetzt werden. Alternativ können diese Dateien auch aus dem letzten Service Pack kopiert werden.

Falls man von Intel auf einen AMD Prozessor gewechselt hat muss zusätzlich noch die Datei Intelppm aus dem Verzeichnis Windows\System32\drivers entfernt werden.

Danach kann man versuchen Windows neu zu booten und mit etwas Glück startet es die Hardwareerkennung und findet den richtigen Controller und die Bootfestplatte.

(SP1)-Installationsfehler: 0x800F0A13 bei der Installation des SP1 für Windows 2008R2

Ich bin extra am Wochenende in die Firma gefahren, um eine Datensicherung eines Windows 2008R2 Servers zu machen und das ServicePack 1 zu installieren. Leider stieg die Installation gleich am Anfang mit folgender Meldung aus:

(SP1)-Installationsfehler: 0x800F0A13

Laut Microsoft Hilfe und Support kann der Fehler durch folgenden, vier Gründe verursacht werden, die bei mir aber nicht zutrafen:

  1. Während des Setup wird die Systempartition nicht automatisch eingebunden bzw. für Windows zugänglich gemacht.
  2. Die Festplatte, auf der sich die Systempartition befindet, wurde vor der Installation von SP1 entfernt.
  3. Windows wird in einem Storage Area Network (SAN) ausgeführt, und der Zugriff auf die Systempartition wurde deaktiviert.
  4. Ein Tool zur Datenträgerverwaltung eines anderen Softwarehersteller wurde zum Kopieren (oder Klonen) des Datenträgers oder der Partition verwendet, auf dem bzw. der SP1 installiert werden soll.

Nachdem ich Google befragt habe, bin ich aber auch auf einen Post im Technet-Blog von joscon gestoßen, der empfahl zuerst das Systemupdate-Vorbereitungstool auszuführen. Falls die Installation danach immer noch nicht funktioniert, gibt es dort auch noch einige andere Lösungsvorschläge. Jedoch keiner dieser Vorschläge hat geholfen.

Die Lösung brachte letztendlich ein Heise Artikel. Nachdem ich wie in den Artikel beschrieben die aktive Partition gesetzt hatte und den Server neu gebootet hatte, funktionierte die Installation des ServicePacks.

Update:
Bei einem anderen Windows 2008R2 Server lief die Installation erst, nachdem ich der vom System reservierten 100 MB Partition einen Laufwerksbuchstaben gegeben hatte. Dazu wurde im Technet Forum geraten.

Erzeugen eines Festplattenimages

Wenn man ein Image einer Festplatte benötigt, reicht dazu eine gängige Linux Live-CD, wie z.B. Koppix.

Nachdem man die Live-CD gebootet hat kann man sich mit dem folgenden Befehlt eine Liste der Festplatten anzeigen lassen.

fdisk -l

Dabei bezeichnet /dev/hda die erste IDE-Platte und /dev/hdb bezeichnet die zweite IDE-Platte. Bei SCSI-Platten bezeichnet analog dazu /dev/sda die erste Platte und /dev/sdb die zweite. Befindet sich beispielsweise auf der Festplatte /dev/hda das System, kann man davon mit dem Programm dd ein Image erzeugen. Am besten leitet das Image gleich mit netcat auf einen anderen PC. Die genaue Anweisung dazu lautet dann wie folgt:

Empfänger:

netcat -w 30 -vvnl 3333 | gzip -dc > hda.raw

Sender:

dd if=/dev/sda | gzip -c | netcat -w 30 -vvn 192.168.1.1

In dem Beispiel liest dd die Festplatte /dev/hda und schickt die Standardausgabe durch gzip zum Komprimieren. Der komprimierte Datenstrom wird von netcat an die IP-Adresse 192.168.1.1 zu dem Port 3333 gesendet. Auf dem Empfangsrechner nimmt netcat den Datenstrom auf dem Port 3333 entgegen. gzip dekomprimiert diesen Datenstrom. Die Ausgabe wird in die Datei hda.raw umgeleitet. Ist die Übertragung zu Ende, kann dieses Image direkt in QEMU oder KVM als virtuelle Maschine getestet werden.

kvm -hda /mnt/berlindc_backup/sda.raw -m 1024 -net nic,model=virtio -vnc :1
192.168.30.2:1

Ubuntu/Debian: Die gleiche Software auf einem neuen Computer installieren

Um bei einem Computer unter Ubuntu oder Debian die gleichen Pakete wie auf einem anderen Computer zu installieren muss man nur die folgenden Schritte durchführen:

  1. Die Paketliste des alten Computer in eine Datei sichern
    dpkg --get-selections "*" > paketliste.txt
  2. Die Pake aus der Datei bei dem neuen Computer auswählen
    dpkg --set-selections < paketliste.txt
  3. Die Pakete auf dem neuen Computer installieren
    apt-get dselect-upgrade

Dabei ist zu beachten, dass das ganze natürlich nur mit Root-Rechten funktioniert!

Backup-Software für Linux

Für das kopieren, synchronisieren und sichern von Dateien gibt es unter Linux wie gewohnt eine riesige Auswahl an Kommandozeilentools, die kaum Wünsche offen lassen. Die bekanntesten sind GNU cpio (copy in/out) und GNU tar (tape archiver). Diese beiden Programm stammen ursprünglich aus der System V bzw. BSD-Ecke und existieren schon ca. 20 Jahre. Sie sind inzwischen absolut ausgereift und zuverlässig.

Wenn man jedoch viele Linux-Server betreibt benötigt man eine Backup-Lösung, die mehrere Server sichert und eine leistungsfähige Volume-Verwaltung mitbringt. Für solche Anforderungen eignen sich die beiden Programme amanda (Advanced Maryland Automatic Network Disk Archiver) und bacula (Wortspiel aus Backup und Dracula / Der Slogan des Programms lautet deshalb auch: „It comes by night and sucks the vital essence from your computers“).

Amanda
Amanda wurde ursprünglich von James da Silva an der University of Maryland’s entwickelt und wird inzwischen von einem ganzen Team weiterentwickelt. Es ist inzwischen auch schon über 10 Jahre alt und sehr ausgereift. Deshalb ist es auch bei jeder Linux-Distribution und den meisten UNIX-Derivaten im Lieferumfang enthalten und kann relativ leicht über die Softwareverwaltung installiert werden. Allerdings ist es recht umfangreich und auf Anhieb nicht leicht zu durchschauen. Leider gibt es auch noch keine GUI. Alles muss per Kommandozeile oder Konfigurationsdatei eingestellt werden.

Bei Amanda gibt es einen Bandrechner, an dem sich das Laufwerk befindet, und auf dem der Server installiert wird, während die zu sichernden Rechnern mit dem Client auszustatten sind. Eine zentrale Konfiguration für den Server gibt vor, welche Dateien von welchen Rechnern und mit welcher Priorität zu sichern sind, wie viele Bänder insgesamt vorhanden und in einem Zyklus sind, usw. Während der Sicherung speichert Amanda alle Informationen zu den gesicherten Dateien in einer Datenbank. Amanda sagt einem also bei einer Rücksicherung welche Bänder einzulegen sind, wenn man angibt welche Dateien von welchem Datum man von welchem Rechner haben möchte.

Bacula
Bacula ist das umfangreichste, kostenlose Backup-Programm, dass es im Augenblick für Linux gibt. Es ist noch umfangreicher als Amanda jedoch in einigen Bereichen noch nicht so ausgereift. Die Entwicklung wurde im Jahr 2000 begonnen und die erste stabile Version wurde erst im Jahr 2006 fertig gestellt. Die zweite stabile Version wurde 2007 fertig gestellt und lässt kaum noch Wünsche offen. Das Programm ist aber leider noch nicht bei allen Linux-Distributionen im Lieferumfang enthalten, da es noch so neu ist. Man kann auf der Webseite der Entwickler neben den Sourcen aber auch viele fertige Pakete für verschiedene Linux-Distributionen finden.

Die Bacula-Software besteht aus drei Programmen, die auch für Windows verfügbar sind: einem Client / File Daemon (dem Computer mit den Dateien, die gesichert werden sollen), einem Storage Daemon (dem Computer mit den Medien, auf die gesichert werden soll) und dem Backup-Servers / Director (dem Computer, der den Backup-Vorgang steuert). Die Konfiguration dieser drei Programme erfolgt jeweils in einer Konfigurationsdatei. Der Backup-Server kann danach über ein CLI (Command Line Interface) gesteuert werden. Es gibt aber inzwischen auch GUI-Software, welche die Bedienung der CLI erleichtert. Unter Linux kann man mithilfe des Programms bat (Bacula Admin Tool) die gebräuchlichsten Verwaltungsaufgaben per GUI erledigen.

Bacula Admin Tool 2.4.0

Für Windows gibt es die bwx-console, die zumindest eine Rücksicherung per GUI ermöglicht. Darüber hinaus kann Bacula mit SQlite-, MySQL- oder PostgreSQL-Datenbanken umgehen, alle Komponenten kommunizieren über TSL-verschlüsselte Verbindungen und sogar die gesicherten Daten lassen sich durch Verschlüsselung vor neugierigen Blicken verbergen.

Fazit
Sobald man viele Linux-Server sichert sollte man sich Bacula und Amanda näher anschauen. Beide lassen sich in größeren Umgebungen sehr gut einsetzten. Amanda besticht durch seine Stabilität und große Verbreitung. Insbesondere die fehlende GUI erschwert aber den Zugang für unerfahrene Admins. Bacula ist umfangreicher und flexibler als Amanda. Insbesondere der große Funktionsumfang und die GUI werden dafür sorgen, dass Bacula zukünftig öfter eingesetzt wird. Es wird sicherlich bald in allen Linux-Distributionen zu finden sein.