Raspberry_PI_cz8.pdf

(1088 KB) Pobierz
Na warsztacie
SZKOŁA
Poziom tekstu: średnio trudny
Zastanawialiście się kiedyś, jak właściwie startuje Raspberry? Proces ten nie
jest aż tak skomplikowany. Zrozumienie go pomoże Wam diagnozować różne
problemy, jakie czasami pojawiają się podczas uruchamiania RPi.
Raspberry Pi
tajemnice startu
Tajemnica 1: uszkodzona karta
Zanim zagłębimy się w szczegóły startu RPi, przyj-
rzyjmy się sposobowi partycjonowania karty SD
z zainstalowanym Raspbianem. Używam jego
ostatniej wersji, z 24 grudnia 2014 r. Świeżo
wypaloną kartę (stworzoną z użyciem
programu
Win32 Disk Imager
i obrazem
2014-12-24-wheezy-raspbian.img)
po-
dzielono na dwie partycje:
• startową
(ang.
boot),
o rozmiarze ok.
56 MB i systemie plików FAT;
• główną
(ang.
root,
„/”), o rozmiarze ok.
3,2 GB i linuksowym systemie plików ext4.
Powyższy podział jest ściśle związany ze spo-
sobem, w jaki startuje Raspberry. Z drugiej strony
powoduje, że po włożeniu takiej karty do czytnika
komputera zarządzanego przez Windows, system
zgłosi nam jej uszkodzenie. Co więcej, zapro-
ponuje, że może ją naprawić. Nie róbcie tego.
Karta wcale nie jest uszkodzona. Windows potrafi
zamontować mniejszą z partycji (w końcu to FAT,
do niedawna natywny dla Microsoftu), ale nie ro-
zumie drugiej – dlatego sygnalizuje problemy. Taki
podział można zobaczyć w Microsoftowej aplikacji
do zarządzania dyskami. Dla Windows 8.1 uru-
chomicie ją, klikając prawym klawiszem myszy
na „Start” i wybierając pozycję „Zarządzanie
dyskami” (1).
Program „Zarządzanie dyskami” dodatkowo
pokaże, że na karcie znajduje się jeszcze 4,2 GB
nieprzydzielonego miejsca. Jest to różnica między
rozmiarem karty (użyłem 8 GB) a wielkością
obrazu Raspbiana (ok. 3,2 GB). Po zalogowaniu
do Raspberry możecie odzyskać to miejsce, roz-
szerzając partycję główną za pomocą programu
raspi-config
(opcja
Expand Filesystem,
ilustracja
4).
Szczegóły partycjonowania łatwiej zobaczyć,
używając aplikacji
GParted
pod Raspbianem (2).
GParted
pokazuje nam znacznie więcej szczegółów.
Rozumie też system ext4.
Ilustracja 3
prezentuje wygląd karty po roz-
szerzeniu partycji do rozmiaru karty SD.
GParted
możecie zainstalować poleceniem „sudo apt-get in-
stall gparted”. Musi być uruchomiony z konta
root.
więcej bitów, tym więcej klastrów można
zaadresować (czyli większe dyski można
obsłużyć). Powstał też VirtualFAT (VFAT),
który obsługuje długie nazwy i znaki na-
rodowe. FAT wykorzystywał np. MS-DOS
(jeżeli ktoś z Was go jeszcze pamięta)
i starsze wersje systemu Microsoft Win-
dows (ostatnio NTFS). Obecnie (głównie
FAT32) jest nadal stosowany na kartach
flash, pendrivach USB itp.
ext4
– najpopularniejszy system plików
dla Linuksa. Miał swoją premierę
Słowniczek
FAT (ang.
File Allocation Table)
Poniżej znajdziecie wytłumaczenie
kilku kluczowych pojęć, które poja-
wiają się dalej w tekście (w kolejności
występowania).
Partycja
– wydzielony, logiczny obszar
dysku. Jeden dysk może zawierać wiele
partycji – podstawowych, rozszerzonych
czy logicznych. Każdą z nich można
sformatować z innym systemem plików.
Windows montuje je zazwyczaj jako
kolejne dyski.
– rodzaj systemu plików, który powstał
już pod koniec lat 70. ub. wieku. Opiera
się na tablicy alokacji plików – specjal-
nej strukturze, która składuje w sobie
referencje do plików i zajmowanych przez
nie jednostek alokacji (klastrów). Możecie
spotkać wersje
FAT12
(adresuje dyski
do 16 MB),
FAT16
(maksymalnie do 4 GB),
FAT32
(2 TB) i najnowszy
exFAT/FAT64.
Liczby 12, 16, 32 oznaczają ilość bitów
używanych do adresowania klastrów. Im
82
m.technik – www.mt.com.pl – nr 3/2015
Skoro już Windowsowi udało się odczytać mniej-
szą z partycji, warto na nią spojrzeć. Zawiera wiele
ciekawych plików. Większością z nich zajmiemy
się później, w tym momencie przyjrzyjmy się tylko
trzem z nich:
• config.txt
• cmdline.txt
• kernel.img
Plik
„config.txt”
to jeden z plików konfiguracyj-
nych czytany jeszcze przed uruchomieniem CPU
(szczegóły poniżej). Zawiera wiele przydatnych
ustawień – jak overscan, tryby video itp. Jeżeli uży-
jecie
raspi-config
do zmiany podziału pamięci RAM
między CPU i GPU („Advanced Options>Memory
Split”), pojawi się tam wpis, np. „gpu_mem=64”
(możliwe wartości to 16/32/64/128/256; zobaczcie
„sudo cat /boot/config.txt | grep gpu”). Podział pa-
mięci można sprawdzić za pomocą (nieudokumento-
wanego) polecenia (parametr „arm” dla CPU i „gpu”
dla GPU; [6]):
1. Partycje karty SD z Raspbianem, widok pod Win-
dows
$ sudo vcgencmd get_mem gpu
gpu=64
$ sudo vcgencmd get_mem arm
arm=448
2. Partycje karty SD z Raspbianem pod Linuks
(GParted)
Dla konfiguracji wykorzystujących interfejs graficz-
ny, lepiej ustawić „gpu_mem=256”.
Drugi z plików – „cmdline.txt” – zawiera opcje
dla jądra linuksowego. W jednym z poprzednich
tekstów prezentowałem „ip=”. Opcja wymusza-
ła na interfejsie sieciowym przyjęcie podanego
adresu. Teraz jednak zwróćcie uwagę na parametry
„root=/dev/mmcblk0p2” oraz „rootfstype=ext4”.
Nazwa „mmcblk0p2” składa się z: „mmc”,
co jest skrótem od „MultiMediaCard”, „blk0”,
które pochodzi od pierwszego znalezionego
3. Partycje karty SD z Raspbianem pod Linuks
– po rozszerzeniu partycji głównej programem
raspi-config (GParted)
w 2008 r. Obsługuje dyski do 1 eks-
bibajta (EiB). Zawiera wiele funkcji
niedostępnych dla FAT/NTFS, jednak
domyślnie nie jest wspierany przez
Windows.
root
– linuksowe konto uprzywilejowa-
nego użytkownika, który ma pełną kon-
trolę nad systemem. Zazwyczaj – nawet
do administracji systemem – wystarczy
korzystać z „sudo”.
Montowanie
– proces polegający
na przyporządkowaniu dysku lub
4. Program raspi-config, wywołanie: „sudo raspi-
-config”
Mogło to dotyczyć nawet 3% po-
wierzchni. To działanie niepożądane
w erze telewizji cyfrowej, ale nadal
często automatycznie wykonywane
przez odbiorniki. Może to pogorszyć
jakość obrazu – scena jest rozciągana
do wielkości wyświetlacza, żeby przy-
kryć obcięty obszar.
Jądro Linuksa (ang.
kernel)
– central-
na część systemu operacyjnego Linuks
odpowiedzialna za kontrolowanie
sprzętu (za pomocą sterowników).
partycji konkretnego miejsca w systemie
plików. Zauważcie, że w przypadku
Windows jest to litera dysku („C:”, „E:”).
Zasoby w Linuksie montowane są tak,
że stają się częścią hierarchii katalogów.
Użytkownik często nawet nie wie, że za-
czął używać osobnej partycji czy dysku.
Overscan
– wobec różnic między
możliwościami wyświetlania przez
różne odbiorniki (monitory, telewizory),
zewnętrzne marginesy obrazu były
obcinane, żeby uniknąć zniekształceń.
83
Na warsztacie
partycji (5), jedynie 60 MB. Ale to zazwyczaj w zu-
pełności wystarcza. Oczywiście zawsze możecie
użyć polecenia „wget”.
Ostatni ze wspomnianych plików – „kernel.img”
– to jądro (ang.
kernel)
Linuksa. Zauważcie, jakie jest
małe – niewiele ponad 3 MB. Tyle wystarczy, żeby
wystartować system i najważniejsze komponenty
(dyski, zarządzanie mocą). Reszta modułów znajduje
się w katalogu głównym, który kernel montuje
zgodnie ze wskazaniami parametru „root=” z pliku
„cmdline.txt”.
Poziom tekstu: średnio trudny
SZKOŁA
Tajemnica 2: start sprzętu
5. Właściwości FAT-owej partycji pod Windows.
Zwróćcie uwagę, że Windows pokazuje FAT32,
a Raspbian FAT16
urządzenia blokowego i „p2” – drugiej partycji
(„p1” to ta mniejsza, którą widzimy pod Windows,
zobacz [5]). Porównajcie wartość „root=” z ilustra-
cjami 2 i 3. Od razu zauważycie, że „dev/mmcbl-
k0p2” (system plików ext4) odnosi się do partycji
głównej i po starcie Raspbiana zostanie podmon-
towany jako katalog główny „/”. Mniejszą partycję
FAT („/dev/mmcblk0p1”) znajdziecie za to w ka-
talogu „/boot”. Możecie to wszystko wyświetlić
na Raspberry poleceniem „lsblk”:
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
mmcblk0     179:0    0   7.3G  0 disk
├─mmcblk0p1 179:1    0    56M  0 part /boot
└─mmcblk0p2 179:2    0   7.2G  0 part /
Nawiasem mówiąc, taka właściwość może się cza-
sami okazać bardzo przydatna. Zdarza mi się używać
partycję FAT do przenoszenia plików na Raspberry.
Kopiuję je pod Windowsem, a po uruchomieniu
Raspberry pliki mam w katalogu „/boot”. Nie ma
na niej zbyt wiele miejsca – jak pokazują właściwości
Oryginalnie stworzone przez Linusa
Torvaldsa światło dzienne ujrzało
w 1991 r. Szybko wsparte przez narzę-
dzia GNU (Richard Stallman), obrosło
w liczne aplikacje i powłoki graficzne,
powoli wyrosło w dystrybucje takie jak
Ubuntu, Fedora czy najpopularniejszy
na Raspberry Pi – Raspbian (wywodzący
się z Debiana).
SoC (ang.
System On a Chip)
– SoC
to dość szeroki termin. Najczęściej
Jak wspomniałem powyżej, Raspberry Pi napędza
SoC Broadcoma, zwany BCM2835. W przypad-
ku Pi składa się on (m.in.) z: procesora głównego
ARM1176JZF-S (CPU), jednostki wspomagającej
grafikę VideoCore IV (GPU), pamięci nieulotnej ROM
oraz przyklejonej nad nimi (PoP) pamięci operacyj-
nej RAM (konkretnie SDRAM, 512 MB dla wersji
B). Start tych układów przebiega w następujących
etapach (na podstawie [1][2][3]):
1. Zaraz po zasileniu RPi uruchamiany jest GPU;
na ten moment CPU i RAM pozostają jeszcze
nieaktywne (w stanie „reset”).
2. Wyspecjalizowany, dodatkowy procesor wczytuje
z ROM i wykonuje bootloadera pierwszego etapu
(ang.
1st stage bootloader).
Kod ten jest wpisywa-
ny do ROMu w czasie produkcji układu.
3. Bootloader pierwszego etapu montuje partycję
startową FAT karty SD (tę mniejszą), wczytuje
zawartość pliku „bootcode.bin” do pamięci pod-
ręcznej L2 procesora GPU (ang.
L2 cache)
i wyko-
nuje go (CPU i RAM nadal w stanie resetu).
4. Kod „bootcode.bin” to tzw. bootloader drugiego
etapu (ang.
2nd stage bootloader).
Uruchamia
pamięć RAM i wczytuje do GPU z karty SD
bootloader trzeciego etapu (ang.
3rd stage bo-
otloader),
zapisany w pliku „start.elf”. Kod „start.
elf” jest jednocześnie systemem operacyjnym
GPU (ang.
firmware),
który pozostanie w jego pa-
mięci i pomaga Linuksowi dostawać się do jego
zasobów. GPU jest uruchamiane.
5. GPU wczytuje plik konfiguracji RPi „config.txt”,
zawierający m.in. ustawienia częstotliwości
poszczególnych elementów SoC (np. CPU, GPU)
SoC charakteryzują się stosunkowo
dużą mocą i niewielkim zapotrzebowa-
niem na prąd. Ich domeną są urzą-
dzenia przenośne zasilane bateryjnie.
Raspberry Pi napędza SoC Broadcoma
BCM2835. Składa się na niego procesor
główny typu ARM1176JZF-S (CPU)
i procesor graficzny (GPU) Videocore IV.
Nad nimi przylutowano pamięć SDRAM
– 256 dla wersji A/A+ lub 512 MB dla
B/B+ (technologia PoP).
odnosi się do kategorii superukładów
elektronicznych, które zawierają w sobie
dostatecznie dużo komponentów,
żeby mogły działać jako autonomiczne
„komputery”. W przypadku typowej
płyty komputerowej, elementy takie jak
główny procesor (ang.
Central Proces-
sing Unit
– CPU), pamięć operacyjna czy
karta graficzna są rozproszone na różne
układy (często wymienialne). SoC inte-
gruje je w pojedynczy układ (ang.
chip).
84
m.technik – www.mt.com.pl – nr 3/2015
Tabela 1. Pliki na karcie SD Raspberry Pi
Plik
Funkcja
bootcode.bin
Bootloder 2-go etapu
start.elf
Bootloader 3-go etapu; firmware GPU; ładuje plik „config.txt” i jądro linuksowe (z parametrami zapisa-
nymi w „cmdline.txt”)
fixup.dat
Dzieli i inicjuje SDRAM między CPU i GPU
kernel.img
Jądro Linuksa; wczytywane do pamięci przez „start.elf”; wykonywane przez CPU
fixup_cd.dat, start_cd.elf Obcięte wersje plików dla GPUmem=16
fixup_x.dat, start_x.elf
Wersje testowe – np. dodatkowe kodeki; obsługa kamery
cmdline.txt
Parametry startu jądra linuksowego
config.txt
Plik konfiguracyjny czytany przez GPU. Zawiera ustawienia m.in. trybów video, overscanu, taktowania
procesorów i podziału pamięci między GPU i CPU
oraz podział pamięci RAM między CPU i GPU
(plik „fixup.dat”).
6. GPU wczytuje plik konfiguracyjny „cmdline.
txt”, zawierający parametry do startu jądra
Linuksowego.
7. GPU wczytuje do RAM „kernel.img” obraz jądra
Linuksa.
8. GPU zmienia stan CPU na aktywny.
9. CPU rozpoczyna wykonywanie kodu jądra
linuksowego.
Widzimy więc, że rola GPU nie ogranicza się
do wspomagania grafiki. Wykonuje on większość
pracy przy starcie systemu. Oprócz wymienionych
powyżej zidentyfikujmy inne pliki znajdujące się
na karcie SD RPi, a związane ze startem sprzętu:
• „fixup.dat”: konfiguruje podział SDRAM między
GPU i CPU;
• „fixup_cd.dat” i „start_cd.elf”: wersje plików uży-
wane dla pamięci GPU zmniejszonej do 16 MB
(ustawienie w „config.txt”);
• „fixup_x.dat”, „start_x.elf”: wersje eksperymen-
talne, często niestabilne, mogą też włączać nowe
funkcje;
• „kernel_emergency.img” (w starszych
Raspbianach): wersja „awaryjna” jądra, może być
używana w przypadku awarii systemu plików.
jedynie diody PWR i ACT, a dla B+ sygnalizację sieci
przesunięto na wtyk Ethernetowy. W Internecie (np.
[4] lub w poprzednich artykułach tej serii) znaj-
dziecie kilka przepisów mówiących o sygnalizacji
podstawowych problemów przy starcie. Określona
liczba mrugnięć ACT – 3, 4, 7 – sygnalizuje, z jakim
problemem mamy do czynienia. Niestety, jest
to jedna z tych funkcji, która z wersji na wersję dość
dynamicznie się zmienia. W rzeczywistości zaufać
można jedynie zachowaniu diody PWR. Jeżeli za-
cznie mrugać, przygasać i podobne – problem wiąże
się z zasilaniem. Zakładając, że Wasza ładowarka
działa poprawnie i ma wydajność powyżej 500 mA,
z wersją B nie powinno być żadnych problemów.
Trochę gorzej to wygląda dla B+. Zauważyłem,
że z ładowarką działającą z B (ok. 750 mA), B+ (bez
dołączonych żadnych akcesoriów) potrafi „oszaleć”.
Problemy znikają po zastosowaniu zasilacza 2 A (np.
od tabletu).
Wracając do diody ACT. Do doświadczeń uży-
łem trzech różnych Raspberry: B (rev2), B+ i A+
z ostatnim Raspbianem usuwając lub uszkadzając
(wymazane przypadkowe fragmenty plików) kolejne
pliki startowe. Okazało się, że każde z urządzeń za-
chowuje się trochę inaczej (zob.
tabela 2).
Generalnie
najbardziej „rozmowna” okazała się najnowsza A+.
Sygnalizowała każdą z możliwych sytuacji, tak braku
jak i uszkodzenia pliku startowego. Najmniej mrugała
najstarsza B – tylko brak „start.elf” lub jądra „kernel.
img”. B+ zachowuje się pośrednio między B i A+.
Niestety, nie mam do dyspozycji wersji A, a rezultaty
uruchamianiem i zatrzymywaniem
procesów użytkownika w Linuksie
– ma PID=1.
Link symboliczny (ang.
symlink)
Tajemnica 3: przebłyski
Raspberry Pi B ma na swojej płytce pięć diód: PWR,
ACT i trzy dodatkowe związane z połączeniem
sieciowym – LNK, FDX i 100. Wersje A/A+ mają
Bootloader
– program rozruchowy.
Zależnie od potrzeb jego zadaniem
jest inicjacja układów, ich począt-
kowa konfiguracja, uruchomienie
podstawowych usług, załadowanie
i przekazanie kontroli do innych
programów. Często używa się całego
łańcuszka bootloaderów, z których
każdy uruchamia następny, bardziej
skomplikowany i realizujący coraz
więcej funkcji. Taki system nazywamy
rozruchem wieloetapowym (ang.
multi-stage bootloader).
Firmware
– specyficzny rodzaj
oprogramowania wbudowanego
w urządzenie, zapewnia jego inicjację,
dostarcza podstawowe procedury
obsługi.
PID (ang.
Process Identifier)
– w systemie operacyjnym: unikato-
wy identyfikator procesu. Na przy-
kład „init” – proces zarządzający
– specyficzny rodzaj zasobu, który wska-
zuje na plik lub katalog. Na poziomie
programów odwołanie jest praktycznie
przezroczyste i zachowuje się dokład-
nie tak, jak w przypadku właściwego
obiektu. Użyjcie komendy „ls -l”, żeby
zobaczyć, na co takie linki wskazują.
85
Na warsztacie
Tabela 2. Dioda ACT i popularne problemy dla Raspberry B, B+ i A+
Usunięty
Uszkodzony
Bootcode.bin B: ACT nie mruga
ACT nie mruga
A+: ACT świeci ciągle
A+: ACT świeci ciągle
B+: ACT świeci ciągle
B+: ACT świeci ciągle
start.elf
B: 4
B: ACT nie mruga
B+: 4
B+: ACT nie mruga
A+: ACT świeci ciągle
A+: ACT świeci ciągle
fixup.dat
Startuje, ale...
Startuje, ale...
kernel.img
B, B+, A+: 7 błysków ACT
B, B+, A+: ACT mruga podczas ładowania jądra, proces się nie kończy,
ze względu na błąd dekompresji (wyświetlany na konsoli)
mogłyby być całkiem interesujące. Najlepiej jednak
po prostu pamiętać o robieniu kopii zapasowej.
Pewne wątpliwości mogą dotyczyć plików
„fixup.*”. Generalnie wszystkie źródła podają,
że są one konieczne do uruchomienia urządzenia.
Ja usuwałem je z karty... i Raspberry startował.
Problemy pojawiały się jednak przy wykrywaniu
i dzieleniu pamięci. Bez „fixup.*”:
• B+: Raspberry wykrywał jedynie 256 MB całko-
witej pamięci (z 512 MB fizycznych);
• B+: podział pamięci nie odzwierciedlał ustawień
„/boot/config.txt” (oprócz „gpu_mem=16”);
• B: podobnie;
• A+: zachowywał się podobnie (A+ ma 256 MB
RAM).
Gdy system startowałem tylko z plikiem „fixup_cd.
dat” na karcie – jedynie dla „gpu_mem=16” konfi-
guracja pamięci wydawała się poprawna. Jego brak
(przy jednoczesnej obecności „fixup.dat”) sprawiał
problemy dla tego ustawienia. Wszystkie te ekspery-
menty obrazuje
tabela 3.
Oczywiście powyższe doświadczenia możemy
traktować jedynie w kategorii ciekawostek. Musicie
wziąć poprawkę na to, że w niestandardowych sy-
tuacjach narzędzia (takie jak „free” czy „vcgencmd”)
mogą zwracać zafałszowane rezultaty. Dodatkowo
przeprowadzałem jedynie testy uruchomienio-
we. Głębsza diagnostyka mogłaby wykazać więcej
problemów. Do czego więc te informacje mogą się
Wam przydać? Jeżeli zauważycie problemy z ilością
pamięci dostępnej dla Raspberry lub z jej podzia-
łem – upewnijcie się, że pliki „fixup.*” znajdują się
na karcie i są poprawne. Jeżeli to nic nie da – po-
nownie wypalcie kartę. To zresztą najlepsza rada
na większość bolączek.
Poziom tekstu: średnio trudny
SZKOŁA
Tajemnica 4: start Linuksa
Gdy „start.elf” załaduje jądro Linuksa do pamięci,
GPU ustawia CPU w stan aktywny. CPU rozpoczyna
wykonywanie kodu jądra zgodnie z parametrami
z „cmdline.txt”. Trzeba by obszernej książki, żeby
opisać wszystko, co się wtedy dzieje. Dość wspo-
mnieć, że inicjowane są urządzenia, ładowane
sterowniki dla nich, montowane systemy plików
(m.in. „/”) itd. Przeskoczymy do końca tej procedu-
ry, koncentrując się na domyślnym dla Raspbiana
sekwencyjnym sposobie inicjacji typu
SystemV.
Wprowadzimy teraz pojęcie poziomów uruchamia-
nia (ang.
runlevel;
[3], [7]):
• S – początkowy, inicjuje sprzęt;
• 0 – zamykanie systemu po komendzie „sudo
halt” lub „sudo shutdown now”;
• 1 (ang.
single-user)
– tryb pojedynczego użytkow-
nika przeznaczony do administracji systemem;
czasami możecie go doświadczyć w przypadku
uszkodzenia systemu plików;
• 2 – tryby dla wielu użytkowników (ang.
multiuser);
• 3, 4, 5 – dla Raspbiana identyczne z 2;
• 6 – restart systemu, po komendzie „sudo reboot”
lub „sudo shutdown -r now”.
Tabela 3. Doświadczenia z plikami „/boot/fixup*.dat”
gpu_mem
Bez fixup.*
Tylko fixup.dat
w config.txt
[gpu MB/cpu MB]
[gpu MB/cpu MB]
B+: 16 MB
16/240
16/240
Tylko 256 MB!
Tylko 256 MB!
B+: 32/64/128/256
128/128
Zgodnie z ustawieniami, 512 MB – OK
Tylko 256 MB!
A+: 16 MB
16/240
16/240
OK?
OK?
A+: 32/64/128
128/128
Zgodnie z ustawieniami, 256 MB – OK
Niezgodnie
z ustawieniami
A+: 256 (eksperyment) 128/128
Ciekawe: 192/64
Tylko fixup_cd.dat
[gpu MB/cpu MB]
16/496
OK
128/128
Tylko 256 MB!
16/240
OK
128/128
Niezgodnie
z ustawieniami
128/128
86
m.technik – www.mt.com.pl – nr 3/2015
Zgłoś jeśli naruszono regulamin