Skip to content

Instantly share code, notes, and snippets.

@lolo32
Last active November 4, 2020 22:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lolo32/93bdfad25d2ede34c900f9ec6bd6ced7 to your computer and use it in GitHub Desktop.
Save lolo32/93bdfad25d2ede34c900f9ec6bd6ced7 to your computer and use it in GitHub Desktop.
Installer Alpine avec ZFS chiffré depuis le mode rescue avec MBR ou UEFI

Avant propos…

Dans cette page, nous allons voir comment installer Alpine Linux sur une partition ZFS chiffrée, le tout avec des commandes pour le MBR et pour le UEFI.

En bonus, des commandes afin de mettre le tout en RAID1/mirroir.

Démarrer avec l'ISO d'installation de Alpine Linux

Il faut redémarrer le serveur en mode Rescue.

Une fois démarré, télécharger l'ISO en mode EXTENDED car c'est le seul à l'heure actuel qui contient les modules pour le ZFS, et l'enregistrer sur le premier disque dur /dev/sda.

wget http://dl-cdn.alpinelinux.org/alpine/v3.12/releases/x86_64/alpine-extended-3.12.0-x86_64.iso \
    -O /dev/sda

Redémarrer le serveur ensuite et accéder à la console de celui-ci via KVM ou autre.

Préparer l'installation

Ouvrir une session root.

Il vaut mieux maintenir le clavier en anglais actuellement, le mot de passe utilisé pour ZFS devra être saisi durant le démarrage avec l'encodage du clavier par défaut, à savoir l'US correspondant à du QWERTY.

Celui-ci sera changé juste avant l'installation, en français.

Installer et configurer les pré-requis

Définir le nom du serveur

setup-hostname

Configurer le réseau

setup-interfaces

Si le réseau est configuré pour être en DHCP, ne rien faire de plus, sinon il faut configurer les DNS

setup-dns

Lancement du réseau

/etc/init.d/networking start

(Optionnel) Configurer le fuseau horaire à utiliser, UTC par défaut

setup-timezone

Définir le dépôt à utiliser pour les paquets

setup-apkrepos

Configurer le client NTP pour la synchronisation de l'horloge

setup-ntp

(Optionel) Activer un serveur SSH afin de réaliser des Copier/Coller facilement. il faut dans un premier temps définir un mot de passe pour le compte root

Il est à noter que la disposition du clavier est toujours en QWERTY sauf si vous l'avez changé. Il faut y penser lors de la création du mot de passe sur le serveur, et lorsque l'on devra se connecter via SSH

passwd
setup-sshd

Activation des services pour le prochain démarrage

rc-update add networking boot
rc-update add urandom boot
rc-update add acpid
rc-update add crond
/etc/init.d/hostname restart

Installer les paquets nécessaires

Note :

Tout programme installé maintenant, ou toute configuration sera repporté sur la version finale de la machine.

Description des programmes installé dans tous les cas :

  • zfs les paquets pour gérer le système de fichier ZFS et fournit les programmes zfs et zpool entre autre
  • sfdisk sera utilisé pour partitionner le disque dur
  • xfsprogs pour la gestion du système de fichier utilisé pour la partition /boot

Pour UEFI

apk add zfs sfdisk grub-efi xfsprogs dosfstools efibootmgr
  • grub-efi pour installer le gestionnaire de chargement du système, à savoir grub
  • dosfstools afin de formater au bon format (FAT32) la partition nécessaire pour l'UEFI
  • efibootmgr permet de modifier le gestionnaire de boot UEFI

Pour MBR

apk add zfs sfdisk syslinux xfsprogs
  • syslinux est le gestionnaire de chargement du système

Pour pouvoir installer le RAID1

Cette partie est à effectuer indépendament de l'UEFI ou du MBR si l'on souhaite mettre en place du mirroring de la partition /boot.

apk add mdadm

Charger les modules

On charge les modules avant de démonter l'ISO afin de pouvoir partitionner

modprobe zfs
modprobe xfs

Pour le FAT, utile uniquement pour la partition UEFI

modprobe vfat
modprobe nls_cp437

Démonte l'image avant repartitionnement

umount /.modloop
umount /media/sda1

Partitionner

Ici, le partitionnement sera réalisé sur /dev/sda. Il faut adapter le cas échéant.

