Raspberry PI OS - co z tym "boot'em"?

Spis treści

Co z tym boot'em

Po włączeniu zasilania (nie tylko) start systemu na RPi zaczyna się od uruchomienia sekwencyjnej procedury nazywanej "bootem".

Prawidłowy jej przebieg uzależniony jest nie tylko od prawidłowej składni, ale również bezbłędnej realizacji poszczególnych etapów wynikających z tzw. bootloadera. Tej nazwy będę używał w dalszej części artykułu..

Na oficjalnym forum Fundacji RPi wyszukując: "bootloader" przykonamy się, że jego temat nadal "żyje". Wątki najczęściej dotyczą problemów z procesem startu RPi.

Istnieje wiele wersji RPi. Artykuł opisuje zagadnienia dotyczące "ręcznej" aktualizacji bootloadera dostarczanego wraz z Raspbianem (32b/64b). Działającym na RPi 4B (8GB wersji). Ale nie tylko pod Raspbianem.

Trochę teorii...

Ekran "rozpaczy"?

Jeśli wszystko przebiega bez problemów na ten etap uruchamiania się systemu z reguły nie zwracamy uwagi.

Coś mignie, jakieś kolory (lub nie ;) ) i po chwili "witamy w świecie RPi". Tak bywa w 99% przypadków.

Gdy jednak trafimy do pozostałego 1% bywa... smutniej i nerwowo! Poprawiamy kable, kilkakrotnie włączamy (i wyłączamy) Raspberry Pi, itd. Czasami pomaga. Bywa, że jednak nie!

Np. u mnie z niektórymi dyskami SSD, podłączonymi poprzez USB3 (przy ustawionej opcji startu z SSD) system zatrzymuje się. I stoi. Bo nie wykrył dysku (który jest). Nie wykrył karty SD (której nie ma). I na coś czeka....

Jeśli nic nie zrobię - czekamy wszyscy! Ale wystarczy, że "na chwilkę" odłączę dysk, odczekam kolejną "chwilkę" i ponownie go podłączę.

Na ekranie pojawia się komunikat o podłączeniu urządzenia do portu USB3 i ... ekran nabiera życia! Przewijają się kolejne komunikaty. Dalej system uruchomia się bez problemu. Przeprowadzone później testy wskazują, że wszystko jest OK. Dziś już wiem, że ten objaw występuje nie tylko u mnie.

Bootloadery bywają różne!Upraszczając nieco zagadnienie startujący Raspberry Pi 4B może wykorzystać bootloader:

  • inicjujący uruchomiemienie pojedyńczego systemu operacyjnego Raspbian (32/64b),
  • inicjujący uruchomiemienie pojedyńczego systemu operacyjnego różnego od Raspbiana (32/64b),
  • inicjujący uruchomiemienie opcji wyboru systemu operacyjnego z listy. Jest to tzw. tryb. multiboot. Jednym z dostępnych OS'ów może być Raspbian (32/64b). Ten artykuł nie dotyczy trybu multiboot.

Jak wkrótce przekonasz się wczytany (zaktualizowany) bootloader pozostaje w pamięci RPi nawet jeśli zaczniesz używać na nim inny system.

I stan taki będzie trwał do chwili, gdy ponownie (świadomie lub nie) zmienisz używaną wersję bootloadera.

Zaznaczałem na wstępie, że niniejszy opis dotyczy Raspberry Pi 4B. Wynika to z tego, że wcześniejsze wersje RPi (ale również i CM4) wykorzystują inne procedury uruchamiające. 

W przypadku Raspberry Pi 4B kod inicjujący jest zapisamy bezpośrednio w pamięci EEPROM (4 MBit / 512 KB). I tam też jest uruchamiany.

Ponieważ artykuł ten przeznaczony jest przede wszystkim dla początkujących użytkowników Raspberry Pi powiem tylko tyle, że możliwości konfiguracyjne bootloadera są IMO dość duże.

Można je poznać czytając artykuł Fundacji RPi omawiający parametry konfiguracyjne. Uważam, że warto go przeczytać już po... zebraniu (co najmniej podstawowych) doświadczeń. 

"Macanie na oślep" może zaprowadzić na manowce! Lekiem na te "manowce" jest skorzystanie z możliwości jakie daje RPI Imager - (ratunkowa!) rekonfiguracja bootloadera.

A na wstępie domyślne ustawienia bootloadera zdają się być w zupełności wystarczające ;)

Aktualizacja bootloadera - czym?

