Skip to content

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