Installation et configuration d'un serveur léger pour une carte Raspberry Pi à partir d'une image minimale de Raspbian.

Introduction

Cette fiche opérationnelle décrit la mise en place d'un serveur minimal Raspbian (basé sur Debian Stretch) qui devra ensuite être étendu selon les besoins (web, TOR, ...).

Le noyau Raspbian est toujours en 32 bits, il peut donc être installé sur toute carte Raspberry, de la Pi Zéro au format carte de crédit équipée d'un mono-processeur 32 bits et de 512MB de RAM, jusqu'à un Pi3 B+ format paquet de cigarettes munie d'un processeur 4 cœurs 64 bits (mais utilisés seulement en 32bits) et de 1Go en RAM.

Nous n'utiliserons que la ligne de commande (CLI), sans écran ni clavier à partir d'une connexion distante en SSH.

S'agissant d'une utilisation serveur, SSH sera durci ainsi que Raspbian.

Préparation de la SDCard

(ici sur un PC Linux Ubuntu 18.04 LTS)

Les Raspberry(ies ?) démarrent normalement à partir d'une carte au format SD (hélas !) d'au moins 2Go pour la présente installation, bien qu'il soit possible d'utiliser un périphérique USB plus rapide.

Il faut y transférer une des images disques disponibles. Nous téléchargeons l'archive ZIP de la plus petite configuration officielle (Raspbian Release date: 2018-11-13)

wget https://downloads.raspberrypi.org/raspbian_lite_latest
echo "47ef1b2501d0e5002675a50b6868074e693f78829822eef64f3878487953234d raspbian_lite_latest" > raspbian_lite_latest.sha256
sha256sum -c raspbian_lite_latest.sha256
(la somme de contrôle est à recopier depuis le site)

Graver l'image

(certaines commandes nécessiteront des droits privilégiés, donc sudo à rajouter devant celles-ci, ou login en tant que root)

Identifier la carte SD

Introduire la carte SD dans le PC et chercher son identifiant de périphérique, par exemple avec lsblk, dmesg ou encore journalctl -xe. Attention à ne pas se tromper sous peine de perdre des données !

lsblk
...
  └─sda3_crypt          253:0    0 118,3G  0 crypt
    └─ubuntu--vg-swap_1 253:2    0   3,9G  0 lvm
      └─cryptswap1      253:3    0   3,9G  0 crypt [SWAP]
sdb                       8:16   1  59,7G  0 disk  /media/xxx/A6F6-44CD
...
La dernière ligne montre une SDCard qui a été montée, elle contient donc déjà un système de fichier et probablement des données ... méfiance avant de continuer. xxx sera à remplacer par votre login — il est également possible que le point de montage soit un chemin différent. Sinon on obtient plutôt
sdb                       8:16   1  59,7G  0 disk
Dans la suite nous supposerons que le périphérique recherché est /dev/sdb.

Gravure (CLI)

unzip raspbian_lite_latest
dd if=2018-11-13-raspbian-stretch-lite.img of=/dev/sdb bs=512
/dev/sdb bs=512
3645440+0 enregistrements lus
3645440+0 enregistrements écrits
1866465280 bytes (1,9 GB, 1,7 GiB) copied, 329,063 s, 5,7 MB/s
sync
optionnellement, vérifier la gravure au prix de 1.8 Go supplémentaires pour la relecture de l'image. On fournit à count= le nombre d'enregistrements indiqués à l'écriture, ici 3645440
sudo dd if=/dev/sdb of=image-relue bs=512 count=3645440
cmp 2018-11-13-raspbian-stretch-lite.img image-relue
rm 2018-11-13-raspbian-stretch-lite.img image-relue

Gravure (GUI)

Autre méthode, graphique, avec etcher à télécharger sur https://www.balena.io/etcher/ ou à installer comme paquet etcher-electron. Dans ce cas il convient de rajouter le suffixe .zip afin que etcher propose cette archive comme image à choisir, sans besoin de la décompresser.

mv raspbian_lite_latest raspbian_lite_latest.zip
En outre etcher vérifiera la gravure bloc par bloc, sans fichier intermédiaire.

Modifier l'image

Retirer puis réinsérer la carte. Normalement Linux la détecte et monte automatiquement ses deux partitions boot et rootfs.

Montage manuel

