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ť
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 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é 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.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í.
Pomocou eBPF môžete vidieť, čo sa deje v
/sys
keď je vložená jednotka USB flash. Tu je uvedený jednoduchý a zložitý príklad.
Vo vyššie uvedenom príklade bcc
náradie 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 kworker
ktorý 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 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é fsck
kedy sa motor konečne rozbehne? A odpoveď je jednoduchá. Vstavané zariadenia sa spoliehajú na koreňový súborový systém 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
Na základe popisu prekrytia a prepojiteľného držiaka sa tomu nikto nečuduje 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í
Zdroj: hab.com