تجاوز إلى المحتوى الرئيسي

لماذا SWUpdate?

التحديثات الميدانية أمر لا مفر منه. SWUpdate يوفر حلًا معياريًا قويًا ومعياريًا لتحديث البرامج الثابتة وأنظمة الملفات الجذرية وطبقات التطبيقات - كل ذلك مع إمكانية التراجع المدمجة.
إنه مفتوح المصدر، وموثق بشكل جيد، ويتكامل بسلاسة مع تخطيط قسم A/B.

واجهة المستخدم الرسومية لمتصفح الويب ل SWUpdate

نظرة عامة على الهندسة المعمارية

SWUpdate يتكون من عدة مكونات رئيسية

  • البرنامج الخفي للتحديث (swupdate) - يعمل على الجهاز ويطبق التحديثات
  • معالجات التحديث - تحديد ما يجب تحديثه (الجذور، والملفات، والبرامج النصية، وما إلى ذلك)
  • واجهات العميل - واجهة الويب أو واجهة برمجة تطبيقات REST أو واجهة برمجة التطبيقات المحلية
  • sw-description ملف - يحدد هيكل ومنطق حزمة التحديثات

مثال على تدفق التحديث

  1. إنشاء حزمة تحديث (.swu) تحتوي على:
    • صورة نظام ملفات جذر جديدة
    • ملف sw-description ملف
    • البرامج النصية الاختيارية (للتخصيص أو التحقق)
      2.swupdate يكتب التحديث إلى الأجهزة المحددة.
  2. يقوم البرنامج النصي لما بعد التحديث بتأكيد النجاح أو تشغيل التراجع إذا لزم الأمر.

مثال على ذلك

في هذا المثال، قمنا في هذا المثال بتقسيم Raspberry Pi OS صورة تريكسي الرسمية إلى ملفين:

  • 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 النصي التالي بضبط معرّفات UUID للأقسام في 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

إمكانيات التكامل

تشغيل التحديثات من واجهة المستخدم المحلية أو واجهة برمجة التطبيقات الخلفية

  • توقيع التحديثات والتحقق منها لتعزيز الأمان
  • استخدام SWUpdate’s واجهة الويب للاختبار أو التصحيح
  • الدمج مع خدمات systemd لأتمتة الاسترداد والتراجع

لماذا تناسب هذه الكومة

جنبا إلى جنب مع rpi-image-gen و rpi-sb-provisioner, SWUpdate يكملان الصورة:

  • إنشاء → rpi-image-gen (إنشاء الصورة)
  • النشر → rpi-sb-provisioner (توفير الجهاز)
  • الصيانة → SWUpdate (تحديثات OTA وإدارة دورة الحياة)

والنتيجة هي نظام أساسي مدمج مرن ومفتوح وقابل للصيانة Linux منصة مدمجة مرنة ومفتوحة وقابلة للصيانة - منصة تتطور مع منتجك، دون الحاجة إلى Yocto.