Créer son image pour RaspberryPI


DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi


Création de son image pour RaspberryPI

L’objectif est de voir comment créer son image pour raspberry-pi afin de pouvoir déployer directement sur la carte SD tous les logiciels spécifiques dont on a besoin sans avoir à refaire les installations et les configurations.

Pour cela nous allons voir comment partir d’une image existante, étendre son filesystem, faire les installations proprement dessus et donc enfin booter dessus.

Toutes les manipulations sont réalisées depuis un raspberry pi, booté sur l’image qui a été mise sur la carte SD, c’est cette meme image qui est ensuite modifiée

Image de départ.

L’image utilisée pour ce test est celle de raspbian disponible directement sur leur site.

Description de l’image

$> file 2020-08-20-raspios-buster-armhf-lite.img
2020-08-20-raspios-buster-armhf-lite.img: DOS/MBR boot sector; 
partition 1 : ID=0xc, start-CHS (0x40,0,1), end-CHS (0x3ff,3,32), startsector 8192, 524288 sectors; 
partition 2 : ID=0x83, start-CHS (0x3ff,3,32), end-CHS (0x3ff,3,32), startsector 532480, 3072000 sectors

sa place sur disque

>$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root      122659452 3240168 114405044   3% /
>$ ls -l
total 1802244
-rwxr-xr-x 1 pi pi 1845493760 Oct 17 08:54 2020-08-20-raspios-buster-armhf-lite.img

Extention du filesystem.

Afin de pouvoir procèder à ses installations sans problème de place il est nécessaire de commencer par étendre le filesystem de l’image.

La commande dd depuis /dev/zero nous permet de faire “grossir” le fichier image de 1GB

$> dd if=/dev/zero bs=1M count=1024 >> 2020-08-20-raspios-buster-armhf-lite.img
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 39.1182 s, 27.4 MB/s

On vérifie, le fichier a bien une taille plus importante de 1 GB

$> ls -l
total 2850820
-rwxr-xr-x 1 pi pi 2919235584 Oct 17 10:16 2020-08-20-raspios-buster-armhf-lite.img

Utilisation de la device loop pour accéder à l’image

La commande losetup va permettre d’attacher l’image a une device loop, elle va indiquer la device loop à utiliser pour les commandes suivantes (ici loop0)

$> losetup -f -P --show 2020-08-20-raspios-buster-armhf-lite.img
/dev/loop0

Partitionnement

Maintenant que l’image est attachée a /dev/loop0 nous pouvons l’utliser pour examiner son partitionnement, et le modifier.

En affichant les partitions nous en voyons deux, le boot en fat32 et la partition / en ext4, cette seconde partition a par défaut l’ancienne taille, il va falloir augmenter celle ci en refaisant le partitionnement.

Cela demande de supprimer la seconde partition

(parted) rm 2

Puis refaire sa création, le premier nombre 273 correspond au start de la seconde partition, le second nombre 2919 correspond à la taille totale en MB de l’image, il va adapter.

(parted) mkpart primary 273 2919
$> parted /dev/loop0
GNU Parted 3.2
Using /dev/loop0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: Loopback device (loopback)
Disk /dev/loop0: 2919MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  273MB   268MB   primary  fat32        lba
 2      273MB   1845MB  1573MB  primary  ext4

(parted) rm 2
(parted) mkpart primary 273 2919
(parted) p
Model: Loopback device (loopback)
Disk /dev/loop0: 2919MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  273MB   268MB   primary  fat32        lba
 2      273MB   2919MB  2647MB  primary               lba

(parted) q
Information: You may need to update /etc/fstab.

resize du filesystem

Attention de bien faire les deux commandes, le fsck qui permet de travailler sur une partition propre, et le resize1fs qui va valider le resize.

$> e2fsck -f /dev/loop0p2
e2fsck 1.44.5 (15-Dec-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
rootfs: 44468/96000 files (0.4% non-contiguous), 290480/384000 blocks
$> resize2fs /dev/loop0p2
resize2fs 1.44.5 (15-Dec-2018)
Resizing the filesystem on /dev/loop0p2 to 646144 (4k) blocks.
The filesystem on /dev/loop0p2 is now 646144 (4k) blocks long.

Montage du filesystem

Maintenant que l’image est préparée pour recevoir les nouvelles installations il faut la mount correctement, pour cela plusieurs opération de mount sont nécessaires.

La partition /boot est la premiere dans l’image, donc comme nous sommes toujours attaché a la device loop cela va correspondre a /dev/loop0p1, logiquement la partitition / étant la seconde elle va correspondre a /dev/loopop2

Il faut aussi attacher un certain nombre de partition systeme necessaires à l’execution de l’environnement en chroot

mount des partitions de l’image

$> mkdir /mnt/pi_slash
$> mount /dev/loop0p2 /mnt/pi_slash/
$> mount /dev/loop0p1 /mnt/pi_slash/boot/

Vérification

$> df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root      122659452 4288752 113356460   4% /
[...]
/dev/loop0p2     2511600 1105008   1260980  47% /mnt/pi_slash
/dev/loop0p1      258095   54603    203492  22% /mnt/pi_slash/boot

mount des partitions du système

$> mount --bind /dev /mnt/pi_slash/dev
$> mount --bind /sys /mnt/pi_slash/sys
$> mount -t proc none /mnt/pi_slash/proc/
$> mount --bind /dev/pts /mnt/pi_slash/dev/pts/

chroot dans le nouvel environnement

$> chroot /mnt/pi_slash/

A partir de ce moment nous sommes dans l’environnement chroot, toutes les opérations d’écritures se feront donc dans l’image comme si on avait booté desssus.

$> df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/loop0p2     2511600 1105008   1260980  47% /
/dev/loop0p1      258095   54603    203492  22% /boot
devtmpfs         1827808       0   1827808   0% /dev

Mise à jour et installations.

upgrade du système

$> apt-get update
$> apt-get upgrade 

installation

Ici pour tester nous allons installer nodejs et pandoc.

$> apt-get install nodejs pandoc

sortie du chroot

$> exit

umount de l’environnement.

Attention, pour que toutes les ecritures soient bien proprement validées il faut bien umount dans l’ordre inverse ou on a effectué les mount.

$> umount /mnt/pi_slash/dev/pts/
$> umount /mnt/pi_slash/proc/
$> umount /mnt/pi_slash/sys
$> umount /mnt/pi_slash/dev
$> umount /mnt/pi_slash/boot
$> umount /mnt/pi_slash

Et bien penser à sortir de la config /dev/loop

$> losetup -d /dev/loop0

Terminé.

Et voila, il ne reste qu’a récupérer le fichier .img ainsi modifié et le copier sur une carte SD pour booter votre raspberry pi et tester.


DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi