Concevoir une solution de mise à jour pour un système embarqué sous Linux

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

Pourquoi faire la mise à jour de vos systèmes embarqués ?

Que ce soit pour le faire évoluer, par l’ajout de nouvelles fonctionnalités ou la correction de bugs mais également pour en assurer la sécurité la mise à jour d’un systèmes embarqué est incontournable et doit faire partie de votre Board Support Package (BSP) dès l’origine.

En effet, pas une semaine ne passe sans que des failles ne soient découvertes dans les logiciels que nous utilisons. Ces failles peuvent être utilisées pour détourner des objets connectés, elles peuvent être ensuite exploitées pour lancer des attaques de dénis de service (ddos), perturber le fonctionnement d’une organisation ou voler des informations personnelles.

 

Prévoir un dispositif de mise à jour du logiciel embarqué dès sa conception

Pour toutes ces raisons, il est indispensable de prévoir un dispositif de mise à jour du logiciel embarqué, le « firmware » des objets connectés.

Lorsqu’un ordinateur effectue des mises à jour, il demande à l’utilisateur de ne pas éteindre le système. C’est nécessaire car de nombreux fichiers sont copiés pendant le processus. En cas d’extinction impromptue, des fichiers et programmes peuvent êtres corrompus et les dépendances de logiciels dans un état incohérent. Pour un PC les conséquences sont limitées : l’utilisateur doit effectuer des opérations (pénibles) de maintenance manuelle.

Le même cas de figure sur un objet connecté peut l’empêcher définitivement de fonctionner. Sachant qu’il n’est pas acceptable de demander à un utilisateur d’effectuer des opérations de maintenance manuelle, l’objet doit retourner en maintenance chez le fabricant ou être mis au rebus. Il existe plusieurs approches pour éviter cette situation.

Comment mettre à jour votre système embarqué sous Linux ?

Mises à jour A/B : une option fiable

Une solution couramment utilisée consiste à appliquer des mises à jour dites « A/B »: la mise à jour est appliquée dans un environnement séparé, habituellement sur une autre partition puis, lorsque tout est prêt, le système redémarre dans son nouvel environnement.

En cas de mise à jour incomplète, on continue d’utiliser le système stable et la mise à jour peut être effectuée plus tard. De plus, il devient possible de réutiliser l’ancien système dans le cas où le nouveau présente des instabilités.

Mises à jour A/B : description pas à pas

Prenons l’exemple d’un objet connecté fonctionnant sous Linux. Il comprend les éléments suivants :

  • Un bootloader (souvent u-boot) 
  • Le noyau Linux (kernel)
  • Les applications systèmes (rootfs)
  • Les données utilisateurs
Le noyau et le rootfs sont contenus sur des partitions qui sont doublées :
Kernel A et Rootfs A sont utilisés
Le bootloader utilise la banque A pour démarrer le système.
Une banque est un ensemble de partitions et de fichiers qui fonctionnent ensemble. Au commencement, le système utilise la banque A, le fichier de mise à jour est présent sur la partition de data. Généralement, il est téléchargé depuis un serveur sécurisé, vérifié, puis décompressé. Le logiciel en charge de la mise à jour applique la nouvelle version sur la banque B : il copie le nouveau kernel sur la partition Kernel B, puis flashe l’image de la partition roots (le système) sur rootfs B. En cas d’extinction impromptue du système, la banque A reste utilisable à tout instant.
Mise à jour de la banque B

Au commencement, le système utilise la banque A, le fichier de mise à jour est présent sur la partition de data. Généralement, il est téléchargé depuis un serveur sécurisé, vérifié, puis décompressé.

Le logiciel en charge de la mise à jour applique la nouvelle version sur la banque B : il copie le nouveau kernel sur la partition Kernel B, puis flashe l’image de la partition roots (le système) sur rootfs B. En cas d’extinction impromptue du système, la banque A reste utilisable à tout instant.

Ensuite, la partition est vérifiée. Si elle n’est pas corrompue, la configuration du bootloader est changée afin qu’il pointe sur la banque B. Dans le cas contraire, la mise à jour sera retentée plus tard. Enfin, le système redémarre et le bootloader utilise la banque B. Si le système est fonctionnel, la banque B est « validée », sinon il est toujours possible de revenir sur la banque A. Cette mise à jour est effectuée depuis la banque A vers la B. La prochaine se fera depuis la B vers la A.

Le bootloader selectionne maintenant le kernel B et le rootfs B
État final de la table des partitions après la mise à jour.

Mise à jour A/B : outils

Swupdate est un excellent outil de mise à jour pour les systèmes embarqués utilisant Linux. Il permet de décrire une archive contenant des fichiers, des images et des scripts. Cette description est utilisée lors de la mise à jour pour appliquer les changements nécessaires. Swupdate est disponible sous licence libre et dispose d’une documentation complète.

Mise à jour de système embarqués : approches alternatives

Pour finir, si cette méthode de mise à jour A/B a fait ses preuves, elle présente l’inconvénient d’obliger la mise à jour de partitions complètes. Ainsi, des solutions comme les packages snap ou bien OSTree peuvent présenter un complément intéressant.

Une réponse

Les commentaires sont fermés.