Créer une image personnalisée de RaspberryPi OS
Nous allons voir dans ce tutoriel une méthode pour créer une image de RaspberryPi OS personnalisée, dans laquelle nous pourrons pré-installer nos propres paquets et configurations.
Les étapes sont détaillées pas-à-pas, mais pour une automatisation via un script, vous trouverez un exemple ici.
Préparation de l'image de base
Tout d'abord il faut récupérer une image de RaspberryPi OS sur la page officielle.
Ensuite, il faut la décompresser:
unxz -k -d raspios.img.xz -c > "raspios.img"
unxz -k -d raspios.img.xz -c > "raspios.img"
Préparation du système de fichiers
Il est probablement nécessaire d'agrandir la partition racine de l'image, de façon à pouvoir installer de nouveaux paquets. On commence par ajouter des zéros à la fin de l'image (ici, 512 Mo):
dd if=/dev/zero bs=1M count=512 >> "raspios.img"
dd if=/dev/zero bs=1M count=512 >> "raspios.img"
et on redimentionne la partition racine en conséquence:
sudo parted "raspios.img" resizepart 2 100%
sudo parted "raspios.img" resizepart 2 100%
À présent, il faut modifier le système de fichier de cette partition pour occuper tout l'espace disponible. On récupère les informations sur la partition:
parted -s "raspios.img" unit B print
parted -s "raspios.img" unit B print
on obtient quelque chose comme:
Modèle : (file)
Disque raspios.img : 2558525440B
Taille des secteurs (logiques/physiques) : 512B/512B
Table de partitions : msdos
Drapeaux de disque :
Numéro Début Fin Taille Type Système de fichiers Drapeaux
1 8388608B 545259519B 536870912B primary fat32 lba
2 545259520B 2558525439B 2013265920B primary ext4
Modèle : (file)
Disque raspios.img : 2558525440B
Taille des secteurs (logiques/physiques) : 512B/512B
Table de partitions : msdos
Drapeaux de disque :
Numéro Début Fin Taille Type Système de fichiers Drapeaux
1 8388608B 545259519B 536870912B primary fat32 lba
2 545259520B 2558525439B 2013265920B primary ext4
L'information qui nous intéresse est le début de la partition racine (ext4), donc: 545259520B
. Ci-après, on veille à retirer le B
final. On utilise cette information pour créer un périphérique de type boucle:
sudo losetup --show -f -o 545259520 raspios.img
sudo losetup --show -f -o 545259520 raspios.img
et on note le chemin du périphérique créé, ici: /dev/loop0
.
Il est préférable de vérifier l'intégrité du système de fichiers:
sudo e2fsck -p -f /dev/loop0
sudo e2fsck -p -f /dev/loop0
On redimentionne le système de fichier à la taille de la partition:
sudo resize2fs /dev/loop0
sudo resize2fs /dev/loop0
il devrait y avoir un message qui confirme que le redimentionnement a bien eu lieu.
Montage des systèmes de fichiers
Nous allons maintnant monter la partition de démarrage et la partition racine.
Tout d'abord, il faut créer le périphérique de type boucle pour la partition de démarrage, tout comme nous l'avons fait pour la partition racine. Il faut récupérer le début de la partition donné par la commande parted
que nous avons utilisée précédemment, dans notre cas 8388608B
. On retire le B
final, et on crée le périphérique de type boucle:
sudo losetup --show -f -o 8388608 raspios.img
sudo losetup --show -f -o 8388608 raspios.img
et on note le chemin du périphérique créé, ici: /dev/loop1
.
Nous pouvons à présent monter nos partitions:
mkdir boot root
sudo mount /dev/loop1 boot
sudo mount /dev/loop0 root
sudo mkdir -p root/boot
sudo mount --bind boot root/boot
mkdir boot root
sudo mount /dev/loop1 boot
sudo mount /dev/loop0 root
sudo mkdir -p root/boot
sudo mount --bind boot root/boot
Préparation du chroot
Il faut monter les répertoires spéciaux dans le système de fichiers racine:
sudo mount --bind /dev root/dev
sudo mount --bind /sys root/sys
sudo mount --bind /proc root/proc
sudo mount --bind /dev root/dev
sudo mount --bind /sys root/sys
sudo mount --bind /proc root/proc
également, on copie les informartions des serveurs DNS, pour la résolution des noms de domaine:
sudo cp /etc/resolv.conf root/etc/resolv.conf
sudo cp /etc/resolv.conf root/etc/resolv.conf
Modification du système de fichiers via chroot
On peut maintenant faire:
sudo chroot root /bin/bash
sudo chroot root /bin/bash
À partir de là, vous pouvez installer des paquets dans l'image:
sudo apt update
sudo apt install ...
sudo apt update
sudo apt install ...
ou bien modifier la configuration du système.
Pour terminer la création de l'image
Pour sortir du chroot, on fait CTRL + D
. Puis, on supprime les ressources qui ne sont plus nécessaires et on démonte les systèmes de fichiers spéciaux:
sudo rm -f root/etc/resolv.conf
sudo umount root/dev
sudo umount root/sys
sudo umount root/proc
sudo umount root/boot
sudo umount root
sudo umount boot
sudo rm -f root/etc/resolv.conf
sudo umount root/dev
sudo umount root/sys
sudo umount root/proc
sudo umount root/boot
sudo umount root
sudo umount boot
On détruit les périphérique de type boucle:
sudo losetup -d /dev/loop0
sudo losetup -d /dev/loop1
sudo losetup -d /dev/loop0
sudo losetup -d /dev/loop1
Et pour finir, on compresse l'image:
xz -k -c raspios.img > raspios_custom.img.xz
xz -k -c raspios.img > raspios_custom.img.xz