Zašto SWUpdate?
Ažuriranja terena su neizbježna. SWUpdate pruža robusno, modularno rješenje za ažuriranje firmwarea, root datotečnih sustava i aplikacijskih slojeva — sve s ugrađenom mogućnošću vraćanja podataka.
Otvorenog je koda, dobro dokumentiran i besprijekorno se integrira s A/B rasporedom particija.
Pregled arhitekture
SWUpdate se sastoji od nekoliko ključnih komponenti:
- Update daemon (swupdate) — izvršava se na uređaju i primjenjuje ažuriranja
- Upravitelji ažuriranja — definiraju što treba ažurirati (rootf-ove, datoteke, skripte itd.)
- Klijentska sučelja — web sučelje, REST API ili lokalni CLI
- sw-description datoteka — definira strukturu i logiku paketa za ažuriranje
Primjer tijeka ažuriranja
- Izraditi paket ažuriranja (.swu) koji sadrži:
• Nova slika korijenskog datotečnog sustava
• Dosje sw-description
• Opcionalne skripte (za prilagodbu ili verifikaciju)
2.swupdate zapisuje ažuriranje na definirane uređaje. - Post-update skripta potvrđuje uspjeh ili pokreće vraćanje unatrag ako je potrebno.
Primjer
U ovom primjeru podijelili smo službenu Raspberry Pi OS Trixie sliku u dvije datoteke:
- 2025-10-01-raspios-trixie-arm64.boot.vfat
- 2025-10-01-raspios-trixie-arm64.root.ext4
Te se datoteke referenciraju u sw-description datoteci za stvaranje .swu paketa:
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"
}
),
}Sljedeći Lua skript prilagođava particijske UUID-ove u cmdline.txt i fstab nakon flashanja:
#!/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.")Koristite swugenerator za pakiranje ažuriranja:(https://github.com/sbabic/swugenerator).
Primijenite ažuriranje
Za testiranje generirane .swu datoteke:
- Pokrenite CM5 u sustav za spašavanje.
- Na primjer, stvorite točku montaže:
sudo mkdir -p /mnt/update- Montirajte NFS share koji sadrži datoteku ažuriranja:
sudo mount -t nfs :/path/to/share /mnt/update- Primijenite ažuriranje:
sudo swupdate -i /mnt/update/update.swuMogućnosti integracije
Pokrenite ažuriranja s lokalnog sučelja ili backend API-ja
- Potpisivanje i provjera ažuriranja radi poboljšane sigurnosti
- Korištenje SWUpdate’s web sučelja za testiranje ili otklanjanje pogrešaka
- Kombinirati s systemd uslugama za automatizaciju oporavka i vraćanja na stare stranice
Zašto se uklapa u ovaj stack
Zajedno s rpi-image-gen i rpi-sb-provisioner, SWUpdate zaokružuje sliku:
- Build → rpi-image-gen (Kreiranje slika)
- Deploy → rpi-sb-provisioner (Device provisioning)
- Održavanje → SWUpdate (OTA ažuriranja i upravljanje životnim ciklusom)
Rezultat je fleksibilna, otvorena i održiva platforma za ugrađene Linux — ona koja se razvija zajedno s vašim proizvodom, bez opterećenja Yocto.
Članci u ovoj seriji
- Izgradnja produkcijskog Linux za Raspberry Pi Compute Module 5
- Od standardnog OS-a do produkcijske platforme
- Prilagodba Raspberry Pi OS s rpi-image-gen
- Sistemska robusnost — Dizajniranje A/B root rasporeda datotečnog sustava
- Provisioning — Automatizacija prvog pokretanja s rpi-sb-provisioner
- OTA i životni ciklus — Softverska ažuriranja s SWUpdate
Izvori
- 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