Moin,
da meine QNAP im Wohnzimmer steht und sich in der Mietwohnung auch nicht sinnvoll anders unterbringen lässt hat das immer wieder zu einem gewissen Nerv-Faktor meinerseits geführt wenn die Tagsüber angefangen hat zu rödeln usw.
Jetzt habe ich mich ein wenig ans Skripten gesetzt und zwei Skripte (plus einigen Kleinkrams rundum) erstellt, um sicherzustellen, dass die QNAP nur dann läuft, wenn sie auch gebraucht wird.
Zur allgemeinen Konfiguration:
Ich habe einen Selbstbau-Heimserver auf dem Microsoft Hyper-V (2019 Datacenter) läuft weil ich die Lizenz im Laufe der Berufsausbildung kostenlos von Microsoft bereitgestellt bekommen habe.
Sicherung aller Systeme läuft über Veeam Backup & Replication V11 Community Edition. Der Speicher auf der QNAP ist per iSCSI gemappt. Das hat den Hintergrund, dass
1) Veeam empfiehlt, iSCSI statt SMB zu verwenden
2) Bei iSCSI kann ich den Speicher auf ReFS formattieren und durch 'block cloning' viel Speicherplatz sparen.
Das konkrete Modell der QNAP ist eine QNAP TS-431x2 mit integriertem SFP+ Port. Mit 3x 14TB Toshiba Enterprise Capacity im Raid 5 ist hier 25TiB Netto für meine Backups vorhanden, was für mich auch auf längere Zeit mehr als genug sein sollte.
Am Ende hat die Aufgabenplanung gesiegt weil die QNAP fast 5 Minuten braucht um den iSCSI-Dienst bereit zu stellen und noch einige Minuten länger um vollständig online zu sein.
Ein Powershell Skript per Aufgabenplanung ausführen ist denkbar simpel, daher gibt es nur den einen Screenshot - wer mehr wissen will, muss googeln.
Das Skript selber nutzt die Wake-on-LAN Funktionalität der QNAP. Dabei habe ich mit Entsetzen feststellen müssen, dass die von mir genutzte QNAP TS-431x2 auf dem 10G SFP+ Port kein WOL beherrscht.
(Wobei SFP+ Adapter die WOL unterstützen wohl eher selten sind. Trotzdem enttäuschend.)
Dann hilft alles nichts - ich muss die QNAP wohl doppelt anschließen. Hier eine Übersicht der verbundenen Adapter:
Da ich mich mit Portbündelung nicht rumschlagen will aber auch keine Unsicherheit haben will, was was macht erfolgt eine Servicebindung.
Ich bin mir nicht sicher, ob WOL noch funktionieren würde falls ich auch die Verwaltungsdienste deaktiviere, aber es gibt auch keinen echten Grund es auszuprobieren. Solange die Dateidienste nur die 10Gbit Verbindung nutzen ist alles prima.
Kommen wir zum verwendeten Powershell-Skript:
Die Invoke-WakeOnLan Funktion habe ich mir hier geholt: https://powershell.one/code/11.html
Man muss ja nicht für jedes Projekt erstmal das Rad neu erfinden. Der V:\Repository Ordner ist - wenn nicht offensichtlich - der Ordner in dem das Veeam-Repository hinterlegt ist.
Der if-Befehl ist, jetzt wo ich drüber nachdenke, überflüssig weil WOL bei einem laufendem System einfach nichts macht, aber wayne. Jetzt habe ich ihn schon drin.
Der Praxistest ist auch erfolgreich. Wenn ich den Task in der Aufgabenplanung manuell anstoße, ist ein paar Minuten später die NAS online. Die letzte Ärgernis ist der Diagnostik-Beep beim Startvorgang, der sich nicht in Software deaktivieren lässt. Da bleibt erstmal abzuwarten, ob der mich nachts aufweckt oder ob der unproblematisch ist.
Die Anforderungen waren wie folgt:
1) Der Shutdown darf erst erfolgen, wenn alle drei Veeam-Jobs erfolgerich waren. Da je nachdem ob Veeam bei einem Job z.B. ein Backup Health Check angefangen hat kann ich mich nicht darauf verlassen, dass die Jobs in der Reihenfolge abschließen, in der sie angelaufen sind.
2) Ich will die QNAP auch nicht jedesmal nach Abschluss der Datensicherung sofort wieder herunterfahren, weil die QNAP selber auch einige Dienste hat, die im Hintergrund laufen sollten und eventuell auch etwas Zeit brauchen
Die Entscheidung, den Shutdown per SSH an die QNAP zu geben war einfach. So viele Möglichkeiten gibt es nicht und SSH ist am einfachsten.
Hier erstmal das Skript:
Es gibt drei Versionen des Skript, die beim Anlaufen jeweils 1, 2 oder 3 in einer Text-File hinterlegen. Wenn alle drei Nummern angesammelt sind (also alle drei Backup-Jobs durchgelaufen) wird der Shutdown eingeleitet. Danach wird die Text-Datei zurückgesetzt.
Ja, das Admin-PW der QNAP steht im Klartext im Skript. Für meinen Heinserver ist das mMn kein Problem. In einer Firmenumgebung in einem per GPO verteilten Skript wäre das natürlich ganz was anderes. (Ja, den Code-Schnippsel zu den Credentials habe ich mir ergoogelt.)
Um das Skript auf einem anderen System verwenden zu können muss das PoSH-SSH Modul installiert und natürlich Umgebungs-spezifische Parameter wie IP, Credentials und Fingerprint angepasst werden.
Eingebaut habe ich, damit ich meine zweite Kondition erfüllen kann, einen konditionalen Sleep-Befehl, der dafür sorgt, dass die QNAP erst um 05:00 Uhr heruntergefahren wird - auch wenn die Backups schon um 02:30 fertig sind. Das ist eingebaut, um Zeit für Hintergrundaufgaben zu lassen, wie schon in den Anforderungen angesprochen.
Veeam kann Skripte vor und nach jedem Job ausführen lassen - jedoch kein Powershell. Hier muss ein Umweg über eine Batch-Datei genommen werden, die dann das entsprechende Powershell-Skript aufruft.
Der Inhalt der Batch ist denkbar simpel, das ist genau dasselbe Prinzip wie weiter oben beim Aufruf durch die Aufgabenplanung.
Und das wars auch schon - jetzt sollte ich tagsüber wieder ein stilles Wohnzimmer haben.
Falls ihr Feedback für mich habt - immer her, auch wenn's Kritik ist. Nur so werde ich besser.
da meine QNAP im Wohnzimmer steht und sich in der Mietwohnung auch nicht sinnvoll anders unterbringen lässt hat das immer wieder zu einem gewissen Nerv-Faktor meinerseits geführt wenn die Tagsüber angefangen hat zu rödeln usw.
Jetzt habe ich mich ein wenig ans Skripten gesetzt und zwei Skripte (plus einigen Kleinkrams rundum) erstellt, um sicherzustellen, dass die QNAP nur dann läuft, wenn sie auch gebraucht wird.
Zur allgemeinen Konfiguration:
Ich habe einen Selbstbau-Heimserver auf dem Microsoft Hyper-V (2019 Datacenter) läuft weil ich die Lizenz im Laufe der Berufsausbildung kostenlos von Microsoft bereitgestellt bekommen habe.
Sicherung aller Systeme läuft über Veeam Backup & Replication V11 Community Edition. Der Speicher auf der QNAP ist per iSCSI gemappt. Das hat den Hintergrund, dass
1) Veeam empfiehlt, iSCSI statt SMB zu verwenden
2) Bei iSCSI kann ich den Speicher auf ReFS formattieren und durch 'block cloning' viel Speicherplatz sparen.
Das konkrete Modell der QNAP ist eine QNAP TS-431x2 mit integriertem SFP+ Port. Mit 3x 14TB Toshiba Enterprise Capacity im Raid 5 ist hier 25TiB Netto für meine Backups vorhanden, was für mich auch auf längere Zeit mehr als genug sein sollte.
Starten der QNAP per Powershell Skript
Ich hatte überlegt, ob ich das Skript um die QNAP zu starten als Start-Skript im Veeam-Job hinterlege oder von der Aufgabenplanung aus ausführen lassen soll.Am Ende hat die Aufgabenplanung gesiegt weil die QNAP fast 5 Minuten braucht um den iSCSI-Dienst bereit zu stellen und noch einige Minuten länger um vollständig online zu sein.
Ein Powershell Skript per Aufgabenplanung ausführen ist denkbar simpel, daher gibt es nur den einen Screenshot - wer mehr wissen will, muss googeln.
Das Skript selber nutzt die Wake-on-LAN Funktionalität der QNAP. Dabei habe ich mit Entsetzen feststellen müssen, dass die von mir genutzte QNAP TS-431x2 auf dem 10G SFP+ Port kein WOL beherrscht.
(Wobei SFP+ Adapter die WOL unterstützen wohl eher selten sind. Trotzdem enttäuschend.)
Dann hilft alles nichts - ich muss die QNAP wohl doppelt anschließen. Hier eine Übersicht der verbundenen Adapter:
Da ich mich mit Portbündelung nicht rumschlagen will aber auch keine Unsicherheit haben will, was was macht erfolgt eine Servicebindung.
Ich bin mir nicht sicher, ob WOL noch funktionieren würde falls ich auch die Verwaltungsdienste deaktiviere, aber es gibt auch keinen echten Grund es auszuprobieren. Solange die Dateidienste nur die 10Gbit Verbindung nutzen ist alles prima.
Kommen wir zum verwendeten Powershell-Skript:
PowerShell:
$Folder = 'V:\Repository'
if (Test-Path -Path $Folder)
{
exit
}
else
{
Invoke-WakeOnLan -MacAddress '24:5E:BE:31:B7:CB'
}
Die Invoke-WakeOnLan Funktion habe ich mir hier geholt: https://powershell.one/code/11.html
Man muss ja nicht für jedes Projekt erstmal das Rad neu erfinden. Der V:\Repository Ordner ist - wenn nicht offensichtlich - der Ordner in dem das Veeam-Repository hinterlegt ist.
Der if-Befehl ist, jetzt wo ich drüber nachdenke, überflüssig weil WOL bei einem laufendem System einfach nichts macht, aber wayne. Jetzt habe ich ihn schon drin.
Der Praxistest ist auch erfolgreich. Wenn ich den Task in der Aufgabenplanung manuell anstoße, ist ein paar Minuten später die NAS online. Die letzte Ärgernis ist der Diagnostik-Beep beim Startvorgang, der sich nicht in Software deaktivieren lässt. Da bleibt erstmal abzuwarten, ob der mich nachts aufweckt oder ob der unproblematisch ist.
Shutdown der QNAP per Powershell Skript
Im Vergleich zum WOL musste ich hier etwas kreativer werden, weil ich kein fertiges Skript das alle nötige Funktionalität beinhaltet finden konnte.Die Anforderungen waren wie folgt:
1) Der Shutdown darf erst erfolgen, wenn alle drei Veeam-Jobs erfolgerich waren. Da je nachdem ob Veeam bei einem Job z.B. ein Backup Health Check angefangen hat kann ich mich nicht darauf verlassen, dass die Jobs in der Reihenfolge abschließen, in der sie angelaufen sind.
2) Ich will die QNAP auch nicht jedesmal nach Abschluss der Datensicherung sofort wieder herunterfahren, weil die QNAP selber auch einige Dienste hat, die im Hintergrund laufen sollten und eventuell auch etwas Zeit brauchen
Die Entscheidung, den Shutdown per SSH an die QNAP zu geben war einfach. So viele Möglichkeiten gibt es nicht und SSH ist am einfachsten.
Hier erstmal das Skript:
PowerShell:
#Der Befehl um PoSH-SSH zu installieren, welches für SSH per PowerShell notwendig ist
#Find-Module PoSH-SSH | Install-Module
#Dies ist Skript Nr. 1 - welches mit dem ersten Veeam Job verlinkt ist und daher die '1' hinterlegt sobald der Job durch ist
Add-Content C:\Skripte\QNAPShutoff.txt "1"
#Wenn alle 3 Veeam Jobs durch sind wird das Skript zum Ausschalten der QNAP aktiv
$ShutoffString = get-content -path "C:\Skripte\QNAPShutoff.txt"
If ($ShutoffString.Contains("1") -and $ShutoffString.Contains("2") -and $ShutoffString.Contains("3"))
{
#Allerdings soll die QNAP etwas Zeit haben um ihre Wartungsarbeiten durchzuführen, daher wird, sofern es noch nicht zwischen 1 und 5 Uhr morgens ist, solange gewartet
$TimeToSleep = ((get-date "5:00") - (get-date))
$secondsToSleep = $timeToSleep.TotalSeconds
If (($secondsToSleep -gt 0) -and ($secondsToSleep -lt 14400))
{
start-sleep $secondsToSleep
}
#Credentials erstellen für die SSH-Verbindung zur QNAP
$username = "admin"
$password = "#hierwäremeinPW"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
#Die QNAP per SSH Runterfahren
New-SSHTrustedHost -SSHHost 192.168.12.181 -FingerPrint 5e:31:53:b6:f6:eb:38:e2:46:7e:f5:e0:60:43:17:3a
New-SSHSession -ComputerName 192.168.12.181 -Port 22 -Credential $cred
Invoke-SSHCommand -SessionId 0 -Command "poweroff"
Remove-SSHSession -Index 0
Set-Content C:\Skripte\QNAPShutoff.txt "0"
exit
}
else
{
exit
}
Es gibt drei Versionen des Skript, die beim Anlaufen jeweils 1, 2 oder 3 in einer Text-File hinterlegen. Wenn alle drei Nummern angesammelt sind (also alle drei Backup-Jobs durchgelaufen) wird der Shutdown eingeleitet. Danach wird die Text-Datei zurückgesetzt.
Ja, das Admin-PW der QNAP steht im Klartext im Skript. Für meinen Heinserver ist das mMn kein Problem. In einer Firmenumgebung in einem per GPO verteilten Skript wäre das natürlich ganz was anderes. (Ja, den Code-Schnippsel zu den Credentials habe ich mir ergoogelt.)
Um das Skript auf einem anderen System verwenden zu können muss das PoSH-SSH Modul installiert und natürlich Umgebungs-spezifische Parameter wie IP, Credentials und Fingerprint angepasst werden.
Eingebaut habe ich, damit ich meine zweite Kondition erfüllen kann, einen konditionalen Sleep-Befehl, der dafür sorgt, dass die QNAP erst um 05:00 Uhr heruntergefahren wird - auch wenn die Backups schon um 02:30 fertig sind. Das ist eingebaut, um Zeit für Hintergrundaufgaben zu lassen, wie schon in den Anforderungen angesprochen.
Veeam kann Skripte vor und nach jedem Job ausführen lassen - jedoch kein Powershell. Hier muss ein Umweg über eine Batch-Datei genommen werden, die dann das entsprechende Powershell-Skript aufruft.
Der Inhalt der Batch ist denkbar simpel, das ist genau dasselbe Prinzip wie weiter oben beim Aufruf durch die Aufgabenplanung.
Code:
Powershell.exe -executionpolicy Bypass C:\Skripte\Shutdown_QNAP1.ps1
Und das wars auch schon - jetzt sollte ich tagsüber wieder ein stilles Wohnzimmer haben.
Falls ihr Feedback für mich habt - immer her, auch wenn's Kritik ist. Nur so werde ich besser.