Skip to main content

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.

Web GUI trình duyệt cho SWUpdate

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

  1. 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.
  2. 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.txtfstab 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:

  1. Khởi động CM5 vào hệ thống cứu hộ.
  2. Tạo một điểm gắn kết, ví dụ:
sudo mkdir -p /mnt/update
  1. Gắn chia sẻ NFS chứa tệp cập nhật:
sudo mount -t nfs :/path/to/share /mnt/update
  1. Áp dụng bản cập nhật:
sudo swupdate -i /mnt/update/update.swu

Khả 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-genrpi-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.