Skip to main content

Miért SWUpdate?

A helyszíni frissítések elkerülhetetlenek. SWUpdate robusztus, moduláris megoldást kínál a firmware, a root fájlrendszerek és az alkalmazási rétegek frissítésére - mindezt beépített visszaállítási képességgel.
Nyílt forráskódú, jól dokumentált, és zökkenőmentesen integrálódik egy A/B partíciós elrendezésbe.

Webböngésző GUI a SWUpdate

Építészeti áttekintés

SWUpdate több kulcsfontosságú összetevőből áll:

  • Frissítési démon (swupdate) - az eszközön fut és frissítéseket alkalmaz
  • Frissítéskezelők - meghatározza, hogy mit kell frissíteni (rootfs, fájlok, szkriptek stb.)
  • Ügyfélfelületek - webes felület, REST API vagy helyi CLI.
  • sw-description fájl - meghatározza a frissítési csomag szerkezetét és logikáját.

Példa frissítési folyamatra

  1. Állítson össze egy frissítőcsomagot (.swu), amely tartalmazza:
    • Egy új gyökér fájlrendszer-képet
    • A sw-description fájl
    • Választható szkriptek (testreszabáshoz vagy ellenőrzéshez).
      2.swupdate A frissítést a meghatározott eszközökre írja.
  2. A frissítés utáni szkript megerősíti a sikert, vagy szükség esetén visszaállítást indít.

Példa

Ebben a példában egy hivatalos Raspberry Pi OS Trixie-képet két fájlra:

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

Ezekre a fájlokra a sw-description fájlban a .swu csomag létrehozásához:

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"
        }
    ),
}

A következő Lua szkript módosítja a partíciók UUID-it a következő fájlokban cmdline.txt és a fstab a villogás után:

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

Használja a swugenerator a frissítés összevonásához:(https://github.com/sbabic/swugenerator).

A frissítés alkalmazása

A generált .swu fájl tesztelése:

  1. Indítsa el a CM5-öt a mentési rendszerbe.
  2. Hozzon létre egy csatolási pontot, például:
sudo mkdir -p /mnt/update
  1. Csatlakoztasson egy NFS-megosztást, amely a frissítési fájlt tartalmazza:
sudo mount -t nfs :/path/to/share /mnt/update
  1. Alkalmazza a frissítést:
sudo swupdate -i /mnt/update/update.swu

Integrációs lehetőségek

Frissítések indítása helyi felhasználói felületről vagy backend API-ról

  • A frissítések aláírása és ellenőrzése a fokozott biztonság érdekében
  • Használja SWUpdate’s webes felület teszteléshez vagy hibakereséshez
  • A systemd szolgáltatásokkal kombinálva automatizálhatja a helyreállítást és a visszaállításokat.

Miért illik ebbe a verembe

A következőkkel együtt rpi-image-gen és a rpi-sb-provisioner, SWUpdate kiegészíti a képet:

  • Építs → rpi-image-gen (Képalkotás)
  • Telepítés → rpi-sb-provisioner (eszközellátás)
  • Karbantartás → SWUpdate (OTA frissítések és életciklus-kezelés)

Az eredmény egy rugalmas, nyitott és karbantartható beágyazott Linux platform - amely a termékkel együtt fejlődik, a termékkel járó többletköltségek nélkül. Yocto.