Linux-Based Firmware, jak wdrożyć dobry sposób na aktualizację?

Rozwijam urządzenie oparte na Linuksie przy użyciu alix 2d13.

StworzyĹ ' em skrypt, ktĂłry zajmuje siÄ ™ tworzeniem pliku graficznego, tworzeniem partycji, instalowaniem boot loadera( syslinux), kernela i initrd oraz, ktĂłry zajmuje siÄ ™ umieszczaniem plikĂłw systemu plikĂłw root na prawej partycji.

Pliki konfiguracyjne znajdują się w systemie plików tmpfs i są tworzone podczas uruchamiania systemu przez oprogramowanie, które odczytuje plik XML znajdujący się na własnej partycji.

Szukam sposób na aktualizację systemu plików i rozważałem dwa rozwiązania:

  • Aktualizacja oprogramowania układowego jest skompresowanym plikiem, który może zawierać jądro, initrd i/lub partycję rootfs, w ten sposób, przy ponownym uruchomieniu initrd zadba o dd obrazu rootfs na prawej partycji;
  • Aktualizacja oprogramowania układowego jest skompresowanym plikiem, który może zawierać dwa archiwa tar, jeden dla bootowania i jeden dla głównego systemu plików.

Każde rozwiązanie ma swoje zalety: - obraz systemu plików pozwoli mi usunąć nieużywane pliki, ale potrzebuje dużo czasu i szybko zabije pamięć compact flash; - archiwum jest mniejsze, potrzebuje mniej czasu na aktualizację, ale w krótkim czasie będę miał caos na głównym systemie plików.

Alternatywnym rozwiązaniem może być umieszczenie listy plików i dodanie skryptu pre / post update do archiwum tar, więc każdy plik, który nie znajduje się na liście plików, zostanie usunięty.

Co o tym myślisz?

Author: Daniele Salvatore Albano, 2011-03-02

3 answers

Zastosowałem następujące podejście. Był on nieco oparty na artykule "Building Murphy-compatible embedded Linux systems", dostępnym tutaj . Użyłem wersji.conf rzeczy opisane w tym artykule, a nie cfgsh rzeczy.

  • Użyj jądra rozruchowego, którego zadaniem jest ponowne zamontowanie" głównego " głównego systemu plików. Jeśli potrzebujesz nowszego jądra, to kexec do tego nowszego jądra zaraz po jego ponownym zamontowaniu w pętli. Zdecydowałem się umieścić kompletny INIT jądra startowego w initramfs, wraz z busybox i kexec (oba połączone statycznie), a mój INIT był prostym skryptem powłoki, który napisałem.
  • jeden lub więcej głównych systemów plików "main OS" istnieje w systemie plików "OS image" jako Pliki Obrazów Dysków. Jądro rozruchowe wybiera jedną z nich na podstawie wersji.plik conf. Utrzymuję tylko dwa główne pliki obrazów systemu operacyjnego, bieżący i jesienny plik. Jeśli bieżąca zawiedzie (więcej o wykrywaniu awarii później), to jądro rozruchowe uruchamia fall-back. Jeśli oba zawiodą lub nie ma fall-back, boot kernel dostarcza powłokę.
  • Konfiguracja systemu jest na oddzielnej partycji. Zwykle nie jest to ulepszone, ale nie ma powodu, aby nie mogło być.
  • istnieją cztery całkowite partycje: boot, OS image, config i data. Partycja danych jest przeznaczona do aplikacji użytkownika, która jest przeznaczona do częstego pisania. boot nigdy nie jest montowany do odczytu/zapisu. Obraz systemu operacyjnego jest montowany tylko (ponownie)podczas odczytu/zapisu. config jest montowany tylko do odczytu/zapisu, gdy rzeczy konfiguracyjne muszą się zmienić (miejmy nadzieję, że nigdy). dane są zawsze montowane do odczytu/zapisu.
  • Pliki obrazów dysku zawierają pełny system Linux, w tym jądro, skrypty init, programy użytkownika (np. busybox, aplikacje produktowe) i domyślną konfigurację, która jest kopiowana na partycję konfiguracyjną podczas pierwszego rozruchu. Pliki mają dowolny rozmiar, aby zmieścić w nich wszystko. Dopóki pozwoliłem wystarczająco dużo miejsca na wzrost, aby partycja obrazu systemu operacyjnego była zawsze wystarczająco duża, aby zmieścić trzy główne pliki obrazu systemu operacyjnego (podczas aktualizacji nie usuwam Stary fall-back, dopóki nowy nie zostanie wyodrębniony), mogę pozwolić, aby główny obraz systemu operacyjnego rosł w razie potrzeby. Te pliki obrazów są zawsze montowane tylko do odczytu. Korzystanie z tych plików usuwa również ból radzenia sobie z awariami aktualizacji poszczególnych plików w rootfs.
  • Ulepszenia są wykonywane przez przeniesienie samorozpakowującego się tarballa do tmpfs. Początek tego skryptu montuje obraz systemu operacyjnego Odczyt/Zapis, a następnie wyodrębnia nowy główny obraz systemu operacyjnego do systemu plików obrazu systemu operacyjnego i następnie aktualizuje wersje.plik conf (przy użyciu metody rename opisanej w artykule "murphy"). Po wykonaniu tego, dotykam pliku znaczka wskazującego, że nastąpiła aktualizacja, a następnie uruchom ponownie.
  • jądro rozruchowe szuka tego pliku stempla. Jeśli go znajdzie, przeniesie go do innego pliku stempla, a następnie uruchomi nowy główny plik obrazu systemu operacyjnego. Oczekuje się, że główny plik obrazu systemu operacyjnego usunie plik stempla po pomyślnym uruchomieniu. Jeśli nie, watchdog uruchomi restart, a następnie jądro rozruchowe zobaczy to i wykryje awarię.
  • zauważ, że istnieje kilka możliwych punktów awarii podczas aktualizacji: synchronizacja wersji.conf podczas aktualizacji i dotykanie / usuwanie plików stempli (trzy instancje). Nie mogłem znaleźć sposobu, aby je dalej zredukować i osiągnąć wszystko, co chciałem. Jeśli ktoś ma lepszą propozycję, chętnie ją usłyszę. Błędy systemu plików lub awarie zasilania podczas pisania obrazu systemu operacyjnego mogą również wystąpić, ale mam nadzieję, że system plików ext3 zapewni jakieś szanse na przeżycie w tym przypadku.
 17
Author: Patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 22:04:10

Możesz mieć oddzielną partycję do aktualizacji (powiedzmy Side1/Side2). Istniejące jądro, rootfs jest w Side1, następnie umieścić aktualizację w Side2 i switch. Dzięki temu można zmniejszyć poziomowanie zużycia i zwiększyć żywotność, ale urządzenie staje się bardziej kosztowne.

 2
Author: New to Rails,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-07 16:27:28

Możesz szybko sformatować partycje przed rozpakowaniem plików tar. Możesz też użyć rozwiązania image, ale użyj najmniejszego możliwego obrazu i po dd wykonaj zmianę rozmiaru systemu plików (chociaż nie jest to konieczne do przechowywania readonly)

 0
Author: forcefsck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-10 22:54:49