Skip to main content

De ce SWUpdate?

Actualizările pe teren sunt inevitabile. SWUpdate oferă o soluție robustă și modulară pentru actualizarea firmware-ului, a sistemelor de fișiere rădăcină și a straturilor de aplicații - toate cu o capacitate de revenire încorporată.
Este open source, bine documentat și se integrează perfect cu un layout de partiție A/B.

Navigator web GUI pentru SWUpdate

Prezentare generală a arhitecturii

SWUpdate constă din mai multe componente cheie:

  • Demonul de actualizare (swupdate) - rulează pe dispozitiv și aplică actualizările
  • Manipulatori de actualizare - definesc ce să actualizeze (rootfs, fișiere, scripturi etc.)
  • Interfețe client - interfață web, REST API sau CLI local
  • sw-description fișier - definește structura și logica pachetului de actualizare

Exemplu de flux de actualizare

  1. Creați un pachet de actualizare (.swu) care conține:
    • O nouă imagine a sistemului de fișiere rădăcină
    • Un fișier sw-description fișier
    • Scripturi opționale (pentru personalizare sau verificare)
      2.swupdate scrie actualizarea pe dispozitivele definite.
  2. Un script post-update confirmă succesul sau declanșează o revenire dacă este necesar.

Exemplu

În acest exemplu, am împărțit o imagine oficială Raspberry Pi OS Trixie oficială în două fișiere:

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

Aceste fișiere sunt menționate în fișierul sw-description pentru a crea pachetul .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"
        }
    ),
}

Următorul script Lua ajustează UUID-urile partițiilor din cmdline.txt și fstab după flashing:

#!/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.")

Utilizați swugenerator pentru a grupa actualizarea:(https://github.com/sbabic/swugenerator).

Aplicați actualizarea

Pentru a testa fișierul .swu generat:

  1. Porniți CM5 în sistemul de salvare.
  2. Creați un punct de montare, de exemplu:
sudo mkdir -p /mnt/update
  1. Montați o partajare NFS care conține fișierul de actualizare:
sudo mount -t nfs :/path/to/share /mnt/update
  1. Aplicați actualizarea:
sudo swupdate -i /mnt/update/update.swu

Posibilități de integrare

Declanșarea actualizărilor de la o interfață de utilizator locală sau de la un API backend

  • Semnați și verificați actualizările pentru o securitate sporită
  • Utilizați SWUpdate’s interfața web pentru testare sau depanare
  • Combinați cu serviciile systemd pentru a automatiza recuperarea și reluarea activității

De ce se potrivește acestui pachet

Împreună cu rpi-image-gen și rpi-sb-provisioner, SWUpdate completează imaginea:

  • Construiți → rpi-image-gen (crearea imaginii)
  • Deploy → rpi-sb-provisioner (Aprovizionarea dispozitivelor)
  • Menținerea → SWUpdate (actualizări OTA și gestionarea ciclului de viață)

Rezultatul este o platformă integrată flexibilă, deschisă și ușor de întreținut Linux o platformă care evoluează odată cu produsul dvs., fără costurile de Yocto.