Virtuelni fajl sistemi u Linux-u: zašto su potrebni i kako funkcionišu? Deo 2

Pozdravljeni vsi, delimo z vami drugi del objave "Virtuelni datotečni sistemi v Linuxu: zakaj so potrebni in kako delujejo?" Prvi del lahko preberete tukaj. Spomnimo, ta serija objav je povezana s pričetkom novega toka tečaja "Administrator Linuxa", ki se začne že kmalu.

Kako spremljati VFS z orodji eBPF in bcc

Najlažji način, da razumemo, kako jedro upravlja z datotekami sysfs – je opazovati to v praksi, najlažji način, da spremljamo ARM64 – je uporaba eBPF. eBPF (kratica za Berkeley Packet Filter) je sestavljen iz virtualne naprave, ki teče v jedru, ki jo privilegirani uporabniki lahko poizvedujejo (query) iz ukazne vrstice. Izvorne kode jedra bralcu sporočajo, kaj jedro lahko stori; zagon orodij eBPF na obremenjenem sistemu pokaže, kaj jedro dejansko počne.

Virtuelni fajl sistemi u Linux-u: zašto su potrebni i kako funkcionišu? Deo 2

Na srečo je začeti uporabljati eBPF dovolj enostavno z orodji bcc, ki so na voljo kot paketi iz splošne distribucije Linux in so podrobno dokumentirana Bernardom Greggom. Orodja bcc so skripti v Pythonu z manjšimi deli kode v C, kar pomeni, da jih lahko vsak, ki pozna oba jezika, zlahka prilagodi. V bcc/tools je 80 Python skriptov, kar pomeni, da bo verjetno razvijalec ali sistemski administrator lahko našel nekaj primernega za rešitev težave.
Da dobite vsaj površinsko predstavo o tem, kakšno delo opravljajo VFS v delujočem sistemu, poskusite vfscount ili vfsstat. To bo pokazalo, da na desetine klicev vfs_open() in njegovih "prijateljev" poteka dobesedno vsako sekundo.

Virtuelni fajl sistemi u Linux-u: zašto su potrebni i kako funkcionišu? Deo 2

vfsstat.py je skript v Pythonu, s kodo C, ki preprosto šteje klice funkcij VFS.

Poglejmo bolj trivialen primer in vidimo, kaj se zgodi, ko v računalnik priključimo USB ključek in ga sistem odkrije.

Virtuelni fajl sistemi u Linux-u: zašto su potrebni i kako funkcionišu? Deo 2

S pomočjo eBPF lahko vidimo, kaj se zgodi, /sys, ko je USB ključek priključen. Tukaj je predstavljen preprost in kompleksen primer.

V zgornjem primeru bcc orodje trace.py izpiše sporočilo, ko se izvede ukaz sysfs_create_files(). Vidimo, da je bil zagnan s pomočjo sysfs_create_files() kworker niti v odgovoru na to, da je bil ključek priključen, toda kateri datoteka se je pri tem ustvarila? Drugi primer prikazuje vso moč eBPF. Tukaj niti kot odgovor na to, da je bil USB priključen, a kateri datoteka je bila pri tem ustvarjena? Drugi primer pokaže vso moč eBPF. Tukaj trace.py izvaja jedro nazad (kernel backtrace) (opcija -K) i ime datoteke koja je kreirana sysfs_create_files(). Umetanje u pojedinačnim iskazima – to je C kod koji uključuje lako prepoznatljivu formatiranu liniju, obezbeđenu Python skriptom koji pokreće LLVM just-in-time kompajler. Ovu liniju on kompajlira i izvršava u virtuelnoj mašini unutar jezgra. Puna potpis funkcije sysfs_create_files () mora biti reprodukovana u drugom komandnom, tako da formatirana linija može da se odnosi na jedan od parametara. Greške u ovom fragmentu C koda rezultiraju prepoznatljivim greškama C kompajlera. Na primer, ako se propusti parametar -l, videćete „Failed to compile BPF text.” Razvijači koji su dobro upoznati sa C i Pythonom smatraće alate bcc jednostavnim za proširenje i izmenu.

