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.

Zephilou

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Post comment