چرا SWUpdate؟
به روزرسانی های میدانی اجتناب ناپذیر است. SWUpdate راه حلی مدولار و قوی برای به روزرسانی فرم ویر، سیستم های فایل ریشه و لایه های برنامه ارائه می دهد — همه با قابلیت بازگشت به عقب داخلی.
متن باز است، مستندسازی خوبی دارد و به طور یکپارچه با چیدمان پارتیشن A/B یکپارچه می شود.
مروری بر معماری
SWUpdate شامل چند مؤلفه کلیدی است:
- به روزرسانی دیمن (swupdate) — روی دستگاه اجرا می شود و به روزرسانی ها را اعمال می کند
- به روزرسانی کننده ها — تعریف کنید چه چیزی باید به روزرسانی شود (rootfها، فایل ها، اسکریپت ها و غیره)
- رابط های کلاینت — رابط وب، API REST یا CLI محلی
- فایل sw-description — ساختار و منطق بسته به روزرسانی را تعریف می کند
نمونه جریان به روزرسانی
۱. یک بسته به روزرسانی (.swu) بسازید که شامل موارد زیر باشد:
• یک تصویر جدید سیستم فایل ریشه
• پرونده sw-description
• اسکریپت های اختیاری (برای سفارشی سازی یا تأیید)
۲.swupdate به روزرسانی را روی دستگاه های تعریف شده می نویسد.
۳. اسکریپت پس از به روزرسانی موفقیت را تأیید می کند یا در صورت لزوم بازگردانی را فعال می کند.
مثال
در این مثال، یک تصویر رسمی 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 تولید شده:
۱. CM5 را وارد سیستم نجات کنید.
۲. برای مثال، یک نقطه نصب بسازید:
sudo mkdir -p /mnt/update۳. یک اشتراک NFS شامل فایل به روزرسانی نصب کنید:
sudo mount -t nfs :/path/to/share /mnt/update۴. به روزرسانی را اعمال کنید:
sudo swupdate -i /mnt/update/update.swuامکانات ادغام
به روزرسانی ها را از یک رابط کاربری محلی یا API بک اند فعال کنید
- امضا و تأیید به روزرسانی ها برای امنیت بهتر
- استفاده SWUpdate’s رابط وب برای تست یا اشکال زدایی
- ترکیب با خدمات systemd برای خودکارسازی بازیابی و بازگشت ها
چرا این استک به آن می خورد
همراه با rpi-image-gen و rpi-sb-provisioner، SWUpdate تصویر را کامل می کند:
- ساخت → rpi-image-gen (ایجاد تصویر)
- استقرار → rpi-sb-provisioner (تأمین دستگاه)
- حفظ → SWUpdate (به روزرسانی های OTA و مدیریت چرخه عمر)
نتیجه، یک پلتفرم Linux تعبیه شده انعطاف پذیر، باز و قابل نگهداری است — پلتفرمی که همراه با محصول شما تکامل می یابد، بدون سربار Yocto.
مقالات این مجموعه
- <a href="https://www.interelectronix.com/index%2Ephp/fa/sakht-yk-linux-amadh-twlyd-bray-raspberry-pi-compute-module-5.html" title="Building a Production-Ready لینوکس برای Raspberry Pi Compute Module 5«>ساخت یک Linux آماده تولید برای Raspberry Pi Compute Module 5
- از سیستم عامل استاندارد تا پلتفرم تولید
- <a href="https://www.interelectronix.com/index%2Ephp/fa/sfarshy-sazy-raspberry-pi-os-ba-rpi-image-gen.html" title="Customizing سیستم عامل Raspberry Pi با rpi-image-gen«>سفارشی سازی Raspberry Pi OS با rpi-image-gen
- پایداری سیستم — طراحی چیدمان سیستم فایل ریشه A/B
- Provisioning — خودکارسازی بوت اول با rpi-sb-provisioner
- OTA و چرخه عمر — به روزرسانی نرم افزار با SWUpdate
منابع
- 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