Kada je USB uređaj umetnut, povratna signalizacija jezgra će pokazati da je PID 7711 – to je nit niti v odgovoru na to, da je bil ključek priključen, toda kateri datoteka se je pri tem ustvarila? Drugi primer prikazuje vso moč eBPF. Tukaj, koja je kreirala datoteku "events" u sysfs. Prema tome, poziv sa sysfs_remove_files() pokazaće da je uklanjanje uređaja dovelo do brisanja datoteke events, što se uklapa u opšti koncept brojenja referenci. U ovom okviru, pregled sysfs_create_link () sa eBPF tokom umetanja USB uređaja pokazuje da je kreirano najmanje 48 simboličkih linkova.

Pa, koja je svrha datoteke events? Korišćenje cscope za pretragu __device_add_disk(), pokazuje da ona poziva disk_add_events (), i ili "media_change", ali "eject_request" mogu biti zapisani u datoteku događaja. Ovde, blok sloj jezgra obaveštava userspace o pojavljivanju i uklanjanju „diska”. Obratite pažnju koliko je informativna ova metoda istraživanja na primeru umetanja USB uređaja u poređenju sa pokušajima da se sazna kako sve funkcioniše isključivo iz izvora.

Root datotečni sistemi samo za čitanje omogućavaju ugrađene uređaje

Naravno, niko ne isključuje server ili svoj računar vađenjem utikača iz utičnice. Ali zašto? Zato što montirani datotečni sistemi na fizičkim uređajima za skladištenje mogu imati odložene zapise, a strukture podataka koje beleže njihovo stanje možda se neće sinhronizovati sa zapisima u skladištu. Kada se to dogodi, vlasnici sistema moraju čekati sledeće pokretanje da bi pokrenuli alatku fsck filesystem-recovery i, u najgorem slučaju, izgubiti podatke.

