{"id":20038,"date":"2023-03-06T05:00:00","date_gmt":"2023-03-06T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=20038"},"modified":"2023-02-28T14:52:29","modified_gmt":"2023-02-28T13:52:29","slug":"swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/","title":{"rendered":"SWUpdate, czyli o aktualizacjach oprogramowania w \u015bwiecie Embedded Linux"},"content":{"rendered":"\n<p>W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded. Om\u00f3wione zostan\u0105 podstawowe strategie aktualizacji oprogramowania oraz przedstawione zostanie narz\u0119dzie SWUpdate. W tek\u015bcie znajdziemy przyk\u0142ady prostych aktualizacji z wykorzystaniem p\u0142ytki Raspberry Pi 4 oraz frameworku SWUpdate.<\/p>\n\n\n\n<p>Motywacj\u0105 do napisania artyku\u0142u by\u0142y dla mnie dotychczasowe do\u015bwiadczenia zwi\u0105zane z aktualizacjami urz\u0105dze\u0144 embedded, kt\u00f3re cz\u0119sto sprowadza\u0142y si\u0119 do wykonaniu skrypt\u00f3w napisanych wcze\u015bniej przez programist\u00f3w. Jako alternatyw\u0119 do tego podej\u015bcia mo\u017cemy u\u017cy\u0107 gotowego, dobrze przetestowanego narz\u0119dzia SWUpdate.<\/p>\n\n\n\n<p>Czasem \u2013 z ro\u017cnych przyczyn \u2013 urz\u0105dzenie Linux Embedded nie ma po\u0142\u0105czenia z sieci\u0105 Internet. W takim wypadku nie da si\u0119 przeprowadzi\u0107 aktualizacji zdalnie, tylko trzeba u\u017cy\u0107 do tego lokalnego interfejsu (UART, SD). W przyk\u0142adach skupi\u0119 si\u0119 na <strong>zdalnych aktualizacjach<\/strong>, aczkolwiek w przypadku wi\u0119kszo\u015bci poruszonych rozwa\u017ca\u0144 medium transmisyjne wykorzystane do aktualizacji nie ma wi\u0119kszego znaczenia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Strategie aktualizacji oprogramowania<\/strong><\/h2>\n\n\n\n<p>Poni\u017cej przestawi\u0119 dwie strategie przygotowania aktualizacji oprogramowania.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Aktualizacja pojedynczej aplikacji<\/strong><\/h3>\n\n\n\n<p>Polega na zaktualizowaniu pojedynczej aplikacji. Najprostszym sposobem przeprowadzenia tego typu aktualizacji jest np. u\u017cycie polecenia&nbsp;scp&nbsp;i podmiana pliku\/plik\u00f3w aplikacji na dysku.<\/p>\n\n\n\n<p>Chcia\u0142bym zacz\u0105\u0107 od <strong>zalet takiego rozwi\u0105zania<\/strong>. Pierwsz\u0105 korzy\u015bci\u0105 jest mniejszy rozmiar aktualizacji w por\u00f3wnaniu do aktualizacji pe\u0142nego obrazu systemu. Drug\u0105 jest to, \u017ce zazwyczaj po aktualizacji wystarczy ponownie uruchomi\u0107 dan\u0105 aplikacj\u0119, a nie ca\u0142y system operacyjny, aby zmiany zosta\u0142y zauwa\u017cone.<\/p>\n\n\n\n<p>Wyst\u0119puj\u0105 r\u00f3wnie\u017c <strong>ryzyka<\/strong>. Po zaktualizowaniu pojedynczej aplikacji mamy w gruncie rzeczy do czynienia z now\u0105 wersj\u0105 ca\u0142ego oprogramowania. Nowa wersja aplikacji mo\u017ce nie dzia\u0142a\u0107 r\u00f3wnie poprawnie z ca\u0142ym systemem jak wersja poprzednia. Podej\u015bcie to mo\u017ce prowadzi\u0107 szybko do problem\u00f3w z zale\u017cno\u015bciami i niesp\u00f3jno\u015bci\u0105 oprogramowania. Kolejnym ryzykiem jest \u201cpopsucie\u201d urz\u0105dzenia. Przyk\u0142adowo: je\u017celi podczas aktualizacji zabraknie zasilania, urz\u0105dzenie mo\u017ce znale\u017a\u0107 si\u0119 w bli\u017cej nieokre\u015blonym stanie i mo\u017cemy straci\u0107 mo\u017cliwo\u015b\u0107 ponownej aktualizacji oraz naprawienia sytuacji, przynajmniej zdalnie.<\/p>\n\n\n\n<p>Strategia aktualizacji pojedynczej aplikacji jest jednak cz\u0119sto wystarczaj\u0105ca i przede wszystkim szybka oraz prosta w u\u017cyciu. W przypadku projekt\u00f3w we wczesnej fazie rozwoju, gdzie niezawodno\u015b\u0107 nie ogrywa kluczowej roli, a urz\u0105dzenie cz\u0119sto mamy pod r\u0119k\u0105, <strong>podej\u015bcie to bardzo dobrze si\u0119 sprawdza<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Aktualizacje pe\u0142nego obrazu systemu<\/strong><\/h3>\n\n\n\n<p>Kolejn\u0105 strategi\u0105 aktualizacji jest aktualizacja nie pojedynczej aplikacji, a ca\u0142ego systemu.<\/p>\n\n\n\n<p><strong>Zalet\u0119<\/strong> rozwi\u0105zania stanowi fakt, i\u017c dostarczaj\u0105c pe\u0142en obraz systemu, nie musimy si\u0119 martwi\u0107 sp\u00f3jno\u015bci\u0105 oprogramowania, poniewa\u017c dostarczamy oprogramowanie w danej konfiguracji, kt\u00f3ra zosta\u0142a wcze\u015bniej przetestowana. Innym atutem jest to, \u017ce je\u015bli aktualizacja si\u0119 nie uda albo zabraknie zasilania podczas aktualizacji, s\u0105 dost\u0119pne mechanizmy, kt\u00f3re pomog\u0105 nam wyj\u015b\u0107 z opresji.<\/p>\n\n\n\n<p>Jej wad\u0105 jest rozmiar przesy\u0142anej paczki. Mo\u017ce by\u0107 to szczeg\u00f3lnie problemem, kiedy transfer danych jest ograniczony. To podej\u015bcie wymaga te\u017c bardziej rozleg\u0142ej wiedzy (bootloader itp).<\/p>\n\n\n\n<p>Mo\u017cemy wyr\u00f3\u017cni\u0107 trzy r\u00f3\u017cne strategie w tym obszarze:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>single copy,<\/li><li>dual copy,<\/li><li>differential update.<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Dual copy<\/strong><\/h4>\n\n\n\n<p>Partycjonowanie urz\u0105dzenia wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"938\" height=\"67\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/1-5.png\" alt=\"\" class=\"wp-image-20039\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/1-5.png 938w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/1-5-300x21.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/1-5-768x55.png 768w\" sizes=\"(max-width: 938px) 100vw, 938px\" \/><\/figure>\n\n\n\n<p>W przypadku strategii dual copy mamy dwie partycje zawieraj\u0105ce system operacyjny. W danej chwili aktywny jest tylko jeden OS, a drugi pozostaje nieaktywny.<\/p>\n\n\n\n<p>Zasada dzia\u0142ania aktualizacji jest prosta. Urz\u0105dzenie odpytuje o dost\u0119pne aktualizacje. Kiedy otrzyma pozytywn\u0105 odpowied\u017a, to pobiera nowy obraz i zapisuje go na nieaktywnej partycji. W kolejnym kroku urz\u0105dzenie musi zosta\u0107 uruchomione ponownie z now\u0105 zapisan\u0105 partycj\u0105 oznaczon\u0105 jako aktywna.<\/p>\n\n\n\n<p>Tym sposobem doszli\u015bmy <strong>do zalet<\/strong> tego podej\u015bcia. W przypadku, kiedy nowo zapisany obraz systemu nie uruchamia si\u0119 poprawnie, zawsze mo\u017cna powr\u00f3ci\u0107 do poprzedniej wersji i zrobi\u0107 j\u0105 aktywn\u0105. Gdy podczas aktualizacji zabraknie zasilania, urz\u0105dzenie nadal b\u0119dzie mog\u0142o korzysta\u0107 ze \u201estarego\u201d obrazu systemu i ponowi\u0107 pr\u00f3b\u0119 aktualizacji. Plusem jest r\u00f3wnie\u017c to, \u017ce nie potrzebujemy \u017cadnej interakcji z u\u017cytkownikiem, poniewa\u017c wszystkie operacje zwi\u0105zane z aktualizacj\u0105 mog\u0105 zosta\u0107 wykonane w tle.<\/p>\n\n\n\n<p><strong>Wad\u0105<\/strong> rozwi\u0105zania jest ilo\u015b\u0107 potrzebnego miejsca. Mo\u017cna powiedzie\u0107, \u017ce potrzebujemy minimum dwa razy tyle miejsca na dysku, jak w przypadku aktualizacji pojedynczej aplikacji na urz\u0105dzeniu z jednym OS. Pewn\u0105 niedogodno\u015bci\u0105 mo\u017ce by\u0107 r\u00f3wnie\u017c to, \u017ce wymagane jest ponowne uruchomienie urz\u0105dzenia.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong><strong>Single Copy<\/strong><\/strong><\/h4>\n\n\n\n<p>Partycjonowanie urz\u0105dzenia wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"938\" height=\"67\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/2-2.png\" alt=\"\" class=\"wp-image-20041\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/2-2.png 938w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/2-2-300x21.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/2-2-768x55.png 768w\" sizes=\"(max-width: 938px) 100vw, 938px\" \/><\/figure>\n\n\n\n<p>Podstawow\u0105 r\u00f3\u017cnic\u0105 mi\u0119dzy strategi\u0105 single copy a dual copy jest to, \u017ce w przypadku tej pierwszej <strong>u\u017cywamy Recovery OS<\/strong> zamiast drugiej partycji z pe\u0142nym OS. Recovery OS to minimalny obraz systemu, z kt\u00f3rego mo\u017cna wystartowa\u0107 urz\u0105dzenie, umo\u017cliwiaj\u0105cy zainstalowania aktualizacji.<\/p>\n\n\n\n<p>Aktualizacje mo\u017cna podzieli\u0107 na nast\u0119puj\u0105ce kroki:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>&nbsp;Urz\u0105dzenie odpytuje si\u0119 o dost\u0119pne aktualizacje i je\u015bli takowe znajdzie, pobiera obraz i zapisuje go na partycji danych.<\/li><li>Nast\u0119pnie prosi u\u017cytkownika o rozpocz\u0119cie ich instalowania.<\/li><li>W kolejnym kroku urz\u0105dzenie zostaje uruchomione z Recovery OS, a pobrany wcze\u015bniej obraz nadpisuje Regular OS.<\/li><li>Na koniec pozostaje uruchomi\u0107 urz\u0105dzenie, \u0142aduj\u0105c podstawowy obraz systemu.<\/li><\/ol>\n\n\n\n<p>Jest niestety kilka <strong>wad<\/strong> tego podej\u015bcia. Potrzebujemy sporo miejsca na partycji danych, poniewa\u017c obraz musi zosta\u0107 gdzie\u015b pobrany. Urz\u0105dzenie przez czas instalowania aktualizacji pozostaje nieaktywne. W razie nieudanej aktualizacji pozostajemy z urz\u0105dzeniem w trybie recovery, ale z dobrych stron mo\u017cemy spr\u00f3bowa\u0107 zainstalowa\u0107 aktualizacje jeszcze raz.<\/p>\n\n\n\n<p>Niestety nie mo\u017cemy pobra\u0107 obrazu jeszcze raz, bo ten krok jest wykonywany przy u\u017cyciu podstawowego OS, a nie recovery. W takim wypadku, je\u015bli wcze\u015bniej pobrany obraz jest w jaki\u015b spos\u00f3b uszkodzony, b\u0119dziemy musieli podj\u0105\u0107 si\u0119 manualnej naprawy problemu.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Differential update<\/strong><\/h4>\n\n\n\n<p>Jest to rodzaj aktualizacji, kt\u00f3ry rozwi\u0105zuje problem z jej wielko\u015bci\u0105. Polega na pobieraniu i zapisywaniu r\u00f3\u017cnic mi\u0119dzy starym a nowym obrazem. Nie b\u0119d\u0119 si\u0119 tutaj wi\u0119cej rozpisywa\u0142, poniewa\u017c jest to obszerny temat, <a href=\"https:\/\/sbabic.github.io\/swupdate\/delta-update.html\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >dobrze opisany w dost\u0119pnych materia\u0142ach.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Czym jest SWUpdate?<\/strong><\/h2>\n\n\n\n<p>SWUpdate jest to \u2018Linux Update agent\u2019, kt\u00f3rego g\u0142\u00f3wnym zadaniem jest pomoc w przeprowadzeniu aktualizacji systemu Embedded Linux. Mo\u017ce zosta\u0107 zainstalowany za pomoc\u0105 komendy menad\u017cera pakiet\u00f3w b\u0105d\u017a zbudowany ze \u017ar\u00f3de\u0142. Projekt oferuje sporo mo\u017cliwo\u015bci i dzi\u0119ki niemu nie musimy wymy\u015bla\u0107 wszystkiego od nowa.<\/p>\n\n\n\n<p>G\u0142\u00f3wne funkcjonalno\u015bci:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>wsparcie wielu strategii aktualizacji, pojedynczych aplikacji oraz ca\u0142ych partycji,<\/li><li>obs\u0142uga wielu no\u015bnik\u00f3w danych za pomoc\u0105 r\u00f3\u017cnych handler\u00f3w (eMMC, SD, Raw NAND, NOR, \u2026),<\/li><li>obs\u0142uga wielu lokalnych interfejs\u00f3w do pobrania oprogramowania (USB, SD, SPI, UART),<\/li><li>mo\u017cliwo\u015b\u0107 przeprowadzania zdalnych aktualizacji,<\/li><li>zintegrowany web serwer do przeprowadzenia aktualizacji,<\/li><li>tryb ci\u0105g\u0142ego odpytywania si\u0119 o dost\u0119pne aktualizacje,<\/li><li>mo\u017cliwa integracja z serwerami do zarz\u0105dzania aktualizacjami \u2013 obecna wersja wspiera serwer Hawkbit,<\/li><li>obs\u0142uga zaszyfrowanych\/podpisanych aktualizacji,<\/li><li>sprawdzanie kompatybilno\u015bci pomi\u0119dzy rewizj\u0105 oprogramowania i urz\u0105dzenia,<\/li><li>mo\u017cliwo\u015b\u0107 dodawania w\u0142asnych handler\u00f3w do obs\u0142ugi niestandardowych protoko\u0142\u00f3w.<\/li><\/ul>\n\n\n\n<p>Wymienione zosta\u0142a tylko cz\u0119\u015b\u0107 mo\u017cliwo\u015bci jakie oferuje framework SWUpdate. Wi\u0119cej dowiecie si\u0119 <a href=\"https:\/\/sbabic.github.io\/swupdate\/swupdate.html\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >ze strony internetowej projektu<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Budowa pliku aktualizacji<\/strong><\/h3>\n\n\n\n<p>Jednym z za\u0142o\u017ce\u0144 projektu SWUpdate jest u\u017cycie do aktualizacji pojedynczego pliku.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/swupdate.drawio.svg\"><img decoding=\"async\" width=\"221\" height=\"331\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/swupdate.drawio.svg\" alt=\"Aktualizacja pojedynczego pliku\" class=\"wp-image-20043\"\/><\/a><figcaption>Ryc. 1 Aktualizacja pojedynczego pliku<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>sw-description \u2013 zawiera meta informacje o pliku aktualizacji. Plik aktualizacji mo\u017ce obejmowa\u0107 wiele obraz\u00f3w\/plik\u00f3w. SWUpdate u\u017cywa biblioteki \u201elibconfig\u201d jako domy\u015blnego parsera pliku sw-description. Istnieje jednak mo\u017cliwo\u015b\u0107 rozszerzenia SWUpdate i dodania w\u0142asnego parsera, opartego na innej sk\u0142adni i j\u0119zyku ni\u017c ten obs\u0142ugiwany przez libconfig,<\/li><li>image 1 \u2026 image n \u2013 poszczeg\u00f3lne obrazy\/pliki u\u017cyte podczas aktualizacji.<\/li><\/ul>\n\n\n\n<p>Wszystkie pojedyncze obrazy\/pliki s\u0105 spakowane razem wraz z plikiem sw-description jako archiwum&nbsp;cpio&nbsp;(wybrano&nbsp;cpio&nbsp;ze wzgl\u0119du na jego prostot\u0119 i mo\u017cliwo\u015b\u0107 przesy\u0142ania strumieniowego).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przyk\u0142ady<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wymagania<\/strong><\/h3>\n\n\n\n<p>Do wykonania przyk\u0142ad\u00f3w potrzebujemy urz\u0105dzenia z systemem Linux oraz komputera, z kt\u00f3rego przeprowadzimy aktualizacje urz\u0105dzenia. W moim przypadku u\u017cy\u0142em p\u0142ytki Raspberry Pi 4 oraz komputera z zainstalowanym Ubuntu 22.04.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przygotowanie \u015brodowiska<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>Przygotowanie obrazu systemu Raspian. Wa\u017cne, aby serwis&nbsp;ssh&nbsp;by\u0142 domy\u015blnie w\u0142\u0105czony. [host]<\/li><li>Zapisanie obrazu na karcie SD i zamontowanie jej w p\u0142ytce. [host, Raspberry Pi]<\/li><li>Zainstalowanie narz\u0119dzia SWUpdate na urz\u0105dzeniu, kt\u00f3rego oprogramowanie b\u0119dzie aktualizowane. SWUpdate mo\u017cna dostarczy\u0107 z u\u017cyciem menad\u017cera pakiet\u00f3w b\u0105d\u017a zbudowa\u0107 ze \u017ar\u00f3de\u0142. W przyk\u0142adzie zosta\u0142a wybrana druga opcja. [Raspberry Pi]<\/li><\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n #install with apt\n sudo apt-get install swupdate\n\n #install from sources\n cd \/home\/pi\n sudo apt-get install lua5.2-dev libssl-dev libconfig-dev libarchive-dev libzmq3-dev libz-dev libcurl4-gnutls-dev libjson-c-dev\n git clone https:\/\/github.com\/sbabic\/swupdate.git &amp;amp;&amp;amp; cd swupdate\n make test_defconfig\n \/\/ Optionally: make menuconfig\n make &amp;amp;&amp;amp; sudo make install\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" type=\"1\" start=\"4\"><li>Przygotowanie pary kluczy (je\u015bli wcze\u015bniej zosta\u0142o w\u0142\u0105czone wsparcie dla podpisywanych paczek). [host]<\/li><\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nopenssl genrsa -out swupdate-priv.pem\n openssl rsa -in swupdate-priv.pem -out swupdate-public.pem -outform PEM -pubout\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" type=\"1\" start=\"5\"><li>Skopiowanie klucza publicznego na p\u0142ytk\u0119. [host]<\/li><\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nscp swupdate-public.pem pi@raspberrypi.local:\/home\/pi\/data\/security\/\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" type=\"1\" start=\"6\"><li>Uruchomienie SWUpdate. [Raspbery Pi]<br><\/li><\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nsudo swupdate -v -k \/home\/pi\/data\/security\/swupdate-public.pem -w &quot;-document_root \/home\/pi\/swupdate\/www&quot;\n \/\/ -v \u2013 ustawia maksymalny poziom logowania\n \/\/ -k \u2013 wskazuje na lokalizacje klucza publicznego, kt\u00f3ry zostanie u\u017cyty do weryfikacji instalowanej aktualizacji\n \/\/ -w \u2013 m\u00f3wi, \u017ce zostanie uruchomiony wbudowany webserwer\n \/\/ -document_root \u2013 \u015bcie\u017cka, gdzie znajduje si\u0119 `document root` webservera. Je\u015bli SWUpdate zosta\u0142 zainstalowany za pomoc\u0105 menad\u017cera pakiet\u00f3w, to trzeba pobra\u0107 repozytorium projektu, poniewa\u017c w nim znajduje si\u0119 wymagany &quot;document root&quot; dla webservera \n\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" start=\"7\"><li>Jako ostatni krok w celu weryfikacji mo\u017cemy uruchomi\u0107 przegl\u0105dark\u0119 i wprowadzi\u0107 stron\u0119 interfejsu webowego SWUpdate: http:\/\/IP-URZ\u0104DZENIA:8080. [host]<\/li><\/ol>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_start.png\"><img decoding=\"async\" width=\"387\" height=\"204\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_start.png\" alt=\"Software update\" class=\"wp-image-20046\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_start.png 387w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_start-300x158.png 300w\" sizes=\"(max-width: 387px) 100vw, 387px\" \/><\/a><figcaption>Ryc. 2 Software update<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przyk\u0142ad 1 \u2013 aktualizacje pojedynczej aplikacji<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Aktualizacja krok po kroku<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>Stworzenie pliku sw-description. [host]<\/li><\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nsoftware =\n {\n     version = &quot;1.0.1&quot;;\n     raspberrypi = {\n         hardware-compatibility: &#x5B; &quot;1.0&quot; ];\n         files: (\n             {\n                 filename = &quot;myApp&quot;;\n                 path = &quot;\/usr\/bin\/myApp&quot;;\n                 sha256 = &quot;a25c88c564ad0e8c42d9863c3a4309c88a264a4b2fca56031e835f05a8e653d1&quot;;\n             }\n         );\n     };\n }\n<\/pre><\/div>\n\n\n<p>Opis parametr\u00f3w w sw-description:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>version \u2013 wersja, do kt\u00f3rej si\u0119 aktualizujemy,<\/li><li>filename \u2013 nazwa aplikacji, kt\u00f3ra zostanie zaktualizowana,<\/li><li>path \u2013 \u015bcie\u017cka dost\u0119pu do aktualizowanej aplikacji,<\/li><li>sha256 \u2013 hash nowej wersji aplikacji.<\/li><\/ul>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\" start=\"2\"><li>Podpisanie paczki. [host]<\/li><\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n openssl dgst -sha256 -sign ~\/swupdate-priv.pem sw-description &gt; sw-description.sig\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" type=\"1\" start=\"3\"><li>Stworzenie archiwum cpio, w moim przypadku robi\u0119 to w Bashu. [host]<\/li><\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nFILES=&quot;sw-description sw-description.sig myApp&quot;\n\n for i in $FILES; do echo $i; done | cpio -ov -H odc &gt;  update-image-v1.swu\n sw-description\n sw-description.sig\n myApp\n 3 blocks\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" start=\"4\"><li>Zaktualizowanie p\u0142ytki z pomoc\u0105 interfejsu webowego. Krok ten wymaga uruchomienia przegl\u0105darki oraz uruchomienia interfejsu webowego SWUpdate. Adres mojej p\u0142ytki Raspberry Pi 4 jest nast\u0119puj\u0105cy: http:\/\/raspberrypi.local:8080. Nast\u0119pnie, za pomoc\u0105 przycisku na stronie wskazujemy plik z aktualizacj\u0105: update-image-v1.swu<\/li><\/ol>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_success.png\"><img decoding=\"async\" width=\"636\" height=\"854\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_success.png\" alt=\"Software update, software upload\" class=\"wp-image-20048\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_success.png 636w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_success-223x300.png 223w\" sizes=\"(max-width: 636px) 100vw, 636px\" \/><\/a><figcaption>Ryc. 3 Software Update, software upload<\/figcaption><\/figure><\/div>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\" start=\"5\"><li>W celu weryfikacji czy aplikacja zosta\u0142a zaktualizowana poprawnie, pod\u0142\u0105czam si\u0119 za pomoc\u0105&nbsp;ssh&nbsp;do p\u0142ytki i sprawdzam, czy zawarto\u015b\u0107 pliku aplikacji zosta\u0142a podmieniona na now\u0105 wersj\u0119. Wcze\u015bniej w pliku myApp znajdowa\u0142 si\u0119 teks&nbsp;myApp v0&nbsp;[Raspbery Pi]<\/li><\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\npi@raspberrypi:~ $ sudo cat \/usr\/bin\/myApp \nmyApp v1\n<\/pre><\/div>\n\n\n<p>Aplikacja zosta\u0142a zaktualizowana pomy\u015blnie. <strong>W ramach \u0107wicze\u0144 proponuj\u0119<\/strong> wys\u0142a\u0107 paczk\u0119 aktualizacyjn\u0105 bez lub z niepoprawn\u0105 sygnatur\u0105 i zobaczy\u0107 jaki dostaniemy komunikat.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przyk\u0142ad 2 \u2013 hardware compatibility<\/strong><\/h2>\n\n\n\n<p>Jedn\u0105 z opcji, jakie udost\u0119pnia framework SWUpdate, jest sprawdzenie kompatybilno\u015bci aktualizacji ze sprz\u0119tem, na kt\u00f3rym ma zosta\u0107 zainstalowana.<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>Na urz\u0105dzeniu Linux Embedded trzeba stworzy\u0107 plik \/etc\/hwrevision, \u015bcie\u017cka mo\u017ce by\u0107 inna, ale wtedy trzeba powiedzie\u0107 o tym SWUpdate podczas uruchamiania poprzez parametr. Plik ten opisuje rewizje hardwaru. Na moim urz\u0105dzeniu plik wygl\u0105da nast\u0119puj\u0105co:<\/li><\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n pi@raspberrypi:~ $ cat \/etc\/hwrevision\n raspberrypi 1.0\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" start=\"2\"><li>Kolejnym krokiem jest dodanie w pliku sw-description rewizji hardware compatibility, dla kt\u00f3rych przeznaczona jest aktualizacja:<\/li><\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nsoftware =\n{\n version = &quot;1.0.1&quot;;\n raspberrypi = {\n     \/\/ soft kompatybilny z hardwarem\n     hardware-compatibility: &#x5B; &quot;1.0&quot; ];\n     \/\/ niekompatybilny soft z hardwarem\n     \/\/ hardware-compatibility: &#x5B; &quot;3.0&quot; ];\n     ...\n }\n ...\n}\n<\/pre><\/div>\n\n\n<p>W przypadku, kiedy aktualizacja nie b\u0119dzie kompatybilna z rewizj\u0105 sprz\u0119tu, nie zostanie ona zainstalowana i zwr\u00f3ci komunikat b\u0142\u0119du:&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_hwrevision.png\"><img decoding=\"async\" width=\"587\" height=\"329\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_hwrevision.png\" alt=\"Hardware cojmpatibility\" class=\"wp-image-20054\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_hwrevision.png 587w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_hwrevision-300x168.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate_hwrevision-555x312.png 555w\" sizes=\"(max-width: 587px) 100vw, 587px\" \/><\/a><figcaption>Ryc. 4 Hardware compatibility<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Framework SWUpdate pozwala podej\u015b\u0107 do aktualizacji w prosty i bezpieczny spos\u00f3b. Jest rozbudowanym narz\u0119dziem i posiada wiele innych, ciekawych mo\u017cliwo\u015bci jak aktualizacje z wykorzystaniem pe\u0142nego obrazu systemu b\u0105d\u017a integracja z serwerem HawkBit \u2013 zach\u0119cam do zapoznania si\u0119 z nim.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Wi\u0119cej artyku\u0142\u00f3w naszych ekspert\u00f3w <a href=\"https:\/\/sii.pl\/blog\/all\/embedded\/\" target=\"_blank\" aria-label=\"z obszaru embedded znajdziesz tutaj (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">z obszaru embedded znajdziesz tutaj<\/a>.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;20038&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;13&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.8&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.8\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;SWUpdate, czyli o aktualizacjach oprogramowania w \u015bwiecie Embedded Linux&quot;,&quot;width&quot;:&quot;152.6&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 152.6px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            4.8\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded. Om\u00f3wione zostan\u0105 podstawowe strategie aktualizacji oprogramowania oraz przedstawione zostanie narz\u0119dzie SWUpdate. &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/\">Continued<\/a><\/p>\n","protected":false},"author":481,"featured_media":20060,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":7,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[563,155],"class_list":["post-20038","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-embedded","tag-linux"],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded, opisz\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\u0119dzie SWUpdate.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Cezary Czajka\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"blogersii\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"SWUpdate \u2013 aktualizacje oprogramowania w Embedded Linux\" \/>\n\t\t<meta property=\"og:description\" content=\"W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded, opisz\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\u0119dzie SWUpdate.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"733\" \/>\n\t\t<meta property=\"og:image:height\" content=\"456\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2023-03-06T04:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2023-02-28T13:52:29+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Sii.Polska\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"SWUpdate \u2013 aktualizacje oprogramowania w Embedded Linux\" \/>\n\t\t<meta name=\"twitter:description\" content=\"W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded, opisz\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\u0119dzie SWUpdate.\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#article\",\"name\":\"SWUpdate \\u2013 aktualizacje oprogramowania w Embedded Linux\",\"description\":\"W artykule porusz\\u0119 temat zdalnych aktualizacji urz\\u0105dze\\u0144 Linux Embedded, opisz\\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\\u0119dzie SWUpdate.\",\"inLanguage\":\"pl-PL\",\"headline\":\"SWUpdate, czyli o aktualizacjach oprogramowania w \\u015bwiecie Embedded Linux\",\"author\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/author\\\/cczajka\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/#organization\"},\"datePublished\":\"2023-03-06T04:00:00+01:00\",\"dateModified\":\"2023-02-28T13:52:29+01:00\",\"articleSection\":\"Development na twardo, Embedded, Linux\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#webpage\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#articleImage\",\"width\":733,\"height\":456,\"caption\":\"SWUpdate, czyli o aktualizacjach oprogramowania w \\u015bwiecie Embedded Linux\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sii.pl\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/development-na-twardo\\\/#listItem\",\"name\":\"Development na twardo\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/development-na-twardo\\\/#listItem\",\"position\":2,\"name\":\"Development na twardo\",\"item\":\"https:\\\/\\\/sii.pl\\\/blog\\\/development-na-twardo\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#listItem\",\"name\":\"SWUpdate, czyli o aktualizacjach oprogramowania w \\u015bwiecie Embedded Linux\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#listItem\",\"position\":3,\"name\":\"SWUpdate, czyli o aktualizacjach oprogramowania w \\u015bwiecie Embedded Linux\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/development-na-twardo\\\/#listItem\",\"name\":\"Development na twardo\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/sii.pl\\\/#organization\",\"name\":\"Sii Polska\",\"url\":\"https:\\\/\\\/sii.pl\\\/blog\\\/\",\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/siipolska\\\/\",\"https:\\\/\\\/www.tiktok.com\\\/@siipolska\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCQ3UQ7RJPEYnAWC_rPE5Dxg\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/sii-polska\",\"https:\\\/\\\/clutch.co\\\/profile\\\/sii-poland\",\"https:\\\/\\\/www.crunchbase.com\\\/organization\\\/sii\",\"https:\\\/\\\/www.wikidata.org\\\/wiki\\\/Q16601096\"]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#webpage\",\"url\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/\",\"name\":\"SWUpdate \\u2013 aktualizacje oprogramowania w Embedded Linux\",\"description\":\"W artykule porusz\\u0119 temat zdalnych aktualizacji urz\\u0105dze\\u0144 Linux Embedded, opisz\\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\\u0119dzie SWUpdate.\",\"inLanguage\":\"pl-PL\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#breadcrumblist\"},\"author\":\"https:\\\/\\\/sii.pl\\\/blog\\\/author\\\/cczajka\\\/#author\",\"creator\":\"https:\\\/\\\/sii.pl\\\/blog\\\/author\\\/cczajka\\\/#author\",\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#mainImage\",\"width\":733,\"height\":456,\"caption\":\"SWUpdate, czyli o aktualizacjach oprogramowania w \\u015bwiecie Embedded Linux\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\\\/#mainImage\"},\"datePublished\":\"2023-03-06T04:00:00+01:00\",\"dateModified\":\"2023-02-28T13:52:29+01:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/sii.pl\\\/blog\\\/\",\"name\":\"blogersii\",\"description\":\"Blog technologiczny Sii \\u2013 praktyczna wiedza od ekspert\\u00f3w\",\"inLanguage\":\"pl-PL\",\"publisher\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"SWUpdate \u2013 aktualizacje oprogramowania w Embedded Linux","description":"W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded, opisz\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\u0119dzie SWUpdate.","canonical_url":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#article","name":"SWUpdate \u2013 aktualizacje oprogramowania w Embedded Linux","description":"W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded, opisz\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\u0119dzie SWUpdate.","inLanguage":"pl-PL","headline":"SWUpdate, czyli o aktualizacjach oprogramowania w \u015bwiecie Embedded Linux","author":{"@id":"https:\/\/sii.pl\/blog\/author\/cczajka\/#author"},"publisher":{"@id":"https:\/\/sii.pl\/#organization"},"datePublished":"2023-03-06T04:00:00+01:00","dateModified":"2023-02-28T13:52:29+01:00","articleSection":"Development na twardo, Embedded, Linux","mainEntityOfPage":{"@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#webpage"},"isPartOf":{"@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#webpage"},"image":{"@type":"ImageObject","url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg","@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#articleImage","width":733,"height":456,"caption":"SWUpdate, czyli o aktualizacjach oprogramowania w \u015bwiecie Embedded Linux"}},{"@type":"BreadcrumbList","@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog#listItem","position":1,"name":"Home","item":"https:\/\/sii.pl\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog\/development-na-twardo\/#listItem","name":"Development na twardo"}},{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog\/development-na-twardo\/#listItem","position":2,"name":"Development na twardo","item":"https:\/\/sii.pl\/blog\/development-na-twardo\/","nextItem":{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#listItem","name":"SWUpdate, czyli o aktualizacjach oprogramowania w \u015bwiecie Embedded Linux"},"previousItem":{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#listItem","position":3,"name":"SWUpdate, czyli o aktualizacjach oprogramowania w \u015bwiecie Embedded Linux","previousItem":{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog\/development-na-twardo\/#listItem","name":"Development na twardo"}}]},{"@type":"Organization","@id":"https:\/\/sii.pl\/#organization","name":"Sii Polska","url":"https:\/\/sii.pl\/blog\/","sameAs":["https:\/\/www.instagram.com\/siipolska\/","https:\/\/www.tiktok.com\/@siipolska","https:\/\/www.youtube.com\/channel\/UCQ3UQ7RJPEYnAWC_rPE5Dxg","https:\/\/www.linkedin.com\/company\/sii-polska","https:\/\/clutch.co\/profile\/sii-poland","https:\/\/www.crunchbase.com\/organization\/sii","https:\/\/www.wikidata.org\/wiki\/Q16601096"]},{"@type":"WebPage","@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#webpage","url":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/","name":"SWUpdate \u2013 aktualizacje oprogramowania w Embedded Linux","description":"W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded, opisz\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\u0119dzie SWUpdate.","inLanguage":"pl-PL","isPartOf":{"@id":"https:\/\/sii.pl\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#breadcrumblist"},"author":"https:\/\/sii.pl\/blog\/author\/cczajka\/#author","creator":"https:\/\/sii.pl\/blog\/author\/cczajka\/#author","image":{"@type":"ImageObject","url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg","@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#mainImage","width":733,"height":456,"caption":"SWUpdate, czyli o aktualizacjach oprogramowania w \u015bwiecie Embedded Linux"},"primaryImageOfPage":{"@id":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/#mainImage"},"datePublished":"2023-03-06T04:00:00+01:00","dateModified":"2023-02-28T13:52:29+01:00"},{"@type":"WebSite","@id":"https:\/\/sii.pl\/blog\/#website","url":"https:\/\/sii.pl\/blog\/","name":"blogersii","description":"Blog technologiczny Sii \u2013 praktyczna wiedza od ekspert\u00f3w","inLanguage":"pl-PL","publisher":{"@id":"https:\/\/sii.pl\/#organization"}}]},"og:locale":"pl_PL","og:site_name":"blogersii","og:type":"article","og:title":"SWUpdate \u2013 aktualizacje oprogramowania w Embedded Linux","og:description":"W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded, opisz\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\u0119dzie SWUpdate.","og:url":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/","og:image":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg","og:image:secure_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg","og:image:width":733,"og:image:height":456,"article:published_time":"2023-03-06T04:00:00+00:00","article:modified_time":"2023-02-28T13:52:29+00:00","article:publisher":"https:\/\/www.facebook.com\/Sii.Polska","twitter:card":"summary","twitter:title":"SWUpdate \u2013 aktualizacje oprogramowania w Embedded Linux","twitter:description":"W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded, opisz\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\u0119dzie SWUpdate.","twitter:image":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg"},"aioseo_meta_data":{"post_id":"20038","title":"SWUpdate \u2013 aktualizacje oprogramowania w Embedded Linux","description":"W artykule porusz\u0119 temat zdalnych aktualizacji urz\u0105dze\u0144 Linux Embedded, opisz\u0119 podstawowe strategie aktualizacji oprogramowania oraz narz\u0119dzie SWUpdate.","keywords":[],"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":[],"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":{"id":"#aioseo-article-6467255260990","slug":"article","graphName":"Article","label":"Article","properties":{"type":"BlogPosting","name":"#post_title","headline":"#post_title","description":"#post_excerpt","image":"","keywords":"","author":{"name":"#author_name","url":"#author_url"},"dates":{"include":true,"datePublished":"","dateModified":""}}},"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":"{\"article\":{\"articleType\":\"BlogPosting\"},\"course\":{\"name\":\"\",\"description\":\"\",\"provider\":\"\"},\"faq\":{\"pages\":[]},\"product\":{\"reviews\":[]},\"recipe\":{\"ingredients\":[],\"instructions\":[],\"keywords\":[]},\"software\":{\"reviews\":[],\"operatingSystems\":[]},\"webPage\":{\"webPageType\":\"WebPage\"}}","pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"created":"2023-02-28 11:52:11","updated":"2023-05-19 07:29:22","ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/sii.pl\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/sii.pl\/blog\/development-na-twardo\/\" title=\"Development na twardo\">Development na twardo<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tSWUpdate, czyli o aktualizacjach oprogramowania w \u015bwiecie Embedded Linux\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/sii.pl\/blog"},{"label":"Development na twardo","link":"https:\/\/sii.pl\/blog\/development-na-twardo\/"},{"label":"SWUpdate, czyli o aktualizacjach oprogramowania w \u015bwiecie Embedded Linux","link":"https:\/\/sii.pl\/blog\/swupdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-embedded-linux\/"}],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/02\/SWUpdate-czyli-o-aktualizacjach-oprogramowania-w-swiecie-Embedded-Linux.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/481"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=20038"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20038\/revisions"}],"predecessor-version":[{"id":20062,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20038\/revisions\/20062"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/20060"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=20038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=20038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=20038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}