Zacznijmy od najprostszego przypadku: Raspberry Pi z Raspbian (32b/64b). Aktualizację bootloadera możemy przeprowadzić na 3 sposoby:

  • wykorzystując opcję RPi Imagera,
  • korzystając w oknie terminala z polecenia: sudo raspi-config (Advanced Options>>Bootloader Version>>"Default" (dla domyślnych ustawień fabrycznych) lub "Latest" (dla najnowszej stabilnej wersji),
  • instalowanie określonego obrazu bootloadera (z pliku) w pamięci EEPROM RPi przy pomocy komendy: rpi-eeprom-update.

Pakiet rpi-eeprom

Instalując Raspbian (32b/64b) pakiet rpi-eeprom instalowany jest automatycznie. W wielu dystrybucjach Linux'a przygotowanych dla RPi również jest dostępny. Czasami instaluje się automatycznie. Czasami trzeba doinstalować.

rpi-eeprom-update (R-OS 32b)

W najgorszym przypadku "dociągnąć" z GitHub'a. Ten ostatni manewr to raczej dla tych "bardziej doświadczonych" ;)

Wracając do pakietu rpi-eeprom po jego instalacji w systemie - z linii komend, terminal (Ctrl+Alt+T) dostępne są 2 polecenia: rpi-eeprom-update oraz rpi-eeprom-config. Polecenie rpi-eeprom-update wyświetli w oknie terminala informację o stanie (aktualności) danych zapisanych w pamięci EEPROM.

Warto polecenie poprzedzić poleceniem "sudo", uzyskamy wtedy również informację o aktualności firmware'u VL805.

Bootloadery "do wyboru, do koloru"By móc zaprezentować "ciekawostki" związane z tą komendą wcześniej ręcznie zaktualizowałem (za pomocą rpi-eeprom-update) bootloader RPi do wersji "beta" z dnia 19.05.21.

Standardowo pliki bootloadera wykorzystywane do jego aktualizacji w pamięci EEPROM zawarte są w katalogu: /lib/firmware/raspberrypi/bootloader.

Poszczególne podkatalogi zawierają:

  • default (link do katalogu: critical) - aktualizacje związane ze wsparciem nowego sprzętu, poprawki ujawnionych błedów/dysfunkcji, okresowe aktualizacje wynikające z włączenia nowych funkcjonalności po pozytywnym przejściu w wydaniu "latest",
  • latest (link do katalogu: stable) - włączenie nowych funkcjonalności po pomyślnym "zaliczeniu" wersji "beta",
  • beta - nowe i/lub eksperymentalne funkcjonalności w fazie testów.

rpi-eeprom-update dla RPi OS 64b Jak widać na obrazku z lewej jest w czym wybierać. Przed dokonaniem wyboru warto zapoznać się z materiałami (dla wnikliwych) dotyczącymi poszczególnych aktualizacjii.

Wybór bootloaderów dla RPi OS'a 64bOK, teraz zajrzyjmy jak to wygląda w wersji 64b Raspbiana. Różnice w zasadzie kosmetyczne.

Nieco mniejsza ilość pozycji w katalogu "stable". Niemal tyle samo "beta".

W mojej subiektywnej (!) ocenie skorzystanie z polecenia rpi-eeprom-update jest wygodniejsze, gdyż pozwala... wybrać konkretny plik aktualizacji. By wykonać taką "ręczną" aktualizację w oknie terminala należy wydać polecenie:

~$ sudo rpi-eeprom-update -d -f pieeprom-RRRR-MM-DD.bin
gdzie:
-d - wskazuje by wykorzystać konfigurację zawartą w pliku zamiast bieżącej,
-f - parametr następujący za tą flagą jest nazwą pliku zawierającego obraz bootloadera.

Dokumentacja rpi-eeprom-.....By zapoznać się z pełnym opisem dostępnych parametrów wywołania poleceń: rpi-eeprom-xxxxx (gdzie xxxxx - to update lub config) wystarczy wywołać te polecenia z parametrem "-h".

Warto wiedzieć, że polecenie rpi-eeprom-update (w rzeczywistości jest to skrypt w katalogu /usr/bin) sprawdza m.in. rodzaj i wersję: sprzętu (działa tylko na RPi 4, procesora, obecność VL805) oraz bootloadera.

Weryfikuje również, czy zainstalowano pakiet libraspberrypi-bin, gdyż w trakcie aktualizacji wykorzystuje polecenie vcgencmd. Na podobnej zasadzie działa drugi ze skryptów: rpi-eeprom-config.

Aplikacje takie jak: RPi Imager czy raspi-config również pozwalają zaktualizować bootloader.

Ale do jakiej wersji(?) to dowiemy się, gdy poszukamy tej informacji albo... po uruchomieniu systemu! :)