Effaçage de la table des partitions

sfdisk --delete /dev/sda

Pour UEFI

Partitionnement du disque sur une table de partition au format GPT :

Partition Taille Type Point de montage
1 512 Mo UEFI /boot/efi
2 100 Mo XFS /boot
3 Reste ZFS /
echo -e "label: gpt\n2M,512M,U\n-,100M,L\n-" | sfdisk -f -W always -w always /dev/sda
mdev -s
mkfs.vfat -F 32 -n UEFI /dev/sda1
BOOTFS=/dev/sda2
ZFSROOT=/dev/sda3

Pour MBR

Partitionnement du disque sur une table de partition au format MBR :

Partition Taille Type Point de montage
1 100 Mo XFS /boot
2 Reste ZFS /
echo -e "label: dos\n2M,100M,L,*\n-" | sfdisk -f -W always -w always /dev/sda
mdev -s
BOOTFS=/dev/sda1
ZFSROOT=/dev/sda2

Formatage des partitions et montage de celles-ci

/boot en XFS

Formatage de la partition /boot au format XFS

mkfs.xfs -L Boot -f $BOOTFS

/ en ZFS

Création du volume ZFS, définition du mot de passe et montage sur /mnt

zpool create -f -o ashift=12 \
    -O acltype=posixacl -O canmount=off -O compression=lz4 \
    -O dnodesize=auto -O normalization=formD -O relatime=on -O xattr=sa \
    -O encryption=aes-256-gcm -O keylocation=prompt -O keyformat=passphrase \
    -R /mnt \
    rpool $ZFSROOT

zfs create -o mountpoint=/ -o canmount=noauto rpool/root
mount -t zfs rpool/root /mnt

Explication de quelques options remarquables :

  • ashift=12 définit la taille des secteurs physiques. Cette valeur est recommandée et vaut 4Kio, correspondant à la valeur des des disques d'aujourd'hui.
  • acltype=posixacl permet d'activer les ACL POSIX globalement.
  • normalization=formD permet de n'accepter les noms des fichiers valides au format UTF-8
  • xattr=sa améliore les performances des attributs étendus, mais l'option n'est valide que pour les systèmes Linux. Ne pas utiliser cette option si le volume doit être utilisé sur un autre système.

Pour vérifier que le pool a bien été créé, saisir la commande suivante

zpool status

La commande doit afficher quelque chose comme ci-après :

  pool: rpool
 state: ONLINE
  scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	rpool       ONLINE       0     0     0
	  sda3      ONLINE       0     0     0

errors: No known data errors

Monter le système /boot et UEFI

mkdir /mnt/boot
mount -t xfs $BOOTFS /mnt/boot

Si UEFI

mkdir /mnt/boot/efi
mount -t vfat /dev/sda1 /mnt/boot/efi

On poursuit avec tout le monde en activant les services ZFS

rc-update add zfs-import sysinit
rc-update add zfs-mount sysinit

Ajouter la SWAP

Taille de la SWAP correspondant à 1 Gio

zfs create -V 1G \
        -o logbias=throughput -o sync=always -o primarycache=metadata \
        -o mountpoint=none -o secondarycache=none \
        rpool/swap

Explication des options utilisées ici

  • -V 1G est la taille de la SWAP que l'on veut créer
  • logbias=throughput et sync=always demandent à ce que les données soient écritent le plus vite possible sur le disque afin de libérer la mémoire
  • primarycache=metadata afin d'éviter que les données soient conservées en RAM via ARC

Pour finir, formatage de la SWAP, activation de l'auto-montage lors du démarrage de la machine, et export afin que l'UUID soit indiqué dans le fichier /etc/fstab lors de l'installation ultérieure.

mkswap -L Swap /dev/zd0
export SWAP_DEVICES=/dev/zd0
rc-update add swap boot

Lancer l'installation

Pour UEFI

export USE_EFI=y
export BOOTLOADER=grub
mkdir /mnt/sys
mount --bind /sys /mnt/sys
setup-disk /mnt

Pour MBR

setup-disk /mnt

Finir la configuration

Pour UEFI

mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc

Corriger la génération automatique de grub.cfg

echo "GRUB_FS=zfs" >> /mnt/etc/default/grub
chroot /mnt grub-mkconfig | sed -e "s#root=ZFS=/#root=ZFS=rpool/#" \
        > /mnt/boot/grub/grub.cfg

