Quantcast
Channel: Configuration Archives - Framboise 314, le Raspberry Pi à la sauce française....
Viewing all articles
Browse latest Browse all 176

Bootez votre Raspberry Pi 3 sur une clé USB

$
0
0

boot_USB_250pxOn attendait cette possibilité depuis la sortie du Raspberry Pi. Coincés par ce démarrage sur la carte SD imposé par les précédents SoC, on attendait l’arrivée de cette nouvelle.
Eh bien ça y est il est possible de booter sur une clé USB avec le Raspberry Pi 3 ! Bon, ça nécessite quelques manipulations mais après… ça fonctionne.

Booter le Raspberry Pi 3 sur sur un périphérique de stockage USB

Comment démarre le SoC

En fait ce qui nous intéresse ici, ce sont les toutes premières secondes de ce démarrage. Juste après que vous ayez branché la prise micro-usb d’alimentation, ou appuyé sur le bouton reset fraîchement installé sur votre Raspberry Pi. Dans un premier temps, le signal RUN s’établit, le SOC se réveille. Le SOC c’est le System On a Chip (Système Sur une Puce) de Broadcom. Ce SOC BCM2837 contient un processeur ARM cadencé à 1,2 GHz, un GPU VideoCore IV, de la mémoire cache et d’autres babioles qui accompagnent généralement les microprocesseurs (GPIO, timers, BUS divers et variés – I2C – SPI, contrôleur d’interruption – PIC, contrôleur de mémoire -MMU, UART…).

etape_01

A 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 (celui qui équipe le Raspberry Pi 3) que lorsqu’il démarre, il va déjà voir s’il y a une carte SD opérationnelle. Si ce n’est pas le cas, il peut baguenauder et essayer de démarrer sur l’USB le SPI ou l’Ethernet…

boot_USB_01

Un Raspberry Pi 3 équipé d’une carte HiFiberry DAC + remarquez à droite de limage la carte SD posée sur le socle et pourtant… ça fonctionne !

Donc ce que je vous propose de faire c’est de commencer cette modif, prévoyez un peu de temps quand même…
Ce tutoriel est paru sur le blog raspberrypi.org, en voici une traduction.

 

Attention !
Ce tutoriel  EXPÉRIMENTAL est accessible aux débutants. Cependant vérifiez qu’il n’y a pas de messages d’erreur ni d’avertissements. Ce tutoriel ne fonctionne qu’avec certains modèles de clés USB si votre modèle de clé ne permet pas de booter le Raspberry Pi 3, inutile de m’incendier 🙂

Mise à jour du firmware

Commencez par une mise à jour du systéme

sudo apt-get update
sudo apt-get upgrade

Ensuite on met à jour le firmware dans /boot (start.elf et bootcode.bin) mais avec 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 0 0:02:06 0:02:06 --:--:-- 468k
*** Updating firmware
*** Updating kernel modules
*** depmod 4.4.15-v7+
*** depmod 4.4.15+
*** Updating VideoCore libraries
*** Using HardFP libraries
*** Updating SDK
*** Running ldconfig
*** Storing current firmware revision
*** Deleting downloaded files
*** Syncing changes to disk
*** If no errors appeared, your firmware was successfully updated to 47d64831ccbc99080f98c1bc8948717c3416cb0f
*** A reboot is needed to activate the new firmware

 Autorisation du boot USB

On va modifier le fichier config.txt pour autoriser le boot USB :

echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt

Ceci ajoute program_usb_boot_mode=1 à la fin du fichier /boot/config.txt.

On peut maintenant redémarrer le Raspberry Pi et vérifier que le registre 17 de l’OTP a bien été modifié

sudo reboot

et pour vérifier le registre :

pi@raspberrypi:~ $ vcgencmd otp_dump | grep 17:
17:3020000a
pi@raspberrypi:~ $

Vérifiez bien que la valeur du registre 17 est    3020000a   ! (0x3020000a pour ceux qui parlent couramment en hexadécimal 😀 ).

Si vous le souhaitez vous pouvez effacer la ligne program_usb_boot_mode du fichier config.txt (attention de ne pas laisser de ligne blanche à la fin du fichier !) de façon à ce que si vous employez votre carte micro SD sur un autre Raspberry Pi, elle ne programme pas le mode de boot sur USB 😉 Vous pouvez faire la modif avec sudo nano /boot/config.txt, par exemple.

Les clés qui fonctionnent à coup sûr

Les tests ont pour le moment été réalisés avec

  • Sandisk Cruzer Fit 16Go
  • Sandisk Cruzer Blade 16Go
  • Sandisk Cruzer Blade 32Go (merci Michel)
  • Samsung 32Go USB 3.0 drive
  • MeCo 16Go USB 3.0
  • Sandisk Cruise Slice16 Go => celle que j’ai utilisé
  • Disque dur WD Pi Drive 314Go

boot_USB_05

