Démarrer sur un disque externe
Introduction
Le chapitre précédent (Utiliser une mémoire de masse externe) montre comment utiliser une mémoire de masse externe pour stocker des données. Cette mémoire peut être une clé USB ou un disque dur USB. Le disque dur externe, connecté en USB, présente l’avantage d’une vitesse de transfert élevée et d’un faible coût au Go.
Pour le démarrage du Raspberry Pi, la carte micro SD est incontournable. C’est dans la première partition de cette carte, formatée en FAT que le SoC vient obligatoirement charger les premiers fichiers de sa séquence de démarrage.
Avec le Raspberry Pi 3 et le SoC BCM2837, il devient possible de booter non plus sur la carte micro SD mais directement sur la clé USB ou le disque dur connecté au Raspberry Pi 3. Cette fonctionnalité est disponible à titre expérimental (août 2016). Elle est décrite dans ce chapitre à titre d’information.
Il faudra impérativement prévoir une alimentation externe pour le disque dur si vous rencontrez des problèmes lors de la connexion du disque dur sur le Raspberry Pi. Certains disques durs (de moins en moins nombreux) sont livrés avec un bloc d’alimentation secteur. D’autres disques durs disposent de deux prises USB, l’une réservée uniquement à...
Séquence de boot du Raspberry Pi
Dans la partition FAT présente sur la carte micro SD se trouvent les fichiers :
-
bootcode.bin : le second étage du bootloader.
-
start.elf : le firmware du GPU fourni en binaire.
-
kernel.img : le noyau de l’OS, celui de Linux avec Raspberry Pi OS.
-
cmdline.txt : le fichier contenant les paramètres passés au noyau lors du boot.
-
config.txt : fichier optionnel, lu par le GPU avant l’initialisation du CPU ARM. Il contient des informations sur la répartition de la RAM, le surcadencement, le mode vidéo à utiliser…
Le GPU transfère tout d’abord en mémoire bootcode.bin, qu’il exécute. bootcode.bin charge start.elf, le firmware du GPU, dans la SDRAM. start.elf effectue le partage de la mémoire entre le CPU et le GPU, puis charge le noyau Linux kernel.img dans la mémoire réservée au CPU.
Pour les Raspberry Pi de génération 4 et 5, le fichier bootcode.bin n’est plus chargé depuis la carte micro SD, mais depuis une mémoire flash embarquée sur la carte.
Le schéma ci-dessous montre le fonctionnement du Raspberry Pi lorsque le système de fichiers racine n’est pas situé sur la carte micro SD, mais sur un disque dur externe.
kernel.img va rechercher le système de fichiers racine (RFS = Root file System) en fonction du paramètre...
Préparation du disque
Le disque dur choisi pour le démarrage du Raspberry Pi est un disque dur USB 3.0 de marque Verbatim et de 1 To de capacité. Il fonctionnera en USB 2.0 sur le Raspberry Pi.
Lors de l’achat du disque, il existe une seule partition exFAT de 1 To.
La préparation du disque va consister à supprimer cette partition et à recréer une ou plusieurs partitions pour l’utilisation du disque avec le Raspberry Pi.
Si le disque doit être utilisé alternativement sur un PC sous Windows et sur le Raspberry Pi, par exemple pour lire sur le Raspberry Pi des vidéos provenant du PC, il faut prévoir deux partitions. Une partition Linux pour accueillir le système de fichiers racine et une partition FAT pour stocker les vidéos.
1. Suppression de la partition d’origine
Le disque dur a été utilisé préalablement sur une machine tournant sous Windows. Il est doté d’une seule partition de la taille du disque.
a. Identification de la partition à supprimer
Le gestionnaire des disques de Windows identifie le disque comme Disque 2, avec une partition principale de 931 Go formaté en exFAT.
Branchez le disque dur sur le hub USB relié au Raspberry Pi.
Le disque démarre et est reconnu par le système, ce qui peut se vérifier avec la commande dmesg (Display Message = afficher les messages) qui affiche à l’écran les messages envoyés par le noyau Linux.
Utilisez la commande dmesg pour visualiser les messages du noyau.
[ 1336.537049] usb 1-1.3.2: Product: Portable USB 3.0 Drive
[ 1336.537063] usb 1-1.3.2: Manufacturer: Verbatim
[ 1336.537075] usb 1-1.3.2: SerialNumber: 21302B120345
[ 1336.543037] scsi0 : usb-storage 1-1.3.2:1.0
[ 1340.639583] scsi 0:0:0:0: Direct-Access TOSHIBA
MQ01ABD100 AX00 PQ: 0 ANSI: 2
[ 1340.645009] sd 0:0:0:0: [sda] 1953525164 512-byte logical
blocks: (1.00 TB/931 GiB)
[ 1340.646124] sd 0:0:0:0: [sda] Write Protect is off
[ 1340.646161] sd 0:0:0:0: [sda] Mode Sense: 00 06 00 00
[ 1340.647250] sd 0:0:0:0: [sda] No Caching mode page present
[ 1340.647284] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 1340.656251] sd 0:0:0:0: [sda] No Caching mode page...
Copie du système de fichiers
Le disque est prêt à recevoir le système de fichiers racine. L’utilisation de la commande cp, si elle est envisageable pour copier le contenu de la carte micro SD vers le disque dur, expose à des désillusions à cause des droits qui existent sur les fichiers et répertoires. Plus radicale, la commande dd effectue une copie secteur par secteur, sans tenir compte du contenu des secteurs en cours de copie.
Attention : la commande dd est dangereuse si elle est mal utilisée. Si les sources et destinations if et of sont erronées, il y a risque de destruction irréversible des données.
Lancez la copie de la partition mmcblk0p2 de la carte micro SD vers la partition sda1 du disque dur avec la commande dd : sudo dd if=/dev/mmcblk0p2 of=/dev/sda1 bs=32M.
pi@raspberrypi ~ $ sudo dd if=/dev/mmcblk0p2 of=/dev/sda1 bs=32M
117+1 enregistrements lus
117+1 enregistrements écrits
3945791488 octets (3,9 GB) copiés, 253,2 s, 15,6 MB/s
Au bout de quelques minutes, le contenu du système de fichiers racine est copié sur le disque dur.
Il est maintenant possible de monter la partition sda1 dans le système.
Créez un répertoire /mnt/diskusb.
Montez la partition 1 du disque dur dans ce répertoire.
pi@raspberrypi /mnt $ sudo mkdir diskusb
pi@raspberrypi /mnt $ sudo mount...
Modification des fichiers de démarrage
Le système de fichiers racine est prêt. Pour que le système soit informé des changements à réaliser lors du démarrage, les fichiers de démarrage doivent également être modifiés.
1. cmdline.txt
Le fichier cmdline.txt contient les paramètres passés au noyau lors de son démarrage. Il contient en particulier le chemin d’accès au système de fichiers racine, qui est par défaut /dev/mmcblk0p2.
Réalisez tout d’abord une sauvegarde de cmdline.txt. Vous pourrez toujours revenir en arrière en cas de problème.
sudo cp cmdline.txt cmdline.org
Ouvrez le fichier /boot/cmdline.txt avec nano et remplacez root=/dev/mmcblk0p2 par root=/dev/sda1 dans la ligne de commande.
Vérifiez soigneusement la modification et enregistrez le fichier modifié.
2. fstab
Lors du démarrage, le fichier fstab indique au système les partitions qu’il doit monter, et sur quel point de montage il doit le faire.
Le fstab qui nous intéresse ici est celui qui sera sollicité lors du démarrage sur le disque dur. Le fstab situé sur la carte micro SD n’aura plus d’utilité à ce moment. C’est le fstab situé sur le disque dur qu’il faut modifier.
Réalisez tout d’abord une sauvegarde...
Vérification du fonctionnement
Redémarrez le Raspberry Pi. Si toutes les modifications ont bien été réalisées, le démarrage du Raspberry se fera sur la carte micro SD pour les premières étapes, puis le système de fichiers racine situé sur le disque dur sera monté à la racine.
Vérifiez avec la commande df que le système de fichiers situé sur le disque dur est bien en service.
login as: pi
pi@10.25.100.15's password:
Linux raspberrypi 3.6.11+ #474 PREEMPT Thu Jun 13 17:14:42 BST 2013 armv6l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in
the individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Aug 13 13:36:13 2013
pi@raspberrypi ~ $ df
Sys. fich. 1K-blocks Util. Disponible Uti% Monté sur
rootfs 309637120 1568180 295471248 1% /
/dev/root 309637120 1568180 295471248 1% /
devtmpfs 183620 0 183620 0%...
Pour aller plus loin
Le disque dur dispose d’une deuxième partition formatée en FAT.
Montez manuellement la deuxième partition dans un dossier /data.
Modifiez /etc/fstab pour que la partition sda2 soit montée automatiquement au démarrage du système.
Vous trouverez la solution de ces deux exercices dans les annexes.
Démarrer sur une clé USB sans carte micro SD
Comme précisé dans l’introduction de ce chapitre, au moment de l’écriture de ces lignes cette possibilité offerte par le SoC BCM2837 est encore expérimentale. Elle fonctionne avec Raspberry Pi OS et uniquement avec certaines clés USB et disques durs (classiques ou SSD).
1. Principe
À la mise sous tension, seul le GPU est activé. Le processeur ARM reste en veille, la SDRAM est désactivée. Le SoC comporte une ROM (Read Only Memory - Mémoire Morte) dans laquelle le fabricant a programmé le premier étage du bootloader. Lors de son réveil, le GPU est paramétré pour exécuter le programme qui est dans cette ROM. C’est ce qu’il fait et le firmware contenu en ROM a pour seul objectif d’accéder à la carte micro SD, qui doit être formatée en FAT (enfin, au moins la première partition)… sauf si on a modifié un registre de l’OTP (One Time Programmable memory) qui dit au BCM2837 que lorsqu’il démarre, il teste s’il y a une carte SD opérationnelle. Si ce n’est pas le cas, il peut essayer de démarrer sur l’USB le SPI ou l’Ethernet…
Sur la photo ci-dessus le Raspberry Pi équipé d’une carte HiFiBerry fonctionne normalement. Il a démarré directement sur la clé USB, sans intervention de la carte micro SD.
2. Mise à jour du système d’exploitation
Commencez par mettre Raspberry Pi OS à jour.
sudo apt-get update
sudo apt-get upgrade
Ensuite le firmware (start.elf et bootcode.bin) dans /boot doit être remplacé par la version de la branche NEXT (expérimentale) : sudo BRANCH=next rpi-update :
pi@raspberrypi:~ $ sudo BRANCH=next rpi-update
*** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
*** Performing self-update
*** Relaunching after update
*** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
*** Downloading specific firmware revision (this will take a few minutes)
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 168 0 168 0 0 294 0 --:--:-- --:--:-- --:--:-- 294
100 51.1M 100 51.1M 0 0 413k...
Conclusion
Le Raspberry Pi démarre maintenant sur disque dur ou sur clé USB. La carte micro SD n’est plus sollicitée que pour les premières étapes du boot dans le premier cas et peut être enlevée dans le deuxième cas. Elle ne subit plus l’usure due aux fréquentes écritures réalisées par Linux lors de son fonctionnement.
Le temps de démarrage n’est pas fondamentalement modifié. Mais la capacité disponible a été largement augmentée, ce qui peut être très utile pour certaines applications.
La carte micro SD utilisée dans ce chapitre pour le démarrage sur disque dur ne peut plus être utilisée seule. Marquez-la soigneusement pour qu’elle reste associée au disque dur. Il suffira de changer la carte pour tester d’autres distributions, le disque dur restant disponible pour stocker des données.
Par contre, la carte micro SD utilisée au début du chapitre pour transférer Raspberry Pi OS sur une clé USB peut toujours être utilisée seule, car le système a simplement été cloné et la carte micro SD n’a pas été modifiée.