Virtualni datotečni sistemi v Linuxu: zakaj so potrebni in kako delujejo? 2. del

Pozdravljeni vsi, z vami delimo drugi del publikacije "Navidezni datotečni sistemi v Linuxu: zakaj so potrebni in kako delujejo?" Prvi del lahko preberete tukaj. Naj vas spomnimo, da je ta serija publikacij časovno sovpadala z začetkom novega toka na tečaju "Linux Administrator", ki se začne zelo kmalu.

Kako spremljati VFS z orodji eBPF in bcc

Najlažji način za razumevanje, kako jedro deluje na datotekah sysfs je videti v praksi, najlažji način za gledanje ARM64 pa je uporaba eBPF. eBPF (okrajšava za Berkeley Packet Filter) je sestavljen iz navideznega stroja, ki teče jedro, ki jih lahko zahtevajo privilegirani uporabniki (query) iz ukazne vrstice. Viri jedra povedo bralcu, kaj zmore jedro; izvajanje orodij eBPF v naloženem sistemu pokaže, kaj jedro dejansko počne.

Virtualni datotečni sistemi v Linuxu: zakaj so potrebni in kako delujejo? 2. del

Na srečo je začetek uporabe eBPF precej enostaven s pomočjo orodij skp, ki so na voljo kot paketi iz splošne distribucije Linux in podrobno dokumentirano Bernard Gregg. Orodja bcc so skripte Python z majhnimi vstavki kode C, kar pomeni, da jih lahko vsakdo, ki pozna oba jezika, zlahka spremeni. IN bcc/tools Obstaja 80 skript Python, kar pomeni, da bo najverjetneje razvijalec ali sistemski skrbnik lahko izbral nekaj primernega za rešitev težave.
Če želite dobiti vsaj površno predstavo o tem, kaj delajo VFS-ji v delujočem sistemu, poskusite vfscount ali vfsstat. To bo pokazalo, recimo, da na desetine klicev vfs_open() in "njegovi prijatelji" se zgodijo dobesedno vsako sekundo.

Virtualni datotečni sistemi v Linuxu: zakaj so potrebni in kako delujejo? 2. del

vfsstat.py je skript Python z vstavki kode C, ki preprosto šteje klice funkcij VFS.

Dajmo bolj trivialen primer in poglejmo, kaj se zgodi, ko v računalnik vstavimo ključek USB in ga sistem zazna.

Virtualni datotečni sistemi v Linuxu: zakaj so potrebni in kako delujejo? 2. del

Z uporabo eBPF lahko vidite, kaj se dogaja v /sysko je vstavljen bliskovni pogon USB. Tukaj je prikazan preprost in zapleten primer.

V zgornjem primeru je bcc Orodje trace.py natisne sporočilo, ko je ukaz zagnan sysfs_create_files(). To vidimo sysfs_create_files() je bil zagnan z uporabo kworker tok kot odgovor na dejstvo, da je bil bliskovni pogon vstavljen, toda katera datoteka je bila ustvarjena? Drugi primer prikazuje moč eBPF. Tukaj trace.py Natisne povratno sled jedra (možnost -K) in ime datoteke, ki je bila ustvarjena sysfs_create_files(). Vstavljanje posameznega stavka je koda C, ki vključuje zlahka prepoznaven niz zapisa, ki ga zagotavlja skript Python, ki izvaja LLVM pravočasni prevajalnik. To vrstico prevede in izvede v virtualnem stroju znotraj jedra. Podpis celotne funkcije sysfs_create_files () je treba reproducirati v drugem ukazu, tako da se lahko formatni niz nanaša na enega od parametrov. Napake v tem delu kode C povzročijo prepoznavne napake prevajalnika C. Na primer, če je parameter -l izpuščen, boste videli "Prevajanje besedila BPF ni uspelo." Razvijalci, ki poznajo C in Python, bodo našli orodja bcc enostavno razširiti in spremeniti.

