Skip to main content

Mengapa SWUpdate?

Kemas kini lapangan tidak dapat dielakkan. SWUpdate menyediakan penyelesaian modular yang teguh untuk mengemas kini perisian tegar, sistem fail akar dan lapisan aplikasi — semuanya dengan keupayaan rollback terbina dalam.
Ia adalah sumber terbuka, didokumentasikan dengan baik, dan disepadukan dengan lancar dengan susun atur partition A/B.

GUI penyemak imbas web untuk SWUpdate

Gambaran keseluruhan seni bina

SWUpdate terdiri daripada beberapa komponen utama:

  • Kemas kini daemon (swupdate) — berjalan pada peranti dan menggunakan kemas kini
  • Kemas kini pengendali — tentukan perkara yang perlu dikemas kini (rootf, fail, skrip, dll.)
  • Antara muka pelanggan — antara muka web, REST API atau CLI tempatan
  • sw-description fail — mentakrifkan struktur dan logik pakej kemas kini

Contoh aliran kemas kini

  1. Bina pakej kemas kini (.swu) yang mengandungi:
    • Imej sistem fail akar baharu
    • Fail sw-description
    • Skrip pilihan (untuk penyesuaian atau pengesahan)
    2.swupdate menulis kemas kini kepada peranti yang ditentukan.
  2. Skrip pasca kemas kini mengesahkan kejayaan atau mencetuskan rollback jika perlu.

Contoh

Dalam contoh ini, kami membahagikan imej rasmi Raspberry Pi OS Trixie kepada dua fail:

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

Fail-fail ini dirujuk dalam fail sw-description untuk mencipta pakej .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"
        }
    ),
}

Skrip Lua berikut melaraskan UUID partition dalam cmdline.txt dan fstab selepas berkelip:

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

Gunakan swugenerator untuk menggabungkan kemas kini:(https://github.com/sbabic/swugenerator).

Gunakan kemas kini

Untuk menguji fail .swu yang dijana:

  1. But CM5 ke dalam sistem penyelamat.
  2. Buat titik pelekap, contohnya:
sudo mkdir -p /mnt/update
  1. Pasang perkongsian NFS yang mengandungi fail kemas kini:
sudo mount -t nfs :/path/to/share /mnt/update
  1. Gunakan kemas kini:
sudo swupdate -i /mnt/update/update.swu

Kemungkinan penyepaduan

Mencetuskan kemas kini daripada UI tempatan atau API bahagian belakang

  • Tandatangan dan sahkan kemas kini untuk keselamatan yang dipertingkatkan
  • Gunakan antara muka web SWUpdate’s untuk ujian atau penyahpepijatan
  • Gabungkan dengan perkhidmatan systemd untuk mengautomasikan pemulihan dan rollback

Mengapa ia sesuai dengan timbunan ini

Bersama-sama dengan rpi-image-gen dan rpi-sb-provisioner, SWUpdate melengkapkan gambar:

  • Bina → rpi-image-gen (Penciptaan imej)
  • Gunakan → rpi-sb-provisioner (Peruntukan peranti)
  • Mengekalkan → SWUpdate (kemas kini OTA dan pengurusan kitaran hayat)

Hasilnya ialah platform Linux terbenam yang fleksibel, terbuka dan boleh diselenggara — platform yang berkembang dengan produk anda, tanpa overhed Yocto.