Créer une Raspbian minimale

Il existe plusieurs images d’OS pour Raspberry disponible sur Internet. Elles ont l’avantage d’être prête à l’emploie, moyennant quelques minutes d’attentes lors de l’exécution de la commande dd. Cependant, suivant l’usage désiré, ces distributions prêtes en l’emploie sont horriblement lourdes et contiennent des centaines de paquets qui nous sont en pratique inutile. L’objet de cet article est de montrer comment créer sa propre distribution Debian minimal pour Raspberry, appelé aussi Raspbian par contraction.

Ici, nous n’allons pas travailler directement sur la carte SD du Raspberry, mais plutôt sur une image locale, via chroot, pour des raisons de performance. En effet, les faibles ressources du Raspberry sont amplement suffisantes pour exécuter l’OS, mais son installation complète serait une tâche trop fastidieuse.
Pour créer cette image vierge, je vous invite à consulter cet article, ou à utiliser la commande dd pour effectuer une image de votre carte SD (plus long).

Base du système

Tout d’abord, nous allons monter l’image précédement créé en la déclarant au système hôte comme un prériphérique de type bloc, puis nous allons monter la partition Linux. Ici, la commande kpartx déclare le périphérique loop2. Ces commandes sont à adapter à votre contexte.

# kpartx -a -v minimal-wheezy-raspbian.img
add map loop2p1 (254:7): 0 122880 linear /dev/loop2 2048
add map loop2p2 (254:8): 0 8263680 linear /dev/loop2 124928
# mount /dev/mapper/loop1p2 /mnt/temp

Nous allons récupérer le système de base grâce à la commande debootstrap.

# cd /mnt/temp
# debootstrap --foreign --no-check-gpg --include=ca-certificates --arch=armhf wheezy /mnt/temp \

http://mirrordirector.raspbian.org/raspbian/

Suite de l’installation via chroot

Il est temps d’utiliser chroot. Pour ce faire, il est nécessaire d’installer le paquet qemu-user-static, puisque votre processeur x86 ne sera pas capable d’exécuter directement les binaires ARM. Une fois ce paquet installé sur le système hôte, exécuter les commandes suivantes pour monter les périphériques spéciaux.

# cp $(which qemu-arm-static) /mnt/temp/usr/bin
# mount -o bind /dev /mnt/temp/dev
# mount -o bind /dev/pts /mnt/temp/dev/pts
# mount -o bind /proc /mnt/temp/proc
# mount -o bind /sys /mnt/temp/sys
# mount -o bind /run /mnt/temp/run

Copions les fichiers nécessaire à la connexion à Internet.

# cp /etc/network/interfaces /mnt/temp/etc/network/interfaces
# cp /etc/resolv.conf /mnt/temp/etc/resolv.conf

Effectuons le chroot.

# echo "echo \
':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:'\
 > /proc/sys/fs/binfmt_misc/register" | sh
# chroot /mnt/temp /bin/bash

Il est temps de finir l’installation !

# /debootstrap/debootstrap --second-stage --verbose
# echo "deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi" > /etc/apt/sources.list
# aptitude update
# aptitude full-upgrade

Quelques ajouts utiles, mais non indispensables

Il peut être utile, suivant votre projet, d’ajouter les dépôts raspberrypi.org.

# echo "deb http://archive.raspberrypi.org/debian/ wheezy main" >> /etc/apt/sources.list
# wget http://archive.raspberrypi.org/debian/raspberrypi.gpg.key
# apt-key add raspberrypi.gpg.key
# rm raspberrypi.gpg.key

Éventuellement, installer le firmware nécessaire à votre matériel.

# aptitude install firmware-atheros firmware-brcm80211 firmware-libertas firmware-ralink firmware-realtek

Également, installer les locales de langues…

# aptitude install locales
# dpkg-reconfigure locales
| fr_FR.UTF-8 UTF-8
# dpkg-reconfigure tzdata
| Europe/Paris
# aptitude install console-data
| « Select keymap from full list »
| pc / azerty / French / Same as X11 (latin 9) / Standard

