Hoekom SWUpdate?
Veldopdaterings is onvermydelik. SWUpdate bied 'n robuuste, modulêre oplossing vir die opdatering van firmware, wortellêerstelsels en toepassingslae — alles met ingeboude terugrolvermoë.
Dit is oopbron, goed gedokumenteer, en integreer naatloos met 'n A/B-partisie-uitleg.
Argitektuur-oorsig
SWUpdate bestaan uit verskeie sleutelkomponente:
- Opdateringsdaemon (swupdate) — loop op die toestel en pas opdaterings toe
- Opdateringshanteerders — definieer wat om op te dateer (rootfs, lêers, skripte, ens.)
- Kliëntkoppelvlakke — webkoppelvlak, REST API, of plaaslike CLI
- sw-description lêer — definieer die struktuur en logika van die opdateringspakket
Voorbeeld van opdateringsvloei
- Bou 'n opdateringspakket (.swu) wat bevat:
• 'n Nuwe wortellêerstelselbeeld
• Die sw-description -lêer
• Opsionele skripte (vir aanpassing of verifikasie)
2.swupdate skryf die opdatering na die gedefinieerde toestelle. - 'n Na-opdateringskrip bevestig sukses of veroorsaak 'n terugrol indien nodig.
Voorbeeld
In hierdie voorbeeld verdeel ons 'n amptelike Raspberry Pi OS Trixie-beeld in twee lêers:
- 2025-10-01-raspios-trixie-arm64.boot.vfat
- 2025-10-01-raspios-trixie-arm64.root.ext4
Hierdie lêers word in die sw-description-lêer verwys om die .swu-pakket te skep:
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"
}
),
}Die volgende Lua-skrip pas UUID's in cmdline.txt en fstab aan na flits:
#!/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.")Gebruik swugenerator om die opdatering te bundel:(https://github.com/sbabic/swugenerator).
Pas die opdatering toe
Om die gegenereerde .swu-lêer te toets:
- Laai die CM5 in die reddingsisteem in.
- Skep 'n monteerpunt, byvoorbeeld:
sudo mkdir -p /mnt/update- Monteer 'n NFS-deel wat die opdateringslêer bevat:
sudo mount -t nfs :/path/to/share /mnt/update- Pas die opdatering toe:
sudo swupdate -i /mnt/update/update.swuIntegrasiemoontlikhede
Aktiveer opdaterings vanaf 'n plaaslike UI of backend-API
- Onderteken en verifieer opdaterings vir verbeterde sekuriteit
- Gebruik SWUpdate’s webkoppelvlak vir toetsing of foutopsporing
- Kombineer met systemd dienste om herstel en terugrolle te outomatiseer
Hoekom dit by hierdie stapel pas
Saam met rpi-image-gen en rpi-sb-provisioner, voltooi SWUpdate die prentjie:
- Bou → rpi-image-gen (Beeldskepping)
- Ontplooi → rpi-sb-provisioner (Toestelvoorsiening)
- Onderhou → SWUpdate (OTA-opdaterings en lewensiklusbestuur)
Die resultaat is 'n buigsame, oop en onderhoudbare ingebedde Linux -platform — een wat saam met jou produk ontwikkel, sonder die oorhoofse koste van Yocto.
Artikels in hierdie reeks
- Bou van 'n produksie-gereed Linux vir Raspberry Pi Compute Module 5
- Van Stock OS na Produksieplatform
- Aanpassing van Raspberry Pi OS met rpi-image-gen
- Stelselrobuustheid — Ontwerp van 'n A/B-wortellêerstelsel-uitleg
- Provisioning — Outomatisering van Eerste Opstart met rpi-sb-provisioner
- OTA en Lewensiklus — Sagteware-opdaterings met SWUpdate
Bronne
- rpi-image-gen: https://github.com/raspberrypi/rpi-image-gen
- rpi-sb-provisioner: https://github.com/raspberrypi/rpi-sb-provisioner
- SWUpdate: https://github.com/sbabic/swupdate
- swugenerator: https://github.com/sbabic/swugenerator