GNU/Linux >> Znalost Linux >  >> Linux

Virtuální souborové systémy v Linuxu:Proč je potřebujeme a jak fungují

Co je souborový systém? Podle prvního linuxového přispěvatele a autora Roberta Lovea:"Souborový systém je hierarchické úložiště dat, které se drží specifické struktury." Tento popis však platí stejně dobře pro VFAT (Virtual File Allocation Table), Git a Cassandra (databáze NoSQL). Co tedy odlišuje souborový systém?

Základy systému souborů

Linuxové jádro vyžaduje, aby entita byla souborovým systémem, musí také implementovat open() , číst() a write() metody na perzistentních objektech, ke kterým jsou přidružena jména. Z hlediska objektově orientovaného programování jádro zachází s generickým souborovým systémem jako s abstraktním rozhraním a tyto tři velké funkce jsou „virtuální“ bez výchozí definice. V souladu s tím se výchozí implementace souborového systému jádra nazývá virtuální souborový systém (VFS).

VFS je základem slavného postřehu, že v systémech podobných Unixu je „všechno soubor“. Zamyslete se nad tím, jak je divné, že výše uvedené malé demo se znakovým zařízením /dev/console skutečně funguje. Obrázek ukazuje interaktivní relaci Bash na virtuálním dálnopisu (tty). Odeslání řetězce do zařízení virtuální konzoly způsobí, že se objeví na virtuální obrazovce. VFS má jiné, ještě podivnější vlastnosti. Například je možné v nich hledat.

Další zdroje pro Linux

  • Cheat pro příkazy Linuxu
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Bezplatný online kurz:Technický přehled RHEL
  • Síťový cheat pro Linux
  • Cheat sheet SELinux
  • Cheat pro běžné příkazy pro Linux
  • Co jsou kontejnery systému Linux?
  • Naše nejnovější články o Linuxu

Známé souborové systémy jako ext4, NFS a /proc všechny poskytují definice tří velkých funkcí v datové struktuře v jazyce C zvané file_operations. Navíc konkrétní souborové systémy rozšiřují a potlačují funkce VFS známým objektově orientovaným způsobem. Jak zdůrazňuje Robert Love, abstrakce VFS umožňuje uživatelům Linuxu bezstarostně kopírovat soubory do az cizích operačních systémů nebo abstraktních entit, jako jsou roury, bez obav o svůj interní formát dat. Jménem uživatelského prostoru může proces prostřednictvím systémového volání zkopírovat ze souboru do datových struktur jádra pomocí metody read() jednoho souborového systému a poté k výstupu dat použít metodu write() jiného druhu souborového systému.

