Ahojte všetci, zdieľame s vami druhú časť publikácie „Virtuálne súborové systémy v LinuxPrečo sú potrebné a ako fungujú? Prvú časť si môžete prečítať . Pripomeňme, že táto séria publikácií je načasovaná tak, aby sa zhodovala so spustením nového streamu na kurze , ktorá začína veľmi skoro.
Ako monitorovať VFS pomocou nástrojov eBPF a bcc
Najjednoduchší spôsob, ako pochopiť, ako jadro funguje so súbormi sysfs je vidieť v praxi a najjednoduchší spôsob, ako sledovať ARM64, je použiť eBPF. eBPF (skratka pre Berkeley Packet Filter) pozostáva zo spusteného virtuálneho stroja , o ktoré môžu privilegovaní používatelia požiadať (query) z príkazového riadku. Zdroje jadra informujú čitateľa o tom, čo jadro dokáže; spustenie nástrojov eBPF na načítanom systéme ukazuje, čo vlastne jadro robí.

Našťastie začať používať eBPF je pomocou nástrojov celkom jednoduché , ktoré sú dostupné ako balíčky zo všeobecnej distribúcie a podrobne zdokumentované . Nástroje bcc sú Python skripty s malým vložením kódu C, čo znamená, že každý, kto pozná oba jazyky, ich môže ľahko upraviť. IN bcc/tools Existuje 80 skriptov Python, čo znamená, že s najväčšou pravdepodobnosťou si vývojár alebo správca systému bude môcť vybrať niečo vhodné na vyriešenie problému.
Ak chcete získať aspoň povrchnú predstavu o tom, akú prácu robia VFS na spustenom systéme, skúste vfscount alebo vfsstat. To ukáže, povedzme, že desiatky hovorov vfs_open() a „jeho priatelia“ sa dejú doslova každú sekundu.

vfsstat.pyje Python skript s vloženým kódom C, ktorý jednoducho počíta volania funkcií VFS.
Uveďme si triviálnejší príklad a pozrime sa, čo sa stane, keď vložíme USB flash disk do počítača a systém to zistí.