To tyle jeśli chodzi o pakiet rpi-eeprom dla Raspbiana (32b/64b)


Bootloader a inne OS'y

Co z innymi systemami? Dla przykładu: Ubuntu-Mate (64b). To, że jest i działa na RPi to wiem. Ale jak wygląda sprawa z aktualizacją bootloadera?

Po pierwsze warto sprawdzić czy pakiet rpi-eeprom został prawidłowo zainstalowany?

Ubuntu-Mate - bootloader'y gdzie?

Jeśli:

  • nie - doinstaluj (sudo apt install rpi-eeprom),
  • tak - sprawdźmy dostępne wersje bootloaderów.

Latest: 03.09.20 to trochę daleko!Po instalacji - trochę kiepsko, bo z plików pomocy jedynie "apropos" wie, że rpi-eeprom zaistniał w systemie!

Warto pamiętać o "podręczniku" zawartym w poleceniu "rpi-eeprom-update -h" :/

Gdy zweryfikujemy dostępne wersje bootloadera nastąpi (przykra) niespodzianka!

W dokumentacji RPi zaznaczono, że uruchomienie Malinki 4B w trybie "USB MSD" wymaga wersji firmware datowanej na 20.08.2020 (lub później).

Tu czegoś brakuje? Bootloadera!

W katalogu "Latest" jako ostatnią wersję bootloadera widzimy kompilację z 03.09.2020! Obecnie 6 wersji wstecz! :o

Wcale nie lepiej jest w katalogu "beta". Ostatnia kompilacja z 11.01.21. 5 wersji wstecz! :/

Czy te różnice mają znaczenie? Każdy może wyrobić sobie zdanie po zapoznaniu się z opisem poszczególnych wydań bootloadera.

Ubuntu_ate to nie Raspberry Pi!Czy zatem warto było instalować pakiet rpi-eeprom? IMO: zdecydowanie tak! Chociażby po to by móc sprawdzić: jak jest!

Po instalacji Ubuntu-Mate (64b) dla Malinki nie często zwracamy uwagę na różnice.

Ostrzeżenie (En)

Mimo, że na ekranie powitalnym dla użytkowników Malinki wyświetlono je na czerwono!

Choć jego "automatyczne" ;) tłumaczenie IMO nie w pełni oddaje treść oryginału to można się zorientować, że oba (działające na platformie RPi 4B) systemy różnią się!

Autorzy Ubuntu-Mate (64b) dla Malinki swoje zastrzeżenia zaczęli tak:

"Choć wrażenia wizualne podczas używania Ubuntu-Mate (dla RPi - przyp mój) są zbliżone (do tych z x86/amd64 - przyp. mój) to architektura obu systemów jest zasadniczo różna".

Wykorzystywane podczas aktualizacji bootloadera polecenie rpi-eeprom-update (podobnie jak rpi-eeprom-config) jest standardowym skryptem powłoki odwołującym się m.in. do komendy vcgencmd.

Czy i na ile procedura aktualizacji bootloadera pod Ubuntu-Mate (64b) dla Malinki (w zakresie: składni, komend, parametrów, a przede wszystkim pod względem efektów działania) jest zgodna z "pierwowzorem" stworzonym dla Raspbiana - nie wiem.

Malejąca ilość parametrów konfiguracji...IMO szkoda czasu na drobiazgową analizę. Dodatkowo wymagającej doskonałej znajomości wykorzystywanych systemów (x86/amd64 vs. armv7/arm64).

To co można zauważyć to fakt, wycofywania się twórców bootloadera z wykorzystywania dodatkowych opcji konfiguracyjnych. Tych zapisanych w pliku pieeprom-xxxx-xx-xx.bin.

W poprzednich wersjach (do września 20r.) było ich w bootloaderze nawet 9. Obecnie są 3. Podstawowe.

Może uznano, że dokumentacji dot. konfiguracji jest tak obszerna i dostępna, że większość użytkowników będzie w stanie sama odpowiednio skonfigurować swoje RPi 4B. Może...


Odczyt, zapis konfiguracji

Prawidłowa konfiguracja bootloadera jest bardzo istotna.

Dokładny opis wszystkich zmiennych wykorzystywanych w konfiguracji został przedstawiony w dokumentacji udostępnionej na stronie Fundacji RPi.

Niektóre z wartości winny zostać przetestowane w konkretnym zastosowaniu. Po wybraniu wartości odpowiadających naszym potrzebom warto je utrwalić, zapisać.

Dlatego też warto zapamiętać poniższe polecenia:

