क्यों SWUpdate?
फ़ील्ड अद्यतन अपरिहार्य हैं। SWUpdate फर्मवेयर, रूट फाइल सिस्टम और एप्लिकेशन परतों को अपडेट करने के लिए एक मजबूत, मॉड्यूलर समाधान प्रदान करता है - सभी अंतर्निहित रोलबैक क्षमता के साथ।
यह खुला स्रोत है, अच्छी तरह से प्रलेखित है, और A/B विभाजन लेआउट के साथ सहजता से एकीकृत होता है।
वास्तुकला अवलोकन
SWUpdate में कई प्रमुख घटक होते हैं:
- डेमॉन अपडेट करें (swupdate) - डिवाइस पर चलता है और अपडेट लागू करता है
- हैंडलर अपडेट करें - परिभाषित करें कि क्या अपडेट करना है (रूटएफ, फ़ाइलें, स्क्रिप्ट, आदि)
- क्लाइंट इंटरफेस - वेब इंटरफ़ेस, आरईएसटी एपीआई, या स्थानीय सीएलआई
- sw-description फ़ाइल - अद्यतन पैकेज की संरचना और तर्क को परिभाषित करता है
उदाहरण अद्यतन प्रवाह
- एक अद्यतन पैकेज (.swu) बनाएँ जिसमें शामिल हैं:
• एक नई रूट फ़ाइल सिस्टम छवि
• sw-description फ़ाइल
• वैकल्पिक स्क्रिप्ट (अनुकूलन या सत्यापन के लिए)
2.swupdate परिभाषित उपकरणों के लिए अद्यतन लिखता है। - एक पोस्ट-अपडेट स्क्रिप्ट सफलता की पुष्टि करती है या यदि आवश्यक हो तो रोलबैक को ट्रिगर करती है।
उदाहरण
इस उदाहरण में, हम एक आधिकारिक Raspberry Pi OS Trixie छवि को दो फाइलों में विभाजित करते हैं:
- 2025-10-01-रास्पियोस-ट्रिक्सी-आर्म64.बूट.वीएफएटी
- 2025-10-01-रास्पियोस-ट्रिक्सी-आर्म64.रूट.ext4
इन फ़ाइलों को .swu पैकेज बनाने के लिए sw-description फ़ाइल में संदर्भित किया गया है:
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- अपडेट फ़ाइल वाले एनएफएस शेयर को माउंट करें:
sudo mount -t nfs :/path/to/share /mnt/update- अपडेट लागू करें:
sudo swupdate -i /mnt/update/update.swuएकीकरण की संभावनाएं
स्थानीय यूज़र इंटरफ़ेस (यूआई) या बैकएंड एपीआई से अपडेट ट्रिगर करें
- बेहतर सुरक्षा के लिए अपडेट पर हस्ताक्षर करें और सत्यापित करें
- परीक्षण या डिबगिंग के लिए SWUpdate’s वेब इंटरफ़ेस का उपयोग करें
- पुनर्प्राप्ति और रोलबैक को स्वचालित करने के लिए systemd सेवाओं के साथ संयोजन करें
यह इस स्टैक में क्यों फिट बैठता है
rpi-image-gen और rpi-sb-provisionerके साथ, SWUpdate चित्र को पूरा करता है:
- बिल्ड → rpi-image-gen (छवि निर्माण)
- → rpi-sb-provisioner तैनात करें (डिवाइस प्रावधान)
- → SWUpdate बनाए रखें (ओटीए अपडेट और जीवनचक्र प्रबंधन)
परिणाम एक लचीला, खुला और रखरखाव योग्य एम्बेडेड Linux प्लेटफॉर्म है - एक जो आपके उत्पाद के साथ विकसित होता है, बिना Yoctoके ओवरहेड के।
इस श्रृंखला में लेख
- Raspberry Pi Compute Module 5के लिए उत्पादन-तैयार Linux का निर्माण
- स्टॉक ओएस से प्रोडक्शन प्लेटफॉर्म तक
- rpi-image-genके साथ Raspberry Pi OS को अनुकूलित करना
- सिस्टम मजबूती - ए/बी रूट फाइल सिस्टम लेआउट डिजाइन करना
- Provisioning — rpi-sb-provisionerके साथ पहले बूट को स्वचालित करना
- ओटीए और जीवनचक्र - 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: <a href="https://github.com/sbabic/swugenerator" लक्ष्य = "_blank">https://github.com/sbabic/swugenerator