DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi
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
L’image utilisée pour ce test est celle de raspbian disponible directement sur leur site.
$> 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>$ 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.imgAfin 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/sOn 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.imgLa 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)
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
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 /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.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.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 patition /
La partition /boot
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
/dev
/sys
/proc
/dev/pts
$> 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/bootA 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% /devIci pour tester nous allons installer nodejs et pandoc.
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_slashEt 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