Pomocou eBPF môžete vidieť, čo sa deje v
/syskeď je vložená jednotka USB flash. Tu je uvedený jednoduchý a zložitý príklad.
Vo vyššie uvedenom príklade bcc náradie vypíše správu pri spustení príkazu sysfs_create_files(). To vidíme sysfs_create_files() bol spustený pomocou kworker stream ako odpoveď na skutočnosť, že bol vložený flash disk, ale aký súbor bol vytvorený? Druhý príklad ukazuje silu eBPF. Tu trace.py Vytlačí spätnú stopu jadra (voľba -K) a názov súboru, ktorý bol vytvorený sysfs_create_files(). Vloženie jedného príkazu je kód C, ktorý obsahuje ľahko rozpoznateľný formátovací reťazec poskytovaný skriptom Python, ktorý spúšťa LLVM kompilátor just-in-time. Tento riadok skompiluje a spustí vo virtuálnom stroji v jadre. Plne funkčný podpis sysfs_create_files () musí byť reprodukovaný v druhom príkaze, aby formátovací reťazec mohol odkazovať na jeden z parametrov. Chyby v tejto časti kódu C majú za následok rozpoznateľné chyby kompilátora C. Napríklad, ak je vynechaný parameter -l, zobrazí sa "Nepodarilo sa skompilovať text BPF." Vývojári, ktorí poznajú C a Python, nájdu nástroje bcc ľahko rozširovať a meniť.
Keď je vložená jednotka USB, spätné sledovanie jadra ukáže, že PID 7711 je vlákno kworkerktorý vytvoril súbor «events» в sysfs. V súlade s tým hovor od sysfs_remove_files() ukáže, že odstránenie disku viedlo k vymazaniu súboru events, čo zodpovedá všeobecnej koncepcii počítania referencií. Zároveň prezeranie sysfs_create_link () s eBPF pri vložení USB disku ukáže, že bolo vytvorených aspoň 48 symbolických odkazov.
Aký je teda zmysel súboru udalostí? Použitie Na vyhľadávanie , ukazuje, čo spôsobuje disk_add_events (), a buď "media_change"Alebo "eject_request" možno zaznamenať do súboru udalosti. Tu vrstva bloku jadra informuje užívateľský priestor, že sa objavil a vysunul „disk“. Všimnite si, aká informatívna je táto metóda výskumu vložením jednotky USB v porovnaní so snahou zistiť, ako veci fungujú čisto zo zdroja.
Koreňové súborové systémy iba na čítanie umožňujú vstavané zariadenia
Samozrejme, nikto nevypína server ani svoj počítač vytiahnutím zástrčky zo zásuvky. Ale prečo? Je to preto, že pripojené súborové systémy na fyzických úložných zariadeniach môžu mať oneskorené zápisy a dátové štruktúry, ktoré zaznamenávajú ich stav, nemusia byť synchronizované so zápismi do úložného priestoru. Keď sa to stane, majitelia systému musia počkať do ďalšieho spustenia, aby spustili nástroj. fsck filesystem-recovery a v najhoršom prípade stratí dáta.
Všetci však vieme, že mnohé zariadenia internetu vecí, ako aj routery, termostaty a autá, teraz fungujú na... LinuxMnohé z týchto zariadení prakticky nemajú žiadne používateľské rozhranie a neexistuje spôsob, ako ich jednoducho vypnúť. Predstavte si, že naštartujete auto s vybitou batériou, keď sa preruší napájanie ovládacieho zariadenia. neustále skákať hore a dole. Ako to, že systém nabootuje bez dlho fsckkedy sa motor konečne rozbehne? A odpoveď je jednoduchá. Vstavané zariadenia sa spoliehajú na koreňový súborový systém (skrátene ro-rootfs (koreňový súborový systém len na čítanie)).
ro-rootfs ponúkajú mnoho výhod, ktoré sú menej zrejmé ako autentickosť. Jednou z výhod je, že malvér nemôže zapisovať /usr alebo /lib, ak žiadny proces Linux Nedá sa doň zapisovať. Ďalším dôvodom je, že pre terénnu podporu vzdialených zariadení je kľúčový do značnej miery nemenný súborový systém, pretože podporný personál používa lokálne systémy, ktoré sú nominálne identické so systémami na mieste. Asi najdôležitejšou (ale aj najzákernejšou) výhodou je, že ro-rootfs núti vývojárov rozhodnúť sa, ktoré systémové objekty budú nemenné, už v počiatočnej fáze návrhu systému. Práca s ro-rootfs môže byť nepríjemná a bolestivá, ako je to často v prípade konštantných premenných v programovacích jazykoch, ale jej výhody ľahko prevažujú nad dodatočnými réžiami.
tvorba rootfs Funkcia iba na čítanie vyžaduje od vývojárov vstavaných systémov určité dodatočné úsilie a práve tu prichádza na rad VFS. Linux vyžaduje, aby súbory v /var boli zapisovateľné a okrem toho sa mnohé populárne aplikácie, ktoré spúšťajú vstavané systémy, pokúsia vytvoriť konfiguráciu dot-files в $HOME. Jedným z riešení pre konfiguračné súbory v domovskom adresári je zvyčajne ich predbežné vygenerovanie a zabudovanie rootfs. Pre /var Jedným z možných prístupov je pripojiť ho na samostatný zapisovateľný oddiel / namontované len na čítanie. Ďalšou populárnou alternatívou je použitie viazacích alebo prekrývacích držiakov.
Spojiteľné a stohovateľné držiaky, ich použitie pri kontajneroch
Vykonanie príkazu man mount je najlepší spôsob, ako sa dozvedieť o viazateľných a prekrývateľných pripojeniach, ktoré dávajú vývojárom a správcom systému možnosť vytvoriť súborový systém v jednej ceste a potom ho vystaviť aplikáciám v inej. Pre vstavané systémy to znamená možnosť ukladať súbory do /var na jednotke flash len na čítanie, ale z prekryvnej alebo prepojiteľnej cesty pripojenia tmpfs в /var pri načítavaní umožní aplikáciám písať si tam poznámky (čmáranie). Pri ďalšom zapnutí zmien na /var sa stratí. Prekryvný držiak vytvára spojenie medzi nimi tmpfs a základný súborový systém a umožňuje vám vykonávať zdanlivé zmeny existujúcich súborov v ro-tootf zatiaľ čo viazateľný držiak môže spôsobiť, že nový držiak bude prázdny tmpfs priečinky viditeľné ako zapisovateľné ro-rootfs spôsoby. Zatiaľ čo overlayfs toto je ten pravý (proper) typ súborového systému, v ktorom je implementované viazateľné pripojenie .
Na základe popisu prekrytia a prepojiteľného držiaka sa tomu nikto nečuduje sú aktívne využívané. Pozrime sa, čo sa stane, keď použijeme na spustenie kontajnera pomocou nástroja mountsnoop od bcc.
volanie system-nspawn spustí kontajner za chodu mountsnoop.py.
Pozrime sa, čo sa stalo:
Запуск mountsnoop zatiaľ čo sa kontajner "bootuje", ukazuje, že doba chodu kontajnera je veľmi závislá od pripojeného pripojenia (zobrazuje sa iba začiatok dlhého výstupu).
Tu systemd-nspawn poskytuje vybrané súbory v procfs и sysfs hostiteľa do kontajnera ako cesty k nemu rootfs, okrem MS_BIND príznak, ktorý nastavuje pripojenie väzby, niektoré ďalšie príznaky na pripojení definujú vzťah medzi zmenami v mennom priestore hostiteľa a kontajnera. Napríklad prepojené pripojenie môže preskočiť zmeny /proc и /sys do kontajnera alebo ich skryť v závislosti od volania.
Záver
Pochopenie vnútornej štruktúry Linux sa môže zdať ako nemožná úloha, keďže samotné jadro obsahuje obrovské množstvo kódu, pričom nepočítame s aplikáciami v používateľskom priestore Linux a rozhrania systémových volaní v knižniciach jazyka C, ako napríklad glibc. Jedným zo spôsobov, ako dosiahnuť pokrok, je čítanie zdrojového kódu jedného podsystému jadra s dôrazom na pochopenie systémových volaní a hlavičiek používateľského priestoru, ako aj hlavných interných rozhraní jadra, ako je tabuľka file_operations. Operácie so súbormi poskytujú princíp „všetko je súbor“, vďaka čomu je ich správa obzvlášť príjemná. Zdrojové súbory jadra C v adresári najvyššej úrovne fs/ predstavujú implementáciu virtuálnych súborových systémov, ktoré sú obalovou vrstvou a poskytujú širokú a relatívne jednoduchú kompatibilitu medzi populárnymi súborovými systémami a úložnými zariadeniami. Pripájanie s prepojením a prekrývaním prostredníctvom menných priestorov Linux — je kúzlo VFS, ktoré umožňuje vytvárať kontajnery a koreňové súborové systémy iba na čítanie. V kombinácii so štúdiom zdrojového kódu, nástroja jadra eBPF a jeho rozhrania bcc
takže prieskum jadra je jednoduchší ako kedykoľvek predtým.
Priatelia, dajte mi vedieť, či vám tento článok pomohol. Máte nejaké komentáre alebo návrhy? A pre tých, ktorí majú záujem o kurz „Administrátor“, Linux„, pozývame vás na , ktorý sa uskutoční 18. apríla.
Zdroj: hab.com