Préparation d’une clé USB déjà partitionnée

Attention !
La clé va être effacée et toutes les données qu’elle contient seront perdue à tout jamais !

Commencez par insérer la clé USB dans un des ports USB du Raspberry Pi. Plutôt que de télécharger à nouveau l’image Raspbian, nous allons copier le système existant sur la carte micro SD du Raspberry Pi. La source (carte SD) sera /dev/mmcblk0 et la destination (clé USB) devrait être /dev/sda en supposant que vous n’ayez pas d’autres périphériques USB connectés.

boot_USB_07

On commence par utiliser parted pour créer une partition FAT32 de 100Mo, suivie d’une partition Linux ext4 qui occupera le reste de la place disponible.

La clé que j’ai utilisé contenait déjà une partition. Si votre clé n’a pas de partition, passez à l’étape suivante.

pi@raspberrypi:~ $ sudo parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mktable msdos
Warning: Partition(s) on /dev/sda are being used.
Ignore/Cancel? i
Warning: The existing disk label on /dev/sda will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? y
Error: Partition(s) 1 on /dev/sda have been written, but we have been unable to
inform the kernel of the change, probably because it/they are in use. As a
result, the old partition(s) will remain in use. You should reboot now before
making further changes.
Ignore/Cancel?

Sortez par CTRL + C et rebootez le Raspberry Pictrl c et reboot

Préparation d’une clé USB non partitionnée

On commence par utiliser parted pour créer une partition FAT32 de 100Mo, suivie d’une partition Linux ext4 qui occupera le reste de la place disponible.

pi@raspberrypi:~ $ sudo parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mktable msdos
Warning: The existing disk label on /dev/sda will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? y
(parted) mkpart primary fat32 0% 100M
(parted) mkpart primary ext4 100M 100%
(parted) print
Model: SanDisk Cruzer Slice (scsi)
Disk /dev/sda: 16,0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags
1 1049kB 99,6MB 98,6MB primary fat32 lba
2 99,6MB 16,0GB 15,9GB primary ext4 lba

(parted) quit
Information: You may need to update /etc/fstab.

Nous allons maintenant formater les partitions et créer les systèmes de fichiers boot et root (ça peut prendre un certain temps selon la taille de la clé USB)

pi@raspberrypi:~ $ sudo mkfs.vfat -n BOOT -F 32 /dev/sda1
mkfs.fat 3.0.27 (2014-11-12)
pi@raspberrypi:~ $ sudo mkfs.ext4 /dev/sda2
mke2fs 1.42.12 (29-Aug-2014)
En train de créer un système de fichiers avec 3884032 4k blocs et 971040 i-noeuds.
UUID de système de fichiers=545cd535-8405-42eb-aafe-e92300be1f10
Superblocs de secours stockés sur les blocs :
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocation des tables de groupe : complété
Écriture des tables d'i-noeuds : complété
Création du journal (32768 blocs) : complété
Écriture des superblocs et de l'information de comptabilité du système de
fichiers : complété

Transfert du système Raspbian sur la clé USB

On va monter les systèmes de fichiers nouvellement créés et installer rsync

pi@raspberrypi:~ $ sudo mkdir /mnt/target
pi@raspberrypi:~ $ sudo mount /dev/sda2 /mnt/target/
pi@raspberrypi:~ $ sudo mkdir /mnt/target/boot
pi@raspberrypi:~ $ sudo mount /dev/sda1 /mnt/target/boot/
pi@raspberrypi:~ $ sudo apt-get update; sudo apt-get install rsync
Atteint http://archive.raspberrypi.org jessie InRelease
.../...
Ign http://mirrordirector.raspbian.org jessie/rpi Translation-en
Lecture des listes de paquets... Fait
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
rsync est déjà la plus récente version disponible.
rsync passé en « installé manuellement ».
0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.

Maintenant que les systèmes de fichiers de la clé USB sont montés, on peut copier le boot et le root file system (rfs) dessus… Comptez une demi heure voire plus selon la taille du système ! Vous pouvez aller boire un café, une bière ou une boisson au cola selon votre préférence. Quoi ? De l’eau ? Non, Monsieur chez moi l’eau ne sert qu’à laver les patates 😉

sudo rsync -ax --progress / /boot /mnt/target

boot_USB_06

Régénérer les clés SSH