Definice funkcí, které patří k samotnému základnímu typu VFS, se nacházejí v souborech fs/*.c ve zdrojovém kódu jádra, zatímco podadresáře fs/ obsahují konkrétní souborové systémy. Jádro také obsahuje entity podobné souborovému systému, jako jsou cgroups, /dev a tmpfs, které jsou potřeba na začátku zaváděcího procesu, a proto jsou definovány v podadresáři init/ jádra. Všimněte si, že cgroups, /dev a tmpfs nevolají file_operations velké tři funkce, ale místo toho přímo čtou a zapisují do paměti.

Níže uvedený diagram zhruba ilustruje, jak uživatelský prostor přistupuje k různým typům souborových systémů běžně nainstalovaných na systémech Linux. Nejsou zobrazeny konstrukce jako roury, dmesg a hodiny POSIX, které také implementují struct file_operations a jejichž přístupy proto procházejí vrstvou VFS.

Existence VFS podporuje opětovné použití kódu, protože základní metody spojené se souborovými systémy nemusí být znovu implementovány každým typem souborového systému. Opětovné použití kódu je široce přijímaný osvědčený postup softwarového inženýrství! Bohužel, pokud znovu použitý kód zavádí závažné chyby, pak jimi trpí všechny implementace, které zdědí běžné metody.

/tmp:Jednoduchý tip

Snadný způsob, jak zjistit, jaké VFS jsou v systému přítomny, je zadat mount | grep -v sd | grep -v :/ , který zobrazí seznam všech připojených souborových systémů, které nejsou rezidentní na disku a ne NFS na většině počítačů. Jedním z uvedených připojení VFS bude jistě /tmp, že?

Proč se nedoporučuje udržovat /tmp v úložišti? Protože soubory v /tmp jsou dočasné(!) a úložná zařízení jsou pomalejší než paměť, kde se vytvářejí soubory tmpf. Fyzická zařízení navíc podléhají opotřebení častým zápisem více než paměť. A konečně, soubory v /tmp mohou obsahovat citlivé informace, takže jejich zmizení při každém restartu je funkce.

Instalační skripty pro některá linuxová distribuce bohužel ve výchozím nastavení stále vytvářejí /tmp na úložném zařízení. Nezoufejte, pokud tomu tak je u vašeho systému. Postupujte podle jednoduchých pokynů na vždy vynikající Arch Wiki a problém vyřešte, mějte na paměti, že paměť přidělená tmpfs není k dispozici pro jiné účely. Jinými slovy, systému s gigantickým tmpfs s velkými soubory může dojít paměť a může dojít k pádu. Další tip:když upravujete soubor /etc/fstab, nezapomeňte jej ukončit novým řádkem, protože váš systém se jinak nespustí. (Hádej, jak to vím.)

/proc a /sys

Kromě /tmp jsou VFS, které většina uživatelů Linuxu nejznámější, /proc a /sys. (/dev se spoléhá na sdílenou paměť a nemá žádné operace se soubory). Proč dvě příchutě? Pojďme se na to podívat podrobněji.

Procfs nabízí snímek okamžitého stavu jádra a procesů, které řídí pro uživatelský prostor. V /proc jádro zveřejňuje informace o možnostech, které poskytuje, jako jsou přerušení, virtuální paměť a plánovač. Kromě toho /proc/sys je místo, kde jsou nastavení, která lze konfigurovat pomocí příkazu sysctl, přístupná uživatelskému prostoru. Stav a statistiky jednotlivých procesů jsou hlášeny v adresářích /proc/.

Chování souborů /proc ilustruje, jak rozdílné mohou být souborové systémy na disku VFS. Na jedné straně /proc/meminfo obsahuje informace prezentované příkazem free . Na druhou stranu je tu také prázdno! jak to může být? Situace připomíná slavný článek napsaný fyzikem Cornell University N. Davidem Merminem v roce 1985 nazvaný "Je tam měsíc, když se nikdo nedívá? Realita a kvantová teorie." Pravdou je, že jádro shromažďuje statistiky o paměti, když je proces požaduje z /proc, a ve skutečnosti existuje nic v souborech v /proc, když se nikdo nedívá. Jak řekl Mermin:"Je to základní kvantová doktrína, že měření obecně neodhaluje již existující hodnotu měřené vlastnosti." (Odpověď na otázku o Měsíci je ponechána jako cvičení.)

Zdánlivá prázdnota procfs dává smysl, protože dostupné informace jsou dynamické. U sysfs je situace jiná. Porovnejme, kolik souborů o velikosti alespoň jednoho bajtu je v /proc versus /sys.

Procfs má přesně jeden, a to exportovanou konfiguraci jádra, což je výjimka, protože ji je potřeba vygenerovat pouze jednou za boot. Na druhou stranu má /sys spoustu větších souborů, z nichž většina obsahuje jednu stránku paměti. Soubory sysfs obvykle obsahují přesně jedno číslo nebo řetězec, na rozdíl od tabulek informací vytvořených čtením souborů jako /proc/meminfo.

Účelem sysfs je vystavit čitelné a zapisovatelné vlastnosti toho, co jádro nazývá „kobjects“ uživatelskému prostoru. Jediným účelem kobjects je počítání referencí:když je vymazán poslední odkaz na kobject, systém získá zpět zdroje s ním spojené. Přesto /sys tvoří většinu známého "stabilního ABI do uživatelského prostoru" jádra, které nikdo nikdy nemůže za žádných okolností "rozbít." To neznamená, že soubory v sysfs jsou statické, což by bylo v rozporu s počítáním referencí nestálých objektů.

Stabilní ABI jádra místo toho omezuje, co může se objeví v /sys, nikoli to, co je v daném okamžiku skutečně přítomno. Výpis oprávnění k souborům v sysfs poskytuje představu o tom, jak lze nastavit nebo číst konfigurovatelné, laditelné parametry zařízení, modulů, souborových systémů atd. Logika nutí k závěru, že procfs je také součástí stabilního ABI jádra, ačkoli dokumentace jádra to výslovně neuvádí.

Sledování VFS pomocí nástrojů eBPF a Skrytá kopie

Nejjednodušší způsob, jak se naučit, jak jádro spravuje soubory sysfs, je sledovat to v akci a nejjednodušší způsob, jak se dívat na ARM64 nebo x86_64, je použít eBPF. eBPF (extended Berkeley Packet Filter) se skládá z virtuálního stroje běžícího uvnitř jádra, na který mohou privilegovaní uživatelé zadávat dotazy z příkazového řádku. Zdroj jádra říká čtenáři, co jádro umí dělat; spuštění nástrojů eBPF na zavedeném systému místo toho ukazuje, co jádro skutečně dělá .

Začít s eBPF je naštěstí docela snadné pomocí nástrojů bcc, které jsou k dispozici jako balíčky od hlavních linuxových distribucí a byly dostatečně zdokumentovány Brendanem Greggem. Nástroje Skrytá kopie jsou skripty Pythonu s malými vloženými úryvky jazyka C, což znamená, že každý, komu vyhovuje kterýkoli jazyk, je může snadno upravit. V tomto počtu je v skrytá kopie/nástroje 80 skriptů Pythonu, takže je vysoce pravděpodobné, že správce systému nebo vývojář najde existující skript, který je relevantní pro jeho potřeby.

Chcete-li získat velmi hrubou představu o tom, jakou práci VFS vykonávají na běžícím systému, vyzkoušejte jednoduchý vfscount nebo vfsstat, které ukazují, že každou sekundu proběhnou desítky volání funkce vfs_open() a jejích přátel.

Pro méně triviální příklad se podívejme, co se stane v sysfs, když je USB klíč vložen do běžícího systému.

V prvním jednoduchém příkladu výše skript trace.py bcc tools vytiskne zprávu při každém spuštění příkazu sysfs_create_files(). Vidíme, že sysfs_create_files() bylo spuštěno vláknem kworker v reakci na vložení USB flash disku, ale jaký soubor byl vytvořen? Druhý příklad ilustruje plnou sílu eBPF. Zde trace.py vytiskne zpětné trasování jádra (volba -K) plus název souboru vytvořeného pomocí sysfs_create_files(). Fragment uvnitř jednoduchých uvozovek je nějaký zdrojový kód C, včetně snadno rozpoznatelného formátovacího řetězce, který poskytnutý skript Pythonu přiměje kompilátor LLVM just-in-time kompilovat a spustit uvnitř virtuálního počítače v jádře. Úplný podpis funkce sysfs_create_files() musí být reprodukován ve druhém příkazu, aby formátovací řetězec mohl odkazovat na jeden z parametrů. Chyby v tomto fragmentu C mají za následek rozpoznatelné chyby kompilátoru C. Pokud například -I je vynechán, výsledkem je "Nepodařilo se zkompilovat text BPF." Vývojáři, kteří jsou obeznámeni s C nebo Pythonem, zjistí, že nástroje Skrytá kopie lze snadno rozšířit a upravit.

Po vložení USB flash disku se objeví zpětné sledování jádra ukazující, že PID 7711 je vlákno typu kworker, které vytvořilo soubor nazvaný „events“ v sysfs. Odpovídající vyvolání pomocí sysfs_remove_files() ukazuje, že odstranění USB klíče vede k odstranění souboru událostí, v souladu s myšlenkou počítání referencí. Sledování sysfs_create_link() s eBPF během vkládání USB flash disku (nezobrazeno) ukazuje, že není vytvořeno méně než 48 symbolických odkazů.

Jaký je vlastně účel souboru událostí? Použití cscope k nalezení funkce __device_add_disk() odhalí, že volá disk_add_events() a do souboru událostí lze zapsat buď "media_change" nebo "eject_request". Zde bloková vrstva jádra informuje uživatelský prostor o vzhledu a zmizení „disku“. Zvažte, jak rychle je tato metoda zkoumání toho, jak funguje vkládání USB flash disku, informativní ve srovnání se snahou zjistit proces pouze ze zdroje.

Kořenové souborové systémy pouze pro čtení umožňují vestavěná zařízení

Nikdo jistě nevypne server nebo desktopový systém vytažením napájecí zástrčky. Proč? Protože připojené souborové systémy na fyzických úložných zařízeních mohou mít nevyřízené zápisy a datové struktury, které zaznamenávají jejich stav, mohou být nesynchronizované s tím, co je na úložišti zapsáno. Když k tomu dojde, majitelé systému budou muset počkat při příštím spuštění, než se spustí nástroj pro obnovu souborového systému fsck a v nejhorším případě skutečně přijdou o data.

Přesto milovníci slyšeli, že mnoho IoT a vestavěných zařízení, jako jsou směrovače, termostaty a automobily, nyní běží na Linuxu. Mnohá ​​z těchto zařízení téměř úplně postrádají uživatelské rozhraní a neexistuje způsob, jak je „odbootovat“ čistě. Zvažte nastartování auta s vybitou baterií, kde se energie v hlavní jednotce běžící na Linuxu opakovaně zvyšuje a snižuje. Jak to, že se systém nabootuje bez dlouhého fsck, když se motor konečně rozběhne? Odpověď zní, že vestavěná zařízení se spoléhají na kořenový souborový systém pouze pro čtení (zkráceně ro-rootfs).

Ro-rootfs nabízí mnoho výhod, které jsou méně zřejmé než neúplatnost. Jedním z nich je, že malware nemůže zapisovat do /usr nebo /lib, pokud tam nemůže zapisovat žádný proces Linuxu. Další je, že do značné míry neměnný souborový systém je kritický pro podporu vzdálených zařízení v terénu, protože pracovníci podpory vlastní místní systémy, které jsou nominálně totožné s těmi v terénu. Snad nejdůležitější (ale také nejjemnější) výhodou je, že ro-rootfs nutí vývojáře, aby se během fáze návrhu projektu rozhodli, které systémové objekty budou neměnné. Zacházení s ro-rootfs může být často nepohodlné nebo dokonce bolestivé, jak to často s konst proměnnými v programovacích jazycích bývá, ale výhody snadno splácejí dodatečné náklady.

Vytváření rootfs pouze pro čtení vyžaduje od embedded vývojářů určité další úsilí, a to je místo, kde přichází na řadu VFS. Linux potřebuje soubory v /var, aby bylo možné zapisovat, a navíc se mnoho populárních aplikací, které spouštějí vestavěné systémy, pokusí vytvořit konfiguraci dot-files v $HOME. Jedním z řešení pro konfigurační soubory v domovském adresáři je obvykle jejich předgenerování a zabudování do rootfs. Pro /var je jedním přístupem připojit jej na samostatný zapisovatelný oddíl, zatímco / samotný je připojen jako pouze pro čtení. Další oblíbenou alternativou je použití spojovacích nebo překryvných připojení.

Vazba a překrytí držáků a jejich použití v kontejnerech

Spuštění man mount je nejlepším místem, kde se můžete dozvědět o připojení a překryvných připojeních, která dávají vestavěným vývojářům a správcům systému možnost vytvořit souborový systém v jednom umístění cesty a poté jej poskytnout aplikacím na druhém. Pro vestavěné systémy je důsledek toho, že je možné ukládat soubory do /var na nezapisovatelném flash zařízení, ale překrýt nebo svázat cestu v tmpfs na cestu /var při bootování, takže aplikace tam mohou načmárat do svého srdce. rozkoš. Při příštím zapnutí budou změny v /var pryč. Překryvná připojení poskytují spojení mezi tmpfs a základním souborovým systémem a umožňují zjevnou modifikaci existujícího souboru v ro-rootfs, zatímco připojení vázání může způsobit, že se nové prázdné adresáře tmpfs zobrazí jako zapisovatelné na cestách ro-rootfs. Zatímco overlayfs je správný typ souborového systému, připojení k připojení jsou implementována zařízením jmenného prostoru VFS.

Na základě popisu overlay a bind mountů nikoho nepřekvapí, že je linuxové kontejnery hojně využívají. Pojďme se podívat, co se stane, když použijeme systemd-nspawn ke spuštění kontejneru spuštěním nástroje mountsnoop bcc:

A podívejme se, co se stalo:

Zde systemd-nspawn poskytuje vybrané soubory v hostitelském procfs a sysfs kontejneru na cestách v jeho rootfs. Kromě příznaku MS_BIND, který nastavuje připojení k připojení, určují vztah mezi změnami v oboru názvů hostitele a v kontejneru některé další příznaky, které vyvolává systémové volání "mount". Například připojení-připojení může buď přenést změny v /proc a /sys do kontejneru, nebo je skrýt v závislosti na vyvolání.

Přehled

Pochopení vnitřních prvků Linuxu se může zdát jako nemožný úkol, protože samotné jádro obsahuje obrovské množství kódu, pomineme-li aplikace v uživatelském prostoru Linuxu a rozhraní systémových volání v knihovnách C, jako je glibc. Jedním ze způsobů, jak dosáhnout pokroku, je číst zdrojový kód jednoho jaderného subsystému s důrazem na pochopení systémových volání a hlaviček pro uživatelský prostor a hlavních vnitřních rozhraní jádra, jejichž příkladem je zde tabulka file_operations. Operace se soubory jsou to, co skutečně funguje „všechno je soubor“, takže jejich ovládání je obzvláště uspokojivé. Zdrojové soubory jádra C v adresáři fs/ nejvyšší úrovně představují jeho implementaci virtuálních souborových systémů, které jsou shim vrstvou, která umožňuje širokou a relativně přímou interoperabilitu oblíbených souborových systémů a úložných zařízení. Bind a overlay mounts přes Linux jmenné prostory jsou kouzlo VFS, které umožňuje kontejnery a kořenové souborové systémy pouze pro čtení. V kombinaci se studiem zdrojového kódu umožňuje jádro eBPF a jeho rozhraní bcc sondování jádra jednodušší než kdykoli předtím.

Moc děkuji Akkana Peck a Michael Eager za komentáře a opravy.

Alison Chaiken představí virtuální souborové systémy:proč je potřebujeme a jak fungují na 17. výroční výstavě Southern California Linux Expo (SCaLE 17x) 7. až 10. března v Pasadeně v Kalifornii.


Linux
  1. Jak Linux zachraňuje pomalé počítače (a planetu)

  2. Jak uložit příkazy Linuxu a používat je na vyžádání

  3. Jak vytvořit a připojit souborové systémy v Linuxu

  1. Jak získat přístup k souborovým systémům Linux ve Windows 10 a WSL 2

  2. Jak pracovat s uživateli a skupinami v Linuxu

  3. Jak změnit velikost oddílů a souborových systémů na nich?

  1. Pochopení cest k souborům a jejich použití v Linuxu

  2. Pochopení souborových systémů Linux:ext4 a další

  3. Jak nainstalovat TBB ze zdroje na Linux a zprovoznit jej