Hallo,
Ich bin noch relativ neu mit HardlinkBackup aber ich konnte schon einige tolle Ergebnisse erzielen die vl in diesem Forum noch nicht so direkt beschrieben worden sind.
Ziel ist es eine Art privates Cloud Backup einzurichten. Es gibt zwei Standorte jeweils mit Strom und Internetzugang und an einem wird gearbeitet und gelebt und am anderen soll das Backup liegen. Wirklich physisch wo anders falls es brennt oder eine Bombe einschlägt xD. Der Backupserver soll ein alter Laptop sein mit USB3 und ein paar USB Festplatten mit Win10 Storagespaces Simple oder Parity formatiert. Optional kann man die Platten noch mit BitLocker verschlüsseln, falls fremde darauf zugriff haben könnten.
Über einen VPN Tunnel lassen sich meine Produktiv PCs und der Backupserver verbinden so dass sie sich Netzwerktechnisch so sehen als wären sie im selben LAN. Das ist für später wichtig.
Prinzipiell soll die Datenkommunikation per SMB(CIFS) also "Windows Freigabe" geschehen. Die nächste Frage die sich stellt ist, wo soll HardlinkBackup laufen? Wer gibt eine Platte frei und wer schreibt/liest darauf?
Läuft HardlinkBackup am eigentlichen PC so würde das Scannen der zu sichernden Dateien flott gehen. Dafür dauert das Scannen der vorhandenen Backups länger und auch das Verlinken durch Hardlinks bzw das Löschen alter Backups dauert viel länger. Das "Link Skript" Feature ist mir da auch ein wenig zu spookie.
Daher habe ich mich für eine Ausführlung am Backupserver selbst entschieden. So kann HardlinkBackup im Prinzip so funktionieren wie es ungefähr gedacht ist und direkt auf der Backup NTFS Partition der USB Platten herumfuhrwerken.
Wie aber die Daten vom eigentlichen PC bereitstellen?
Man könnte jetzt einfach Windows Freigaben konfigurieren aber dadurch verliert man die Möglichkeit vorher Snapshots mit ShadowCopies zu erstellen um auch gelockte/genutzte Files sichern zu können bzw einen eindeutigen Zeitpunkt absamplet. Für mich keine Lösung weil ich zahlreiche Applikationen Webserver usw habe, die ich nicht jedes mal stoppen will wenn ein Backup gezogen wird.
Daher habe ich mir folgendes PowerShell Script "DiskBackupSnapshot.ps1" gebastelt:
$Drive = $args[0]
$Drive_Name = $args[1]
echo "Drive Letter: $Drive"
echo "Drive Name: $Drive_Name"
# Remove Share
Remove-SmbShare -Name ("xxx_Shadow_" + $Drive_Name) -Force
# remove Backup Mount
#Remove-PSDrive -Name Z
# Remove Link
Start-Process -Wait -FilePath cmd -ArgumentList '/c', 'rmdir', ($Drive + '\xxx_Shadow')
# list snapshots
vssadmin list shadows /for=$Drive
# remove shadows
vssadmin delete shadows /for=$Drive /all /Quiet
# create snapshot
(Get-WmiObject -list win32_shadowcopy).create($Drive + "\","ClientAccessible")
#Find the latest Shadow copy
$HDDriveID = (Get-WmiObject win32_volume -filter ("DriveLetter='" + $Drive + "'")).DeviceID
$LastShadowCopy = Get-WmiObject win32_shadowcopy | Where-Object {$_.VolumeName -eq $HDDriveID} | Sort-Object InstallDate | Select-Object -Last 1
# Then mount it:
#New-PSDrive -Name Z -PSProvider FileSystem -Root ($LastShadowCopy.DeviceObject + "\")
$d = $LastShadowCopy.DeviceObject + "\"
echo "Shadowcopy Path: $d"
# Link
#cmd /c mklink /d W:\Shadowcopy "$d"
Start-Process -Wait -FilePath cmd -ArgumentList '/c', 'mklink', '/d', ($Drive + '\xxx_Shadow'), "`"$d`""
# hide Link
(Get-Item ($Drive + '\xxx_Shadow') -Force).attributes="Hidden"
# Create Share
New-SmbShare -Name ("xxx_Shadow_" + $Drive_Name) -Path ($Drive + '\xxx_Shadow') -ReadAccess ($env:UserDomain + "\" + $env:UserName)
Dieses Script kann am PC ausgeführt werden und man übergiebt ihm das Laufwerk ("D:") und einen Laufwerks Namen ("Daten"). Bei Ausführung löscht es automatisch alle ShadowCopies für das Laufwerk und erstellt einen frischen Snapschot. Dieser Snapshot wird dann unter D:\xxx_Shadow\ versteckt verlinkt. Anschließend wir eine neue Windows Freigabe erstellt, die den versteckten Snapshot Ordner shared als "xxx_Shadow_Data". Der lokale Windows User erhält automatisch Leserechte um auf diesen Share zuzugreifen.
Hier sei erwähnt, das Script ist nicht das schönste und man kann sicher noch einiges ausbessern bzw eleganter lösen. Egal, bei mir funktionierts so und es soll als Vorlage für euch dienen.
Gut. Das heißt wir müssten jetzt zuerst am PC das Script ausführen und anschließend entsprechend am Backupserver das HardlinkBackup Profil. Wäre cool wenn man die Ausführung des Scripts vom Backupserver aus triggern könnte. Dann könnte man auch den netten Scheduler von HardlinkBackup verwenden und alles funktioniert vollautomatisch.
Das geht auch und zwar mit PsExec (Sysinternals Tool)
Dazu am PC in der Registry
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
"LocalAccountTokenFilterPolicy"=dword:00000001
Und Google is your Friend um herauszufinden welche Ports man noch in der Firewall freigeben muss am PC. Achtung ich würde diese Ports aber nur für die VPN IP des Backupservers freigeben. Alle anderen Geräte haben dort nichts verloren.
Dann sollte der Befehl
C:\PfadZuPsExec\PSExec64.exe \\MeinPC -u User -p Passwort -h powershell.exe -File C:\LokalerPfadZumScript\DiskBackupSnapshot.ps1 D: Data
vom Backupserver aus ausführbar sein. Es wird aber remote am zu sichernden PC ausgeführt. Cool.
Tja und jetzt ist es nur noch eine Kleinigkeit:
Am Backupserver im Hardlinkbackup Profil
Quellverzeichnis:
\\MeinPC\xxx_Shadow_Data
Pre-Backup Befehl:
C:\PfadZuPsExec\PSExec64.exe \\MeinPC -u User -p Passwort -h powershell.exe -File C:\LokalerPfadZumScript\DiskBackupSnapshot.ps1 D: Data
Und das sollte es gewesen sein.
Ach ja eines noch: Natürlich muss man einmalig vom Backupserver auf die Windows Freigabe des PCs manuell zugreifen. Dabei muss man User und Passwort vom PC eingeben und SPEICHERN. Sonst kann der Backupserver natürlich nicht als dieser User auf den Share vom PC zugreifen.
Natürlich kann man das selbe script auch ganz leicht für andere Laufwerke wiederverwenden. Man muss nur den Pre-Backup Befehl entsprechend anpassen. Man sollte aber darauf achten, dass nicht zwei Jobs gleichzeitig starten weil sonst das Windows Shadow Copies Service Probleme bekommt. Also ca.5min Zeitunterschied und alles sollte stabil laufen.
Außerdem sollte der Shadow Copy Service natürlich auch genügend Speicherplatz erhalten damit, für die Zeitdauer des Backups, auch das Delta der Laufwerksänderungen gespeichert werden können.
Ich empfehle Folgendes einmalig am PC auszuführen:
vssadmin resize shadowstorage /for=D: /on=D: /maxsize=UNBOUNDED
Für die Zukunft:
Beim Backupziehen ist der einzige zeitaufwendige Schritt nun nur noch der "Einlesen" Vorgang bei dem der BackupServer über VPN/Windows Freigabe alle Ordner und Files scannt. Das dauert definitv am längest abgesehen vom Dateitransfer selbst, der nicht vermeidbar ist.
Es wäre denkbar, dass man auch das noch deutlich beschleunigt, in dem man auf dem PC diesen Scan lokal durchführt und das Ergebnis direkt an die BackupServer HardlinkBackup Instanz übergibt. HardlinkBackup bräuchte dann nur noch die fehlenden neuen Dateien laden und den Rest wieder mit Hardlinks verlinken. Usw.
Leider ist das derzeit nicht machbar weil HardlinkBackup keine entsprechende SW-Schnittstelle bietet.
Aber ist vl eine gute Idee für die Zukunft @Lupinhos 😉 Eine Softwareschnittstelle mit der man HardlinkBackup eine File/Folder Liste übergeben kann mit den benötigten Attributen (Filesize, Name, Path, Last Change Timestamp, Checksum?, ...).
Ich hoffe jemand kann was damit anfangen! lG
|