# odczytanie (na ekran) bieżącej konfiguracji bootloadera (z EEPROM),
~$ sudo rpi-eeprom-config
lub
~$ sudo vcgencmd bootloader_config

# zapis do pliku boot.conf bieżącej konfiguracji bootloadera (z EEPROM)
~$ sudo rpi-eeprom-config > boot.conf
lub
~$ sudo rpi-eeprom-config -o boot.conf
lub
~$ sudo vcgencmd bootloader_config > boot.conf

# odczytanie (na ekran) konfiguracji z pliku bootloadera,
~$ sudo rpi-eeprom-config <ścieżka>pieeprom-RRRR-MM-DD.bin

# zapis konfiguracji bootloadera do pliku boot.conf,
~$ sudo rpi-eeprom-config <ścieżka>pieeprom-RRRR-MM-DD.bin > boot.conf
lub
~$ sudo rpi-eeprom-config <ścieżka>pieeprom-RRRR-MM-DD.bin -o boot.conf

# utworzenie nowego pliku bootloadera pieeprom-new.bin wykorzystując plik konfiguracyjny boot.conf oraz
# plik bootloadera <ścieżka>pieeprom-RRRR-MM-DD.bin,
~$ sudo rpi-eeprom-config --config boot.conf --out pieeprom-new.bin <ścieżka>pieeprom-RRRR-MM-DD.bin


Nie mieszaj...

Nie warto ryzykować i mieszać...Na jednym z for poświęconych na RPi 4B padło pytanie: w jaki sposób aktualizować bootloader, gdy na dysku USB3 zainstalowaliśmy inny system niż Raspbian (32b/64b).

Wśród wielu sugestii znalazłem taką:

"Chcesz uniknąć rozczarowań i kłopotów nie mieszaj! Nie ryzykuj! 
Poświęć jedną kartę SD, na której będziesz miał Raspbian OS 32b do wprowadzania istotnych zmian w konfiguracji (sprzętowej) czy bootloadera swojej Malinki."

Początkowo nie zwróciłem na nią uwagi. Ot rada jedna z wielu. Dziś po różnych doświadczeniach i kilku (własnych) błędach wiem, że warto z tej sugestii skorzystać.

Oczywiście dziś i Raspberry Pi Imager oferuje stworzenie "karty ratunkowej. I bardzo dobrze. Oczywiście mam taką.

Lecz ta z Raspbian OS 32b jest regularnie aktualizowana. Nie dopisuję na niej niczego co nie jest związane z obsługą sprzętu. Żadnych wynalazków! Jedyny wyjątek stanowią zapisane konfiguracje. Nie tylko bootloadera.

Sięgam do nią gdy muszę! I jest dobrze!Karta SD - nie ma... a jest?!

Na wstępie wspominałem, że czasami moje RPi potrzebuje chwili i/lub popchnięcia (w postaci odłączenia i ponownego podłączenia nośnika na USB3), by wystartować z "obcym" systemem.

Nie prowadzę w tej dziedzinie dokładnych statystyk. Od czasu używania do konfiguracji m.in. bootloadera "dedykowanej" karty SD takich przypadków jest zdecydowanie mniej. Teraz to zaledwie incydenty. I to cieszy! :)

Tych, którzy są rozczarowani, że nie ma tu "super recepty" na wszelkie bolączki związane z bootowaniem się Malinku chcę przeprosić. Informuję również, że:

  • miałem nadzieję, że taką receptę stworzę :o,
  • po dwukrotnym zawieszeniu się Malinki aktualizowanej "spod innego systemu" uznałem, że limit życzliwości losu i cierpliwości RPi został wyczerpany.
    Nie chcąc drażnić losu czy ogłuszyć RPi - odpuściłem !
  • odetchnąłem pełną piersią gdy Raspberry Pi Imager ożywił (odmawiającą współpracy) Malinkę i skorzystałem ze wskazanej powyżej rady.
    Nie wstydzę się tego! Mądrych warto słuchać!

Obecnie moje RPi (zamiennie) współdziała z trzema systemami (pochodne Linuksa, oprócz 2 wersji Raspbiana) i daje mi to dużą frajdę.

Zmagania z konfiguracją bootloadera i RPi jako takiego pozwoliły mi lepiej poznać to maleństwo. To też cieszy!

Zagadnienia opisane w niniejszym artykule są pokłosiem doświadczeń związanych z realizacją projektu "Mikroskop do lutowania (RPi 4B+HQC+M42)".

Jeśli jesteś zainteresowany tym na co "marnotrawię swój czas" zapraszam do Warsztatu krótkofalowca.