GNU/Linux >> Znalost Linux >  >> Linux

Jaké jsou minimální aplikace kořenového souborového systému, které jsou nutné k úplnému zavedení linuxu?

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 (často tmpfs montáž)
  • /usr :obsahuje podadresáře bin , lib a sbin . /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áte syslogd démon (jako je BusyBox), který z něj čte
  • null (chová se jako soubor, který je vždy prázdný)
  • ptmx a pts 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 ssh
  • random (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 o pts 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.


Linux
  1. Linux – Jak změnit zapomenuté heslo roota?

  2. Linux – Jak zjistit, jaké pevné disky jsou v systému?

  3. Linux – jaké zdroje entropie používá jádro Linuxu?

  1. Jaké jsou různé typy shellů v Linuxu?

  2. Jaký je účel skupiny „wheel“ v Linuxu

  3. Jaká je role magického čísla při bootování v Linuxu?

  1. Linux – Jaké jsou různé způsoby nastavení oprávnění k souborům atd. na Gnu/linux?

  2. Jaké jsou nevýhody linuxových front zpráv?

  3. Jaké je nejjednodušší vysvětlení skutečnosti, že aplikace pro Windows nejsou kompatibilní s Linuxem?