pfSense Boot-Slice über Kommandozeile duplizieren

In einer typischen pfSense “embedded” Installation (NanoBSD) ist der Speicherplatz in zwei gleich große Slices (“Partitionen”) unterteilt.

Grundsätzlich beinhalten beide die selben Daten.

Bei einem Systemupdate wird auf das aktuell ungenutzte Slice geschrieben. Sollte das Update Fehler verursachen, kann im Rahmen des pfSense Bootvorgangs der bisherige Stand ausgewählt und somit der Betrieb wie gewohnt fortgesetzt werden.

Slice über Weboberfläche duplizieren

Nach einem erfolgreichen Update spiegelt man das nun aktualisierte Slice zurück und bereitet damit auf ein künftiges Systemupdate vor. In Diagnostics > NanoBSD der pfSense Weboberfläche kann dazu der Knopf Duplicate slice verwendet werden.

Je nach Datendurchsatz dauert der Vorgang eventuell länger als die Browserverbindung aufrecht erhalten werden kann.

In diesem Fall bleibt ungewiss, ob das Duplizieren erfolgreich war.

Slice über Kommandozeile duplizieren

Um das Problem zu umgehen, kann der entsprechende dd Befehl manuell via SSH ausgeführt werden. Auch über SSH ist die pfSense Developer Shell erreichbar.

Die pfSense Developer Shell ermöglicht den direkten Aufruf der PHP-Funktionen wie sie auch die pfSense Weboberfläche nutzt und erlaubt somit die Rekonstruktion eines möglichst identischen Ablaufs.

Auf Basis der Erkenntnisse aus dem pfSense Quellcode ergibt sich folgende PHP-Befehlsabfolge für die Developer Shell in pfSense 2.2.

Achtung: Die Befehlsfolge kann bei falscher Anwendung potentiell Schaden verursachen und darf lediglich als Leitfaden betrachtet werden.

nanobsd_detect_slice_info();
global $TOFLASH, $COMPLETE_PATH, $COMPLETE_BOOT_PATH;
echo "Will clone FROM $COMPLETE_BOOT_PATH TO $TOFLASH\n";
if(nanobsd_clone_slice($COMPLETE_PATH)) { echo "SUCCESS\n"; } else { echo "FAILURE\n"; }
nanobsd_detect_slice_info();
exec

Hinweis: Während im Rahmen der Funktion das nanobsd_clone_slice das dd-Kommando aktiv ist, kann der Fortschritt mittles STRG+T abgefragt werden.

Vergleiche dazu den Groovy-Skills Beitrag “Übertragenes Datenvolumen von dd ausgeben STATUS/SIGINFO/SIGUSR1”.