Skip to main content

למה SWUpdate?

עדכוני שטח הם בלתי נמנעים. SWUpdate מספק פתרון מודולרי וחזק לעדכון קושחה, מערכות קבצים שורשיות ושכבות יישומים — הכל עם יכולת גלגול מובנית.
הוא קוד פתוח, מתועד היטב, ומשתלב בצורה חלקה עם פריסת מחיצות A/B.

ממשק משתמש גרפי של דפדפן אינטרנט עבור SWUpdate

סקירת אדריכלות

SWUpdate מורכב ממספר מרכיבים מרכזיים:

  • שד עדכון (swupdate) — רץ על המכשיר ומיישם עדכונים
  • מטפלי עדכון — מגדירים מה לעדכן (rootfs, קבצים, סקריפטים וכו')
  • ממשקי לקוח — ממשק ווב, REST API, או CLI מקומי
  • קובץ sw-description — מגדיר את המבנה והלוגיקה של חבילת העדכון

דוגמה לזרימת עדכון

  1. בנה חבילת עדכון (.swu) שמכילה:
    • תמונת מערכת קבצים שורשית חדשה
    • קובץ sw-description
    • סקריפטים אופציונליים (להתאמה אישית או אימות)
    2.swupdate כותב את העדכון למכשירים שהוגדרו.
  2. סקריפט לאחר עדכון מאשר הצלחה או מפעיל חזרה חזרה אם צריך.

דוגמה

בדוגמה הזו, חילקנו תמונה רשמית של Raspberry Pi OS Trixie לשני קבצים:

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

קבצים אלו מוזכרים בקובץ sw-description ליצירת חבילת .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"
        }
    ),
}

סקריפט Lua הבא מתאים UUIDs של מחיצות ב-cmdline.txt ו-fstab לאחר פלאשינג:

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

השתמש swugenerator כדי לאגד את העדכון:(https://github.com/sbabic/swugenerator).

יישם את העדכון

כדי לבדוק את קובץ ה-.swu שנוצר:

  1. להפעיל את ה-CM5 למערכת החילוץ.
  2. ליצור נקודת הרכבה, לדוגמה:
sudo mkdir -p /mnt/update
  1. התקן שיתוף NFS המכיל את קובץ העדכון:
sudo mount -t nfs :/path/to/share /mnt/update
  1. יישם את העדכון:
sudo swupdate -i /mnt/update/update.swu

אפשרויות אינטגרציה

הפעלת עדכונים מממשק משתמש מקומי או מ-API בצד האחורי

  • חתימה ואימות עדכונים לשיפור האבטחה
  • שימוש בממשק ווב SWUpdate’s לבדיקה או ניפוי שגיאות
  • לשלב עם שירותי systemd לאוטומציה של שחזור וחזרה לאחור

למה זה מתאים לערימה הזו

יחד עם rpi-image-gen ו- rpi-sb-provisioner, SWUpdate משלים את התמונה:

  • Build → rpi-image-gen (יצירת תמונה)
  • פריסת → rpi-sb-provisioner (הקצאת מכשירים)
  • שמירה על → SWUpdate (עדכוני OTA וניהול מחזור חיים)

התוצאה היא פלטפורמת Linux משובצת גמישה, פתוחה וניתנת לתחזוקה — כזו שמתפתחת עם המוצר שלך, ללא העומס הכבד של Yocto.