Ko je pogon USB vstavljen, bo povratna sled jedra pokazala, da je PID 7711 nit kworkerki je ustvaril datoteko «events» в sysfs. V skladu s tem je klic iz sysfs_remove_files() bo pokazalo, da je bila zaradi odstranitve pogona datoteka izbrisana events, kar ustreza splošnemu konceptu štetja referenc. Hkrati pa ogled sysfs_create_link () z eBPF bo med vstavljanjem pogona USB pokazalo, da je bilo ustvarjenih vsaj 48 simbolnih povezav.

Kaj je torej smisel datoteke dogodkov? Uporaba cscope Za iskanje __device_add_disk(), pokaže, kaj povzroča disk_add_events (), in bodisi "media_change"Ali "eject_request" lahko posnamete v datoteko dogodkov. Tukaj sloj bloka jedra obvesti uporabniški prostor, da se je "disk" pojavil in izvrgel. Upoštevajte, kako informativna je ta raziskovalna metoda z vstavljanjem pogona USB v primerjavi s poskusom, da bi ugotovili, kako stvari delujejo zgolj iz vira.

Korenski datotečni sistemi samo za branje omogočajo vdelane naprave

Seveda nihče ne izklopi strežnika ali računalnika tako, da izvleče vtič iz vtičnice. Ampak zakaj? To je zato, ker so nameščeni datotečni sistemi na fizičnih pomnilniških napravah morda zaostali pri zapisovanju in podatkovne strukture, ki beležijo njihovo stanje, morda niso sinhronizirane s pisanjem v pomnilnik. Ko se to zgodi, morajo lastniki sistema počakati do naslednjega zagona, da zaženejo pripomoček. fsck filesystem-recovery in v najslabšem primeru izgubo podatkov.

Vendar pa vsi vemo, da številne naprave IoT, pa tudi usmerjevalniki, termostati in avtomobili zdaj poganjajo Linux. Mnoge od teh naprav imajo malo ali nič uporabniškega vmesnika in jih ni mogoče "čisto" izklopiti. Predstavljajte si, da zaženete avto s praznim akumulatorjem, medtem ko je napajanje krmilne enote zmanjkalo Linux nenehno skakanje gor in dol. Kako to, da se sistem zažene brez dolgega fsckkdaj motor končno zažene? In odgovor je preprost. Vgrajene naprave se zanašajo na korenski datotečni sistem samo za branje (okrajšano ro-rootfs (korenski datotečni sistem samo za branje)).

ro-rootfs ponuja veliko prednosti, ki so manj očitne kot pristnost. Ena prednost je, da zlonamerna programska oprema ne more pisati /usr ali /lib, če noben proces Linuxa ne more pisati tja. Drugo je, da je pretežno nespremenljiv datotečni sistem ključnega pomena za terensko podporo oddaljenih naprav, saj se podporno osebje zanaša na lokalne sisteme, ki so nominalno identični terenskim sistemom. Morda je najpomembnejša (a tudi najbolj zahrbtna) prednost ta, da ro-rootfs sili razvijalce, da se odločijo, kateri sistemski objekti bodo nespremenljivi v fazi načrtovanja sistema. Delo z ro-rootfs je lahko nerodno in boleče, saj so spremenljivke const pogosto v programskih jezikih, vendar njihove prednosti zlahka upravičijo dodatne stroške.

ustvarjanje rootfs Samo za branje zahteva nekaj dodatnega truda za vdelane razvijalce, in tu nastopi VFS. Linux zahteva, da so datoteke notri /var so bili zapisljivi, poleg tega pa bodo številne priljubljene aplikacije, ki poganjajo vgrajene sisteme, poskušale ustvariti konfiguracijo dot-files в $HOME. Ena od rešitev za konfiguracijske datoteke v domačem imeniku je običajno vnaprejšnje ustvarjanje in vgradnja rootfs. Če želite /var Eden od možnih pristopov je, da ga namestite na ločeno zapisljivo particijo, medtem ko / nameščen samo za branje. Druga priljubljena alternativa je uporaba vezivnih ali prekrivnih nosilcev.

