Pozdravljeni vsi, z vami delimo drugi del publikacije "Navidezni datotečni sistemi v Linuxu: zakaj so potrebni in kako delujejo?" Prvi del lahko preberete
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 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.
Na srečo je začetek uporabe eBPF precej enostaven s pomočjo orodij 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.
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.
Z uporabo eBPF lahko vidite, kaj se dogaja v
/sys
ko je vstavljen bliskovni pogon USB. Tukaj je prikazan preprost in zapleten primer.
V zgornjem primeru je bcc
Orodje 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 kworker
ki 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 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 fsck
kdaj motor končno zažene? In odgovor je preprost. Vgrajene naprave se zanašajo na korenski datotečni sistem 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
Na podlagi opisa prekrivanja in povezljivega nosilca ni nihče presenečen, da 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
Vir: www.habr.com