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.

delta copy server

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ń).

delta copy server

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.