Povezljivi in ​​zložljivi nosilci, njihova uporaba s kontejnerji

Izvajanje ukaza man mount je najboljši način za spoznavanje povezljivih in prekrivnih namestitev, ki razvijalcem in sistemskim skrbnikom omogočajo, da ustvarijo datotečni sistem na eni poti in ga nato izpostavijo aplikacijam na drugi. Za vgrajene sisteme to pomeni možnost shranjevanja datotek v /var na bliskovnem pogonu samo za branje, vendar prekrivna ali povezljiva pot vpetja iz tmpfs в /var pri nalaganju bo aplikacijam omogočila, da tam pišejo opombe (čečkanje). Ko boste naslednjič vklopili spremembe v /var bo izgubljen. Prekrivni nosilec ustvari zvezo med tmpfs in osnovni datotečni sistem ter vam omogoča, da naredite navidezne spremembe obstoječih datotek v ro-tootf medtem ko lahko vezni nosilec naredi nove prazne tmpfs mape, v katere je mogoče zapisovati ro-rootfs načine. Medtem overlayfs ta je prava (proper) tip datotečnega sistema, v katerem je implementirana vezava Imenski prostor VFS.

Na podlagi opisa prekrivanja in povezljivega nosilca ni nihče presenečen, da Vsebniki Linuxa se aktivno uporabljajo. Poglejmo, kaj se zgodi, ko uporabimo systemd-nspawn za zagon vsebnika z orodjem mountsnoop od bcc.

Izziv system-nspawn zažene vsebnik med delovanjem mountsnoop.py.

Poglejmo, kaj se je zgodilo:

Izstrelite mountsnoop medtem ko se vsebnik "zaganja", kaže, da je čas izvajanja vsebnika močno odvisen od namestitve, ki je povezana (prikazan je le začetek dolgega izhoda).

Tukaj systemd-nspawn ponuja izbrane datoteke procfs и sysfs od gostitelja do vsebnika kot poti do njega rootfs... Poleg tega MS_BIND zastavico, ki nastavi povezovalni priklop, nekatere druge zastavice na priklopu določajo razmerje med spremembami v imenskem prostoru gostitelja in vsebnika. Na primer, povezani nosilec lahko bodisi preskoči spremembe na /proc и /sys v vsebnik ali jih skrijete, odvisno od klica.

Zaključek

Razumevanje notranjega delovanja Linuxa se lahko zdi nemogoča naloga, saj samo jedro vsebuje ogromno kode, pri čemer pustimo ob strani aplikacije uporabniškega prostora Linuxa in sistemske klicne vmesnike v knjižnicah C, kot je npr. glibc. Eden od načinov za napredek je branje izvorne kode enega podsistema jedra, s poudarkom na razumevanju sistemskih klicev in glav uporabniškega prostora ter glavnih notranjih vmesnikov jedra, kot je tabela file_operations. Datotečne operacije zagotavljajo načelo "vse je datoteka", zaradi česar je upravljanje še posebej prijetno. Izvorne datoteke jedra C v imeniku najvišje ravni fs/ predstavljajo izvedbo virtualnih datotečnih sistemov, ki so ovojna plast, ki zagotavlja široko in razmeroma preprosto združljivost med priljubljenimi datotečnimi sistemi in napravami za shranjevanje. Povezovanje in prekrivna montaža prek imenskih prostorov Linux je čar VFS, ki omogoča ustvarjanje vsebnikov samo za branje in korenskih datotečnih sistemov. V kombinaciji s pregledom izvorne kode, jedrnega orodja eBPF in njegovega vmesnika bcc
zaradi česar je raziskovanje jedra lažje kot kdaj koli prej.

Prijatelji, pišite, je bil ta članek koristen za vas? Imate morda kakšne pripombe ali pripombe? Vabljeni vsi, ki vas tečaj Linux Administrator zanima Odprt dan, ki bo 18. aprila.

Prvi del.

Vir: www.habr.com

Dodaj komentar