I. Introduction▲
Le Raspberry Pi charge son système d’exploitation à partir du lecteur de carte micro SD. Le Raspberry Pi 3 a aussi la possibilité de charger le système à partir d’une clé USB ou du réseau sans avoir recours à la carte SD. Il est donc nécessaire de préparer le système de manière appropriée pour que le nano ordinateur puisse démarrer.
I-A. Architecture▲
Le processeur intégré au Raspberry Pi supporte le jeu d’instructions ARM, contrairement au processeur d’un ordinateur classique (Intel, AMD) qui implémente le jeu d’instructions x86. Ainsi, le système d’exploitation et les programmes doivent être compilés pour utiliser le jeu d’instructions approprié, sans quoi, il sera impossible de les exécuter.
II. Installateurs▲
Les installateurs sont la manière la plus simple d’installer son système pour le Raspberry Pi. En effet, il suffit d’avoir une carte SD formatée en FAT32, de copier les fichiers et voilà, le nano ordinateur peut démarrer sur un programme d’installation permettant de télécharger et de préparer automatiquement la carte SD avec le système d’exploitation voulu.
II-A. NOOBS▲
NOOBS (pour New Out Of Box Software) est un logiciel simplifiant le processus d’installation d’un système d’exploitation pour le Raspberry Pi.
Deux configurations existent :
- NOOBS : un installateur qui intègre la distribution Linux Raspbian. Il n’y aura donc pas besoin de télécharger Raspbian pour l’installer. Les autres systèmes sont téléchargés par Internet ;
- NOOBS Lite : uniquement l’installateur qui téléchargera et installera la distribution voulue.
Pour installer NOOBS, il suffit de copier les fichiers décompressés sur la carte SD formatée.
Une fois le Raspberry Pi démarré avec NOOBS, vous verrez une fenêtre vous proposer différents systèmes que vous pouvez installer. Vous avez le choix entre :
- Raspbian ;
- LibreElec ;
- OSMC ;
- Windows 10 IoT Core (versions RTM et Insider).
Il suffit d’en sélectionner un ou plusieurs et de cliquer sur installer.
NOOBS permet aussi d’ajouter une partition de 512 Mo formatée en ext4 sur la carte SD. Elle peut être utile pour séparer les données utilisateur du reste du système.
Vous pouvez choisir la langue du système dans le menu en bas de l’écran.
Une fois l’installation terminée, le système peut démarrer. Par contre, l’installation du système d’exploitation supprime NOOBS.
II-A-1. Ajouter un système dans NOOBS▲
Il est possible d’ajouter son propre système dans NOOBS. Pour ce faire, il faut créer deux archives au format XZ :
- boot.tar.xz : une copie de la partition boot ;
- root.tar.xz : les fichiers du système.
Ensuite, dans le dossier OS de NOOBS, vous pouvez ajouter votre système en vous inspirant de ce qui est fait avec Raspbian.
II-B. BerryBoot▲
BerryBoot est un autre installateur ne se consacrant qu’à l’installation de distribution GNU/Linux. Tout comme NOOBS, il suffit de formater sa carte SD en FAT32 et de copier les fichiers sur le support.
L’installation d’un système se fait en trois écrans de configuration :
- configuration généraliste : overscan, type de connexion, sortie vidéo et langue utilisée ;
- support de destination (carte SD, USB ou réseau) ;
-
choix du système, parmi :
- Rapsbian,
- Fedora,
- LibreELEC,
- OpenELEC,
- Android KitKat (sans accélération graphique),
- Ubuntu Mate 15.04,
- Ubuntu Core 15.04,
- LTSP BerryTerminal,
- RetroPie,
- Arch Linux,
- Kali 2.0.1,
- Puppy alpha 4,
- Sugar,
- BerryWebserver.
II-B-1. Ajouter un système dans BerryBoot▲
Pour être compatibles avec BerryBoot, les images de système d’exploitation doivent être converties au format SquashFS. Pour ce faire, vous pouvez utiliser les commandes suivantes :
$ sudo kpartx -av image_you_want_to_convert.img
add map loop0p1 (252:5): 0 117187 linear /dev/loop0 1
add map loop0p2 (252:6): 0 3493888 linear /dev/loop0 118784
$ sudo mount /dev/mapper/loop0p2 /mnt
$ sudo sed -i 's/^\/dev\/mmcblk/#\0/g' /mnt/etc/fstab
$ sudo sed -i 's/^PARTUUID/#\0/g' /mnt/etc/fstab
$ sudo rm -f /mnt/etc/console-setup/cached_UTF-8_del.kmap.gz
$ sudo rm -f /mnt/etc/systemd/system/multi-user.target.wants/apply_noobs_os_config.service
$ sudo rm -f /mnt/etc/systemd/system/multi-user.target.wants/raspberrypi-net-mods.service
$ sudo rm -f /mnt/etc/rc3.d/S01resize2fs_once
$ sudo mksquashfs /mnt converted_image_for_berryboot.img -comp lzo -e lib/modules
$ sudo umount /mnt
$ sudo kpartx -d image_you_want_to_convert.img
Ensuite, vous pouvez ajouter le système à BerryBoot en plaçant l’image sur une clé USB et en choisissant l’option « Operating system installer » puis « Add OS ».
II-C. Formater la carte▲
Le formatage détruit toutes les données actuellement présentes sur la carte. Pensez à sauvegarder vos données avant de procéder au formatage.
II-C-1. Windows▲
L’association SanDisk (SD) fournit un utilitaire pour le formatage de la carte SD, disponible sur le site officiel. Une fois installé, l’utilitaire permet de formater la carte. Lorsque cette dernière est insérée dans le lecteur, repérez sous quel nom/lettre de lecteur elle apparaît dans le système. Cette indication est nécessaire afin d’indiquer le périphérique approprié à l’utilitaire.
Par défaut, les options (« FULL(erase) FORMAT » et « FORMAT SIZE ADJUSTEMENT OFF ») sont correctes. Il ne reste plus qu’à formater (bouton « Format »).
II-C-2. Mac▲
L’outil officiel est aussi disponible pour Mac. Lancez-le et sélectionnez « Overwrite Format ». Vérifiez que vous avez sélectionné le bon périphérique et formatez (bouton « Format »).
II-C-3. Linux▲
Sous Linux, vous pouvez utiliser l’outil de partitionnement, GParted. Formatez la carte SD en FAT32.
III. Installation à partir d’une image▲
Vous avez la possibilité d’installer directement votre système d’exploitation (tel que Raspbian) sans passer par NOOBS. Pour ce faire, il suffit de télécharger l’image du système (portant généralement l’extension .img).
Une image est une copie carbone d’une carte SD.
III-A. Mise en place▲
Pour préparer la carte SD, il ne suffit pas de copier, à l’aide de l’explorateur de fichiers, l’image sur le média. En effet, pour être utile, le fichier image doit être inscrit sur la carte sans tenir compte des partitions ou d’un quelconque système de fichiers.
III-A-1. Linux▲
Il suffit de copier l’image sur le disque avec la commande dd. Dans l’exemple suivant, la carte SD est identifiée sous le nom de mmcblk0(1) :
dd if=2016-05-27-raspbian-jessie.img of=/dev/mmcblk0 bs=1M
Par mesure de sécurité, lancez la commande sync après la copie afin de vous assurer que l’opération est terminée.
III-A-2. Windows▲
Pour copier l’image, vous avez besoin de Win32 Disk Imager. Une fois le programme lancé, il suffit de charger l’image, de choisir le lecteur identifiant la carte SD et de cliquer sur le bouton « Write ».
III-A-3. Mac▲
IV. Installation sur un périphérique de stockage USB▲
À partir du Raspberry Pi 3, il est possible de lire le système à partir d’un périphérique de stockage connecté en USB, sans carte SD.
Cette fonctionnalité est expérimentale. De plus, il est nécessaire d’avoir une carte SD pour activer et mettre en place le démarrage du Raspberry Pi sur le périphérique de stockage USB.
IV-A. Mise à jour du système▲
Assurez-vous d’avoir les dernières mises à jour du système :
sudo apt-get update
sudo apt-get upgrade
IV-B. Mise à jour du micro logiciel▲
Le micrologiciel doit aussi être mis à jour avec la version expérimentale :
sudo BRANCH=next rpi-update
IV-C. Activation du mode▲
Éditez le fichier /boot/config.txt pour ajouter la ligne :
program_usb_boot_mode=1
N’oubliez pas de retirer cette ligne, si par exemple, vous utilisez la carte SD sur un autre Raspberry Pi, sans quoi, cela activera l’option sur la nouvelle machine. De plus, à partir du Raspberry Pi 3, la valeur passée à cette option est enregistrée dans le Raspberry Pi.
Après redémarrage du Raspberry Pi, vous pouvez vérifier que le mode a été activé grâce à la commande :
vcgencmd otp_dump | grep 17:
La commande doit retourner :
17:3020000a
IV-D. Préparation du périphérique de stockage USB▲
L’idée générale est que nous allons dupliquer sur le périphérique de stockage USB le système installé sur la carte SD. Pour des raisons de simplicité, on travaille à partir du Raspberry Pi démarré avec Raspbian.
IV-D-1. Partitionnement▲
Premièrement, il faut partitionner la clé pour qu’elle puisse accepter les fichiers.
La clé est par la suite identifiée /dev/sda. Cela peut en être autrement sur votre système, notamment si vous avez connecté plusieurs périphériques de stockage USB, ou un disque dur externe. Par sécurité, ne connectez uniquement que le périphérique de stockage avec lequel vous souhaitez travailler.
Avant de commencer, n’oubliez pas de démonter la clé :
sudo umount /dev/sda*
Il est nécessaire de faire deux partitions :
- une partition FAT32 de 100 Mo ;
- une partition ext4 occupant le reste de l’espace du support.
Pour créer la hiérarchie des partitions, vous pouvez utiliser parted(2) :
sudo parted /dev/sda
Dans parted :
mktable msdos
L’outil demande une confirmation de l’opération. Ensuite, vous pouvez créer les partitions :
mkpart primary fat32 0% 100M
mkpart primary ext4 100M 100%
Le premier paramètre indique le type de partition, le deuxième le format de la partition, le troisième le début de la partition et finalement arrive la taille de la partition.
Pour vérifier le partitionnement, vous pouvez utiliser la commande print.
Ensuite, on quitte parted :
quit
Il n’est pas encore possible d’utiliser la clé, car même si elle est organisée, les partitions ne sont pas formatées. Pour ce faire, on utilise les commandes suivantes :
sudo mkfs.vfat -n BOOT -F 32 /dev/sda1
sudo mkfs.ext4 /dev/sda2
IV-D-2. Copie du système▲
Le périphérique est prêt, rendez les systèmes de fichiers accessibles au système :
sudo mkdir /mnt/target
sudo mount /dev/sda2 /mnt/target/
sudo mkdir /mnt/target/boot
sudo mount /dev/sda1 /mnt/target/boot/
Ainsi, la clé sera accessible à travers le dossier /mnt/target.
Pour la copie des fichiers, nous utilisons rsync. Il n’est pas installé par défaut ; installez-le :
sudo apt-get update; sudo apt-get install rsync
Et lancez la copie :
sudo rsync -ax --progress / /boot /mnt/target
IV-D-3. Régénération des clés SSH▲
Comme nous voulons un système neuf et surtout qui n’utilise pas les clés du système précédent, nous devons réinitialiser la configuration du serveur SSH :
cd /mnt/target
sudo mount --bind /dev dev
sudo mount --bind /sys sys
sudo mount --bind /proc proc
sudo chroot /mnt/target
rm /etc/ssh/ssh_host*
dpkg-reconfigure openssh-server
exit
sudo umount dev
sudo umount sys
sudo umount proc
IV-D-4. Configuration du démarrage par USB▲
Le Raspberry Pi est configuré pour démarrer sur le périphérique USB. Toutefois, comme nous avons copié un système prévu pour démarrer sur la carte SD, il est nécessaire de modifier deux fichiers référençant la carte SD et non le périphérique de stockage USB :
-
le fichier de démarrage /boot/cmdline.txt :
Sélectionnezsudo sed -i "s,root=/dev/mmcblk0p2,root=/dev/sda2," /mnt/target/boot/cmdline.txt
- le fichier système énumérant les partitions à utiliser /etc/fstab :
sudo sed -i "s,/dev/mmcblk0p,/dev/sda," /mnt/target/etc/fstab
IV-D-5. Finalisation▲
Le périphérique est prêt. Démontez-le et arrêtez le système :
cd ~
sudo umount /mnt/target/boot
sudo umount /mnt/target
sudo poweroff
Débranchez votre Raspberry Pi, enlevez la carte SD et rebranchez l’alimentation. Le système démarrera sur le périphérique USB.
V. Démarrage par le réseau▲
À partir du Raspberry Pi 3, il est aussi possible de lire le système à partir du réseau, sans nécessiter de carte SD, ni de clé USB. L’avantage de ce démarrage par le réseau est que vous pouvez avoir plusieurs Raspberry Pi connectés à un serveur unique qui fournira le système configuré selon vos souhaits. Un exemple serait le cas d’une salle de classe.
V-A. Préparation du Raspberry Pi▲
V-A-1. Activation du mode▲
Éditez le fichier /boot/config.txt pour ajouter la ligne :
program_usb_boot_mode=1
N’oubliez pas de retirer cette ligne, si par exemple, vous utilisez la carte SD sur un autre Raspberry Pi, sans quoi, cela activera l’option sur la nouvelle machine. De plus, à partir du Raspberry Pi 3, la valeur passée à cette option est enregistrée dans le Raspberry Pi.
Vous pouvez vérifier que le mode a été activé, après redémarrage du Raspberry Pi, grâce à la commande :
vcgencmd otp_dump | grep 17:
La commande doit retourner :
17:3020000a
V-A-2. Désactivation du swap▲
Lorsque la mémoire vive est pleine, le système utilise le disque dur pour continuer (opération appelée swap). Lors du démarrage par le réseau, le Raspberry Pi n’aura pas de support pour effectuer cette opération et vous devez donc la désactiver grâce aux commandes suivantes :
sudo apt-get purge dphys-swapfile dphys-config
sudo update-rc.d -f dphys-swapfile remove
Redémarrez le Raspberry Pi. Vous pouvez vérifier si le swap a été désactivé avec la commande :
swapon -s
Finalement, vous pouvez supprimer le fichier /var/swap.
V-B. Préparation du serveur▲
Ici, je vais faire abstraction de la configuration du réseau. Vous devez faire en sorte que le Raspberry Pi puisse joindre le serveur et vous connaissez l’adresse IP de ce dernier.
Dans la suite du guide, on utilise les paramètres suivants :
- eth0 : l’interface réseau utilisée ;
- 10.0.0.100 : l’adresse IP du serveur ;
- 10.0.0.255 : l’adresse IP de broadcast.
L’architecture du processeur du serveur n’a pas d’incidence sur le procédé. Par contre, les fichiers que fournit le serveur au Raspberry Pi doivent être compatibles avec le processeur ARM. En l’occurrence, c’est la distribution GNU/Linux Raspbian qui est utilisée.
V-B-1. Logiciels▲
Vous devez installer :
- dnsmasq ;
- nfs-server ;
- tcpdump (pour tester).
V-B-2. Fichiers▲
Créez deux répertoires :
- /tftboot ;
- /nfs/rpi.
Les répertoires sont placés à la racine, mais ce n’est pas une obligation.
Dans le répertoire /tftboot, vous allez mettre les fichiers de la partition /boot de votre carte SD. Dans le dossier /nfs/rpi, copiez les fichiers du système.
Les fichiers du système que nous utilisons proviennent d’un système initialement prévu pour une carte SD. Éditez le fichier /nfs/rpi/etc/fstab pour supprimer les lignes mentionnant mmcblk0p1 et mmcblk0p2.
V-B-3. Test de connexion entre le Raspberry Pi et le serveur▲
Si votre serveur est joignable à partir du Raspberry Pi, au démarrage de celui-ci (sans carte SD), le serveur et les autres machines du réseau recevront une requête. Vous pouvez vérifier ce comportement avec tcpdump :
sudo tcpdump -i eth0 port bootpc
Vous devrez voir une ligne similaire à :
IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from b8:27:eb...
V-B-4. Configuration de dnsmasq▲
dnsmasq intègre un serveur TFTP. Avec l’outil, vous allez pouvoir répondre à la requête de démarrage et renvoyer au Raspberry Pi les fichiers nécessaires à son démarrage : le bootloader.
Éditez le fichier de configuration /etc/dnsmasq.conf pour y ajouter les lignes suivantes :
port=0
dhcp-range=10.0.0.255,proxy
log-dhcp
enable-tftp
tftp-root=/tftpboot
pxe-service=0,"Raspberry Pi Boot"
Redémarrez dnsmasq afin de prendre en compte le changement de configuration :
sudo systemctl restart dnsmasq
Les logs sont activés grâce à log-dhcp. Vous pouvez les consulter avec :
tail -f /var/log/daemon.log
ou, si le fichier n’existe pas, à travers les journaux système :
journalctl -b --unit=dnsmasq
En démarrant le Raspberry Pi, vous allez voir les requêtes suivantes :
sept. 17 13:32:45 LW-PC dnsmasq-tftp[712]: file /tftpboot/bootsig.bin not found
sept. 17 13:32:45 LW-PC dnsmasq-tftp[712]: sent /tftpboot/bootcode.bin to 10.0.0.11
sept. 17 13:32:45 LW-PC dnsmasq-tftp[712]: file /tftpboot/9148b5b5/start.elf not found
sept. 17 13:32:45 LW-PC dnsmasq-tftp[712]: file /tftpboot/autoboot.txt not found
sept. 17 13:32:45 LW-PC dnsmasq-tftp[712]: sent /tftpboot/config.txt to 10.0.0.11
sept. 17 13:32:45 LW-PC dnsmasq-tftp[712]: file /tftpboot/recovery.elf not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: sent /tftpboot/start.elf to 10.0.0.11
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: sent /tftpboot/fixup.dat to 10.0.0.11
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/recovery.elf not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: sent /tftpboot/config.txt to 10.0.0.11
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/dt-blob.bin not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/recovery.elf not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: sent /tftpboot/config.txt to 10.0.0.11
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/bootcfg.txt not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: sent /tftpboot/cmdline.txt to 10.0.0.11
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/recovery8.img not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/recovery8-32.img not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/recovery7.img not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/recovery.img not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/kernel8.img not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/kernel8-32.img not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/armstub8.bin not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: error 0 Early terminate received from 10.0.0.11
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: failed sending /tftpboot/kernel7.img to 10.0.0.11
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/armstub8-32.bin not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/armstub7.bin not found
sept. 17 13:32:51 LW-PC dnsmasq-tftp[712]: file /tftpboot/armstub.bin not found
sept. 17 13:32:55 LW-PC dnsmasq-tftp[712]: sent /tftpboot/kernel7.img to 10.0.0.11
sept. 17 13:32:55 LW-PC dnsmasq-tftp[712]: sent /tftpboot/bcm2710-rpi-3-b.dtb to 10.0.0.11
sept. 17 13:32:55 LW-PC dnsmasq-tftp[712]: sent /tftpboot/config.txt to 10.0.0.11
sept. 17 13:32:55 LW-PC dnsmasq-tftp[712]: sent /tftpboot/overlays/vc4-kms-v3d.dtbo to 10.0.0.11
Indiquant que les fichiers demandés du bootloader sont bien envoyés.
Certains fichiers sont marqués comme introuvables (« not found »). Ne vous inquiétiez pas : le Raspberry Pi recherche une liste de fichiers, dont certains ne sont pas présents. Dès qu’il en trouve un convenable (par exemple kernel7.img) il pourra démarrer.
V-B-5. Configuration du serveur NFS▲
Afin de rendre public le dossier partagé par le serveur NFS, ajoutez la ligne suivante au fichier /etc/exports :
/nfs/rpi *(rw,sync,no_subtree_check,no_root_squash)
Pour prendre en compte le changement, utilisez la commande suivante :
exportfs -axv
V-B-6. Finalisation▲
Pour finir, vous devez modifier le fichier /tftpboot/cmdline.txt afin indiquer au bootloader que le système à charger est sur un serveur NFS. Remplacez à partir de root= avec ce qui suit :
root=/dev/nfs nfsroot=10.0.0.100:/nfs/rpi,tcp,vers=3 rw ip=dhcp rootwait elevator=deadline
Le système est prêt.
VI. Remerciements▲
Cet article n’aurait pas pu voir le jour sans le support de la Raspberry Pi Foundation. En effet, la fondation m’a envoyé un exemplaire du Raspberry Pi 3 : modèle B afin de permettre l’écriture de ce document. |
Merci aussi aux relecteurs : Franck Talbart, zoom61, Philippe Dpt35, ainsi qu’au relecteur orthographique : Malick SECK.