umount /mnt/dev
umount /mnt/proc

Pour MBR

Écrit le secteur MBR afin que le système puisse démarrer

dd if=/usr/share/syslinux/mbr.bin of=/dev/sda

Nettoyer et redémarrer

umount /mnt/sys

reboot

Notes pour UEFI

Si le système ne démarre pas automatiquement avec UEFI, il faut éditer l'ordre de démarrage du boot, soit directement dans l'UEFI, soit avec l'utilisation de l'utilitaire efibootmgr.


Afficher la liste des entrées :

efibootmgr -v

Devrait afficher quelque chose comme ici :

BootCurrent: 0002
Timeout: 0 seconds
BootOrder: 0000,0001,0002,0003
Boot0000* UiApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)
Boot0001* UEFI VBOX CD-ROM VB2-01700376 	PciRoot(0x0)/Pci(0x1,0x1)/Ata(1,0,0)N.....YM....R,Y.
Boot0002* UEFI VBOX HARDDISK VBefef2fd7-f6b20036 	PciRoot(0x0)/Pci(0xd,0x0)/Sata(0,65535,0)N.....YM....R,Y.
Boot0003* EFI Internal Shell	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(7c04a583-9e3e-4f1c-ad65-e05268d0b4d1)
Boot0004* alpine	HD(1,GPT,c4f262a1-59d9-e948-9801-49cc40ee1de9,0x1000,0x100000)/File(\EFI\alpine\grubx64.efi)

Ici, les champs intéressants sont BootOrder et les entrées Bootxxxx.

BootOrder représente l'ordre dans lequel les entrées seront essayées afin de démarrer la machine. Dans ce cas là, les entrées de 0000 à 0003 seront testées dans l'ordre, l'entrée 0004 ne sera jamais essayée.


Pour modifier l'ordre, il faut utiliser l'option -o :

efibootmgr -o 1,4,3
BootCurrent: 0002
Timeout: 0 seconds
BootOrder: 0001,0004,0003
Boot0000* UiApp
Boot0001* UEFI VBOX CD-ROM VB2-01700376 
Boot0002* UEFI VBOX HARDDISK VBefef2fd7-f6b20036 
Boot0003* EFI Internal Shell
Boot0004* alpine

Maintenant, le CD-ROM sera essayé en premier, puis l'entrée alpine et pour finir le Shell EFI ; les autres entrées sont ignorées.


Pour ajouter une entrée, il faut utiliser l'option -c qui mettra aussi l'entrée créée en premier dans l'ordre de démarrage, ou -C qui ne fera que rajouter l'entrée à la liste sans modification de l'ordre du boot.

efibootmgr -c -L EtiquetteEntree -l /EFI/alpine/grubx64.efi
BootCurrent: 0002
Timeout: 0 seconds
BootOrder: 0005,0001,0004,0003
Boot0000* UiApp
Boot0001* UEFI VBOX CD-ROM VB2-01700376 
Boot0002* UEFI VBOX HARDDISK VBefef2fd7-f6b20036 
Boot0003* EFI Internal Shell
Boot0004* alpine
Boot0005* EtiquetteEntree

Pour supprimer une entrée, il faut utilier l'option -B :

efibootmgr -b 5 -B
BootCurrent: 0002
Timeout: 0 seconds
BootOrder: 0001,0004,0003
Boot0000* UiApp
Boot0001* UEFI VBOX CD-ROM VB2-01700376 
Boot0002* UEFI VBOX HARDDISK VBefef2fd7-f6b20036 
Boot0003* EFI Internal Shell
Boot0004* alpine

Créer la partition /boot en RAID1

Création du RAID1 avec seulement un seul disque, l'autre est ajouté plus bas:

mdadm --create /dev/md0 --level=1 --raid-devices=2 --metadata=0.90 --run $BOOTFS missing

mdadm --detail --scan >> /etc/mdadm.conf
rc-update add mdadm-raid boot
echo raid1 >> /etc/modules

Ajout de la seconde partition /boot (second disque):

mdadm /dev/md0 --add /dev/sdb2

Ajout d'une seconde partition mirroir au ZFS:

zpool attach rpool sda3 sdb3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment