To zcela závisí na tom, jaké služby chcete mít ve svém zařízení.
Programy
Linux můžete spustit přímo do shell . Není to příliš užitečné v produkci – kdo by tam chtěl mít jen shell – ale je užitečný jako intervenční mechanismus, když máte interaktivní bootloader:předejte init=/bin/sh
na příkazový řádek jádra. Všechny systémy Linux (a všechny unixové systémy) mají v /bin/sh
shell ve stylu Bourne/POSIX .
Budete potřebovat sadu nástrojů prostředí . BusyBox je velmi častou volbou; obsahuje shell a běžné nástroje pro manipulaci se soubory a textem (cp
, grep
, …), nastavení sítě (ping
, ifconfig
, …), manipulace s procesy (ps
, nice
, …) a různé další systémové nástroje (fdisk
, mount
, syslogd
, …). BusyBox je extrémně konfigurovatelný:můžete si vybrat, které nástroje chcete, a dokonce i jednotlivé funkce v době kompilace, abyste dosáhli správného kompromisu velikosti a funkčnosti pro vaši aplikaci. Kromě sh
, naprosté minimum, bez kterého nemůžete nic dělat, je mount
, umount
a halt
, ale bylo by atypické nemít také cat
, cp
, mv
, rm
, mkdir
, rmdir
, ps
, sync
a několik dalších. BusyBox se nainstaluje jako jeden binární soubor s názvem busybox
, se symbolickým odkazem pro každý nástroj.
První proces na normálním unixovém systému se nazývá init
. Jeho úkolem je spustit další služby. BusyBox obsahuje inicializační systém. Kromě init
binární (obvykle se nachází v /sbin
), budete potřebovat jeho konfigurační soubory (obvykle nazývané /etc/inittab
— některé moderní náhrady init tento soubor odstraní, ale nenajdete je na malém vestavěném systému), které označují, jaké služby a kdy spustit. Pro BusyBox /etc/inittab
je volitelný; pokud chybí, získáte kořenový shell na konzoli a skript /etc/init.d/rcS
(výchozí umístění) se spustí při spouštění.
To je vše, co potřebujete, samozřejmě kromě programů, díky kterým vaše zařízení dělá něco užitečného. Například na mém domácím routeru s variantou OpenWrt jsou jediné programy BusyBox, nvram
(pro čtení a změnu nastavení v NVRAM) a síťové nástroje.
Pokud nejsou všechny vaše spustitelné soubory staticky propojeny, budete potřebovat dynamický zavaděč (ld.so
, které mohou být nazývány různými jmény v závislosti na výběru knihovny libc a na architektuře procesoru) a všech dynamických knihoven (/lib/lib*.so
, možná některé z nich v /usr/lib
) vyžadované těmito spustitelnými soubory.
Struktura adresáře
Standard Hierarchy Filesystem popisuje běžnou adresářovou strukturu systémů Linux. Je zaměřen na desktopové a serverové instalace:mnohé z nich lze na vestavěném systému vynechat. Zde je typické minimum.
/bin
:spustitelné programy (některé mohou být v/usr/bin
místo toho)./dev
:uzly zařízení (viz níže)/etc
:konfigurační soubory/lib
:sdílené knihovny, včetně dynamického zavaděče (pokud nejsou všechny spustitelné soubory staticky propojeny)/proc
:přípojný bod pro souborový systém proc/sbin
:spustitelné programy. Rozdíl od/bin
je to/sbin
je pro programy, které jsou užitečné pouze pro správce systému, ale tento rozdíl nemá význam u vestavěných zařízení. Můžete udělat/sbin
symbolický odkaz na/bin
./mnt
:užitečné mít na kořenových souborových systémech pouze pro čtení jako počáteční bod připojení během údržby/sys
:bod připojení pro souborový systém sysfs/tmp
:umístění pro dočasné soubory (častotmpfs
montáž)/usr
:obsahuje podadresářebin
,lib
asbin
./usr
existuje pro další soubory, které nejsou v kořenovém souborovém systému. Pokud to nemáte, můžete vytvořit/usr
symbolický odkaz na kořenový adresář.
Soubory zařízení
Zde jsou některé typické položky v minimálním /dev
:
console
full
(zápis do něj vždy hlásí „na zařízení nezbývá místo“)log
(soket, který programy používají k odesílání záznamů protokolu), pokud mátesyslogd
démon (jako je BusyBox), který z něj čtenull
(chová se jako soubor, který je vždy prázdný)ptmx
apts
adresář, pokud chcete používat pseudoterminály (tj. jakýkoli jiný terminál než konzole) — např. pokud je zařízení připojeno k síti a chcete se připojit pomocí telnetu nebo sshrandom
(vrací náhodné bajty, riskuje blokování)tty
(vždy označuje terminál programu)urandom
(vrací náhodné bajty, nikdy neblokuje, ale na čerstvě spuštěném zařízení nemusí být náhodné)zero
(obsahuje nekonečnou sekvenci prázdných bajtů)
Kromě toho budete potřebovat položky pro váš hardware (kromě síťových rozhraní, tato nemají položky v /dev
):sériové porty, úložiště atd.
U vestavěných zařízení byste normálně vytvořili položky zařízení přímo v kořenovém souborovém systému. Špičkové systémy mají skript nazvaný MAKEDEV
vytvořit /dev
záznamy, ale na vestavěném systému skript často není součástí obrazu. Pokud lze některý hardware připojit za provozu (např. pokud má zařízení hostitelský port USB), pak /dev
by měl být spravován udev (můžete mít stále minimální sadu na kořenovém souborovém systému).
Akce při spuštění
Kromě kořenového souborového systému musíte pro normální provoz připojit několik dalších:
- procfs na
/proc
(v podstatě nepostradatelné) - sysfs na
/sys
(v podstatě nepostradatelné) tmpfs
souborový systém na/tmp
(aby programy mohly vytvářet dočasné soubory, které budou v paměti RAM, nikoli v kořenovém systému souborů, který může být ve formátu flash nebo pouze pro čtení)- tmpfs, devfs nebo devtmpfs na
/dev
pokud je dynamický (viz udev v části „Soubory zařízení“ výše) - vývojáři na
/dev/pts
pokud chcete používat [pseudoterminály (viz poznámka opts
výše)
Můžete vytvořit /etc/fstab
soubor a zavolejte mount -a
nebo spusťte mount
ručně.
Spusťte démona syslog (stejně jako klogd
pro protokoly jádra, pokud syslogd
program se o to nestará), pokud máte nějaké místo pro zápis logů.
Poté je zařízení připraveno ke spuštění služeb specifických pro aplikaci.
Jak vytvořit kořenový souborový systém
Toto je dlouhý a rozmanitý příběh, takže vše, co zde udělám, je uvést několik tipů.
Kořenový souborový systém může být uchováván v RAM (načten z (obvykle komprimovaného) obrazu v ROM nebo flash), nebo na diskovém souborovém systému (uložený v ROM nebo flash), nebo načten ze sítě (často přes TFTP), pokud je to možné. . Pokud je kořenový souborový systém v RAM, udělejte z něj initramfs – souborový systém RAM, jehož obsah se vytváří při spouštění.
Existuje mnoho rámců pro sestavení kořenových obrazů pro vestavěné systémy. V BusyBox FAQ je několik tipů. Buildroot je populární, umožňuje vám vytvořit celý kořenový obraz s nastavením podobným linuxovému jádru a BusyBoxu. OpenEmbedded je další takový rámec.
Wikipedia má (neúplný) seznam oblíbených vestavěných distribucí Linuxu. Příkladem vestavěného Linuxu, který můžete mít ve svém okolí, je rodina operačních systémů OpenWrt pro síťová zařízení (oblíbená na domácích routerech kutilů). Pokud se chcete učit na základě zkušeností, můžete vyzkoušet Linux od nuly, ale je zaměřen spíše na stolní systémy pro fandy než na vestavěná zařízení.
Poznámka k jádru Linux vs. Linux
Jediné chování, které je zapečeno v jádře Linuxu, je první program, který se spouští při bootování. (Nebudu se zde pouštět do jemností initrd a initramfs.) Tento program, tradičně nazývaný init, má proces ID 1 a má určitá privilegia (imunita vůči signálům KILL) a povinnosti (sklízení sirotků). Můžete spustit systém s linuxovým jádrem a spustit cokoli chcete jako první proces, ale pak máte operační systém založený na linuxovém jádře, a ne to, co se běžně nazývá „Linux“ – Linux, ve zdravém smyslu. tohoto termínu je operační systém podobný Unixu, jehož jádrem je jádro Linuxu. Například Android je operační systém, který není podobný Unixu, ale je založen na linuxovém jádře.
Vše, co potřebujete, je jeden staticky propojený spustitelný soubor umístěný v systému souborů v izolaci. Nepotřebujete žádné další soubory. Tím spustitelným souborem je proces init. Může to být busybox. To vám dává shell a řadu dalších nástrojů, vše samo o sobě. Můžete přejít do plně funkčního systému pouhým ručním prováděním příkazů v busyboxu pro připojení kořenového souborového systému pro čtení a zápis, vytvoření /dev uzlů, exec real init atd.
Pokud nepotřebujete žádné nástroje shellu, staticky propojený mksh
binární (např. proti klibc – 130 kB na Linuxu/i386). Potřebujete /linuxrc
nebo /init
nebo /sbin/init
skript, který pouze volá mksh -l -T!/dev/tty1
ve smyčce:
#!/bin/mksh
while true; do
/bin/mksh -l -T!/dev/tty1
done
-T!$tty
volba je nedávným přírůstkem do mksh
který mu říká, aby vytvořil nový shell na daném terminálu a počkal na něj. (Předtím zde bylo pouze -T-
k demonizaci programu a -T$tty
spawnovat se na terminálu, ale ne na něj čekat. To nebylo tak hezké.) -l
volba mu jednoduše řekne, aby spustil přihlašovací shell (který zní /etc/profile
, ~/.profile
a ~/.mkshrc
).
To předpokládá, že váš terminál je /dev/tty1
, náhradník. (Pomocí větší magie lze terminál automaticky zjistit. /dev/console
vám nedá plnou kontrolu nad prací.)
Potřebujete několik souborů v /dev
aby to fungovalo:
- /dev/console
- /dev/null
- /dev/tty
- /dev/tty1
Zavedení s volbou jádra devtmpfs.mount=1
eliminuje potřebu vyplněného /dev
, nechte to být prázdný adresář (vhodný pro použití jako přípojný bod).
Obvykle budete chtít mít nějaké nástroje (z klibc, busybox, beastiebox, toybox nebo toolbox), ale ve skutečnosti nejsou potřeba.
Možná budete chtít přidat ~/.mkshrc
soubor, který nastavuje $PS1 a některé základní shellové aliasy a funkce.
Jednou jsem vytvořil 171K komprimovaný (371K nekomprimovaný) initrd pro Linux/m68k pouze pomocí mksh (a jeho ukázkového souboru mkshrc) a klibc-utils. (To však bylo předtím, než bylo do shellu přidáno -T!, takže to vytvořilo přihlašovací shell na /dev/tty2
místo toho a odezněla zpráva do konzole, která uživateli říká, aby přepnul terminály.) Funguje to dobře.
To je opravdu naprosté minimum založit. Ostatní odpovědi poskytují vynikající rady směrem k poněkud funkčnějším systémům. Toto je skutečně speciální případ.
Zřeknutí se odpovědnosti:Jsem vývojář mksh.