Skip to main content

Pourquoi SWUpdate?

Les mises à jour sur le terrain sont inévitables. SWUpdate La solution de mise à jour des microprogrammes, des systèmes de fichiers racine et des couches d'application est robuste et modulaire, avec une capacité de retour en arrière intégrée.
Il s'agit d'un logiciel libre, bien documenté et qui s'intègre parfaitement à une configuration de partition A/B.

Interface graphique du navigateur web pour SWUpdate

Aperçu de l'architecture

SWUpdate se compose de plusieurs éléments clés :

  • Le démon de mise à jour (swupdate), qui s'exécute sur l'appareil et applique les mises à jour
  • Gestionnaires de mise à jour - définissent ce qui doit être mis à jour (rootfs, fichiers, scripts, etc.)
  • Interfaces client : interface web, API REST ou CLI locale.
  • sw-description fichier - définit la structure et la logique du paquet de mise à jour

Exemple de flux de mise à jour

  1. créez un paquet de mise à jour (.swu) qui contient :
    • une nouvelle image du système de fichiers racine
    • Le fichier sw-description fichier
    • Des scripts optionnels (pour la personnalisation ou la vérification)
      2.swupdate Un script de mise à jour écrit la mise à jour sur les périphériques définis.
  2. un script post-mise à jour confirme le succès ou déclenche un retour en arrière si nécessaire.

Exemple

Dans cet exemple, nous avons divisé une image officielle de Raspberry Pi OS officielle Trixie en deux fichiers :

  • 2025-10-01-raspios-trixie-arm64.boot.vfat
  • 2025-10-01-raspios-trixie-arm64.root.ext4

Ces fichiers sont référencés dans le fichier sw-description pour créer le paquet .swu :

software =
{
    version = "0.1.0";
    description = "Firmware update for XXXXX Project";

    hardware-compatibility: [ "1.0", "1.2", "1.3"];

    images: (
        {
            filename = "2025-10-01-raspios-trixie-arm64.boot.vfat";
            device = "/dev/mmcblk0p1";
            compressed = "zlib";
            installed-directly = true;
        },
        {
            filename = "2025-10-01-raspios-trixie-arm64.root.ext4";
            device = "/dev/mmcblk0p2";
            compressed = "zlib";
            installed-directly = true;
        }
    );

    scripts: (
        {
          type: "lua",
          filename: "repair-disk-uuid.lua"
        }
    ),
}

Le script Lua suivant ajuste les UUIDs des partitions dans cmdline.txt et fstab après le flashage :

#!/usr/bin/lua

-- helper: run shell command and capture output
function run(cmd)
  local f = io.popen(cmd)
  local out = f:read("*a")
  f:close()
  return (out:gsub("%s+$", ""))
end

-- detect PARTUUIDs
local root_part = "/dev/mmcblk0p2"
local boot_part = "/dev/mmcblk0p1"
local root_uuid = run("blkid -s PARTUUID -o value " .. root_part)
local boot_uuid = run("blkid -s PARTUUID -o value " .. boot_part)

print("Rootfs PARTUUID: " .. root_uuid)
print("Boot   PARTUUID: " .. boot_uuid)

-- mount points
os.execute("mkdir -p /mnt/root /mnt/boot")
os.execute("mount " .. root_part .. " /mnt/root")
os.execute("mount " .. boot_part .. " /mnt/boot")

-- update cmdline.txt
local cmdline_path = "/mnt/boot/cmdline.txt"
local file = io.open(cmdline_path, "r")
local text = file:read("*a")
file:close()

text = text:gsub("root=PARTUUID=[^ ]+", "root=PARTUUID=" .. root_uuid)

file = io.open(cmdline_path, "w")
file:write(text)
file:close()

-- update /etc/fstab
local fstab_path = "/mnt/root/etc/fstab"
local fstab = io.open(fstab_path, "r")
local content = fstab:read("*a")
fstab:close()

-- replace root line
content = content:gsub("PARTUUID=[^%s]+%s+/%s", "PARTUUID=" .. root_uuid .. " /")
-- replace boot line (/boot or /boot/firmware)
content = content:gsub("PARTUUID=[^%s]+%s+/boot", "PARTUUID=" .. boot_uuid .. " /boot")

fstab = io.open(fstab_path, "w")
fstab:write(content)
fstab:close()

os.execute("sync")
os.execute("umount /mnt/boot")
os.execute("umount /mnt/root")

print("All PARTUUIDs updated successfully.")

Utilisez swugenerator pour regrouper la mise à jour :(https://github.com/sbabic/swugenerator).

Appliquer la mise à jour

Pour tester le fichier .swu généré, procédez comme suit

  1. démarrez le CM5 dans le système de secours.
  2. créez un point de montage, par exemple :
sudo mkdir -p /mnt/update
  1. montez un partage NFS contenant le fichier de mise à jour :
sudo mount -t nfs :/path/to/share /mnt/update
  1. appliquez la mise à jour :
sudo swupdate -i /mnt/update/update.swu

Possibilités d'intégration

Déclenchez des mises à jour à partir d'une interface utilisateur locale ou d'une API dorsale.

  • Signez et vérifiez les mises à jour pour une sécurité accrue
  • Utilisez l'interface SWUpdate’s pour les tests ou le débogage
  • Combinez avec les services systemd pour automatiser la récupération et les retours en arrière.

Pourquoi il s'inscrit dans cette pile

Ensemble avec rpi-image-gen et rpi-sb-provisioner, SWUpdate complète l'image :

  • Construire → rpi-image-gen (création d'une image)
  • Déployer → rpi-sb-provisioner (approvisionnement en appareils)
  • Maintenir → SWUpdate (mises à jour OTA et gestion du cycle de vie)

Le résultat est une plateforme intégrée flexible, ouverte et facile à maintenir, qui évolue avec votre produit, sans frais supplémentaires. Linux qui évolue en même temps que votre produit, sans les frais généraux liés à l'utilisation d'un système d'exploitation. Yocto.