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.
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
- 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. - 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:
- But CM5 ke dalam sistem penyelamat.
- Buat titik pelekap, contohnya:
sudo mkdir -p /mnt/update- Pasang perkongsian NFS yang mengandungi fail kemas kini:
sudo mount -t nfs :/path/to/share /mnt/update- Gunakan kemas kini:
sudo swupdate -i /mnt/update/update.swuKemungkinan 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.
Artikel dalam siri ini
- Membina Linux sedia pengeluaran untuk Raspberry Pi Compute Module 5
- Daripada OS Stok kepada Platform Pengeluaran
- Menyesuaikan Raspberry Pi OS dengan rpi-image-gen
- Keteguhan Sistem — Merancang susun atur sistem fail A/B
- Provisioning — Mengautomasikan But Pertama dengan rpi-sb-provisioner
- OTA dan Kitaran Hayat — Kemas Kini Perisian dengan SWUpdate
Sumber
- 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