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ócz sh
, niezbędne minimum, które tak naprawdę nie można nic zrobić bez jest mount
, umount
a halt
, 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 nazwie busybox
, 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 pliku init
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ęsto tmpfs
montowanie)
/usr
: Zawiera podkatalogi bin
, lib
a sbin
. /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śli syslogd
odczytujesz z niego demon (np. BusyBox)
null
(działa jak plik, który zawsze jest pusty)
ptmx
oraz pts
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 ssh
random
(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:
- procfs włączony
/proc
(prawie niezbędny)
- sysfs on
/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)
- tmpfs, devfs lub devtmpfs on
/dev
if dynamic (patrz udev w „ Plikach urządzeń” powyżej)
- poświęca się,
/dev/pts
jeśli chcesz użyć [pseudo-terminali (patrz uwaga na temat pts
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śli syslogd
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.