Informations sur les techno utilisées

  • Alpine Linux est une distribution Linux légère qui est souvent utilisée comme système de fichier root pour conteneurs (OCI). Elle utilise des outils peu conventionnels sur Linux tels que la bibliothèque C musl et remplace coreutils par busybox. Elle utilise le service d’initialisation OpenRC et le gestionnaire de paquets apk (outil maison).

  • ZFS est un système de fichiers développé auparavant par Sun Microsystems pour Solaris 10. Il dispose de fonctionnalités avancées telles que la protection contre la corruption des données, la compression, la déduplication ainsi que la prise en charge des instantanés (snapshots) et des clones. Il peut gérer de très grandes quantités de données (au maximum 3*10^24To) et est extrêmement résilient. À l’heure actuelle, le projet OpenZFS s’occupe de poursuivre le développement de ZFS d’une manière réellement open source tout en centralisant les portages sur les différents systèmes (Linux/FreeBSD/macOS/Windows). Il n’est cependant pas directement inclus dans le kernel Linux, car la licence GPL (celle utilisée pour Linux) n’est pas compatible avec la licence CDDL (celle utilisée pour ZFS/OpenZFS) d’après la FSF (Free Software Foundation).

  • ZFSBootMenu est un chargeur de démarrage (bootloader). Il charge un petit système Linux autonome qui identifie et lance des noyaux et des images initramfs dans des systèmes de fichiers ZFS en utilisant la commande kexec. Il permet de plus de gérer des snapshots ZFS.

Prérequis

  • Un PC/VM en UEFI
  • Une connexion à Internet
  • Télécharger l’ISO Extended d’Alpine Linux
  • Un cerveau

Configuration du LiveCD

Connection en root sur l’image et passage du clavier en AZERTY

setup-keymap fr

Changement du layout

Configuration du réseau

setup-interfaces -r

Configuration du réseau

Configuration du serveur SSH

Nous allons installer OpenSSH dans l’environnement live pour pouvoir copier-coller les commandes. Vous allez devoir changer le mot de passe root du liveCD. De plus, vous allez devoir décommenter la variable “PermitRootLogin” présente dans le fichier /etc/ssh/sshd_config et de la passer sur “yes”

passwd
apk add openssh
vi /etc/ssh/sshd_config
service sshd restart

Connection réussie via SSH

Ajout des repo sur le live

cat <<EOF > /etc/apk/repositories
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main/
https://dl-cdn.alpinelinux.org/alpine/latest-stable/community/
EOF
apk update

Ajout des paquets manquants et lancement du module zfs

apk add zfs zfs-scripts cfdisk
modprobe zfs

Création du fichier /etc/hostid

zgenhostid -f 0x00bab10c

Création du pool

Partitionnement du disque

Créez une table GPT. Créez une partition de 512Mo pour l’EFI et prennez le reste pour le pool ZFS. Vous pouvez utiliser l’outil que vous souhaitez.

Création des partitions du disque

Ajout de la passphrase sur le disque

echo 'UnSup3rM0tDeP@ss3' > /etc/zfs/zroot.key
chmod 000 /etc/zfs/zroot.key

Création du pool

zpool create -f -o ashift=12 \
 -O compression=lz4 \
 -O acltype=posixacl \
 -O xattr=sa \
 -O relatime=on \
 -O encryption=aes-256-gcm \
 -O keylocation=file:///etc/zfs/zroot.key \
 -O keyformat=passphrase \
 -o autotrim=on \
 -o compatibility=openzfs-2.1-linux \
 -m none zroot /dev/sda2

Création du système de fichiers initial

zfs create -o mountpoint=none zroot/ROOT
zfs create -o mountpoint=/ -o canmount=noauto zroot/ROOT/alpine
zfs create -o mountpoint=/home zroot/home
zpool set bootfs=zroot/ROOT/alpine zroot

Export puis réimport du pool sur un point de montage temporaire

zpool export zroot
zpool import -N -R /mnt zroot
zfs load-key -L prompt zroot
zfs mount zroot/ROOT/alpine
zfs mount zroot/home

