Neden SWUpdate?
Saha güncellemeleri kaçınılmazdır. SWUpdate ürün yazılımını, kök dosya sistemlerini ve uygulama katmanlarını güncellemek için sağlam, modüler bir çözüm sunar - hepsi yerleşik geri alma özelliğine sahiptir.
Açık kaynaklıdır, iyi belgelenmiştir ve A/B bölümleme düzeniyle sorunsuz bir şekilde entegre olur.
Mimariye genel bakış
SWUpdate birkaç temel bileşenden oluşur:
- Güncelleme daemon'u (swupdate) - cihaz üzerinde çalışır ve güncellemeleri uygular
- Güncelleme işleyicileri - neyin güncelleneceğini tanımlayın (rootfs, dosyalar, betikler, vb.)
- İstemci arayüzleri - web arayüzü, REST API veya yerel CLI
- sw-description dosyası - güncelleme paketinin yapısını ve mantığını tanımlar
Örnek güncelleme akışı
- Aşağıdakileri içeren bir güncelleme paketi (.swu) oluşturun:
- Yeni bir kök dosya sistemi görüntüsü
- Bu sw-description dosya
- İsteğe bağlı komut dosyaları (özelleştirme veya doğrulama için)
2.swupdate Güncellemeyi tanımlanan cihazlara yazar.
- Güncelleme sonrası komut dosyası başarıyı onaylar veya gerekirse bir geri alma işlemini tetikler.
Örnek
Bu örnekte, bir resmi Raspberry Pi OS Trixie görüntüsünü iki dosyaya ayırın:
- 2025-10-01-raspios-trixie-arm64.boot.vfat
- 2025-10-01-raspios-trixie-arm64.root.ext4
Bu dosyalar, aşağıdaki dosyalarda referans sw-description dosyasını .swu paketini oluşturmak için kullanın:
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"
}
),
}Aşağıdaki Lua betiği, bölüm UUID'lerini cmdline.txt ve fstab yanıp söndükten sonra:
#!/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.")Kullanım swugenerator güncellemeyi paketlemek için:(https://github.com/sbabic/swugenerator).
Güncellemeyi uygulayın
Oluşturulan .swu dosyasını test etmek için:
- CM5'i kurtarma sistemine önyükleyin.
- Örneğin bir bağlama noktası oluşturun:
sudo mkdir -p /mnt/update- Güncelleme dosyasını içeren bir NFS paylaşımını bağlayın:
sudo mount -t nfs :/path/to/share /mnt/update- Güncellemeyi uygulayın:
sudo swupdate -i /mnt/update/update.swuEntegrasyon olanakları
Yerel bir kullanıcı arayüzünden veya arka uç API'sinden güncellemeleri tetikleyin
- Gelişmiş güvenlik için güncellemeleri imzalayın ve doğrulayın
- Kullanım SWUpdate’s test veya hata ayıklama için web arayüzü
- Kurtarma ve geri alma işlemlerini otomatikleştirmek için systemd hizmetleriyle birleştirin
Neden bu yığına uyuyor
ile birlikte rpi-image-gen ve rpi-sb-provisioner, SWUpdate resmi tamamlar:
- Oluştur → rpi-image-gen (Görüntü oluşturma)
- Dağıt → rpi-sb-provisioner (Cihaz hazırlama)
- Korumak → SWUpdate (OTA güncellemeleri ve yaşam döngüsü yönetimi)
Sonuç olarak esnek, açık ve bakımı yapılabilir bir gömülü Linux platform - ürününüzle birlikte gelişen, ek yük getirmeyen bir platform Yocto.
Bu serideki makaleler
- Building a Production-Ready Linux for Raspberry Pi Compute Module 5
- Stok İşletim Sisteminden Üretim Platformuna
- Customizing Raspberry Pi OS with rpi-image-gen
- Sistem Sağlamlığı - Bir A/B Kök Dosya Sistemi Düzeni Tasarlama
- Provisioning — Automating First Boot with rpi-sb-provisioner
- OTA ve Yaşam Döngüsü - Yazılım Güncellemeleri ile SWUpdate
Kaynaklar
- 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