Table of Contents

ZFSBootMenu: Bootování Linuxu na ZFS, správa a klonování snapshotů

Stalo se vám někdy, že vám chybělo místo např. v kořenovém oddílu vaší Linuxové instalace? Nebo, že byste chtěli experimentovat s jinou distribucí linuxového systému, ale chyběl vám předem vytvořený oddíl? Mě se to stalo nedávno. A protože ZFS používám na svých serverech již mnoho let, hledal jsem na internetu schůdný způsob jak provést instalaci Linuxu přímo do ZFS souborového systému. Do debianu můžete přidat podporu ZFS následujícími příkazy:

sudo apt install linux-headers-$(uname -r)
sudo apt install zfsutils-linux zfs-dkms

Tímto způsobem se stáhnou moduly jádra s podporou ZFS a přeloží se pro aktuálně běžící kernel. Co se ale stane, pokud dojde k upgradu kernelu někdy později? Nic se nestane, moduly se znovu přeloží pro aktualizovanou verzi kernelu automaticky. Tedy jediné co zbývá dořešit je instalace Linuxu přímo na ZFS a bootování přímo ze ZFS. Linuxové instalátory ZFS z licenčních důvodů nepodporují a omezená je i podpora GRUBu pro ZFS, která neumožňuje plně využít výhod ZFS.

Jako řešení jsem našel projekt ZFSBootMenu. Startování Linuxu ze ZFS řeší vlastním bootloaderem, který je ve skutečnosti minimalistickou instalací linuxu, která se spouští přímo z UEFI oddílu. Z toho důvodu obsahuje bezproblémovou podporu ZFS. Do vlastního obrazu ZFSBootMenu lze přidat například podporu sítě a SSH serveru. Pomocí ZFSBootMenu lze ZFS nejen startovat, ale i spravovat snapshoty a provádět základní údržbu.

Instalaci jednotlivých distribucí na ZFS řeší projekt svými návody pro jednotlivé distribuce. Jednotlivé instalace systému mohou být samostatné ZFS datasety a ZFSBootMenu mezi nimi umožňuje při startu vybírat. Díky snapshotům tak lze před větší aktualizací vytvořit návratový bod a v případě problémů nastartovat předchozí stav.

Ruční instalace Debianu a ZFSBootMenu zavaděče

Návod pro Debian lze nalézt zde. Návody pro jiné distribuce vyberete v menu vlevo.

První krok je stažení živé distribuce debianu, která musí být čerstvá, aby k použitému kernelu bylo možné přeložit ZFS podporu. Po nabootování do této živé distribuce doporučuji si nainstalovat jako první balíček openssh-server, aby jste instalaci mohli provádět na dálku z počítače na kterém jste zvyklí pracovat.

apt update
apt install openssh-server

Přihlásíte se jako uživatel user, heslo live distribuce je “live”. Poté se můžete stát root, příkazem sudo su.

V dalším kroku si doinstalujete podporu pro ZFS v Linuxu a potřebné nástroje. Rozdělíte disk, vytvoříte UEFI oddíl pro bootování, vytvoření ZFS pool a nastavíte heslo pro šifrování a ZFS properties. Samotnou instalaci Debianu provedete nástrojem debootstrap. Následně provedete chroot, kde provedete změnu hostname, nastavíte rootovské heslo, doinstalujete potřebné balíčky. Pro inspiraci já jsem provedl instalaci následujících balíčků mých oblíbených desktopových prostředí:

apt install task-kde-desktop i3 firmware-linux firmware-misc-nonfree xserver-xorg-video-all mc vim screen htop openssh-server
 
# věci pro wifi
apt install firmware-iwlwifi wireless-tools wpasupplicant
 
adduser jojo
 
usermod -aG sudo jojo
 
systemctl set-default graphical.target
 
echo "auto enp2s0
allow-hotplug enp2s0
iface enp2s0 inet dhcp" >> /etc/network/interfaces

Instalace EFI aplikaci ZFSBootMenu se provádí pouhým stažením z webu na patřičné místo do UEFI oddílu. Aby vám disk bootoval na všech počítačích a byl tedy přenositelným přidejte navíc příkaz.

cp /boot/efi/EFI/ZBM/VMLINUZ.EFI \
/boot/efi/EFI/BOOT/BOOTX64.EFI

