Transformer un vieux Raspberry Pi en PC de quarantaine

Récemment, j’ai mis la main sur une archive ZIP assez massive, près d’1Go, remplie de PDFs sur un sujet qui m’intéresse. Seul bémol : j’ai récupéré ce fichier dans un recoin « douteux » du web. Ma paranoïa me hurlait de ne pas l’ouvrir sur ma machine principale, et encore moins sur un appareil connecté à mon réseau domestique. J’avais deux options :

  1. Utiliser mon PC perso, sans doute pas suffisamment sécurisé mais surtout a accès à toute ma vie numérique (cloud, mail, comptes…)
  2. Tenter le coup avec mon PC pro, certes ultra-sécurisé par mon employeur mais le devoir de s’expliquer à la DSI en cas de détection du moindre problème
  3. Ressusciter une vieille machine chez moi, la déconnecter du réseau et l’utiliser comme une « zone de quarantaine».

Ça tombe bien, on a tous un vieux Raspberry Pi qui prend la poussière dans un tiroir. Le mien affiche fièrement plus de 10 ans au compteur! autant dire, comme on va le voir, que c’est loin d’être une bête de course !

La douche froide

J’insère une carte SD de 128 Go, j’installe Raspberry Pi OS via BalenaEtcher , je copie mon zip sur le bureau et je lance fièrement dans un terminal la commande suivante pour décompresser mon fichier.

Bash
7z x archive.7z

Cette commande est la base pour extraire des fichiers avec l’outil 7-Zip sous Linux (via le paquet p7zip):

  • 7z : C’est l’appel au programme 7-Zip.
  • x : Signifie eXtract with full paths (extraire avec l’arborescence complète), en gros contrairement à la commande e, x respecte la hiérarchie des dossiers et sous-dossiers créée lors de la compression.
  • archive.7z : C’est tout simplement le nom du fichier que l’on souhaite décompresser.

La déception est immédiate, j’obtiens le message d’erreur 

Bash
Can't allocate required memory !

Pourtant, j’ai 128 Go d’espace libre! Mais voilà le problème: mon vieux Pi ne possède qu’1 Go de RAM….

Mais pourquoi utiliser la RAM plutôt que la carte SD… c’est là qu’entre en jeu le Buffering (Mise en tampon) : Écrire sur une carte SD est très lent par rapport à écrire sur la mémoire RAM. Le processeur décompresse donc les données à toute vitesse et les stocke temporairement dans la RAM avant de les « déverser » tranquillement sur la carte. Si le flux est trop rapide comme dans notre cas, la RAM sature.

On imagine souvent que l’extraction est un simple transfert de fichiers dans le disque dur d’un dossier A vers un dossier B, mais c’est en réalité une opération mathématique bien plus intense.

Pourquoi la décompression consomme-t-elle autant ?

Les algorithmes de compression comme LZMA (le plus connu) utilisent ce que l’on appelle un « dictionnaire ». Pour donner une analogie, si un texte contient 100 fois le mot « Anticonstitutionnellement » par exemple, l’archive le remplace par un code plus court, disons pour simplifier “abc”. Pour décompresser, le logiciel doit donc charger ce dictionnaire en RAM pour faire la traduction (remplacer chaque “abc” de texte compressé par le mot original “Anticonstitutionnellement”). Plus la compression est forte, plus le dictionnaire est gros car on va essayer de remplacer plusieurs mots qui se répètent par des codes plus courts.

L’astuce pour vérifier : Inutile d’ouvrir le fichier pour lire ce dictionnaire. On peut juste utiliser la commande

Bash
7z l -slt mon_archive.7z
  • `7z` c’est toujours la commande de l’application de décompression 7-Zip.
  • `l` signifie liste.  Cette option demande à 7-Zip d’afficher le contenu de l’archive sans le décompresser.
  • `-slt` signifie **Show List Technical** (affichage technique détaillé). Au lieu d’une liste simple, 7-Zip affiche toutes les métadonnées techniques pour chaque fichier contenu dans l’archive. On obtient ainsi par exemple Nom du fichier, Taille réelle, Taille compressée, Date et heure…

j’obtiens quelque chose comme:

Bash

Bash
Path = mon_archive.7z
Type = 7z
Physical Size = 1876048576
Headers Size = 200
Method = LZMA2:26
Solid = + Blocks = 1

En cherchant la ligne Method, on peut voir LZMA2:26. Le chiffre 26 est une puissance de 2 (il faut donc lire 2262^{26}) qui signifie un dictionnaire de 64 Mo. La RAM consommée étant souvent de 1 à 2 fois la taille du dictionnaire, mon Pi était déjà sous l’eau.

La bidouille du vieux sorcier

Et si on forçait manuellement l’utilisation de la carte SD au lieu de mémoire RAM?

Le concept de mémoire virtuelle (dont le Swap est l’implémentation sous Linux) remonte aux années 60 car à cette époque, la RAM coûtait une fortune. Le Swap est une forme de mémoire qui utilise une partie du stockage (SD ou disque dur) pour simuler de la RAM. Par défaut, Raspberry Pi OS propose un swap de 100 Mo. Ridicule pour mon cas. On va le passer à 20 Go. Et sur Linux, c’est assez simple en 4 commandes chrono:

