Installer Raspberry Pi OS sur Raspberry Pi sans clavier, ni souris, ni écran
Cet article montre comment configurer un Raspberry de A à Z à l’aide d’un ordinateur standard. Le Raspberry sera donc en mode headless, c’est-à-dire sans clavier, ni souris, ni écran.
N.B. L’article original, écrit en août 2017, s’intitulait “Installer Raspian Stretch sur Raspberry Pi” et était accessible à cette URL : https://ouilogique.com/installer-raspian-stretch/ qui est maintenant redirigée vers l’URL actuelle.
Matériel utilisé pour cette procédure
- Un Raspberry Pi modèle 2 (ou plus)
- Une carte SD (32 Go recommandés)
- Un ordinateur standard
- Un routeur (optionnel, on peut connecter le RPi directement sur le port Ethernet)
- Un câble Ethernet
Préparation (~15 min)
N.B. Ce chapitre a été mis à jour en mars 2023
Choix de l’OS
Anciennement, l’OS du Raspberry s’appelait Raspbian ce qui était logique puisqu’il est basé sur Debian. On devait le télécharger séparément et l’installer avec un programme qui s’appelait Etcher.
Aujourd’hui, les choses sont un peu différentes. Etcher a été remplacé par Raspberry Pi Imager et on a plus besoin de télécharger l’OS séparément, car c’est le programme qui s’en charge. Il peut être téléchargé ici :
On a le choix entre plusieurs moutures de l’OS. Celle que je préfère est la version “Raspberry Pi OS (64-bit)”. La raison est que j’ai besoin d’un OS 64 bit pour faire tourner Prince (https://www.princexml.com/). En cas de doute, il vaut mieux choisir l’OS recommandé, c’est-à-dire “Raspberry Pi OS (32-bit)”.
Choix du terminal
Si vous êtes sur macOS ou n’importe quel système *nix, le choix est vite fait, il suffit d’utiliser le terminal par défaut. Ça ne veut pas dire qu’il n’y a qu’une possibilité, mais qu’il y a de fortes chances que vous sachiez déjà quel terminal choisir.
Par contre si vous êtes sur Windows, il y a de fortes chances que vous ne sachiez pas quel terminal choisir. Donc voici quelques possibilités.
- Windows PowerShell (intégré à Windows)
- COMMAND.COM (cmd) (intégré à Windows)
- MinGW – Git Bash installé avec Git
- Cygwin
- PuTTY
Procédure d’installation (~30 min)
- Sur un ordinateur standard (pas le Raspberry), télécharger Raspberry Pi Imager et l’installer.
- Dans Raspberry Pi Imager, cliquer sur “Système d’exploitation” et sélectionner l’OS de votre choix.
- Insérer une carte SD, cliquer sur “Choisir le stockage” et choisir la carte SD.
-
Important : Cliquer sur la roue dentée et s’assurer que l’option “Activer SSH” est activée.
Anciennement, l’activation de SSH se faisait en créant un fichier vide appelé
ssh
dans le répertoireboot
, par exemple avec la commandetouch /Volumes/boot/ssh
. Ce n’est plus nécessaire aujourd’hui. - Cliquer sur ÉCRIRE. Entrez votre mot de passe lorsque le dialogue le demande. L’écriture de l’image disque prend environ 10 min avec la vérification (si elle a été sélectionnée dans les préférences). Ces temps peuvent beaucoup varier en fonction de votre matériel.
- Éjecter la carte SD.
- Insérer la carte SD dans le Raspberry éteint.
- Connecter le câble Ethernet.
- Brancher le câble d’alimentation du Raspberry.
- Après environ 30 secondes, ouvrir un terminal et se connecter au Raspberry avec la commande
ssh pi@raspberrypi.local
. Le mot de passe par défaut estraspberry
. Si SSH renvoie l’erreurWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
,
c’est parce qu’une entrée existe déjà pourraspberrypi.local
dans le fichier~/.ssh/known_hosts
(ou sur Windows%HOMEPATH%\.ssh\known_hosts
) de l’ordinateur hôte (pas le RPi). Donc pour aller plus loin, il faut supprimer les lignes qui commencent parraspberrypi.local
dans le fichierknown_hosts
.
Retrouver un appareil sur le réseau local
Si on doit retrouver un Raspberry sur le réseau, la première commande à essayer est
ping -c1 raspberrypi.local
.
Mais si on ne connait pas le nom du Raspberry, alors il faut balayer toutes les adresses possibles (network scan).
Il y a deux commandes utiles pour cela, arp
et nmap
.
Sur la commande nmap
doit être installée via Homebrew.
Pour ceux qui préfèrent les GUI, il y a aussi Zenmap.
arp -a
nmap -sP 192.168.1.0/24
Mise à jour de Raspbian
sudo apt-get -y update # Télécharge les informations des paquets à partir des sources configurées.
sudo apt-get -y upgrade # Mets à jour les paquets installés sans en supprimer.
sudo apt-get -y dist-upgrade # Installe les versions candidates des paquets installés en installant ou en supprimant d’autres paquets si nécessaire.
sudo apt-get -y autoremove # Supprime les dépendances qui ne sont plus utilisées.
À voir aussi :
- https://www.lecoindunet.com/difference-apt-update-upgrade-full-upgrade
- https://askubuntu.com/a/527421/949794
Configuration
nano ~/.bash_profile
Copier-coller les commandes suivantes dans .bash_profile :
PS1=$'\n\n\xf0\x9f\x98\xBA'" \t – \[\033[01;32m\]\u@\h\[\033[00m\]:\W > "
alias ll='ls -lGhF'
alias la='ll -a'
alias gs='git status'
alias lsserial='python3 -m serial.tools.list_ports'
IP=$(hostname -I | awk '{print $1}')
alias pyserver='PORT=4000; echo -e "\nhttp://localhost:$PORT"; echo -e "http://$IP:$PORT\n"; /usr/bin/python3 -m http.server $PORT'
TIMEFORMAT=$'\nElapsed time: %E'
###
# Create virtual environment for python3 (once)
# cd $HOME && python3 -m venv pyenv
# and activate it (for each terminal)
##
VENVPATH="$HOME/pyenv/bin/activate"
if [[ -f "$VENVPATH" ]]; then source "$VENVPATH"; fi
# If Byobu is installed, launch it at startup.
[[ -f /usr/bin/byobu-launch ]] && _byobu_sourced=1 . /usr/bin/byobu-launch 2>/dev/null || true
source ~/.bash_profile
sudo raspi-config
# Update
# Advanced Options / Expand filesystem
SSH
Sur l’ordinateur hôte
# Si le fichier ~/.ssh/id_rsa.pub n’existe pas,
# il faut le créer avec `ssh-keygen`.
ssh-keygen # Accepter toutes les valeurs par défaut.
cat ~/.ssh/id_rsa.pub # + Copier le résultat dans le presse-papier.
Sur le RPi
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys # + Coller la clé de l’hôte à la fin du fichier.
chmod 644 ~/.ssh/authorized_keys
Permissions de fichiers courants
chmod 700 ~/.ssh
chmod 644 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/known_hosts
chmod 644 ~/.ssh/config
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/github_rsa
chmod 644 ~/.ssh/github_rsa.pub
chmod 600 ~/.ssh/mozilla_rsa
chmod 644 ~/.ssh/mozilla_rsa.pub
Sélection des interfaces utilisateurs
Par défaut, l’interface graphique est activée et elle consomme beaucoup de ressources. Donc si on ne l’utilise pas, il est conseillé de la désactiver. Malheureusement, lorsqu’elle est désactivée, les disques ne sont pas montés automatiquement lorsqu’on les connecte au RPi.
sudo raspi-config
# 1 System Options
# S5 Boot / Auto Login
# B2 Console Autologin ou B1 Console
VNC
N.B. Il faut que l’interface graphique soit activée pour que VNC fonctionne (voir § précédent).
sudo raspi-config
# 3 Interfacing Options / I3 VNC <Yes>.
# Si l’option n’est pas visible, il faut
# installer VNC au préalable avec la commande :
sudo apt-get install realvnc-vnc-server realvnc-vnc-viewer
Télécharger un client VNC pour se connecter au serveur VNC du RPi. Par exemple RealVNC :
N.B. Le client VNC installé par défaut sur macOS ne fonctionne pas pour se connecter au serveur VNC du RPi. L’erreur retournée est
Le logiciel de l’ordinateur distant semble ne pas être compatible avec cette version de Partage d’écran.
bash /System/Library/CoreServices/Applications/Screen\ Sharing.app
Enlever les programmes inutiles
Enfin, inutiles pour moi…
df -h # Pour voir la capacité de la carte SD
sudo apt-get purge wolfram-engine
sudo apt-get purge libreoffice*
sudo apt-get clean
sudo apt-get autoremove
df -h # Vous venez de libérer 1.1 Go !
Réinstaller un programme qu’on croyait inutile
sudo apt-get --assume-yes update
sudo apt-get --assume-yes install wolfram-engine
Ajouter quelques programmes utiles
Byobu
Byobu (https://www.byobu.org/) est un gestionnaire de fenêtres et un multiplexeur de terminal en mode texte sous licence GPLv3. Il a été conçu à l’origine pour apporter des améliorations élégantes au gestionnaire de fenêtres GNU Screen, par ailleurs fonctionnel, simple et pratique, pour la distribution serveur Ubuntu. Byobu comprend maintenant des profils améliorés, des raccourcis clavier pratiques, des utilitaires de configuration et des notifications d’état du système commutables pour le gestionnaire de fenêtres GNU Screen et le multiplexeur de terminal plus moderne Tmux, et fonctionne sur la plupart des distributions Linux, BSD et Mac. Le code source se trouve sur GitHub : https://github.com/dustinkirkland/byobu
Dans la terminologie de Byobu, une session est une instance de Byobu en cours d’exécution. Une session se compose d’une collection de fenêtres (windows), qui sont essentiellement des sessions shell, et de volets (panes), qui sont des sous-sections de fenêtre.
sudo apt-get install byobu --assume-yes
byobu
# Configurer les options de base en pressant sur F1
# Configurer le raccourci de “l’escape sequence”.
# Conseil: utiliser la lettre “B”.
Change escape sequence
# Configurer le démarrage automatique de Byobu.
Byobu currently does not launch at login (toggle on)
Raccourcis clavier
Les raccourcis clavier sont définis dans le fichier
f-keys.tmux
(source).
/usr/share/byobu/keybindings/f-keys.tmux
Sur macOS, la majorité des raccourcis n’est utilisable qu’à travers la touche F12
.
Donc quand l’aide indique la combinaison C-a
, il faut la remplacer par F12
.
Par exemple,
F12 %
scinde le volet actuel en deux volets verticaux.F12 |
scinde le volet actuel en deux volets horizontaux.F12 C-i
active le volet suivant.F12 C-o
décale le contenu de chaque volet.
La liste de toutes les fonctions F12
est disponible avec la commande F12 ?
.
Ci-dessous, la liste des raccourcis autres que F12
.
Key | Action |
---|---|
F1 | configuration menu |
F2 | new window |
F3 | previous window |
F4 | next window |
F5 | refresh menu bar status notifications |
F6 | detach |
F7 | — |
F8 | rename window |
F9 | configuration menu |
F10 | — |
F11 | — |
F12 | — |
ctrl-D | kill window |
À lire
- https://www.digitalocean.com/community/tutorials/how-to-install-and-use-byobu-for-terminal-management-on-ubuntu-16-04
- https://superuser.com/a/818753/508141
iPython
python3 -m pip install ipython
Tmux
N.B. Ce chapitre est ici pour référence. Je n’utilise plus Tmux directement, mais à travers Byobu.
sudo apt --assume-yes install tmux
tmux # crée et démarre un nouveau _shell_
tmux new -s session_name # idem mais avec un nom de session
tmux detach # pour se détacher du shell en cours
# ctrl-B S # liste les shells tmux
# ctrl-B D # revient au shell principal
tmux ls # liste les shells tmux
tmux a -t 0 # revient au shell tmux 0
tmux a # revient au dernier shell utilisé
exit # quitte et détruit le shell en cours
tmux kill-session -t 0 # détruit une session détachée
# Par défaut, la roulette de la souris fait défiler
# l’historique des commandes. Pour que la roulette
# fasse défiler l’écran, il faut éditer le fichier
# ~/.tmux.conf
nano ~/.tmux.conf
# et ajouter le paramètre
set-option -g mouse on
# Il ne s’appliquera qu’aux nouveaux shells et pas
# aux shells existants, mais on peut le faire dans
# chaque shell individuel avec la commande
tmux set-option -g mouse on
# En mode mouse on, il n’est possible de sélectionner
# du texte. Il faut donc revenir en mode off.
tmux set-option -g mouse off
# https://ostechnix.com/install-tmux-plugin-manager/
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# tmux source ~/.tmux.conf
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
À voir aussi :
- https://tmuxcheatsheet.com/
- Tmux has forever changed the way I write code.
- Tutorial Install And Use Tmux on MacOS
GNU screen
Je préfère ne pas utiliser GNU screen, mais parfois… on a pas le choix.
sudo apt-get --assume-yes install screen
echo "shell -$SHELL" > ~/.screenrc # Pour que screen lise .bash_profile
screen # Démarre un nouveau shell
# ctrl-A ctrl-D # revient au shell principal
screen -ls # liste des shells
screen -r xxxx # xxxx = no du shell que l’on veut activer
# ctrl-A K # arrête le shell en cours
screen -X -S xxxx quit # quitte le shell no xxxx
screen -X -S xxxx kill # arrête le shell no xxxx
# RS232
python3 -m serial.tools.list_ports
screen /dev/ttyACM0 115200
# ctrl-A K # pour arrêter la transmission série
Partager un espace disque avec samba
Source : https://raspberrypihq.com/how-to-share-a-folder-with-a-windows-computer-from-a-raspberry-pi/
Sur le Raspberry
Installer samba
sudo apt-get --assume-yes install samba samba-common-bin
Éditer la configuration
sudo nano /etc/samba/smb.conf
Vérifier la présence des informations suivantes :
workgroup = WORKGROUP
wins support = yes
À la fin du fichier, ajouter les informations suivantes :
# Source
# https://raspberrypihq.com/how-to-share-a-folder-with-a-windows-computer-from-a-raspberry-pi/
[PiShare]
comment = Raspberry Pi Share
path = /home/pi
browseable = yes
writeable = yes
only guest = no
create mask = 0777
directory mask = 0777
public = no
Le flag public = no
indique que l’accès en temps qu’invité est désactivé.
Si on le change en public = yes
, le disque est partagé en lecture seule.
sudo smbpasswd -a pi # Pour changer le mot de passe.
Monter le disque partagé sur macOS
Dans le Finder :
⌘ K
smb://pi@raspberrypi.local
Monter le disque partagé sur Windows
Voir
On peut aussi entrer le chemin d’accès au Raspberry au format UNC directement dans la barre d’adresse de l’explorateur Windows (raccourcis Win+E, Ctrl+L).
\\raspberrypi.local
Si la résolution du nom d’hôte ne fonctionne pas, on peut aussi utiliser l’adresse IP :
\\192.168.1.240
Installer une autre version de Python 3
Les informations de ce chapitre sont passablement obsolètes car les dernières versions de l’OS du RPi intègrent des versions de Python supérieures à 3.6. Donc avant d’installer une nouvelle version de Python 3, il est prudent de vérifier la version installée sur le Raspberry avec la commande
python3 --version
On peut aussi vérifier la version de l’OS avec la commande
cat /etc/os-release
Édit du 16 octobre 2019 : Raspbian Buster intègre la version 3.7.3 de Python.
Édit du 11 février 2023 : Raspberry Pi OS Bullseye 64 bit intègre la version 3.9.2 de Python.
Raspbian Stretch propose la version 3.5 de Python.
Comme Python 3.6 apporte de nouvelles fonctionnalités comme les f-strings et que le module asyncio
a été amélioré, je pense que c’est intéressant de l’installer aussi.
L’idée est aussi de pouvoir tester le module quart.
Source : https://liftcodeplay.com/2017/06/30/how-to-install-python-3-6-on-raspbian-linux-for-raspberry-pi/ Les versions de Python disponibles sont téléchargeables à : https://www.python.org/ftp/python/ Temps d’installation : environ 30 min. Cette procédure n’écrase pas les versions de Python existantes.
Cette procédure montre comment installer Python 3.6.7.
J’ai aussi essayé d’installer la version 3.7.1 et l’installation a réussi, mais malheureusement
pip
ne fonctionnait pas, donc il m’était impossible d’installer de nouveaux modules.
sudo apt-get --assume-yes install build-essential checkinstall
sudo apt-get --assume-yes install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
mkdir ~/temp && cd ~/temp
wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz
sudo tar xzf Python-3.6.7.tgz
cd Python-3.6.7
sudo -s
TIMEFORMAT='time : %E'
time (bash configure && make -j4 altinstall)
exit
cd ~ && sudo rm -rf temp
Créer un lien pour que Python 3.6 soit la version de Python 3 par défaut.
Ceci nous permettra d’indiquer le shebang #!/usr/bin/env python3
au début des scripts et de les exécuter avec la commande python3 <nom_du_script.py>
.
which python3.6 # /usr/local/bin/python3.6
python3.6 -V # Python 3.6.7
sudo ln -sf /usr/local/bin/python3.6 /usr/local/bin/python3
/usr/bin/env python3 -V # Python 3.6.7
which python3 # /usr/local/bin/python3
Pour installer des modules
Si
pip install <module>
ne fonctionne pas, on peut utiliser les commandes suivantes :
sudo python3.6 -m pip install --upgrade pip
sudo python3.6 -m pip install quart
picocom
Picocom est un terminal série.
sudo apt-get --assume-yes install picocom
picocom -b 115200 -p 1 -c /dev/tty
Pour pouvoir l’utiliser sans être sudoer, il faut que l’utilisateur courant fasse partie du groupe dialout (et peut-être des groupes plugdev et input, je ne suis plus sûr). Il faut redémarrer le RPi pour que le changement soit pris en compte.
sudo usermod -a -G dialout $USER
sudo usermod -a -G plugdev $USER
sudo usermod -a -G input $USER
sudo reboot
torsocks
Torsocks permet d’utiliser le réseau Tor en ligne de commande, autrement dit, il permet de “torifier” la ligne de commande.
sudo apt-get install torsocks --assume-yes
ANS=$(torsocks wget -qO- https://check.torproject.org/api/ip)
echo $ANS
# {"IsTor":true,"IP":"××.××.××.××"}
YouTube-DL
python3 -m pip install --force-reinstall https://github.com/yt-dlp/yt-dlp/archive/master.tar.gz
Arrêter ou redémarrer un Raspberry
Ce n’est pas une bonne idée de juste tirer la prise quand on veut arrêter ou redémarrer son Raspberry. En effet, au bout de quelque temps, le système se retrouve avec un grand nombre de fichiers partiels et probablement illisibles. Si des fichiers importants sont touchés, le Raspberry peut devenir inutilisable.
Donc pour éteindre un Raspberry, on utilisera une des commandes ci-dessous.
La différence entre elles n’est pas aussi évidente qu’il y parait (voir https://unix.stackexchange.com/a/196471/199660).
Seule la commande halt
éteint la LED rouge d’alimentation, donc je suppose que c’est celle qu’il faut privilégier.
N.B. Attention, aucune de ces commandes ne coupe l’alimentation de la carte ou l’alimentation des ports USB. Donc ce n’est pas une bonne option pour éjecter un disque externe par exemple.
sudo halt
sudo poweroff
sudo shutdown -h now --poweroff
Et pour redémarrer un Raspberry, on utilisera une des commandes suivantes
sudo reboot
sudo shutdown -r now
Lire un disque externe
Lorsqu’on connecte un disque externe, il est automatiquement accessible au chemin /media/pi/nom_du_disque
.
Ce chemin est aussi appelé point de montage.
On peut le voir avec la commande ls
et accéder aux répertoires avec la commande cd
.
Dans l’exemple ci-dessous, le disque externe s’appelle LaCie
.
Ce nom changera avec d’autres fabricants ou si plusieurs disques du même fabricant sont utilisés en même temps.
Il faut tenir compte de ce fait lorsqu’on écrit des scripts et des programmes qui utilisent le chemin du point de montage.
ls -l /media/pi/
cd /media/pi/LaCie
Éjecter un disque externe
N.B. À proprement parler, seuls les médias comme les CD ou les bandes peuvent être éjectés. Mais le terme est aussi utilisé pour les autres médias.
Éjecter un média est un peu plus compliqué que de le connecter et l’utiliser. En effet, sur un Raspbery ou n’importe quel système *nix, il faut comprendre trois notions :
- Les disques
- Les partitions
- Les points de montage
Pour explorer ces concepts, utilisons la commande lsblk
.
lsblk --output NAME,PATH,RM,RO,ROTA,TYPE,SIZE,FSAVAIL,MOUNTPOINT
NAME PATH RM RO ROTA TYPE SIZE FSAVAIL MOUNTPOINT
sda /dev/sda 0 0 1 disk 4.5T
├─sda1 /dev/sda1 0 0 1 part 200M
└─sda2 /dev/sda2 0 0 1 part 4.5T 1T /media/pi/LaCie
mmcblk0 /dev/mmcblk0 0 0 0 disk 29.7G
├─mmcblk0p1 /dev/mmcblk0p1 0 0 0 part 256M 201.8M /boot
└─mmcblk0p2 /dev/mmcblk0p2 0 0 0 part 29.5G 24G /
Les résultats affichés par la commande lsblk
ci-dessus montrent deux disques appelés sda
et mmcblk0
.
Ils ont chacun deux partitions sda1
, sda2
, mmcblk0p1
et mmcblk0p2
.
Et ils ont chacun un ou deux points de montage /media/pi/LaCie
, /boot
et /
.
On peut différencier les disques des partitions dans le dessin de la structure hiérarchique de la première colonne NAME et aussi dans la colonne TYPE.
L’éjection du disque se passe en deux étapes :
- Démonter ses points de montage.
Dans le cas présenté, il n’en a qu’un qui est monté à
/media/pi/LaCie
, mais dont la référence se trouve à/dev/sda2
. - Couper l’alimentation du disque.
La référence du disque lui-même se trouve à
/dev/sda
.
N.B. Il faut s’assurer que le disque n’est plus utilisé, sinon le système refusera de le démonter avec l’erreur
target is busy
. C’est à ça que sert le changement de répertoire ci-dessous.
cd
udisksctl unmount --block-device /dev/sda2
sudo udisksctl power-off --block-device /dev/sda
Pour aller plus loin
- What you need to know about disks and disk partitions in Linux.
- What is NVMe SSD technology?
- What Is an MMC Card - Full Guide
Configurer les interfaces réseaux
Pour activer ou désactiver les différentes interfaces réseaux, on peut utiliser nmtui
.
À voir aussi
- https://www.raspberrypi.com/news/raspberry-pi-bullseye-update-april-2022/
- https://learnxinyminutes.com/docs/bash/
- https://devhints.io/bash
- https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html
- https://funprojects.blog/2021/04/26/control-usb-powered-devices/
- https://raspberrypi.stackexchange.com/questions/118656/raspberry-pi4-uhubctl-bash-script-wont-run
- https://github.com/codazoda/hub-ctrl.c/issues/17
Quelques commandes utiles
- Déterminer le modèle de Raspberry
cat /sys/firmware/devicetree/base/model
# Raspberry Pi 4 Model B Rev 1.1
- Déterminer la version de l’OS
cat /etc/os_release