Préparer une Raspberry Pi

Ci-dessous les étapes pour :

  • installer le système d’exploitation de la Raspberry Pi connu sous le nom Raspberry Pi OS (base Linux Debian) depuis un PC Windows ou Linux

  • fixer la configuration initiale

Installation de Raspberry Pi OS …​

…​depuis un PC Linux

  1. Insérer la carte µSD de la Raspberry Pi dans le PC à l’aide d’un adaptateur USB⇆µSD

  2. Télécharger l’image Raspberry Pi OS depuis le NAS du labo

    jdoe@C14-15:~$ smbclient //Diskstation/install --user=ADSN/ragnar (1)
    Password for [ADSN\ragnar]:
    Try "help" to get a list of possible commands.
    smb: \> cd RaspberryPi\
    smb: \RaspberryPi\> ls *.xz
    2024-07-04-raspios-bookworm-armhf.img.xz
    2025-05-13-raspios-bookworm-arm64.img.xz
    smb: \RaspberryPi\> get ./2025-05-13-raspios-bookworm-arm64.img.xz
    getting file \RaspberryPi\2025-05-13-raspios-bookworm-arm64.img.xz of size 1207847856 as ./2025-05-13-raspios-bookworm-arm64.img.xz (11475.2 KiloBytes/sec) (average 11475.2 KiloBytes/sec)
    smb: \RaspberryPi\> exit
    jdoe@C14-15:~$
    1 Remplacer ragnar par votre nom de compte Active Directory

    Pour récupérer le fichier image, on peut aussi utiliser l’explorateur de fichier graphique en saisissant le chemin smb://Diskstation/install/RaspberryPi.

  3. Décompresser l’image disque

    jdoe@C14-15:~$ unxz ./2025-05-13-raspios-bookworm-arm64.img.xz
  4. Identifier le périphérique correspondant à la carte microSD grâce à sa taille depuis la commande lsblk

    Exemple :
    jdoe@C14-15:~$ lsblk
    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
    sda      8:0    0 465.8G  0 disk
    ├─sda1   8:1    0   286M  0 part /boot/efi
    ├─sda2   8:2    0   8.1G  0 part [SWAP]
    └─sda3   8:3    0 457.4G  0 part /
    sdb      8:16   1  14.8G  0 disk(1)
    ├─sdb1   8:17   1   512M  0 part
    └─sdb2   8:18   1   4.7G  0 part
    sr0     11:0    1  1024M  0 rom
    1 La taille de ma carte µSD est 16Go ⇒ le périphérique qui lui est associé est sdb car 14.8Go est proche de 16Go

    Dans la suite des instructions, remplacer “sdb” par le périphérique qui a été détecté sur votre propre système

  5. Écrire l’image de Raspberry Pi OS sur la carte microSD via la commande dd

    Les données de la µSD seront écrasées sans demande de confirmation⇒ Veiller à choisir le bon périphérique de destination (c’est-à-dire celui associé à la carte µSD) dans le paramètre of= de la commande ci-dessous.

    jdoe@C14-15:~$ sudo dd if=2025-05-13-raspios-bookworm-arm64.img of=/dev/sdb bs=4M status=progress conv=fsync (1)
    [sudo] password for jdoe:
    6157238272 bytes (6.2 GB, 5.7 GiB) copied, 322.772 s, 19.1 MB/s
    jdoe@C14-15:~$ sync (2)
    1 ⚠ spécifier le périphérique associé à la µSD (sdb dans mon cas mais peut-être autre chose sur votre système)
    2 synchronise la mémoire tampon avec le disque.
  6. Monter la partition boot de la carte µSD dans le système de fichiers de votre PC pour y faire les modifications nécessaires

    sudo mkdir /mnt/rpi_boot
    sudo mount /dev/sdb1 /mnt/rpi_boot (1)
    1 La partition boot est la plus petite (→ /dev/sdb1) parmi celles listées par la commande lsblk pour le disque associé à la µSD (→ /dev/sdb dans mon cas)
  7. Préparer l’accès “headless”

    Voir Mode Headless pour une explication sur ce mode.

    1. Créer dans /mnt/rpi_boot un fichier hostname.txt avec le nom désiré de la Raspberry Pi (exemple: rpi-c12-04).

      echo "rpi-c12-04" | sudo tee /mnt/rpi_boot/hostname.txt
    2. Modifier le fichier cmdline.txt en ajoutant à la fin :

      sudo sed -i -e '$ s/$/ cfg80211.ieee80211_regdom=FR systemd.run=\/boot\/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target/' /mnt/rpi_boot/cmdline.txt

      Ce fichier doit respecter la convention UNIX en terme de caractère de fin de ligne : IL DOIT IMPERATIVEMENT ETRE LF (0x0A).

      Pour s’assurer du respect de cette convention, on peut utiliser la commande objdump -C /mnt/rpi_boot/cmdline.txt et vérifier que les lignes — notamment la dernière — se terminent uniquement avec l’octet 0x0a (LF) et non 0x0d 0x0a (CR + LF) ou 0x0d (CR)

      Exemple :
      jdoe@john-virtualbox:~$ hexdump -C /mnt/rpi_boot/cmdline.txt
      [...]
      00000080  61 72 67 65 74 0a                         |arget.| (1)
      1 Le caractère de fin de ligne est 0x0a (LF) ⇒ c’est OK
    3. Ajouter le script firstrun.sh à la racine /mnt/rpi_boot.

      Ce fichier doit également respecter la convention UNIX en terme de caractère de fin de ligne : IL DOIT IMPERATIVEMENT ETRE LF (0x0A)

      sudo tee /mnt/rpi_boot/firstrun.sh > /dev/null << 'EOF'
      #!/bin/bash
      set +e
      CURRENT_HOSTNAME=$(cat /etc/hostname | tr -d " \t\n\r")
      NEW_HOSTNAME=$(cat /boot/firmware/hostname.txt | tr -d " \t\n\r")
      echo $NEW_HOSTNAME > /etc/hostname
      sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\t$NEW_HOSTNAME/g" /etc/hosts
      systemctl enable ssh
      FIRSTUSER=$(getent passwd 1000 | cut -d: -f1)
      FIRSTUSERHOME=$(getent passwd 1000 | cut -d: -f6)
      echo "$FIRSTUSER:"'$5$bD3Tw27JLx$G8uIBQgYsTzf3L3IS8hxgEoqqfkvAFqJfltQ7KSy9Y3' | chpasswd -e
      if [ "$FIRSTUSER" != "pi" ]; then
        usermod -l "pi" "$FIRSTUSER"
        usermod -m -d "/home/pi" "pi"
        groupmod -n "pi" "$FIRSTUSER"
        if grep -q "^autologin-user=" /etc/lightdm/lightdm.conf ; then
          sed /etc/lightdm/lightdm.conf -i -e "s/^autologin-user=.*/autologin-user=pi/"
        fi
        if [ -f /etc/systemd/system/getty@tty1.service.d/autologin.conf ]; then
          sed /etc/systemd/system/getty@tty1.service.d/autologin.conf -i -e "s/$FIRSTUSER/pi/"
        fi
        if [ -f /etc/sudoers.d/010_pi-nopasswd ]; then
          sed -i "s/^$FIRSTUSER /pi /" /etc/sudoers.d/010_pi-nopasswd
        fi
      fi
      cat >/etc/wpa_supplicant/wpa_supplicant.conf << 'WPAEOF'
      country=FR
      ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
      ap_scan=1
      update_config=1
      network={
        ssid="STS_C12"
        psk=fc3c77582ae2ac71409f1a2cdade251e6e8414af9136d68cc39eccd7ee532ac8
      }
      WPAEOF
      chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf
      rfkill unblock wifi
      for filename in /var/lib/systemd/rfkill/*:wlan ; do echo 0 > $filename; done
      rm -f /etc/localtime
      echo "Europe/Paris" > /etc/timezone
      dpkg-reconfigure -f noninteractive tzdata
      cat >/etc/default/keyboard << 'KBEOF'
      XKBMODEL="pc105"
      XKBLAYOUT="fr"
      XKBVARIANT=""
      XKBOPTIONS=""
      KBEOF
      dpkg-reconfigure -f noninteractive keyboard-configuration
      if [ -f /etc/xdg/autostart/piwiz.desktop ]; then
        mv /etc/xdg/autostart/piwiz.desktop /etc/xdg/autostart/.piwiz.desktop.save
      fi
      systemctl disable userconfig.service > /dev/null 2>&1
      if [ "$(getent passwd rpi-first-boot-wizard)" != "" ]; then
        userdel -r rpi-first-boot-wizard > /dev/null 2>&1
      fi
      rm -f /etc/sudoers.d/010_wiz-nopasswd
      rm -f /etc/xdg/autostart/deluser.desktop
      sudo rm /etc/profile.d/sshpwd.sh
      sudo rm /etc/xdg/lxsession/LXDE-pi/sshpwd.sh
      rm -f /boot/firstrun.sh
      sed -i 's| systemd.run.*||g' /boot/cmdline.txt
      exit 0
      EOF
      sudo chmod +x /mnt/rpi_boot/firstrun.sh
  8. Démonter la carte microSD

    sudo umount /mnt/rpi_boot
  9. Procéder au 1er démarrage comme indiqué dans la section “1er démarrage

…​depuis un PC Windows

La procédure indiquée ci-dessous fait usage du logiciel Rufus pour créer la carte µSD sur laquelle sera installé le système d’exploitation de la Raspberry Pi.

D’autres logiciels sont utilisables tels que Raspberry Pi Imager, Balena Etcher, Win32 disk imager. Cependant, ils présentent chacun un inconvénient :

Raspberry Pi Imager programme la µSD en téléchargeant Raspberry Pi OS depuis internet (⇒ N installations impliquent N téléchargements de Raspberry Pi OS).

  • Balena Etcher est beaucoup plus “lourd” que Rufus (139Mo contre 1.3Mo pour l’installateur).

  • Win32 disk imager ne semble plus vraiment maintenu (dernière version datant de 2017).

À noter que Win32 disk imager est le seul à offrir la fonctionnalité de sauvegarde d’une carte SD dans un fichier sur l’ordinateur. Cette fonctionnalité est malgré tout peu à peu délaissée car supplantée par l’utilitaire SD Card Copier présent dans les versions récentes de Raspberry Pi OS.

  1. Insérer la carte µSD de la Raspberry Pi dans le PC à l’aide d’un adaptateur USB⇆µSD

  2. Télécharger en local sur sa machine l’archive de l’image disque de Raspberry Pi OS (→ une image des partitions et du système de fichiers à copier sur la carte µSD).

    Exemple pour la version Bookworm du 04/07/2024 avec interface graphique : 2024-07-04-raspios-bookworm-armhf.img.xz

    Cette image disque sera récupérée depuis le NAS du labo (→ \\diskstation\install\RaspberryPi).

  3. Désarchiver l’image disque (→ 7-Zip, Winzip …​)

  4. Programmer la carte SD avec le contenu de cette image disque décompressée grâce au logiciel Rufus en veillant à sélectionner le bon lecteur de destination (pas le disque dur mais la carte µSD…​)

    rufus
  5. Préparer l’accès “headless

    Voir Mode Headless pour une explication sur ce mode.

    Pour permettre le mode d’utilisation headless dès la 1ère mise sous tension de la Raspberry Pi, il faut :

    • soit utiliser le logiciel Raspberry Pi Imager pour personnaliser l’image disque de Raspberry Pi OS avant son téléchargement depuis le site officiel

    • soit apporter des modifications sur la carte µSD sur laquelle a été transféré l’image disque standard de Raspberry Pi OS.

    Au lycée, c’est cette 2ème méthode qui sera utilisée.

    1. Créer dans la partition de la carte µSD nommée boot (→ voir astuce ci-dessous si cette partition ne s’affiche dans l’explorateur de Windows) un fichier nommé obligatoirement hostname.txt dans lequel vous indiquerez le nom à assigner à votre Raspberry Pi.

      Celui-ci sera de la forme rpi-c12-<n°-sur-2-chiffres-de-la-Raspberry Pi>. Exemple : rpi-c12-04

      hostname edit
      Exemple

      Veillez à ce que l’explorateur affiche les extensions de nom de fichier (option : Affichage  🗹 Extensions de nom) pour s’assurer que les noms de fichier correspondent exactement à ce qui est saisi lors de leur création.

      En effet, l’explorateur ajoute systématiquement l’extension .txt à tout nouveau document texte créé et ne l’affiche pas si cette option n’est pas cochée. Il en résulte que si vous créez un fichier hostname.txt celui portera au final le nom hostname.txt.txt (← 2 extensions .txt)

      Si la partition boot n’apparait pas dans l’explorateur de fichiers de Windows, lui attribuer une lettre de lecteur via le gestionnaire de disques (→ commande diskmgmt.msc ou bouton droit sur menu “Démarrer” puis “Gestion des disques”)

      boot assign drive letter
    2. Ajouter les commandes données ci-dessous à la suite de la ligne présente dans le fichier cmdline.txt déjà présent sur la µSD en veillant à n’ajouter AUCUN RETOUR À LA LIGNE (caractères CR (0x0D) ou LF (0x0A) ou combinaison des 2):

      cfg80211.ieee80211_regdom=FR systemd.run=/boot/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target
      cmdline edit
      Exemple dans Bookworm

      Cet ajout aura pour conséquence de demander l’exécution du script firstrun.sh (voir plus loin pour son contenu) au 1er démarrage de la Raspberry Pi

      Pour s’assurer qu’aucun retour à la ligne n’est inséré, le mieux est :

      • d’utiliser un éditeur de texte un tant soit peu évolué (i.e. VSCode) pour faire la modification plutôt que le Bloc Notes Windows qui a tendance à ajouter des retours à la ligne automatiquement

      • de vérifier dans un éditeur hexadécimal qu’aucun caractère CR (0x0D) ou LF (0x0A) n’a été ajouté automatiquement

        [...]
        0000000C0 3D 6B 65 72 6E 65 6C 2D 63 6F 6D 6D 61 6E 64 2D =kernel-command-
        00000000D 6C 69 6E 65 2E 74 61 72 67 65 74                line.target (1)
        1 Pas de 0A ou 0D après le 74 final
    3. Coller dans la partition boot le fichier firstrun.sh file dont le contenu est donné ci-dessous :

      Tout comme dans l’étape précédente, il faut porter toute son attention sur les retours à la ligne : ceux-ci doivent être OBLIGATOIREMENT codés avec la convention Unix (→ uniquement LF (0x0A)) et non avec celle de Windows (→ CR (0x0D) + LF (0x0A)) ou de MacOS (→ uniquement CR (0x0D)).

      Le non respect de cette contrainte empêchera le démarrage de la Raspberry Pi.

      #!/bin/bash
      
      # Demande au shell de stopper l'exécution du script dès qu'une erreur se produit
      set +e
      
      # Configuration du nouveau nom d'hôte avec celui
      # présent dans le fichier hostanme.txt
      CURRENT_HOSTNAME=`cat /etc/hostname | tr -d " \t\n\r"`
      NEW_HOSTNAME=`cat /boot/firmware/hostname.txt | tr -d " \t\n\r"`
      echo $NEW_HOSTNAME >/etc/hostname
      sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\t$NEW_HOSTNAME/g" /etc/hosts
      
      # Activation de SSH
      systemctl enable ssh
      
      # Mise en place d el'utilisateur par défaut
      # (user : pi / password : raspberry)
      FIRSTUSER=`getent passwd 1000 | cut -d: -f1`
      FIRSTUSERHOME=`getent passwd 1000 | cut -d: -f6`
      echo "$FIRSTUSER:"'$5$bD3Tw27JLx$G8uIBQgYsTzf3L3IS8hxgEoqqfkvAFqJfltQ7KSy9Y3' | chpasswd -e
      if [ "$FIRSTUSER" != "pi" ]; then
         usermod -l "pi" "$FIRSTUSER"
         usermod -m -d "/home/pi" "pi"
         groupmod -n "pi" "$FIRSTUSER"
         if grep -q "^autologin-user=" /etc/lightdm/lightdm.conf ; then
            sed /etc/lightdm/lightdm.conf -i -e "s/^autologin-user=.*/autologin-user=pi/"
         fi
         if [ -f /etc/systemd/system/getty@tty1.service.d/autologin.conf ]; then
            sed /etc/systemd/system/getty@tty1.service.d/autologin.conf -i -e "s/$FIRSTUSER/pi/"
         fi
         if [ -f /etc/sudoers.d/010_pi-nopasswd ]; then
            sed -i "s/^$FIRSTUSER /pi /" /etc/sudoers.d/010_pi-nopasswd
         fi
      fi
      
      # Configuration du WiFi pour la salle C12 (SSID : STS_C12)
      cat >/etc/wpa_supplicant/wpa_supplicant.conf <<'WPAEOF'
      country=FR
      ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
      ap_scan=1
      
      update_config=1
      network={
         ssid="STS_C12"
         psk=fc3c77582ae2ac71409f1a2cdade251e6e8414af9136d68cc39eccd7ee532ac8
      }
      WPAEOF
      
      chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf
      rfkill unblock wifi
      for filename in /var/lib/systemd/rfkill/*:wlan ; do
         echo 0 > $filename
      done
      
      # Configuration du fuseau horaire
      rm -f /etc/localtime
      echo "Europe/Paris" >/etc/timezone
      dpkg-reconfigure -f noninteractive tzdata
      
      # Configuration clavier AZERTY
      cat >/etc/default/keyboard <<'KBEOF'
      XKBMODEL="pc105"
      XKBLAYOUT="fr"
      XKBVARIANT=""
      XKBOPTIONS=""
      KBEOF
      
      dpkg-reconfigure -f noninteractive keyboard-configuration
      
      # Désactive l'exécution automatique de piwiz (interface graphique de configuration) au 1er démarrage
      # Source : https://forums.raspberrypi.com/viewtopic.php?t=339914
      if [ -f /etc/xdg/autostart/piwiz.desktop ]; then
         mv /etc/xdg/autostart/piwiz.desktop /etc/xdg/autostart/.piwiz.desktop.save
      fi
      systemctl disable userconfig.service > /dev/null 2>&1
      if [ "$(getent passwd rpi-first-boot-wizard)" != "" ]; then
         userdel -r rpi-first-boot-wizard > /dev/null 2>&1
      fi
      rm -f /etc/sudoers.d/010_wiz-nopasswd
      rm -f /etc/xdg/autostart/deluser.desktop
      
      # Désactivation du message d'avertissement concernant l'utilisation du mot de passe par défaut dans SSH
      sudo rm /etc/profile.d/sshpwd.sh
      sudo rm /etc/xdg/lxsession/LXDE-pi/sshpwd.sh
      
      # Suppression de ce script après son exécution
      rm -f /boot/firstrun.sh
      
      # Suppression des options du cmdline.txt permettant de lancer ce script au 1er démarrage
      sed -i 's| systemd.run.*||g' /boot/cmdline.txt
      
      exit 0
  6. Éjecter la carte µSD du PC

  7. Procéder au 1er démarrage comme indiqué dans la section “1er démarrage

1er démarrage

  1. Insérer la carte µSD dans la Raspberry Pi

  2. Connecter un câble réseau à la Raspberry Pi

  3. Si Utilisation désirée ≠ “Headless”, brancher un clavier, une souris et un écran à la Raspberry Pi

  4. Démarrer la Raspberry Pi en l’alimentant via un bloc secteur 5V avec prise micro-usb pouvant délivrer 2500mA

    Le 1er démarrage de la Raspberry Pi nécessite 3 re-démarrages de celle-ci ⇒ soyez patient car ceci dure plusieurs minutes

  5. Se connecter à la Raspberry Pi :

    • soit localement depuis l’interface graphique ou en ligne de commande en utilisant les clavier/souris + écran branchés ur la Raspberry Pi
      → valable pour le mode Desktop

    • soit par SSH (→ PuTTY ou commande ssh) en indiquant l’adresse IP de la Raspberry Pi ou simplement son nom d’hôte
      → valable pour les modes Desktop et Headless

      Les données d’identification configurées par défaut au lycée sont normalement les suivantes :

      login    : pi
      password : raspberry

Configuration de base

La configuration de base consiste généralement à :

  • configurer la disposition du clavier (→ clavier AZERTY)

  • renommer si besoin la Raspberry Pi (→ hostname)

  • changer éventuellement le mot de passe

  • activer les interfaces matérielles (I2C, SPI, Serial, OneWire) avec les capteurs ou dispositifs de commandes connectables à la Raspberry Pi

La procédure est la suivante :

  1. Lancer l’utilitaire de configuration

    • soit depuis l’interface graphique

      raspi config gui
    • soit depuis une console (locale ou distante via ssh) en exécutant la commande :

      sudo raspi-config
      raspi config cli
  2. Configurer au besoin la disposition des touches du clavier à partir du menu Localisation Options  Keyboard

  3. Aller dans System Options  Hostname pour changer au besoin le nom de la Raspberry Pi

  4. Changer éventuellement le mot de passe en passant par le menu System Options  Password.

    Ceci ne doit bien entendu n’être fait que sur une Raspberry Pi disposant d’une carte µSD personnelle ou dédiée à un projet de fin d’année. Dans le cas contraire, la Raspberry Pi doit rester utilisable par tout le monde et il est donc conseillé de garder le mot de passe par défaut (→ raspberry).

  5. Activer les bus matériels sur les broches d’entrées/sorties par l’intermédiaire des menus :

    • Interface Options  I2C,

    • Interface Options  SPI,

    • Interface Options  Serial Port.

      Pour l’interface Serial Port, désactiver le serial login shell et activer le serial port hardware.

🞄  🞄  🞄