2022 02 18 Container docker pour vieux BSP
Contents
Introduction
Avec la pénurie de composants actuelle beaucoup d'entreprises sont contraintes de modifier leurs cartes électroniques de manière à supporter des variantes de leurs composants. Ce changement de composants impose souvent de retoucher le logiciel et de «remettre les mains dans le code» archivé depuis belle lurette. Le temps du développement n'étant pas celui de la production, les projets sont souvent «figés» de longue date. Et les machines qui permettaient de compiler le matériel sont totalement obsolète quand le produit est en «full-prod».
Réinstaller les vieux logiciels qui ont permis de développer le produit se révèle souvent une gageur sur des systèmes actuels.
Heureusement pour Armadeus, tout le développement de ses cartes se fait sous Linux. Et nous avons aujourd'hui un outils formidable pour faire tourner de vieux logiciel sur des systèmes «à jour» : la virtualisation légère, avec notamment le logiciel docker.
Docker, la virtualisation légère
Selon Wikipedia Docker est «une plateforme permettant de lancer certaines applications dans des conteneurs logiciels. Docker étend le format de conteneur Linux standard, LXC, avec une API de haut niveau fournissant une solution pratique de virtualisation qui exécute les processus de façon isolée2.»
Dit simplement, Docker est une machine virtuelle qui émule le système d'exploitation et les librairies mais pas les instructions machine. Ce qui en fait une machine virtuelle très performante.
Docker est très intéressant pour faire tourner un programme dans un environnement logiciels contrôlé avec des versions figées. C'est par exemple le cas pour compiler un BSP en utilisant une vieille distribution linux.
Compilation du BSP armadeus pour APF27
L'APF27 est typiquement la carte qui est encore actuellement en production chez armadeus mais dont le BSP n'est plus utilisable avec les outils actuels. À l'origine, le BSP de l'apf27 était compilé sur des version d'ubuntu datant des années 2010 !
Si l'on veut pouvoir reprendre son projet sans avoir à redémarrer un ordinateur de cette époque, voici comment faire avec docker. L'exemple de cet article a été réalisé sur une distribution ubuntu version Ubuntu 20.04.3 LTS.
Lancement de Docker
Docker est un «deamon» qu'il faut lancer en tâche de fond sur son système. Sur Ubuntu c'est systemd qui contrôle ça :
$ sudo systemctl start docker
Une fois que docker tourne en tâche de fond, on peu lancer directement une console `bash` ubuntu version 12.04 avec la commande
$ sudo docker run -it ubuntu:12.04 /bin/bash
root@1a5b88e1759c:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.5 LTS"
root@1a5b88e1759c:/#
Un container existe déjà sur les serveurs docker avec une version minimaliste. En tapant la commande ci-dessus, docker va simplement télécharger le container pour le lancer sur la machine.
Notre shell bash tourne bien dans une distribution ubuntu version 12.04. Pour visualiser les container actifs dans docker on lancera la commande suivant dans une autre console :
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a5b88e1759c ubuntu:12.04 "/bin/bash" 2 minutes ago Up 2 minutes stoic_noether
Si l'on quitte la console avec `exit`, le container sera mis en inactif et il faudra le relancer pour pouvoir s'y ré-attacher :
root@1a5b88e1759c:/# exit
exit
$ sudo docker container start stoic_noether
stoic_noether
$ sudo docker attach stoic_noether
root@1a5b88e1759c:/# history
1 ls
2 top
3 cat /etc/lsb-release
4 exit
5 history
root@1a5b88e1759c:/#
Une fois que l'on se trouve dans la console on peut tenter de télécharger et compiler le bsp armadeus-7.0 par exemple :
root@3264de07ca45:/# cd /opt/
root@3264de07ca45:/opt# mkdir bsp
root@3264de07ca45:/opt# cd bsp/
root@3264de07ca45:/opt/bsp# wget https://sourceforge.net/projects/armadeus/files/armadeus/armadeus-7.0/armadeus-7.0.tar.bz2/download
bash: wget: command not found
root@3264de07ca45:/opt/bsp# apt-get install wget
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package wget
root@3264de07ca45:/opt/bsp# apt-get update
Ign http://archive.ubuntu.com precise Release.gpg
[...]
E: Some index files failed to download. They have been ignored, or old ones used instead.
root@3264de07ca45:/opt/bsp#
Ach! Très vite on se rend compte que la distribution fournie par docker est bien trop minimaliste pour que l'on puisse travailler avec. Nous allons donc devoir construire notre propre container qui partira de cette distribution pour la customiser.
Construction d'un container
Pour construire son propre container, il faut créer un fichier de configuration avec le nom Dockerfile. Dans lequel on donnera le container de départ :
#Simple commentaire d'entête
FROM ubuntu:12.04
# on ajoute les dépots apt encore accessible aujourd'hui
# Sources from https://gist.github.com/ivomts/4558134
RUN echo "deb http://old-releases.ubuntu.com/ubuntu/ precise main restricted" > /etc/apt/sources.list && \
echo "deb http://old-releases.ubuntu.com/ubuntu/ precise-updates main restricted" >> /etc/apt/sources.list && \
echo "deb-src http://old-releases.ubuntu.com/ubuntu/ precise main restricted" >> /etc/apt/sources.list && \
echo "deb http://old-releases.ubuntu.com/ubuntu/ precise-updates main restricted" >> /etc/apt/sources.list && \
echo "deb-src http://old-releases.ubuntu.com/ubuntu/ precise-updates main restricted" >> /etc/apt/sources.list
Et on construit le container en lui donnant un nom et une version :
$ sudo docker build -t apf27bsp:0.1 .
Sending build context to Docker daemon 2.56kB
Step 1/2 : FROM ubuntu:12.04
---> 5b117edd0b76
Step 2/2 : RUN echo "deb http://old-releases.ubuntu.com/ubuntu/ precise main restricted" > /etc/apt/sources.list && echo "deb http://old-releases.ubuntu.com/ubuntu/ precise-updates main restricted" >> /etc/apt/sources.list && echo "deb-src http://old-releases.ubuntu.com/ubuntu/ precise main restricted" >> /etc/apt/sources.list && echo "deb http://old-releases.ubuntu.com/ubuntu/ precise-updates main restricted" >> /etc/apt/sources.list && echo "deb-src http://old-releases.ubuntu.com/ubuntu/ precise-updates main restricted" >> /etc/apt/sources.list
---> Running in 0b854be1e236
Removing intermediate container 0b854be1e236
---> 9c3cb7850267
Successfully built 9c3cb7850267
Successfully tagged apf27bsp:0.1
Le container ainsi construit peut être lancé avec la commande que l'on connaît bien maintenant :
$ sudo docker container run -it apf27bsp:0.1 /bin/bash
root@d6f2e3190f9b:/# apt-get update
Get:1 http://old-releases.ubuntu.com precise Release.gpg [198 B]
...
root@d6f2e3190f9b:/# apt-get install wget
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
libidn11
The following NEW packages will be installed:
libidn11 wget
0 upgraded, 2 newly installed, 0 to remove and 27 not upgraded.
Need to get 392 kB of archives.
After this operation, 970 kB of additional disk space will be used.
Do you want to continue [Y/n]? y
...
root@d6f2e3190f9b:/# cd /opt/
root@d6f2e3190f9b:/opt# ls
root@d6f2e3190f9b:/opt# mkdir bsp
root@d6f2e3190f9b:/opt# cd bsp/
root@d6f2e3190f9b:/opt/bsp# wget https://sourceforge.net/projects/armadeus/files/armadeus/armadeus-7.0/armadeus-7.0.tar.bz2/download --no-check-certificate
...
Saving to: `download'
100%[=========================================================================================================================================================================>] 6,572,959 1.87M/s in 3.8s
2022-02-18 15:58:54 (1.67 MB/s) - `download' saved [6572959/6572959]
root@d6f2e3190f9b:/opt/bsp# mv download armadeus-7.0.tar.bz2
root@d6f2e3190f9b:/opt/bsp# apt-get install bzip2
root@d6f2e3190f9b:/opt/bsp# tar jxf armadeus-7.0.tar.bz2
root@d6f2e3190f9b:/opt/bsp#
Très vite on se rend compte que nous avons beaucoup de logiciels à télécharger et installer. Le problème des containers c'est que rien n'est enregistré, donc à chaque fois qu'on lance le container avec la commande `run` tout est remis à zéro.
Il devient donc indispensable d'ajouter les commandes de mise à jour des packages dans le `Dockerfile`. Heureusement, Armadeus propose un script pour ça dans son BSP comme nous allons le voir par la suite.
Montage de répertoires «host»
Pour récupérer les fichiers que l'on compile avec le container il va être nécessaire de «monter» un répertoire de son ordinateur dans le container.
Ce montage se fait au lancement du container. Par exemple si nous souhaitons monter le répertoire de téléchargement des packets buildroot ainsi que le répertoire du bsp armadeus nous utiliserons la commande :
sudo docker run --mount src=/downloads,target=/downloads,type=bind \
--mount src=/home/user/prj/armadeusbsp,target=/opt/bsp/,type=bind \
-it apf27bsp:1.0 /bin/bash
Nous mutualiserons ainsi le répertoires /downloads de notre machine et nous récupérerons les binaires générés à la compilation du bsp dans le container.
Le Dockerfile Armadeus
Armadeus fourni le Dockerfile pour compiler l'apf27. Le script se trouve dans le répertoire `scripts/docker/apf27-ubuntu-12.04` du bsp. Un fichier README.md donne la marche à suivre pour le construire et le lancer.
Pour construire le container, il suffit de se rendre dans le répertoire et de taper la commande :
sudo docker build -t apf27bsp:0.1 .