Entfernte Windows-Freigabe (CIFS) über rsync zu FreeNAS sichern

Es bestehen diverse Möglichkeiten, auch einem Windows-Rechner rsync “beizubringen”. Die Nutzung entsprechender Software von Drittanbietern stellt jedoch stets eine potentielle zusätzliche Fehlerquelle dar. Ein Benutzer beschreibt seine Erfahrung mit Deltacopy, einer rsync-Lösung für Windows, im FreeNAS-Forum wie folgt:

It was easy to make work with FreeNAS, but its behavior was very odd and small things would cause it to fail(such as a non-english character in a filename) while doing rsync to rsync via 2 FreeNAS boxes was without any problems. Deltacopy was also very very slow, didn’t always behave according to what I expected for the settings, etc.

Aus solchen Gründen ist es ratsam, kritische Anforderungen auf Basis bewährter Funktionalitäten zu lösen.

Im Folgenden ist beschrieben, wie FreeNAS genutzt werden kann, um Inhalte einer entfernten Windows-Freigabe zum lokalen Speicher zu ziehen.

Windows-Freigabe am FreeNAS-System einhängen

# Verbindungsdaten festlegen (hier eigene Werte festlegen)
WINDOWS_IP=
WINDOWS_HOSTNAME=
WINDOWS_SHARE=
WINDOWS_USER=
WINDOWS_PASSWORD=

Funktionierende Verbindung sicherstellen

# Zugriff zur Freigabe prüfen
smbclient -U ${WINDOWS_USER} -L ${WINDOWS_IP}
smbclient \\\\${WINDOWS_IP}\\${WINDOWS_SHARE} -U ${WINDOWS_USER} ${PASSWORT}

# Freigabe testweise lokal einhängen
TEMP_MNT=`mktemp -d`
mount_smbfs -I ${WINDOWS_IP} //${WINDOWS_USER}@${WINDOWS_HOSTNAME}/${WINDOWS_SHARE} ${TEMP_MNT} &&
  ls ${TEMP_MNT}
umount ${TEMP_MNT} 

Verbindung permanent einrichten

# Schreibzugriff zu Konfigurationdateien vorübergehend ermöglichen
mount -uo rw /

# Lokalen Mountpunkt erstellen
mkdir -p /network

# Mountoptionen in fstab festlegen
echo "//${WINDOWS_USER}@${WINDOWS_HOSTNAME}/${WINDOWS_SHARE} /network/${WINDOWS_SHARE} smbfs ro,-N,-I${WINDOWS_IP} 0 0" >> /conf/base/etc/fstab

# Zugangsdaten zur Windows-Freigabe in nsmb.conf hinterlegen
echo '' >> /conf/base/etc/nsmb.conf && echo "[${WINDOWS_HOSTNAME}:${WINDOWS_USER}]" >> /conf/base/etc/nsmb.conf && echo "password=${WINDOWS_PASSWORD}" >> /conf/base/etc/nsmb.conf

# Schreibzugriff zu Konfigurationdateien verbieten
mount -uo ro /

Einrichtung überprüfen

Die Änderungen werden erst nach einem Neustart aktiv. Um sie sofort zu testen, geht man wie folgt vor.

cp /conf/base/etc/nsmb.conf /etc/nsmb.conf &&
  mount -F /conf/base/etc/fstab /network/${WINDOWS_SHARE}

Rsync konfigurieren

Mit obiger Einrichtung wird die Windows-Freigabe quasi als lokale Ressource behandelt.

rsync kann auch zum Kopieren zwischen lokalen Pfaden eingesetzt werden. Über das Web-Interface von FreeNAS ist allerdings lediglich die Konfiguration der Nutzung eines entfernten Rechners möglich.

Um Benutzers des Web-Interface dennoch eine einfache Einrichtung von “Rsync Tasks” zu ermöglichen, wird FreeNAS selbst logisch als “entfernter” Rechner konfiguriert.

# Schreibzugriff zu Konfigurationdateien vorübergehend ermöglichen
mount -uo rw /

# SSH Public-Key für root generieren
ssh-keygen

# ECDSA Hostschlüssel importieren
ssh-keyscan localhost >> /root/.ssh/known_hosts

# Authentifizierung via Public Key von localhost erlauben
cat /root/.ssh/id_rsa.pub | sed 's/^/from="127.0.0.1",no-agent-forwarding,no-port-forwarding,no-user-rc,no-X11-forwarding /g' >> /root/.ssh/authorized_keys

# Schreibzugriff zu Konfigurationdateien verbieten
mount -uo ro /

Rsync-Task einrichten

An dieser Stelle ist alles Notwendige vorbereitet, um die Einrichtung eines Rsync-Task via FreeNAS-Web-Interface für das Kopieren der der Daten der Windows-Freigabe zum entsprechenden Ziel-Dataset zu ermöglichen (System > Rsync-Tasks > Add Rsync-Task).

Die Einrichtung an sich birgt noch ein relativ offensichtliches Risiko:
Schlägt das Einhängen der Windows-Freigabe fehl, werden, wenn die rsync-Option --delete verwendet wird, die Inhalte aus dem Zielverzeichnis gelöscht.

Sinnvollerweise wird dem entgegen gewirkt indem vor Ausführen von rsync die Verfügbarkeit der Quelle sichergestellt wird.

Rein über das Web-Interface ist dies allerdings unmöglich. Ist das Risiko für diesen Fall als relativ gering einzuschätzen, minimieren regelmäßige ZFS Snapshots die Auswirkungen des Problems (Storage > Periodic Snapshot Tasks > Add Periodic Snapshot).

Ansonsten muss mit einem entsprechenden Skript behandelt werden.