logo Hubert Pawlak

Full-stack Developer Portfolio | Hubert Pawlak

Zdalne Odblokowywanie Puli ZFS przez ZFSBootMenu

17.10.2026

10 minut czytania

#zfs #zfsbootmenu #linux

Problem i rozwiązanie

ZFS (Zettabyte File System) słynie z wysokiego poziomu integralności danych, zapewnianego dzięki kompleksowemu systemowi sum kontrolnych i zaawansowanym funkcji tworzenia migawek. Jednak wdrożenie szyfrowania wiąże się z istotnym ograniczeniem operacyjnym: koniecznością fizycznego dostępu. Gdy pule ZFS są chronione hasłami, ich obsługa wymaga fizycznego podłączenia klawiatury i monitora, co powoduje znaczne utrudnienia logistyczne, które często można rozwiązać jedynie za pomocą kosztownych przełączników KVM.

Niniejszy przewodnik przedstawia stabilne, sprawdzone rozwiązanie opracowane na podstawie moich własnych testów. Wykorzystując ZFSBootMenu, możemy umożliwić zdalne odblokowywanie zaszyfrowanych zbiorów danych ZFS podczas procesu uruchamiania. Eliminuje to konieczność fizycznej obecności przy rutynowym administrowaniu, umożliwiając niezawodne zarządzanie systemem zarówno przy biurku, jak i z drugiego końca miasta. Poniższy artykuł skupia się na tym, jak włączyć zdalne odblokowywanie zbiorów danych ZFS za pomocą ZBM, ale nie mówi nic o koniecznym buforowaniu klucza szyfrującego w initramfs drugiego etapu.

Kontekst konfiguracji

Ostatnie zmiany w oficjalnym kontenerze kompilacyjnym ZBM sprawiły, że dotychczasowe metody przestały działać. W niniejszym przewodniku opisano niezawodne rozwiązanie oparte na praktycznych doświadczeniach, pozwalające włączyć zdalny dostęp do sekwencji rozruchowej systemu root-on-ZFS. Jeśli czujesz się na siłach, by zarządzać tak zaawansowaną konfiguracją, wykonaj poniższe kroki.

Wymagania systemowe

Ta konfiguracja jest zaawansowana i zakłada znajomość procesu uruchamiania jądra systemu Linux oraz podstaw systemu plików ZFS. Przed kontynuowaniem upewnij się, że zostały spełnione poniższe wymagania:

  • System typu root-on-ZFS: Twój system operacyjny musi być zainstalowany na systemie plików ZFS, a nie na tradycyjnych partycjach.
  • Wiedza w zakresie niestandardowej struktury rozruchowej: Musisz wiedzieć, jak zastąpić dotychczasowy program rozruchowy narzędziem ZFSBootMenu (ZBM), jeśli jeszcze z niego nie korzystasz.
  • Układ docelowy: System musi wykorzystywać układ, w którym jądro i initramfs znajdują się w katalogu /efi wewnątrz zaszyfrowanego zbioru danych, podczas gdy ZBM znajduje się na niezaszyfrowanej partycji FAT32 /boot

Po wdrożeniu sekwencja uruchamiania będzie przebiegać następująco:

  1. ZBM uruchamia się
  2. System próbuje skonfigurować karty sieciowe za pomocą DHCP
  3. Startuje usługa Dropbear
  4. Użytkownik odszyfrowuje zbiory danych za pośrednictwem SSH lub fizycznej konsoli
  5. Użytkownik wybiera, który zbiór danych/jądro + initramfs ma zostać uruchomiony

Etapy wdrożenia

Krok 1: Zainstaluj niezbędne narzędzia

1
2
sudo pacman -S mkinitcpio dropbear dhclient efibootmgr
sudo yay -S zfsbootmenu

W tej sekcji znajdują się polecenia specyficzne dla danej dystrybucji, które zależą od menedżera pakietów używanego przez system operacyjny. Należy dostosować te polecenia do konkretnej dystrybucji systemu Linux.

Krok 2: Skonfiguruj ZFSBootMenu

Ten plik jest sercem konfiguracji, kontrolującym sposób budowy ZFSBootMenu za pomocą polecenia generate-zbm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Components:
  Enabled: false
EFI:
  Enabled: true
  ImageDir: /efi/EFI/ZBM
  Versions: false
Global:
  BootMountPoint: /efi
  InitCPIO: true
  InitCPIOConfig: /etc/zfsbootmenu/mkinitcpio.conf
  InitCPIOHookDirs:
  - /etc/zfsbootmenu/initcpio
  - /usr/lib/initcpio
  ManageImages: true
Kernel:
  Prefix: VMLINUZ
  CommandLine: ro quiet loglevel=0 zbm.timeout=-1
  Path: /boot/vmlinuz-linux-lts