pi@raspberrypi:~ $ cd /mnt/target
pi@raspberrypi:/mnt/target $ sudo mount --bind /dev dev
pi@raspberrypi:/mnt/target $ sudo mount --bind /sys sys
pi@raspberrypi:/mnt/target $ sudo mount --bind /proc proc
pi@raspberrypi:/mnt/target $ sudo chroot /mnt/target
root@raspberrypi:/# rm /etc/ssh/ssh_host*
root@raspberrypi:/# dpkg-reconfigure openssh-server
Creating SSH2 RSA key; this may take some time ...
2048 7a:f7:33:4c:01:71:a3:fc:c1:2c:b4:9c:3c:3f:4b:19 /etc/ssh/ssh_host_rsa_key.pub (RSA)
Creating SSH2 DSA key; this may take some time ...
1024 28:c6:4b:d1:5e:d9:cb:8c:ca:ad:70:fe:87:08:a1:21 /etc/ssh/ssh_host_dsa_key.pub (DSA)
Creating SSH2 ECDSA key; this may take some time ...
256 f7:f1:9e:3f:6b:13:41:d2:d9:ee:a1:00:e2:ef:ed:db /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)
Creating SSH2 ED25519 key; this may take some time ...
256 fc:98:8c:c3:52:45:95:c1:67:78:41:0c:00:c6:23:f0 /etc/ssh/ssh_host_ed25519_key.pub (ED25519)
[ ok ] Restarting OpenBSD Secure Shell server: sshd.
root@raspberrypi:/# exit
exit
pi@raspberrypi:/mnt/target $ sudo umount dev
pi@raspberrypi:/mnt/target $ sudo umount sys
pi@raspberrypi:/mnt/target $ sudo umount proc

Modifier cmdline.txt

Il faut maintenant modifier cmdline.txt pour que la clé USB soit le root file system (RFS) à la place de la carte SD :

pi@raspberrypi:/mnt/target $ sudo sed -i "s,root=/dev/mmcblk0p2,root=/dev/sda2," /mnt/target/boot/cmdline.txt

/!\ il n’y a qu’une ligne de code et /mnt/target/boot/cmdline.txt est en un seul bloc

Modifier fstab

pi@raspberrypi:/mnt/target $ sudo sed -i "s,/dev/mmcblk0p,/dev/sda," /mnt/target/etc/fstab

/!\ il n’y a qu’une ligne de code et /mnt/target/etc/fstab est en un seul bloc

Démonter le système de fichier de la clé USB

pi@raspberrypi:/mnt/target $ cd ~
pi@raspberrypi:~ $ sudo umount /mnt/target/boot
pi@raspberrypi:~ $ sudo umount /mnt/target

Arrêter le Raspberry Pi 3

pi@raspberrypi:~ $ sudo poweroff

Maintenant vous pouvez débrancher la prise micro USB d’alimentation et enlever la carte SD

boot_USB_04

Attendez 2,87 secondes (nan c’est une connerie 😉 )

Redémarrer le Raspberry Pi 3

et… reconnectez l’alim… suspens 🙂

ecran_boot

Bon bin chez moi après ce bel écran coloré, ça boote 😀

Raspbian démarre et j’arrive sur le bureau en mode graphique. J’avais installé x11vnc, depuis mon PC je me reconnecte… Ma foi tout ça fonctionne !

Allez une petite verification :

pi@raspberrypi:~ $ df -h
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/root 15G 4,0G 9,8G 29% /
devtmpfs 459M 0 459M 0% /dev
tmpfs 463M 0 463M 0% /dev/shm
tmpfs 463M 6,4M 457M 2% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 463M 0 463M 0% /sys/fs/cgroup
/dev/sda1 93M 20M 73M 22% /boot
tmpfs 93M 0 93M 0% /run/user/1000

et aussi

fdisk -l

/dev/sda1 2048 194559 192512 94M c W95 FAT32 (LBA)
/dev/sda2 194560 31266815 31072256 14,8G 83 Linux

Et avec Ubuntu Mate ?

Là je n’ai pas testé personnellement, c’est Michel qui s’y est collé… Volà ce qu’il en dit :

« Pour Ubuntu Mate 16.10.1 je n’ai rien touché du tout. Ma carte SD était bien chargée d’applications et il a fallu une bonne heure pour faire le transfert de la carte SD vers la clé USB.

Le 1er démarrage un peu long…….20 secondes environ et ensuite un peu plus court.

Aucun fichier n’a été modifié, j’ai uniquement suivi le tuto à la lettre près. »

Si comme Michel vous avez testé d’autres distributions que Raspbian ou d’autres clés n’hésitez pas à ajouter les infos dans les commentaires, je les reprendrai en fin d’article 🙂

Conclusion

Depuis le temps qu’on attendait cette possibilité, elle est enfin disponible. Le Raspberry Pi boote sur autre chose que la carte micro SD !

Certes ceci est encore expérimental mais fonctionne bien. Il faudra tester le boot sur un disque dur classique et sur un SSD mais c’est déjà très encourageant.

boot_USB_02

Le boot Ethernet fonctionne, j’espère le tester bientôt. C’est un peu plus compliqué à mettre en oeuvre et il reste des points à améliorer sur ce démarrage mais c’est déjà fonctionnel 🙂

Sources

Pi 3 booting part I: USB mass storage boot beta

 

Pi 3 booting part II: Ethernet

 

 


Viewing all articles
Browse latest Browse all 176

Trending Articles