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
Configuration du réseau
setup-interfaces -r
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
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.
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 :
Notes
Ce guide est fortement inspiré du wiki officiel de ZFSBootMenu.