Por quê? SWUpdate?
As atualizações de campo são inevitáveis. SWUpdate O sistema de atualização de firmware da Microsoft oferece uma solução robusta e modular para atualização de firmware, sistemas de arquivos raiz e camadas de aplicativos, tudo com recurso de reversão incorporado.
É de código aberto, bem documentado e se integra perfeitamente a um layout de partição A/B.
Visão geral da arquitetura
SWUpdate consiste em vários componentes principais:
- Daemon de atualização (swupdate) - é executado no dispositivo e aplica as atualizações
- Manipuladores de atualização - definem o que deve ser atualizado (rootfs, arquivos, scripts etc.)
- Interfaces de cliente - interface da Web, API REST ou CLI local
- sw-description Arquivo de atualização - define a estrutura e a lógica do pacote de atualização
Exemplo de fluxo de atualização
- crie um pacote de atualização (.swu) que contenha:
- Uma nova imagem do sistema de arquivos raiz
- O arquivo sw-description arquivo
- Scripts opcionais (para personalização ou verificação)
2.swupdate O usuário grava a atualização nos dispositivos definidos.
- um script pós-atualização confirma o sucesso ou aciona uma reversão, se necessário.
Exemplo
Neste exemplo, dividimos uma imagem oficial do Raspberry Pi OS oficial do Trixie em dois arquivos:
- 2025-10-01-raspios-trixie-arm64.boot.vfat
- 2025-10-01-raspios-trixie-arm64.root.ext4
Esses arquivos são referenciados no arquivo sw-description para criar o pacote .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"
}
),
}O script Lua a seguir ajusta os UUIDs da partição em cmdline.txt e fstab após o flash:
#!/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.")Use swugenerator para agrupar a atualização:(https://github.com/sbabic/swugenerator).
Aplicar a atualização
Para testar o arquivo .swu gerado:
- inicialize o CM5 no sistema de recuperação.
- crie um ponto de montagem, por exemplo:
sudo mkdir -p /mnt/update- monte um compartilhamento NFS que contenha o arquivo de atualização:
sudo mount -t nfs :/path/to/share /mnt/update- aplique a atualização:
sudo swupdate -i /mnt/update/update.swuPossibilidades de integração
Acione atualizações a partir de uma interface de usuário local ou de uma API de back-end
- Assine e verifique as atualizações para aumentar a segurança
- Use a SWUpdate’s interface da Web para testes ou depuração
- Combine com os serviços systemd para automatizar a recuperação e as reversões
Por que ele se encaixa nesta pilha
Junto com rpi-image-gen e rpi-sb-provisioner, SWUpdate completa a imagem:
- Construir → rpi-image-gen (Criação de imagem)
- Implantar → (provisionamento de dispositivos) rpi-sb-provisioner (Provisionamento de dispositivos)
- Maintain → (Manutenção) SWUpdate (Atualizações OTA e gerenciamento do ciclo de vida)
O resultado é uma plataforma incorporada flexível, aberta e de fácil manutenção Linux flexível, aberta e de fácil manutenção, que evolui com seu produto, sem a sobrecarga de Yocto.
Artigos desta série
- Building a Production-Ready Linux for Raspberry Pi Compute Module 5
- Do sistema operacional de estoque à plataforma de produção
- Customizing Raspberry Pi OS with rpi-image-gen
- Robustez do sistema - Projetando um layout de sistema de arquivos raiz A/B
- Provisioning — Automating First Boot with rpi-sb-provisioner
- OTA e ciclo de vida - Atualizações de software com SWUpdate
Fontes
- 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