Kljub temu vsi vemo, da mnoge IoT naprave ter usmerjevalniki, termostati in avtomobili zdaj delujejo na sistemu Linux. Mnoge od teh naprav praktično nimajo uporabniškega vmesnika in ni načina, da bi jih izklopili 'čisto'. Predstavljajte si, da zagnate avtomobil z izpraznjeno baterijo, ko napajanje krmilne enote na Linux nenehno niha navzgor in navzdol. Kako lahko sistem zažene brez dolgega fsck, ko motor konfinally zažene? Odgovor je preprost. Vgrajene naprave se zanašajo na korenski datotečni sistem samo za branje (skrajšano ro-rootfs (datotečni sistem brez možnosti pisanja).

ro-rootfs ponujajo številne prednosti, ki so manj očitne kot neobdelanost. Ena od prednosti je, da zlonamerna programska oprema ne more pisati v /usr ili /lib, če noben proces Linux ne more tja pisati. Druga pa je, da je v veliki meri nespremenljiv datotečni sistem ključen za podporo na terenu oddaljenim napravam, saj asistenti uporabljajo lokalne sisteme, ki so nominalno enaki sistemom na terenu. Morda je najpomembnejša (in najbolj pretkana) prednost to, da ro-rootfs pripravlja razvijalce, da odločijo, kateri sistemski objekti bodo nespremenljivi, že v fazi načrtovanja sistema. Delo z ro-rootfs je lahko neprijetno in boleče, kar se pogosto dogaja s spremenljivkami const v programskih jezikih, toda njihove prednosti enostavno odtehtajo dodatne stroške.

Ustvarjanje rootfs samo za branje zahteva dodatna prizadevanja od razvijalcev vgrajenih sistemov, in tukaj pride na plano VFS. Linux zahteva, da so datoteke v /var dostopne za pisanje, in poleg tega mnoge priljubljene aplikacije, ki vodijo vgrajene sisteme, poskušajo ustvariti konfiguracijske dot-datoteke u $DOM. Ena od rešitev za konfiguracijske datoteke v domačem direktoriju je običajno njihova predhodna generacija in zbiranje v rootfs. Za /var en od možnih pristopov je, da ga namestite v ločeno particijo, dostopno za pisanje, medtem ko je sam / se montira samo za čitanje. Druga popularna alternativa je korišćenje povezanih ili preklopnih montaža (bind or overlay mounts).

Povezane i preklopne montaže, korišćenje ih od strane kontejnera

Izvršavanje komande man mount – najbolji način da se sazna više o povezanim i preklopnim montažama koje omogućavaju programerima i sistemskim administratorima da kreiraju datotečni sistem na jednom putu, a zatim ga dodele aplikacijama na drugom. Za ugrađene sisteme to znači mogućnost skladištenja datoteka u /var na USB fleš uređaju koji je dostupan samo za čitanje, ali preklopno ili povezano montiranje puta iz tmpfs u /var prilikom pokretanja će omogućiti aplikacijama da zapisuju beleške (scrawl). Pri sledećem uključivanju, promene u /var će biti izgubljene. Preklopno montiranje stvara spoj između tmpfs i podložnog datotečnog sistema i omogućava pretvaranje postojećih datoteka u ro-tootf dok povezano montiranje može učiniti nove prazne tmpfs foldere vidljivim kao dostupnim za pisanje u ro-rootfs putanjama. Dok overlayfs je pravi (proper) tip datotečnog sistema, povezano montiranje je realizovano u imenu prostora VFS.

Na osnovu opisa preklopnog i povezanog montiranja, niko se ne čudi što Linux kontejneri aktivno ih koriste. Pogledajmo šta se dešava kada koristimo systemd-nspawn za pokretanje kontejnera, koristeći alat mountsnoop od bcc.

Poziv system-nspawn pokreće kontejner tokom rada mountsnoop.py.

Pogledajmo šta je izašlo:

Pokretanje mountsnoop tokom 'učitavanja' kontejnera pokazuje da okruženje za izvođenje kontejnera u velikoj meri zavisi od povezanog montiranja (Prikazan je samo početak dugog izlaza).

Tukaj systemd-nspawn pruža odabrane datoteke u procfs in sysfs hosta u kontejner kao putanje u njegovom rootfs. Pored MS_BIND flaga, koji postavlja povezano montiranje, neki drugi flagovi u montiranom sistemu definišu međuzavisnost između promena u prostoru imena hosta i kontejnera. Na primer, povezano montiranje može ili propuštati promene u /proc in /sys u kontejner, ili ih skrivati u zavisnosti od poziva.

Zaključek

Razumevanje notranje strukture Linuxa se lahko zdi nemogoča naloga, saj jedro vsebuje ogromno količino kode, ne da bi upoštevali aplikacije uporabniškega prostora Linux in vmesnike sistemskih klicev v knjižnicah C, kot je glibc. Eden od načinov za napredek je preučevanje izvorne kode enega pod sistema jedra s poudarkom na razumevanju sistemskih klicev in naslovov, usmerjenih na uporabniški prostor, ter osnovnih notranjih vmesnikov jedra, na primer tabela file_operations. Datotečne operacije zagotavljajo načelo „vse je datoteka“, zato je upravljanje z njimi še posebej prijetno. Izvorne datoteke jedra v jeziku C v zgornjem nivoju fs/ predstavljajo implementacijo virtualnih datotečnih sistemov, ki so plast lupine, ki zagotavlja široko in sorazmerno preprosto združljivost priljubljenih datotečnih sistemov in naprav za shranjevanje. Montiranje s povezovanjem in prekrivanje prek Linuxovih prostorov imen je čarovnija VFS, ki omogoča ustvarjanje kontejnerjev in korenskih datotečnih sistemov samo za branje. V kombinaciji z raziskovanjem izvorne kode, orodje jedra eBPF in njegov vmesnik bcc
naredijo raziskovanje jedra lažje kot kadarkoli prej.

Prijatelji, prosimo, sporočite, ali je bil ta članek koristen za vas? Morda imate kakšne komentarje ali pripombe? Tiste, ki jih zanima tečaj 'Linux Administrator', vabimo na dan odprtih vrat, ki bo potekal 18. aprila.

Prvi del.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster