Tại sao SWUpdate?
Cập nhật hiện trường là không thể tránh khỏi. SWUpdate cung cấp một giải pháp mô-đun mạnh mẽ để cập nhật chương trình cơ sở, hệ thống tệp gốc và các lớp ứng dụng — tất cả đều có khả năng khôi phục tích hợp.
Nó là mã nguồn mở, được ghi chép đầy đủ và tích hợp liền mạch với bố cục phân vùng A / B.
Tổng quan về kiến trúc
SWUpdate bao gồm một số thành phần chính:
- Cập nhật daemon (swupdate) - chạy trên thiết bị và áp dụng các bản cập nhật
- Trình xử lý cập nhật — xác định những gì cần cập nhật (rootfs, tệp, tập lệnh, v.v.)
- Giao diện máy khách — giao diện web, API REST hoặc CLI cục bộ
- sw-description file — xác định cấu trúc và logic của gói cập nhật
Ví dụ về quy trình cập nhật
- Xây dựng gói cập nhật (.swu) chứa:
• Hình ảnh hệ thống tệp gốc mới
• Tệp sw-description
• Tập lệnh tùy chọn (để tùy chỉnh hoặc xác minh)
2.swupdate ghi bản cập nhật vào các thiết bị đã xác định. - Tập lệnh sau cập nhật xác nhận thành công hoặc kích hoạt khôi phục nếu cần.
Ví dụ
Trong ví dụ này, chúng tôi chia hình ảnh chính thức của Raspberry Pi OS Trixie thành hai tệp:
- 2025-10-01-raspios-trixie-arm64.boot.vfat
- 2025-10-01-raspios-trixie-arm64.root.ext4
Các tệp này được tham chiếu trong tệp sw-description để tạo gói .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"
}
),
}Tập lệnh Lua sau đây điều chỉnh UUID phân vùng trong cmdline.txt và fstab sau khi nhấp nháy:
#!/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.")Sử dụng swugenerator để gói bản cập nhật: (https://github.com/sbabic/swugenerator).
Áp dụng bản cập nhật
Để kiểm tra tệp .swu đã tạo:
- Khởi động CM5 vào hệ thống cứu hộ.
- Tạo một điểm gắn kết, ví dụ:
sudo mkdir -p /mnt/update- Gắn chia sẻ NFS chứa tệp cập nhật:
sudo mount -t nfs :/path/to/share /mnt/update- Áp dụng bản cập nhật:
sudo swupdate -i /mnt/update/update.swuKhả năng tích hợp
Kích hoạt cập nhật từ giao diện người dùng cục bộ hoặc API phụ trợ
- Ký và xác minh các bản cập nhật để tăng cường bảo mật
- Sử dụng giao diện web SWUpdate’s để kiểm tra hoặc gỡ lỗi
- Kết hợp với các dịch vụ systemd để tự động khôi phục và khôi phục
Tại sao nó phù hợp với ngăn xếp này
Cùng với rpi-image-gen và rpi-sb-provisioner, SWUpdate hoàn thiện bức tranh:
- Build → rpi-image-gen (Tạo hình ảnh)
- Triển khai → rpi-sb-provisioner (Cung cấp thiết bị)
- Duy trì → SWUpdate (cập nhật OTA và quản lý vòng đời)
Kết quả là một nền tảng Linux nhúng linh hoạt, mở và có thể bảo trì - một nền tảng phát triển cùng với sản phẩm của bạn mà không có chi phí Yocto.
Các bài viết trong loạt bài này
- Xây dựng một Linux sẵn sàng sản xuất cho Raspberry Pi Compute Module 5
- Từ hệ điều hành chứng khoán đến nền tảng sản xuất
- Tùy chỉnh Raspberry Pi OS với rpi-image-gen
- Tính mạnh mẽ của hệ thống — Thiết kế bố cục hệ thống tệp gốc A / B
- Provisioning — Tự động hóa lần khởi động đầu tiên với rpi-sb-provisioner
- OTA và Vòng đời — Cập nhật phần mềm với SWUpdate
Nguồn
- 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