کیوں SWUpdate؟
فیلڈ اپ ڈیٹس ناگزیر ہیں۔ SWUpdate فرم ویئر، روٹ فائل سسٹمز، اور ایپلیکیشن لیئرز کو اپ ڈیٹ کرنے کے لیے ایک مضبوط، ماڈیولر حل فراہم کرتا ہے — سب کے ساتھ بلٹ ان رول بیک صلاحیت کے ساتھ۔
یہ اوپن سورس ہے، اچھی طرح دستاویزی ہے، اور A/B پارٹیشن لے آؤٹ کے ساتھ بغیر کسی رکاوٹ کے انٹیگریٹ ہو جاتا ہے۔
معماری کا جائزہ
SWUpdate کئی اہم اجزاء پر مشتمل ہے:
- اپ ڈیٹ ڈیمون (swupdate) — ڈیوائس پر چلتا ہے اور اپڈیٹس لاگو کرتا ہے
- اپ ڈیٹ ہینڈلرز — یہ طے کریں کہ کیا اپ ڈیٹ کرنا ہے (روٹ ایفز، فائلز، اسکرپٹس وغیرہ)
- کلائنٹ انٹرفیسز — ویب انٹرفیس، REST API، یا مقامی CLI
- sw-description فائل — اپ ڈیٹ پیکیج کی ساخت اور منطق کی وضاحت کرتی ہے
مثال اپ ڈیٹ فلو
- ایک اپ ڈیٹ پیکیج (.swu) بنائیں جس میں شامل ہوں:
• ایک نیا روٹ فائل سسٹم امیج
• sw-description فائل
• اختیاری اسکرپٹس (حسب ضرورت یا تصدیق کے لیے)
2.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 اسکرپٹ فلیش کرنے کے بعد cmdline.txt اور fstab میں پارٹیشن UUIDs کو ایڈجسٹ کرتا ہے:
#!/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انضمام کے امکانات
مقامی UI یا بیک اینڈ API سے اپ ڈیٹس ٹرگر کریں
- بہتر سیکیورٹی کے لیے اپ ڈیٹس پر دستخط اور تصدیق کریں
- ٹیسٹنگ یا ڈیبگنگ کے لیے SWUpdate’s ویب انٹرفیس استعمال کریں
- systemd سروسز کے ساتھ مل کر ریکوری اور رول بیکس کو خودکار بنانا
یہ اس اسٹیک میں کیوں فٹ بیٹھتا ہے
rpi-image-gen اور rpi-sb-provisionerکے ساتھ مل کر، SWUpdate تصویر کو مکمل کرتا ہے:
- بلڈ → rpi-image-gen (تصویر تخلیق)
- ڈیپلائے → rpi-sb-provisioner (ڈیوائس پروویژننگ)
- → SWUpdate برقرار رکھنا (OTA اپ ڈیٹس اور لائف سائیکل مینجمنٹ)
نتیجہ ایک لچکدار، کھلا اور قابل دیکھ بھال ایمبیڈڈ Linux پلیٹ فارم ہے — جو آپ کی پروڈکٹ کے ساتھ ترقی کرتا ہے، بغیر کسی اضافی بوجھ کے Yoctoکے۔
اس سلسلے کے مضامین
ذرائع
- 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