Backup Windowsów na NAS Qnap
Posted on Mon 10 February 2020 in Automatyczny dom, Shitz • 3 min read
Pisałem już, że nienawidzę Windows? Pewnie tak. Opisywanie jak ratować ten wykwit ludzkiego upadku (niezły zlepek mi wyszedł) jest mi równie wstrętne jak samo ratowanie, jednakże wychowałem się, na szczęście, w katolickim środowisku i pomaganie ludziom, nawet przy Windows, leży w mojej naturze.
Jest taki jeden znany mi huncwot, który śmie twierdzić, że moja empatia i bezinteresowna pomoc jest ewolucyjnym kompromisem ale wkładam te jego popierdółki pomiędzy bajki. Wypchaj się kochany mój bliźni! ;)
Przechodzę do sedna.
Poproszono mnie o stworzenie taniego (czyt. darmowego) rozwiązania do backupowania wielu komputerów z Windows na dysk sieciowy Qnap.
Spróbowałem kilku narzędzi do kopii zapasowych dostępnych na NAS-ach Qnapa i żadne z nich nie spełniło moich oczekiwań. A były one skromne: ma toto działać, archiwizacja ma być wywoływana od strony NAS-a, i ... ma działać.
Dlaczego od strony NAS-a? Bo to dobre zabezpieczenie przez różnego rodzaju ransomwarem. Jeśli to NAS inicjuje połączenie, kopiuje, a potem takie połączenie zamyka, to wirus czy rootkit nie ma prostego sposobu na zaszyfrowanie zdalnego backupu. Wiele osób nie przyswaja tego faktu i potem są zdziwieni, że zaszyfrowany jest i komputer i jego backup na dysku sieciowym.
Wypróbowałem urBackup, Archiware P5 i kilka innych narzędzi ale okazało się, że to wszystko złom.
Od kilku lat używam z powodzeniem rdifff-backupa (na Linuksie), a że rdiff-backup używa librsync, więc przyszło mi do głowy, że stare proste rozwiązania będą najlepsze. I miałem rację!
Na NAS-ie rsync jest domyślnie zainstalowany, musiałem więc zająć się jego uruchamianiem. Do takiego zadania najlepiej nadaje się zwykły cron.
Próby oswojenia Qnapa z wbudowanym cron-nem skończyły się wielką frustracją: wielokrotne próby zmuszenia go do odpalania własnych skryptów spaliły na panewce. Zdecydowałem się na instalację alternatywnej linii pakietów na Qnapa: Entware.
Pobrałem paczkę i zainstalowałem Entware na dwóch Qnapach, jeden ma CPU Intela, drugi pracuję na Armie. Piszę to, żeby zaznaczyć, że moje rozwiązanie nadaje się dla obu platform. Entware rozsiadło się grzecznie i mogłem doinstalować kilka niezbędnych narzędzi:
opkg update opkg install cron
Następnie wydałem polecenie, które zamienia w crontabie użytkownika na tego, który jest domyślnym administratorem NAS-a:
sed -i 's/root/admin/g' /opt/etc/crontab
Co, w moim przypadku, zamieniło domyślnego roota na admina.
W katalogu /opt/etc/ jest plik crontab, do zawartości dodałem na końcu jedną linię:
SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/bin:/opt/sbin MAILTO="" HOME=/ # ---------- ---------- Default is Empty ---------- ---------- # */1 * * * * admin /opt/bin/run-parts /opt/etc/cron.1min */5 * * * * admin /opt/bin/run-parts /opt/etc/cron.5mins 01 * * * * admin /opt/bin/run-parts /opt/etc/cron.hourly 02 4 * * * admin /opt/bin/run-parts /opt/etc/cron.daily 22 4 * * 0 admin /opt/bin/run-parts /opt/etc/cron.weekly 42 4 1 * * admin /opt/bin/run-parts /opt/etc/cron.monthly 00 12 * * * admin /opt/etc/Samsung-dysk-c.sh
Zawartość skryptu Samsung-dysk-c.sh:
#!/usr/bin/env sh MASZYNA="Samsung-dysk-c" TODAY=`/bin/date +"%Y%m%d"` YESTERDAY=`/bin/date -d "1 day ago" +"%Y%m%d"` OLDBACKUP=`/bin/date -d "2 days ago" +"%Y%m%d"` BACKUPDIR="/share/CACHEDEV2_DATA/rsync-backup" SHAREUSR="$BACKUPDIR/$MASZYNA" EXCLUDES="$BACKUPDIR/$MASZYNA.excludes" LOG="$SHAREUSR/BACKUP_success.log" SOURCE="192.168.1.77::dysk-c" DESTINATION="$SHAREUSR/$TODAY/" /usr/bin/rsync -zavx --exclude-from=$EXCLUDES --numeric-ids --delete -r --link-dest=../$YESTERDAY $SOURCE $DESTINATION rm -R $SHAREUSR/$OLDBACKUP echo "BACKUP success-$TODAY" >> $LOG exit 0
Linia EXCLUDES wskazuje na plik $MASZYNA.excludes, zawierający nazwy folderów i plików, których nie będę archiwizował, czyli plik Samsung-Dysk-c.excludes zawiera ścieżki wykluczone z backupu.
Dla jasności, są to ścieżki do folderów/plików na maszynie, która była backupowana.
Przykładowa zawartość pliku wykluczeń:
$GetCurrent $Recycle.Bin $SysReset backup Config.Msi Documents and Settings Drivers HP Universal Print Driver Intel langpacks PerfLogs PostVistaPE Program Files Program Files (x86) ProgramData Recovery SSFac System Volume Information temp Windows Windows10Upgrade Users\Administrator Users\All Users Users\Default Users\Default User Users\Public
Linia SOURCE="192.168.1.77::dysk-c" też ma znaczenie, które wyjaśnię za pół pacierza.
Uruchomiłem cron-a:
/opt/etc/init.d/S10cron start
Na laptopie z Windowsem miałem do zrobienia kilka rzeczy. Najsampierw zainstalowałem serwer rsynca czyli freeware o nazwie: DeltaCopyServer.
Po zainstalowaniu ustawiłem w nim odpowiednie katalogi do zsynchronizowania:
kliknąłem "Add New Directory" i wpisałem nazwę wpisu "dysk-c" oraz ścieżkę, np.: C:\ (bo kopiuję wszystko oprócz moich wykluczeń).
W końcu mam backup wywoływany od strony NAS-a.
Uwaga: skrypt jest prymitywny, nie zawiea żadnych procedur sprawdzających błędy. Np. w przypadku przerwania sesji rsync-a pozostawi niedokończony backup i nie skasuje starszej kopii. Obsługę błędów trzeba sobie wymyśleć samemu.