Au cas où le montage automatique n'aurait pas eu lieu, retrouver l'identifiant de périphérique associé à la carte, probablement le même que précédemment

 
fdisk -l /dev/sdb
Périphérique Amorçage Début     Fin Secteurs Taille Id Type
/dev/sdb1              8192   98045    89854  43,9M  c W95 FAT32 (LBA)
/dev/sdb2             98304 3645439  3547136   1,7G 83 Linux
La première partition, ici /dev/sdb1 formattée en FAT32 est celle qui contient le boot, on la monte
mkdir /media/xxx/boot
mount /dev/sdb1 /media/xxx/boot

Modifications

  1. Créer un fichier (vide) ssh dans boot
    touch /media/xxx/boot/ssh
    
    Cela lancera le serveur SSH au démarrage de la Pi.

  2. Optionnellement, on peut souhaiter que Raspbian n'étende pas automatiquement la partition rootfs à tout l'espace disponible sur la SDCard lorsqu'il démarrera. Cela permet, par exemple, d'achever de configurer le serveur sur la Pi, puis, avant de l'utiliser réellement, de recopier la SDCard pour obtenir une image préconfigurée qu'il suffira de dupliquer. Cela sans devoir y enregistrer les Go ou les dizaines de Go d'espace alloué mais non utilisé rajoutés par l'extension.
    sed -i -E 's: +init=/usr/lib/raspi-config/init_resize.sh::' /media/xxx/boot/cmdline.txt
    
    Plus tard, après avoir récupéré l'image, on pourra rajouter le redimensionnement automatique en remontant la carte comme précédemment
    sed -i -E 's:$: init=/usr/lib/raspi-config/init_resize.sh:' /media/xxx/boot/cmdline.txt
    
    ou plus simplement, sur la Pi, utiliser raspi-config.

    Attention: le redimensionnement automatique sur la Pi ne fonctionnera pas si une autre partition a été créée.

    Note : certaines des opérations ci-après réalisées sur la Pi en fonctionnement, pourraient être menées à cette étape, typiquement les modifications de fichiers ou le redimensionnement (voir la dernière section « Exemple de duplication ».

  3. Ejecter la carte (GUI) ou démonter ses volumes (CLI)
    umount /dev/sdb[12]
    rmdir /media/xxx/boot
    

Sur la Pi

On insère la SDCard dans la Pi ... et on met le contact. Le démarrage ne nécessite aucun écran ni clavier.

Il faudra cependant trouver l'adresse IPv4 ou IPv6 associée.

Objectifs

Opérations

(Utiliser l'adresse IPv4 ou IPv6 correcte)

Finalisation

Si l'on avait choisi d'empêcher l'expansion du système de fichier à toute la carte, on peut maintenant en sauver l'image préconfigurée sur le PC. En supposant qu'elle y est toujours associée à /dev/sdb

On peut vérifier le nombre de secteurs consommés par fdisk -l /dev/sdb comme dans la section « Montage manuel ». On prend le secteur de fin + 1 pour count= puisque leur numérotation commence à 0.

sudo dd if=/dev/sdb of=raspbian-mini-preconf.img bs=512 count=3645440

On gagne de la place en compressant cette image. L'omnipréset format zip, très portable, permet de la transférer à d'autres sytèmes.

On peut alors créer de nouvelles partitions et/ou augmenter la taille de la partition Raspian rootfs sur la carte SD (cf la section « Modifications »)

Exemple de duplication

(Il s'applique également à la version originale de Raspbian.)

On part d'une grosse carte SD de 64 Go qu'on suppose encore vue comme /dev/sdb sur laquelle on rajoutera une troisième partition (pour un futur /home par exemple)

unzip raspbian_lite_preconf.zip
ls -lh raspbian_lite_preconf.*
-rw-r- 1 xx xx 1,8G janv.  4 12:18 raspbian_lite_preconf.img
-rw-rr 1 xx xx 472M janv.  4 12:34 raspbian_lite_preconf.zip

Rafraîchissement mémoire —la nôtre !— à propos du partionnement de notre image

fdisk -l raspbian_lite_preconf.img
Disque raspbian_lite_preconf.img : 1,8 GiB, 1866465280 octets, 3645440 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x7ee80803
Périphérique                morçage Début     Fin Secteurs Taille Id Type
raspbian_lite_preconf.img1           8192   98045    89854  43,9M  c W95 FAT32 (LBA)
raspbian_lite_preconf.img2          98304 3645439  3547136   1,7G 83 Linux

Attention à ne pas se tromper de périphérique — risque de perte irrémédiable de données

dd if=raspbian_lite_preconf.img of=/dev/sdb bs=512
3645440+0 enregistrements lus
3645440+0 enregistrements écrits
1866465280 bytes (1,9 GB, 1,7 GiB) copied, 312,137 s, 6,0 MB/s
sync
On peut vérifier que 1866465280 ÷ 512 = 3645440 = 3645439(bloc de fin) + 1

Retirer et remettre la carte dans le lecteur, son montage devant être automatique, la démonter et vérifier :

umount /dev/sdb{1,2}
fdisk -l /dev/sdb
Disque /dev/sdb : 59,7 GiB, 64054362112 octets, 125106176 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x7ee80803
Périphérique Amorçage Début     Fin Secteurs Taille Id Type
/dev/sdb1              8192   98045    89854  43,9M  c W95 FAT32 (LBA)
/dev/sdb2             98304 3645439  3547136   1,7G 83 Linux

Extension de sdb2 / rootfs à 15Go. Signification des commandes : Delete 2 New 2 Primary « secteur de début tel qu'indiqué juste au-dessus » taille Write. Pour éviter les problèmes, on peut choisir de taper à la main les commandes pour fdisk ...

fdisk /dev/sdb <<EOD...
d
2
n
p
2
98304
+15G
w
EOD...
Bienvenue dans fdisk (util-linux 2.31.1).
Les modifications resteront en mémoire jusqu'à écriture.
Soyez prudent avant d'utiliser la commande d'écriture.
Commande (m pour l'aide) : Numéro de partition (1,2, 2 par défaut) : 
La partition 2 a été supprimée.
Commande (m pour l'aide) : Type de partition
   p   primaire (1 primaire, 0 étendue, 3 libre)
   e   étendue (conteneur pour partitions logiques)
Sélectionnez (p par défaut) : Numéro de partition (2-4, 2 par défaut) : Premier secteur (2048-125106175, 2048 par défaut) : Dernier secteur, +secteurs ou +taille{K,M,G,T,P} (98304-125106175, 125106175 par défaut) : 
Une nouvelle partition 2 de type «  Linux  » et de taille 15 GiB a été créée.
La partition #2 contient une signature ext4.
Commande (m pour l'aide) : 
La table de partitions a été altérée.
Appel d'ioctl() pour relire la table de partitions.
Synchronisation des disques.
e2fsck -f /dev/sdb2
Passe 1 : vérification des i-noeuds, des blocs et des tailles
Passe 2 : vérification de la structure des répertoires
Passe 3 : vérification de la connectivité des répertoires
Passe 4 : vérification des compteurs de référence
Passe 5 : vérification de l'information du sommaire de groupe
rootfs : 41674/110880 fichiers (0.2% non contigus), 289406/443392 blocs
resize2fs /dev/sdb2
resize2fs 1.44.1 (24-Mar-2018)
En train de redimensionner le système de fichiers sur /dev/sdb2 à 3932160 (4k) blocs.
Le système de fichiers sur /dev/sdb2 a maintenant une taille de 3932160 blocs (4k).
fdisk -l /dev/sdb
...
Périphérique Amorçage Début      Fin Secteurs Taille Id Type
/dev/sdb1              8192    98045    89854  43,9M  c W95 FAT32 (LBA)
/dev/sdb2             98304 31555583 31457280    15G 83 Linux

Création d'une 3ème partition, pour l'exemple. Elle débutera donc ici à 31555583 + 1

fdisk /dev/sdb <<EOD...
n
p
3
31555584
indiquer la taille voulue p.ex. +8G ou laisser vide pour taille = le maximum
w
EOD...
mkfs.ext4 /dev/sdb3
sync

Sortir et remettre la carte dans son lecteur pour vérifier

df -h
/dev/sdb1                      44M     23M   22M  51% /media/xxx/boot
/dev/sdb2                      15G    1,1G   13G   8% /media/xxx/rootfs
/dev/sdb3                      44G     53M   42G   1% /media/xxx/6ebaf79d-1176-4393-9cd3-24744acb0757