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.
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.
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 à duQWERTY
.Celui-ci sera changé juste avant l'installation, en français.
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 SSHpasswd 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
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 programmeszfs
etzpool
entre autresfdisk
sera utilisé pour partitionner le disque durxfsprogs
pour la gestion du système de fichier utilisé pour la partition/boot
apk add zfs sfdisk grub-efi xfsprogs dosfstools efibootmgr
grub-efi
pour installer le gestionnaire de chargement du système, à savoir grubdosfstools
afin de formater au bon format (FAT32) la partition nécessaire pour l'UEFIefibootmgr
permet de modifier le gestionnaire de boot UEFI
apk add zfs sfdisk syslinux xfsprogs
syslinux
est le gestionnaire de chargement du système
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
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
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
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
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 de la partition /boot au format XFS
mkfs.xfs -L Boot -f $BOOTFS
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-8xattr=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
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
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éerlogbias=throughput
etsync=always
demandent à ce que les données soient écritent le plus vite possible sur le disque afin de libérer la mémoireprimarycache=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
export USE_EFI=y
export BOOTLOADER=grub
mkdir /mnt/sys
mount --bind /sys /mnt/sys
setup-disk /mnt
setup-disk /mnt
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
Écrit le secteur MBR afin que le système puisse démarrer
dd if=/usr/share/syslinux/mbr.bin of=/dev/sda
umount /mnt/sys
reboot
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é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