Installation d’Alpine

apk --arch x86_64 -X http://dl-cdn.alpinelinux.org/alpine/latest-stable/main \
 -U --allow-untrusted --root /mnt --initdb add alpine-base

Copie des fichiers du live sur le pool

cp /etc/hostid /mnt/etc
cp /etc/resolv.conf /mnt/etc
cp /etc/apk/repositories /mnt/etc/apk
cp /etc/network/interfaces /mnt/etc/network
mkdir /mnt/etc/zfs
cp /etc/zfs/zroot.key /mnt/etc/zfs

Chroot sur l’OS

mount --rbind /dev /mnt/dev
mount --rbind /sys /mnt/sys
mount --rbind /proc /mnt/proc
chroot /mnt

Ajout d’un mot de passe sur le compte root

passwd

Ajout des services principaux au démarrage

rc-update add hwdrivers sysinit
rc-update add networking
rc-update add hostname

Configuration de ZFS

Installation du service et du kernel

apk add zfs zfs-lts zfs-scripts curl efibootmgr
rc-update add zfs-import sysinit
rc-update add zfs-mount sysinit

Configuration d’mkinitfs pour qu’il charge les modules ZFS à la génération de l’initramfs

echo "/etc/hostid" >> /etc/mkinitfs/features.d/zfshost.files
echo "/etc/zfs/zroot.key" >> /etc/mkinitfs/features.d/zfshost.files
echo 'features="ata base keymap kms mmc scsi usb virtio nvme zfs zfshost"' > /etc/mkinitfs/mkinitfs.conf

Regénération de l’initramfs

mkinitfs -c /etc/mkinitfs/mkinitfs.conf "$(ls /lib/modules)"

Installation et configuration de ZFSBootMenu

Ajout des propriétés de ZFSBootMenu sur les datasets

zfs set org.zfsbootmenu:commandline="quiet" zroot/ROOT
zfs set org.zfsbootmenu:keysource="zroot/ROOT/alpine" zroot

Ajout du système de fichiers vfat sur la partition de boot

mkfs.vfat -F32 /dev/sda1

Création de l’entrée fstab et montage de la partition

cat << EOF >> /etc/fstab
/dev/sda1 /boot/efi vfat defaults 0 0
EOF

mkdir -p /boot/efi
mount /boot/efi

Téléchargement de ZFSBootMenu et copie sur EFI

mkdir -p /boot/efi/EFI/ZBM
curl -o /boot/efi/EFI/ZBM/VMLINUZ.EFI -L https://get.zfsbootmenu.org/efi
cp /boot/efi/EFI/ZBM/VMLINUZ.EFI /boot/efi/EFI/ZBM/VMLINUZ-BACKUP.EFI

Création de l’entrée EFI

efibootmgr -c -d /dev/sda -p 1 \
  -L "ZFSBootMenu (Backup)" \
  -l '\EFI\ZBM\VMLINUZ-BACKUP.EFI'

efibootmgr -c -d /dev/sda -p 1 \
  -L "ZFSBootMenu" \
  -l '\EFI\ZBM\VMLINUZ.EFI'

Passage du clavier en AZERTY sur l’EFI et sur Alpine

wget https://get.zfsboot.menu/zbm-kcl
apk add bash binutils
bash zbm-kcl -a rd.vconsole.keymap=fr /boot/efi/EFI/ZBM/VMLINUZ.EFI
bash zbm-kcl -a rd.vconsole.keymap=fr /boot/efi/EFI/ZBM/VMLINUZ-BACKUP.EFI
apk del bash binutils
setup-keymap fr

Préparation au premier démarrage

Quitter le chroot et démonter les partitions

exit
cut -f2 -d" " /proc/mounts | grep ^/mnt | tac | while read i; do umount -l $i; done

Export du zpool et reboot

zpool export zroot
reboot

ZFSBootMenu demande la passphrase :

Passphrase ZFSBootMenu

ZFSBootMenu en action !

fastfetch en action sur Alpine !

Notes

Ce guide est fortement inspiré du wiki officiel de ZFSBootMenu.