Krok 3: Zdefiniuj moduły i skrypty

Ten plik kieruje procesem tworzenia initramfs, zapewniając, że wszystkie niezbędne narzędzia zostaną dołączone, a co najważniejsze, że nasze niestandardowe skrypty będą uruchamiane we właściwej kolejności.

1
2
3
4
5
6
# vim:set ft=sh
MODULES=()
BINARIES=(ip dhclient dhclient-script timeout efibootmgr)
FILES=()
HOOKS=(base udev modconf block filesystems keyboard rclocal dropbear zfsbootmenu)
rclocal_hook=/etc/zfsbootmenu/initcpio/rc.local

Krok 4: Inicjalizacja połączeń sieciowych

Oto mój niestandardowy skrypt, zaprojektowany z myślą o prostocie i niezawodności w środowisku wczesnego rozruchu. Uruchamia on wszystkie interfejsy sieciowe (z wyjątkiem interfejsu pętli zwrotnej) i próbuje użyć DHCP z ograniczeniem czasu odpowiedzi. Limit czasu wynoszący 10 sekund gwarantuje, że jeśli systemowi nie uda się nawiązać połączenia sieciowego, nie zawiesi się on na czas nieokreślony, co pozwala na potencjalne fizyczne przywrócenie działania poprzez dostęp do konsoli.

1
2
3
4
5
6
7
8
9
#!/bin/sh

IFACES=$(ip -o link show | awk -F': ' '$2 != "lo" {print $2}')

for IFACE in $IFACES; do
    ip link set dev "$IFACE" up || exit 1
done

timeout 10 dhclient -1 $IFACES

Krok 5: Skrypty SSH

Jako demona SSH umożliwiającego zdalny dostęp wybrałem Dropbear. Zamiast tworzyć własne skrypty, wykorzystałem te pochodzące z forków mkinitcpio-rclocal i mkinitcpio-dropbear autorstwa ahesforda na GitHubie. Odpowiadają one za wprowadzenie do initramfs niezbędnych kluczy kryptograficznych. Inteligentnie sprawdzają, czy istniejące klucze OpenSSH można przekonwertować do formatu Dropbear; w przeciwnym razie generują nowe.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/ash

run_hook ()
{
  [ -d /dev/pts ] || mkdir -p /dev/pts
  mount -t devpts devpts /dev/pts

  echo "Starting dropbear"
  # Configuration processing and dropbear execution is done in a subshell
  # to prevent dropbear.conf from inadvertently clobbering important variables
  # or terminating the shell that is running /init.
  (
    # Load configuration options (currently only default listen address)
    [ -r /etc/dropbear/dropbear.conf ] && . /etc/dropbear/dropbear.conf
    /usr/sbin/dropbear -E -s -j -k -p "${dropbear_listen:-22}"
  )

}

run_cleanuphook ()
{
    umount /dev/pts
    rm -R /dev/pts
    if [ -f /var/run/dropbear.pid ]; then
        kill `cat /var/run/dropbear.pid`
    fi
}

Uwaga dotycząca bezpieczeństwa: Podczas procesu konfiguracji korzystałem z maszyny wirtualnej głównie ze względu na wygodę, oddzielając środowisko wdrożeniowe ZBM od produkcyjnego systemu operacyjnego. Wygenerowane klucze hosta SSH i autoryzowane klucze są przechowywane w postaci niezaszyfrowanej w initramfs. Jeśli dojdzie do naruszenia fizycznego dostępu do maszyny, osoba atakująca może wykorzystać ten wektor do późniejszej ekstrakcji haseł poprzez pasywne lub aktywne ataki typu „man-in-the-middle” (MITM).

Krok 6: Wygeneruj ZBM i utwórz wpis rozruchowy

Po skonfigurowaniu wszystkich ustawień i skryptów należy wygenerować ostateczny obraz ZFSBootMenu i poinstruować UEFI, aby go wczytywał.

1
2
3
4
generate-zbm -d
efibootmgr -c -d "$DISK" -p "$BOOT_PARTITION" \
  -L "ZFSBootMenu" \
  -l '\EFI\ZBM\VMLINUZ.EFI'

Kontakt

Chcesz zapoznać się z moimi publicznymi projektami lub po prostu porozmawiać na temat poruszony w tym artykule? Wybierz poniżej, w jaki sposób chcesz się ze mną skontaktować.

github.com/hubertpawlak

Poznaj moje publiczne projekty i wnieś swój wkład, jeśli chcesz

hubertpawlak.2st8x@8alias.com

Najszybszy sposób na otrzymanie odpowiedzi

cal.com/hubertpawlak

Zaplanuj rozmowę w dogodnym dla siebie terminie