Virtuálne súborové systémy v Linuxe: prečo sú potrebné a ako fungujú? Časť 2

Ahojte všetci, zdieľame s vami druhú časť publikácie „Virtuálne súborové systémy v Linuxe: prečo sú potrebné a ako fungujú? Môžete si prečítať prvú časť tu. Pripomeňme, že táto séria publikácií je načasovaná tak, aby sa zhodovala so spustením nového streamu na kurze "Správca Linuxu", 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 jadro, 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í.

Virtuálne súborové systémy v Linuxe: prečo sú potrebné a ako fungujú? Časť 2

Našťastie začať používať eBPF je pomocou nástrojov celkom jednoduché BCC, ktoré sú dostupné ako balíčky zo všeobecnej distribúcie Linux a podrobne zdokumentované Bernard Gregg. 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.

Virtuálne súborové systémy v Linuxe: prečo sú potrebné a ako fungujú? Časť 2

vfsstat.py je 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í.

Virtuálne súborové systémy v Linuxe: prečo sú potrebné a ako fungujú? Časť 2

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 trace.py 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 cscope Na vyhľadávanie __device_add_disk(), 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 na mnohých zariadeniach internetu vecí, ako aj na smerovačoch, termostatoch a autách teraz funguje Linux. Mnohé z týchto zariadení majú málo alebo žiadne používateľské rozhranie a neexistuje spôsob, ako ich „čisto“ vypnúť. Predstavte si, že štartujete auto s vybitou batériou, keď je napájanie riadiacej jednotky zapnuté Linux 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 len na čítanie (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 tam žiadny linuxový proces nemôže zapisovať. Ďalším je, že do značnej miery nemenný súborový systém je kritický pre podporu vzdialených zariadení v teréne, pretože podporný personál sa spolieha na lokálne systémy, ktoré sú nominálne identické so systémami v teréne. Snáď 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é vo fáze návrhu systému. Práca s ro-rootfs môže byť nepríjemná a bolestivá, pretože premenné const sú často v programovacích jazykoch, ale ich výhody ľahko odôvodňujú dodatočnú réžiu.

tvorba rootfs Iba na čítanie vyžaduje od embedded vývojárov určité úsilie navyše a tu prichádza do úvahy VFS. Linux vyžaduje, aby boli súbory in /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 Menný priestor VFS.

Na základe popisu prekrytia a prepojiteľného držiaka sa tomu nikto nečuduje Linuxové kontajnery sú aktívne využívané. Pozrime sa, čo sa stane, keď použijeme systemd-nspawn 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útorného fungovania Linuxu sa môže zdať ako nemožná úloha, keďže samotné jadro obsahuje obrovské množstvo kódu, ponechajúc bokom aplikácie v užívateľskom priestore Linuxu a rozhrania systémových volaní v knižniciach C ako napr. 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, ktorá poskytuje širokú a relatívne jednoduchú kompatibilitu medzi populárnymi súborovými systémami a úložnými zariadeniami. Prepojenie a pripojenie prekrytia cez menné priestory Linuxu je kúzlo VFS, ktoré umožňuje vytváranie kontajnerov a koreňových súborových systémov iba na čítanie. V kombinácii s preskúmaním zdrojového kódu, základného nástroja eBPF a jeho rozhrania bcc
takže prieskum jadra je jednoduchší ako kedykoľvek predtým.

Priatelia, píšte, bol pre vás tento článok užitočný? Možno máte nejaké pripomienky alebo pripomienky? A tí, ktorí majú záujem o kurz Linux Administrator, sú pozvaní Deň otvorených dverí, ktorý sa uskutoční 18. apríla.

Prvá časť.

Zdroj: hab.com

Pridať komentár