Nyní bude instalace bootovat i na počítačích, na kterých není uložen odkaz na VMLINUZ.EFI v UEFI NVRAM (BIOSu). Bohužel v hlavním návodu to není, je zde odkaz na článekPortable ZFSBootMenu.

Výhody ZFS

Nyní vás nejspíše napadá, že ta ruční instalace je příliš zdlouhavá a dost možná se něco pokazí a tak může trvat ještě déle a že tak bude možná lepší se ZFSBootMenu úplně vyhnout. Ale lze se na to dívat i jinak. Část příkazů je práce se ZFS, která stejně je/bude užitečná se naučit. Zbývající část, například operace v chroot by se vám mohla hodit, pokud se něco pokazí i v případech, že ZFS vůbec nepoužíváte. Umět instalaci provádět ručně se též hodí pro masové nasazení a např. klonování a zálohování disků běžících systémů. Je tedy možné že se ona časová investice bohatě vrátí. V případě proběhlo vše hladce postupným kopírováním příkazů z návodu, takže to netrvalo významně déle než běžná instalace. Pro jistotu chci připomenout jednotlivé podstatné výhody ZFS oproti nejčastěji používanému souborovému systému Linuxu ext4.

Klonování instalace na jiný stroj

Řekněme, že mám na svém pracovním počítači, pro své potřeby vyladěnou instalaci Debianu Trixie běžící na ZFS. A nyní bych ji chtěl naklonovat na svůj notebook, abych mohl pracovat i na cestách. Jaký bude postup?

Na stroji, který chci klonovat si vytvořím snapshot.

sudo zfs snapshot zroot/ROOT/debian@migration
sudo zfs snapshot zroot/home@migration

Na novém počítači, kam chci instalaci klonovat začnu stejnou jako při nové instalaci. Tedy nabootuji do aktuální živé distribuce Debianu. Doinstaluji openssh-server. Rozdělím disk, vytvořím EFI partition a ZFS pool s šifrovaným rootovským datasetem.

Samotné klonování pak provedu na původním stroji příkazy:

sudo zfs send zroot/ROOT/debian@migration | ssh user@192.168.0.135 "sudo zfs receive zroot/ROOT/debian"
sudo zfs send zroot/home@migration | ssh user@192.168.0.135 "sudo zfs receive zroot/home"

Defaultní heslo live Debianu je “live”. V mé gigabitové síti přenesení necelých 100 GB obsazené části disku (s kompresí) trvalo řádově minuty.

Kopírováním datasetů se zfs send bez parametru -p se nepřenesou některé jejich properties, které je nutné pro fungování ZFSBootMenu. Nastavím je tedy ručně.

sudo zfs set mountpoint=/ zroot/ROOT/debian
sudo zfs set canmount=noauto zroot/ROOT/debian
sudo zfs set mountpoint=/home zroot/home
sudo zpool set bootfs=zroot/ROOT/debian zroot

Pokud bych chtěl místo vybraných datasetů (jak je provedeno výše) kopírovat všechny datasety včetně rootovského, včetně všech properties a v zašifrované podobě, použiji:

sudo zfs send -Rw zroot | ssh user@192.168.0.135 'sudo zfs receive -F zroot'

V tomto případě se přenese vše včetně properties a zpool zůstane zašifrován původně použitím heslem. Properties pak nemusím nastavovat dodatečně.

Dále pokračuji podle návodu, především instalaci samotného ZFSBootMenu samozřejmě s tím, že vynechám instalaci Debianu a jeho balíčků, které byly přeneseny.

Pro přenos na jiný hardware může být nutné doinstalovat balíčky s firmware Wi-fi, GPU ovladače, změnit nastavení sítě. Vždy je dobré změnit hostname, promazat SSH host keys a změnit identifikátor UEFI disku v /etc/fstab.

ls -l /etc/ssh/ssh_host_*
rm -f /etc/ssh/ssh_host_*
ssh-keygen -A
 
vim /etc/hostname
vim /etc/hosts
zgenhostid -f
 
zgenhostid -f 0x00bab10c
 
cat << EOF > /etc/fstab
$( blkid | grep "$BOOT_DEVICE" | cut -d ' ' -f 2 ) /boot/efi vfat defaults 0 0
EOF