To pytanie o aplikacje do przestrzeni użytkownika, ale wysłuchaj mnie!
Trzy „aplikacje”, że tak powiem, są wymagane do uruchomienia funkcjonalnej dystrybucji Linuksa:
Bootloader - Dla osadzonych zwykle jest to U-Boot, choć nie jest to trudne wymaganie.
Jądro - to całkiem proste.
Zrootowany system plików - nie można bez niego uruchomić powłoki. Zawiera system plików, do którego jądro uruchamia się i gdzie
init
jest nazywany formą.
Moje pytanie dotyczy # 3. Jeśli ktoś chciałby zbudować bardzo minimalne rootfsy (w tym pytaniu powiedzmy, że nie ma GUI, tylko powłoka), jakie pliki / programy są wymagane do rozruchu z powłoki?
linux
embedded
startup
architecture
root-filesystem
MDMoore313
źródło
źródło
Odpowiedzi:
To całkowicie zależy od tego, jakie usługi chcesz mieć na swoim urządzeniu.
Programy
Możesz uruchomić Linuksa bezpośrednio w powłoce . Nie jest bardzo przydatny w produkcji - kto chciałby po prostu mieć tam powłokę - ale jest użyteczny jako mechanizm interwencji, gdy masz interaktywny bootloader: przejdź
init=/bin/sh
do wiersza poleceń jądra. Wszystkie systemy Linux (i wszystkie systemy uniksowe) mają powłokę w stylu Bourne / POSIX/bin/sh
.Będziesz potrzebował zestawu narzędzi powłoki . BusyBox jest bardzo powszechnym wyborem; zawiera skorupę i wspólnych narzędzi do pliku tekstowego i manipulacji (
cp
,grep
...), konfigurację sieci (ping
,ifconfig
...), manipulowanie procesem (ps
,nice
...), i różne inne narzędzia systemowe (fdisk
,mount
,syslogd
, ...). BusyBox jest niezwykle konfigurowalny: możesz wybrać narzędzia, które chcesz, a nawet poszczególne funkcje w czasie kompilacji, aby uzyskać właściwy kompromis w zakresie rozmiaru / funkcjonalności aplikacji. Opróczsh
, niezbędne minimum, które tak naprawdę nie można nic zrobić bez jestmount
,umount
ahalt
, ale byłoby to nietypowe, aby nie mieć równieżcat
,cp
,mv
,rm
,mkdir
,rmdir
,ps
,sync
I kilka innych. BusyBox instaluje się jako pojedynczy plik binarny o nazwiebusybox
, z dowiązaniem symbolicznym dla każdego narzędzia.Pierwszy proces w normalnym systemie uniksowym jest nazywany
init
. Jego zadaniem jest uruchomienie innych usług. BusyBox zawiera system inicjujący. Oprócz plikuinit
binarnego (zwykle znajdującego się w/sbin
) będziesz potrzebować jego plików konfiguracyjnych (zwykle nazywanych/etc/inittab
- niektóre współczesne zastępowania init usuwają ten plik, ale nie znajdziesz ich w małym systemie osadzonym), które wskazują, jakie usługi uruchomić i kiedy. W przypadku BusyBox/etc/inittab
jest opcjonalny; jeśli go brakuje, dostajesz powłokę root na konsoli, a skrypt/etc/init.d/rcS
(domyślna lokalizacja) jest wykonywany podczas rozruchu.To wszystko, czego potrzebujesz, poza programami, które sprawiają, że Twoje urządzenie robi coś pożytecznego. Na przykład na moim routerze domowym z wariantem OpenWrt jedynymi programami są BusyBox
nvram
(do odczytu i zmiany ustawień w pamięci NVRAM) oraz narzędzia sieciowe.O ile wszystkie pliki wykonywalne nie są połączone statycznie, potrzebujesz dynamicznego modułu ładującego (
ld.so
który może być wywoływany pod różnymi nazwami w zależności od wyboru biblioteki libc i architektury procesora) oraz wszystkich bibliotek dynamicznych (/lib/lib*.so
być może niektórych z nich/usr/lib
) wymaganych przez te pliki wykonywalne.Struktura katalogów
Filesystem Hierarchy Standard opisuje wspólną strukturę katalogów systemów Linux. Jest ukierunkowany na instalacje komputerów i serwerów: wiele z nich można pominąć w systemie wbudowanym. Oto typowe minimum.
/bin
: programy wykonywalne (niektóre mogą być w/usr/bin
zamian)./dev
: węzły urządzeń (patrz poniżej)/etc
: pliki konfiguracyjne/lib
: biblioteki współdzielone, w tym dynamiczny moduł ładujący (chyba że wszystkie pliki wykonywalne są połączone statycznie)/proc
: punkt podłączenia dla systemu plików proc/sbin
: programy wykonywalne. Różnica/bin
polega na tym, że/sbin
dotyczy programów, które są użyteczne tylko dla administratora systemu, ale to rozróżnienie nie ma znaczenia na urządzeniach osadzonych. Możesz zrobić/sbin
symboliczny link do/bin
./mnt
: przydatne w przypadku głównych systemów plików tylko do odczytu jako punktu montowania na podstawie podczas konserwacji/sys
: punkt montowania systemu plików sysfs/tmp
: lokalizacja plików tymczasowych (częstotmpfs
montowanie)/usr
: Zawiera podkatalogibin
,lib
asbin
./usr
istnieje dla dodatkowych plików, które nie znajdują się w głównym systemie plików. Jeśli go nie masz, możesz utworzyć/usr
symboliczne łącze do katalogu głównego.Pliki urządzeń
Oto kilka typowych wpisów w minimalnym
/dev
:console
full
(pisanie do niego zawsze zgłasza „brak miejsca na urządzeniu”)log
(gniazdo używane przez programy do wysyłania wpisów do dziennika), jeślisyslogd
odczytujesz z niego demon (np. BusyBox)null
(działa jak plik, który zawsze jest pusty)ptmx
orazpts
katalog , jeśli chcesz używać pseudo-terminali (tj. dowolnego terminala innego niż konsola) - np. jeśli urządzenie jest podłączone do sieci i chcesz połączyć się za pomocą telnet lub sshrandom
(zwraca losowe bajty, ryzyko zablokowania)tty
(zawsze oznacza terminal programu)urandom
(zwraca losowe bajty, nigdy nie blokuje, ale może nie być losowe na świeżo uruchomionym urządzeniu)zero
(zawiera nieskończoną sekwencję bajtów pustych)Poza tym będziesz potrzebować wpisów dla swojego sprzętu (z wyjątkiem interfejsów sieciowych, które nie dostają wpisów
/dev
): portów szeregowych, pamięci itp.W przypadku urządzeń osadzonych wpisy urządzeń zwykle tworzy się bezpośrednio w głównym systemie plików. Systemy zaawansowane mają skrypt wywoływany
MAKEDEV
do tworzenia/dev
wpisów, ale w systemie osadzonym skrypt często nie jest dołączany do obrazu. Jeśli jakiś sprzęt może być podłączony „na gorąco” (np. Jeśli urządzenie ma port hosta USB),/dev
powinien być zarządzany przez udev (nadal możesz mieć minimalny zestaw w głównym systemie plików).Działania podczas uruchamiania
Poza głównym systemem plików konieczne jest zamontowanie kilku dodatkowych elementów do normalnego działania:
/proc
(prawie niezbędny)/sys
(prawie niezbędne)tmpfs
system plików włączony/tmp
(aby umożliwić programom tworzenie plików tymczasowych, które będą w pamięci RAM, a nie w głównym systemie plików, który może być we flashu lub tylko do odczytu)/dev
if dynamic (patrz udev w „ Plikach urządzeń” powyżej)/dev/pts
jeśli chcesz użyć [pseudo-terminali (patrz uwaga na tematpts
powyżej)Możesz utworzyć
/etc/fstab
plik i zadzwonićmount -a
lub uruchomićmount
ręcznie.Uruchom demona syslog (jak również
klogd
dzienniki jądra, jeślisyslogd
program się tym nie zajmuje), jeśli masz jakieś miejsce do zapisywania dzienników.Następnie urządzenie jest gotowe do uruchomienia usług specyficznych dla aplikacji.
Jak zrobić główny system plików
To długa i różnorodna historia, więc jedyne, co tu zrobię, to kilka wskazówek.
Główny system plików może być przechowywany w pamięci RAM (ładowany z (zwykle skompresowanego) obrazu w pamięci ROM lub flash), lub w systemie plików opartym na dysku (przechowywany w pamięci ROM lub flash) lub ładowany z sieci (często przez TFTP ), jeśli dotyczy . Jeśli główny system plików znajduje się w pamięci RAM, ustaw go jako initramfs - system plików RAM, którego zawartość jest tworzona podczas rozruchu.
Istnieje wiele struktur do składania obrazów głównych dla systemów osadzonych. Istnieje kilka wskazówek w FAQ BusyBox . Buildroot jest popularnym narzędziem, pozwalającym na zbudowanie całego obrazu głównego z konfiguracją podobną do jądra Linuksa i BusyBox. OpenEmbedded to kolejna taka platforma.
Wikipedia ma (niekompletną) listę popularnych osadzonych dystrybucji Linuksa . Przykładem wbudowanego Linuksa, który możesz mieć w pobliżu, jest rodzina systemów operacyjnych OpenWrt dla urządzeń sieciowych (popularna na domowych routerach majsterkowiczów). Jeśli chcesz uczyć się na podstawie doświadczenia, możesz wypróbować Linuksa od podstaw , ale jest on przeznaczony raczej dla komputerów stacjonarnych dla hobbystów niż dla urządzeń osadzonych.
Uwaga na temat jądra Linux vs
Jedynym zachowaniem, które jest upieczone w jądrze Linuksa, jest to, że jest to pierwszy program uruchamiany w czasie rozruchu. (Nie będę wchodził tutaj w subtelności initrd i initramfs .) Ten program, tradycyjnie nazywany init , ma proces ID 1 i ma pewne przywileje (odporność na sygnały KILL ) i obowiązki (zbieranie sierot ). Możesz uruchomić system z jądrem Linuksa i uruchomić cokolwiek chcesz jako pierwszy proces, ale wtedy masz system operacyjny oparty na jądrze Linuksa, a nie to, co zwykle nazywa się „Linux” - Linux , w zdrowym sensie tego terminu to uniksowy system operacyjny, którego jądrem jest jądro Linux. Na przykład Android to system operacyjny, który nie jest podobny do Uniksa, ale jest oparty na jądrze Linux.
źródło
Wszystko czego potrzebujesz to jeden statycznie powiązany plik wykonywalny, umieszczony w systemie plików, w izolacji. Nie potrzebujesz żadnych innych plików. Ten plik wykonywalny to proces inicjujący. Może być zajęty. To daje powłokę i wiele innych narzędzi, wszystko samo w sobie. Możesz przejść do w pełni funkcjonalnego systemu, po prostu ręcznie wykonując polecenia w busybox, aby zamontować główny system plików do odczytu i zapisu, utworzyć / dev węzły, wykonać prawdziwy init itp.
źródło
Jeśli nie potrzebujesz żadnych narzędzi powłoki, zrobi to statycznie powiązany
mksh
plik binarny (np. Przeciwko klibc - 130K w systemie Linux / i386). Potrzebujesz skryptu/linuxrc
lub/init
lub,/sbin/init
który po prostu wywołujemksh -l -T!/dev/tty1
pętlę:-T!$tty
Opcja jest najnowszym dodatkiem domksh
informujący go do tarła nową powłokę na danym terminalu i czekać na niego. (Wcześniej było tylko-T-
do dæmonise się programm i-T$tty
na tarło na terminalu, ale nie czekać na niego. To nie było tak miło.)-l
Opcja po prostu mówi to, aby uruchomić powłokę logowania (który odczytuje/etc/profile
,~/.profile
i~/.mkshrc
).Zakłada się, że twój terminal jest
/dev/tty1
, zamiennik. (Przy większej magii terminal można automatycznie znaleźć./dev/console
Nie da ci pełnej kontroli pracy.)Aby
/dev
to zadziałało, potrzebujesz kilku plików :Uruchamianie z opcją jądra
devtmpfs.mount=1
eliminuje potrzebę wypełnienia/dev
, po prostu niech to będzie pusty katalog (odpowiedni do użycia jako punkt montowania).Zwykle będziesz chciał mieć jakieś narzędzia (z klibc, busybox, beastiebox, toybox lub toolbox), ale tak naprawdę nie są potrzebne.
Możesz dodać
~/.mkshrc
plik, który konfiguruje $ PS1 oraz kilka podstawowych aliasów i funkcji powłoki.Kiedyś zrobiłem initrd skompresowany (371K nieskompresowany) dla Linux / m68k, używając tylko mksh (i jego przykładowego pliku mkshrc) i tylko klibc-utils. (To było wcześniej, jednak -T! Został dodany do powłoki, więc
/dev/tty2
zamiast tego uruchomił powłokę logowania i wysłał komunikat do konsoli z informacją, że użytkownik powinien zmienić terminale.) Działa dobrze.To naprawdę minimalna konfiguracja. Pozostałe odpowiedzi stanowią doskonałą poradę dotyczącą nieco bardziej funkcjonalnych systemów. To jest wyjątkowa sprawa.
Oświadczenie: Jestem programistą mksh.
źródło
mksh
.Minimalny program init hello world program krok po kroku
Skompiluj cześć świata bez żadnych zależności, które kończą się nieskończoną pętlą.
init.S
:Nie możemy użyć
sys_exit
, inaczej jądro wpadnie w panikę.Następnie:
Tworzy to system plików z naszym hello world
/init
, który jest pierwszym programem dla użytkowników, który uruchomi jądro. Moglibyśmy również dodać więcej plikówd/
i byłyby one dostępne z/init
programu podczas działania jądra.Następnie
cd
w drzewie jądra Linux, kompilacja jest jak zwykle i uruchom ją w QEMU:I powinieneś zobaczyć linię:
na ekranie emulatora! Pamiętaj, że nie jest to ostatni wiersz, więc musisz spojrzeć nieco dalej.
Możesz także użyć programów C, jeśli połączysz je statycznie:
z:
Możesz działać na prawdziwym sprzęcie z włączonym USB
/dev/sdX
i:Świetne źródło na ten temat: http://landley.net/writing/rootfs-howto.html Wyjaśnia również, jak używać
gen_initramfs_list.sh
, czyli skryptu z drzewa źródeł jądra Linuksa, który pomaga zautomatyzować proces.Następny krok: skonfiguruj BusyBox, aby móc współpracować z systemem: https://github.com/cirosantilli/runlinux
Testowane na Ubuntu 16.10, QEMU 2.6.1.
źródło