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.