Faire une image Raspbian custom pour son Raspberry en full headless
Retour aux sources pour le Raspberry pi !
J’ai enfin craqué pour un RPI3 pour qu’il trouve sa place à coté du RPI1 et du RP2 avec un changement d’image aussi pour passer à Raspbian Pixel en mode light.
Contexte:
Voilà le problème: je souhaite éviter de brancher câble, écran et tout le toutim sur les 3 RPI. Mais aussi je veux une image contenant déjà une connexion ssh activée parce que, dans le cadre de mon futur lab RPI, je vais redescendre les images régulièrement.
Depuis la fin de l’année 2016, Raspbian a désactivé le ssh et il faut rajouter un fichier dans le répertoire de /boot mais je vais vous proposer une autre solution.
Materiel:
Tout ce qu’il vous faut : une image Raspbian … et un Linux (ici CentOS 7)
Ca commence mal …
On commence par monter l’image localement :
[root@i5 cyklodev]# ll Downloads/2017-03-02-raspbian-jessie-lite.img
-rw-r--r--. 1 cyklodev cyklodev 1393557504 Mar 8 15:55 Downloads/2017-03-02-raspbian-jessie-lite.img
[root@i5 cyklodev]# mount Downloads/2017-03-02-raspbian-jessie-lite.img /mnt/rpi-custom
mount: /dev/loop1 is write-protected, mounting read-only
mount: wrong fs type, bad option, bad superblock on /dev/loop1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
[root@i5 cyklodev]# echo $?
32
[root@i5 cyklodev]# df -h
Filesystem Size Used Avail Use% Mounted on
....
/dev/loop0 1.2G 743M 389M 66% /mnt/rpi-custom
....
Le montage a été fait mais en write-protected (RC 32) , du coup ça n’est pas très utile. Le point intéressant est que le montage est un /dev/loopX et pas un /dev/sdXX . L’image est en fait un device de type loopback. Un outil dédié existe (losetup), mais on va s’en passer.
Une solution:
On commence donc par démonter le précédent point de montage.
[root@i5 cyklodev]# umount /mnt/rpi-custom
Passons au crible l’image qu’on veut monter/modifier.
[root@i5 cyklodev]# fdisk -l Downloads/2017-03-02-raspbian-jessie-lite.img
Disk Downloads/2017-03-02-raspbian-jessie-lite.img: 1393 MB, 1393557504 bytes, 2721792 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xb2455b06
Device Boot Start End Blocks Id System
Downloads/2017-03-02-raspbian-jessie-lite.img1 8192 137215 64512 c W95 FAT32 (LBA)
Downloads/2017-03-02-raspbian-jessie-lite.img2 137216 2721791 1292288 83 Linux
On va se concentrer sur 2 valeurs (en gras) :
- La taille des blocks (Units)
- La position du démarrage de la partition qu’on cible
Avec ces 2 valeurs on va obtenir l’offset global de l’image pour la monter proprement : 137216 * 512 = 70254592 .
[root@i5 ckd-rpi]# mount -o loop,offset=70254592 /home/cyklodev/Downloads/2017-03-02-raspbian-jessie-lite.img /mnt/rpi-custom [root@i5 ckd-rpi]# echo $? 0 [root@i5 ckd-rpi]# df -h Filesystem Size Used Avail Use% Mounted on .... /dev/loop0 1.2G 743M 389M 66% /mnt/rpi-custom ....
Cette fois ci plus de soucis, le montage permet l’écriture.
Customisation :
Avec cette méthode, on retrouve notre image montée en écriture (RC 0) où on va pouvoir customiser notre config:
La bannière :
Ça permettra de s’y retrouver en local et en remote
vi /mnt/rpi-custom/etc/issue*
Ssh :
Il existe une solution en créant un fichier ssh vide dans /boot.
touch /mnt/rpi-custom/boot/ssh
Mais je voulais vous montrer autre chose :
[root@i5 cyklodev]# ls -1 /mnt/rpi-custom/etc/rc.loca* /mnt/rpi-custom/etc/rc.local /mnt/rpi-custom/etc/rc.local.bak
On retrouve le rc.local avec un rc.local.bkp… En fait au tout premier boot, on retrouve le resize2fs de microSD qui switch le fichier rc.local.bak en rc.local.
Donc pour générer le démarrage de mon ssh en automatique je vais le glisser dans rc.local.bak pour être sur d’avoir mon ssh après le reboot.
[root@i5 cyklodev]# vi /mnt/rpi-custom/etc/rc.local.bak .... service ssh start exit 0
Libre à vous de pousser plus loin la customisation :)
Le bonus:
Histoire d’éviter de faire les calculs pour l’offset, j’ai fait un script qui s’occupe de tout et qui est disponible sur mon Github.
Attention, cela ne fonctionne pour l’instant que sur du CentOS/Redhat.