1. Allouer l’espace

On commence par créer un fichier vide de 20 Go qui servira de zone de stockage.

Bash
sudo fallocate -l 20G /swapfile

fallocate réserve instantanément l’espace sur le disque et le nomme /swapfile.

2. Sécuriser les accès

On restreint l’accès au système uniquement pour éviter qu’un processus malveillant ou concurrent n’aille fouiller ou corrompre cette extension de mémoire.

Bash
sudo chmod 600 /swapfile

Le 600 signifie que seul l’utilisateur administrateur peut lire ou écrire dans ce fichier. Ce qui est par défaut quand on execute des commande via sudo

3. Formater et activer

Enfin, on transforme ce fichier en véritable « RAM de secours ».

Bash
sudo mkswap /swapfile
sudo swapon /swapfile

mkswap(make swap) prépare la structure de notre fichier /swapfile, et swapon l’intègre officiellement à la mémoire disponible du système.

Et c’est à peu près tout, le tour est joué…

L’extraction « Basse Consommation »

Même avec ce boost, j’ai joué la prudence en désactivant le multi-threading afin de réduire l’empreinte mémoire :

Bash
7z x -mmt=off archive.7z
  • -mmt=off : mmt Par défaut, 7-Zip utilise tous les cœurs CPU disponibles en parallèle pour accélérer les opérations; Or chaque coeur consomme de la mémoire (nos fameux buffers de décompression). En le mettant en off, signifie : désactiver complètement le multi-threading et forcer une exécution mono-thread (1 seul cœur)

On force donc 7-Zip à travailler de manière linéaire, sur un seul cœur. C’est plus lent, mais bien moins gourmand.

Pendant que le processeur s’échine à décompresser l’archive, il est fascinant (et prudent) d’observer comment le système jongle avec la mémoire. Pour cela, j’ouvre un second terminal et j’utilise la commande

Bash
free -h

L’option -h (human-readable) permet d’afficher les valeurs en Go et Mo plutôt qu’en octets illisibles.

On obtient alors un tableau de ce type :

Bash
Type     Total  Utilisé  Libre
Mem      980Mi  800Mi    180Mi
Swap20Gi 450Mi  1.5Gi

Le problème de free -h, c’est qu’il ne donne qu’une « photo » instantanée de la situation au moment exact où on l’execute. Pour suivre l’évolution de la consommation sans avoir à taper la commande frénétiquement, on peut faire appel à l’utilitaire watch:

Bash
watch -n 1 free -h

Le paramètre -n 1 demande à watch de rafraîchir l’affichage toutes les 1 seconde. On obtient alors un monitoring dynamique qui nous permet de voir, en direct, le Swap se remplir à mesure que la RAM physique sature. Le résultat est sans appel : ma RAM était pleine à craquer, et le Swap commence à se remplir progressivement.

Le conseil du parano

Surveillez la température ! Le Swap sollicite énormément le processeur. J’ai utilisé la commande

Bash
vcgencmd measure_temp

pour vérifier que je ne dépassais pas les 80°C.

Bash
temp=47.8°C

Mon Pi est monté à 72°C, ce qui reste raisonnable. Si tu dépasses les 80-85°C, le Pi va ralentir de lui-même (aussi appelé thermal throttling) pour ne pas griller.

Fin de l’histoire

Une fois mes PDFs extraits, j’ai procédé au nettoyage. Le Swap sur carte SD est pratique mais il faut garder en tête qu’il est destructeur : il use les cellules de stockage mémoire à force des écritures répétées sur la carte SD. Pour préserver la durée de vie de ma carte, je désactive donc mon artifice :

Bash
sudo swapoff /swapfile
sudo rm /swapfile

swapoff dit au système d’arrêter d’utiliser le fichier comme RAM, et rm le supprimer pour libérer ainsi mes 20Go d’espace que j’ai réservé précédemment.

Conclusion : Pourquoi s’embêter ?

Certains parmi vous pourraient se dire : « tout ça pour un zip ? »… à lequel je réponds, oui mais pas que: 

  1. Sécurité Totale : En mode “déconnecté”, une application ou une clef USB douteuse que je branche sur ma station de quarantaine est sur une île déserte. Si un malware tente de scanner mon réseau ou d’infecter ma machine, il est coincé. Au pire, je formate ma carte SD..
  2. Recyclage : Mon Pi de 2016 n’est pas complètement obsolète; il a une seconde vie utile maintenant comme station de quarantaine dédiée.
  3. Maîtrise : Linux nous rappelle qu’avec un peu de configuration, on peut repousser les limites physiques d’un matériel modeste… Allez faire ça avec un système complètement fermé comme Windows…

Bref, je dormirai tranquil ce soir une fois que j’aurai fini de lire mes PDF. Sur ce, à la prochaine pour de nouvelles bidouilles !

Catégories :

Étiquettes :

Aucune réponse

Laisser un commentaire