Fin de l’installation

Pour finir, définissons un mot de passe pour root, ainsi qu’un nom d’hôte.

# passwd
# echo "my-host" > /etc/hostname

Il reste à configurer les fichiers /etc/hosts, /etc/resolv.conf et /etc/netwok/interfaces pour terminer, ainsi que le fichier /etc/fstab.
En ce qui concerne ce dernier fichier, la commande blkid permet de récupérer l’UUID des partitions montés. Il nous faut repérer la partition /dev/mapper/loop1p2 (adapter à votre situation), puis à éditer fstab pour monter cette partition en tant que système de fichier racine.

# blkid
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
Unsupported ioctl: cmd=0x5331
/dev/sda1: UUID="3b916d65-66ce-4acb-8a7f-325e4a901166" TYPE="ext2"
/dev/sda5: UUID="6365d1b9-2454-435b-8188-288d6a88e962" TYPE="crypto_LUKS"
/dev/mapper/sda5_crypt: UUID="xToFlZ-LAyW-TGJD-gL6p-aa7o-Wisp-tzDMEX" TYPE="LVM2_member"
/dev/mapper/system-system_debian: UUID="9a253ac4-ceab-4f2a-acd9-22e8fee1a1f9" TYPE="ext4"
/dev/mapper/system-data: UUID="14555dca-24e2-4bf6-9220-39f606081d75" TYPE="ext4"
/dev/mapper/system-swap: UUID="448f8218-20dc-4e2e-91e2-9be97870e677" TYPE="swap"
/dev/mapper/truecrypt1: UUID="f4c7a5a0-d65a-4c0f-8fb1-30b1f25c796e" TYPE="ext3"
/dev/mapper/loop1p1: SEC_TYPE="msdos" UUID="5837-9875" TYPE="vfat"
/dev/mapper/loop1p2: UUID="249572c9-c8c2-46d8-9c6c-1f8733d7ec34" TYPE="ext4"
# vi /etc/fstab
proc /proc proc defaults 0 0
UUID=249572c9-c8c2-46d8-9c6c-1f8733d7ec34 / ext4 errors=remount-ro 0 1

Sortons du chroot, qui n’est plus nécessaire.

# exit

Installation des drivers et du firmware de démarrage

Le temps est venu de ficeler tout cela joliment, par l’installation des drivers. Nous allons les récupérer sur le dépôt git du projet raspberrypi, puis les copier dans la partition racine de notre image.

# cd ..
# git clone https://github.com/raspberrypi/firmware.git
# cp -R firmware/hardfp/opt/* temp/opt/
# cp -R firmware/modules temp/lib/

Le paquet secure-delete contient la commande sfill, qui permet de remplir l’espace vide du système de fichier par des zéro. Ce qui a pour effet d’augmenter considérablement le taux de compression de notre image, si nous voulons la partager, via Internet par exemple.

# sfill -l -l -z temp/
# umount temp

Copions le firmware sur la première partition de l’image (au format vfat).

# mount /dev/mapper/loop1p1 /mnt/temp
# cp -R firmware/boot/* temp/
# sfill -l -l -z temp/
# umount temp

Il ne nous reste plus qu’à retirer le périphérique spécial,

# kpartx -d -v minimal-wheezy-raspbian.img

et suivant notre convenance :

  • compresser l’image et la partager sur Internet ;
    # gzip -9 minimal-wheezy-raspbian.img
  • copier l’image sur une carte SD et démarrer le Raspberry pi dessus ;
    # dd if=minimal-wheezy-raspbian.img of=/dev/sdX
  • continuer l’installation ou coder quelques outils spécifiques.

Notes pour la suite

Il n’est évidemment pas nécessaire, si vous avez déjà employé la commande dd pour copier l’image sur le support SD, d’exécuter systématiquement une copie complète via cette commande.
Une copie partielle, via rsync par exemple, suffit.
Ainsi la commande suivante met à jour la carte SD suivant les dernières modifications effectués sur l’image.

# rsync -avz /mnt/rpi/ /media/UUID_CARTE_SD