Pozdrav svima, s vama dijelimo drugi dio publikacije “Virtualni sistemi datoteka u Linuxu: zašto su potrebni i kako funkcioniraju?” Možete pročitati prvi dio
Kako pratiti VFS koristeći eBPF i bcc alate
Najlakši način da shvatite kako kernel radi na datotekama sysfs
je vidjeti u praksi, a najlakši način za gledanje ARM64 je korištenje eBPF-a. eBPF (skraćenica od Berkeley Packet Filter) sastoji se od virtuelne mašine koja se pokreće query
) iz komandne linije. Izvori kernela govore čitaocu šta kernel može da uradi; pokretanje eBPF alata na učitanom sistemu pokazuje šta kernel zapravo radi.
Srećom, početak korištenja eBPF-a je prilično jednostavan uz pomoć alata bcc
su Python skripte sa malim umetcima C koda, što znači da svako ko poznaje oba jezika može ih lako modificirati. IN bcc/tools
Postoji 80 Python skripti, što znači da će najvjerovatnije programer ili administrator sistema moći odabrati nešto prikladno za rješavanje problema.
Da biste dobili barem površnu predstavu o tome šta VFS-ovi rade na pokrenutom sistemu, pokušajte vfscount
ili vfsstat
. Ovo će pokazati, recimo, desetine poziva vfs_open()
a "njegovi prijatelji" se dešavaju bukvalno svake sekunde.
vfsstat.py
je Python skripta sa umetcima C koda koja jednostavno broji pozive VFS funkcija.
Hajde da damo jedan trivijalni primer i vidimo šta se dešava kada ubacimo USB fleš disk u računar i sistem ga detektuje.
Koristeći eBPF možete vidjeti šta se dešava
/sys
kada je USB fleš disk umetnut. Ovdje je prikazan jednostavan i složen primjer.
U gore prikazanom primjeru, bcc
alatka sysfs_create_files()
. Vidimo to sysfs_create_files()
je pokrenut koristeći kworker
stream kao odgovor na činjenicu da je fleš disk umetnut, ali koja je datoteka stvorena? Drugi primjer pokazuje snagu eBPF-a. Evo trace.py
Štampa povratni trag kernela (opcija -K) i ime datoteke koja je kreirana sysfs_create_files()
. Umetanje jedne izjave je C kod koji uključuje lako prepoznatljiv niz formata koji pruža Python skripta koja pokreće LLVM kompajler upravo na vrijeme. On kompajlira ovu liniju i izvršava je u virtuelnoj mašini unutar kernela. Potpis pune funkcije sysfs_create_files ()
mora se reproducirati u drugoj naredbi tako da se formatni niz može odnositi na jedan od parametara. Greške u ovom dijelu C koda rezultiraju prepoznatljivim greškama C kompajlera. Na primjer, ako je parametar -l izostavljen, vidjet ćete "Kompilacija BPF teksta nije uspjela." Programeri koji poznaju C i Python će pronaći alate bcc
lako proširiti i promijeniti.
Kada je USB disk umetnut, praćenje kernela će pokazati da je PID 7711 nit kworker
koji je kreirao fajl «events»
в sysfs
. Shodno tome, poziv od sysfs_remove_files()
će pokazati da je uklanjanje diska rezultiralo brisanjem datoteke events
, što odgovara opštem konceptu brojanja referenci. Istovremeno, gledanje sysfs_create_link ()
sa eBPF-om prilikom umetanja USB drajva će pokazati da je kreirano najmanje 48 simboličkih veza.
Dakle, koja je svrha datoteke događaja? Upotreba disk_add_events ()
, i bilo koje "media_change"
, ili "eject_request"
može se snimiti u datoteku događaja. Ovdje sloj bloka kernela obavještava korisnički prostor da se "disk" pojavio i izbacio. Obratite pažnju na to koliko je ovaj metod istraživanja informativan umetanjem USB diska, u poređenju sa pokušajem da shvatite kako stvari funkcionišu isključivo iz izvora.
Root sistemi datoteka samo za čitanje omogućavaju ugrađene uređaje
Naravno, niko ne isključuje server ili svoj računar izvlačenjem utikača iz utičnice. Ali zašto? To je zato što montirani datotečni sistemi na fizičkim uređajima za pohranu mogu imati zaostala upisivanja, a strukture podataka koje bilježe njihovo stanje možda neće biti sinkronizirane sa upisima u memoriju. Kada se to dogodi, vlasnici sistema moraju čekati do sljedećeg pokretanja kako bi pokrenuli uslužni program. fsck filesystem-recovery
i, u najgorem slučaju, gubitak podataka.
Međutim, svi znamo da mnogi IoT uređaji, kao i ruteri, termostati i automobili, sada pokreću Linux. Mnogi od ovih uređaja imaju malo ili nimalo korisničkog sučelja, i ne postoji način da ih se "čisto" isključi. Zamislite da pokrenete automobil sa istrošenim akumulatorom kada je napajanje kontrolne jedinice fsck
kada motor konačno počinje da radi? A odgovor je jednostavan. Ugrađeni uređaji se oslanjaju na korijenski sistem datoteka ro-rootfs
(osnovni fajl sistem samo za čitanje)).
ro-rootfs
nude mnoge prednosti koje su manje očigledne od autentičnosti. Jedna od prednosti je što zlonamjerni softver ne može pisati /usr
ili /lib
, ako nijedan Linux proces ne može upisati tamo. Drugi je da je uglavnom nepromjenjiv sistem datoteka kritičan za terensku podršku udaljenim uređajima, budući da se osoblje za podršku oslanja na lokalne sisteme koji su nominalno identični terenskim sistemima. Možda je najvažnija (ali i najpodmukla) prednost to što ro-rootfs prisiljava programere da odluče koji će sistemski objekti biti nepromjenjivi u fazi dizajna sistema. Rad sa ro-rootf-ovima može biti nezgodan i bolan, jer su const varijable često u programskim jezicima, ali njihove prednosti lako opravdavaju dodatne troškove.
stvaranje rootfs
Samo za čitanje je potreban dodatni napor za ugrađene programere, i tu se pojavljuje VFS. Linux zahtijeva da fajlovi budu unutra /var
bili su upisivi, a pored toga, mnoge popularne aplikacije koje pokreću ugrađene sisteme pokušaće da kreiraju konfiguraciju dot-files
в $HOME
. Jedno rješenje za konfiguracijske datoteke u matičnom direktoriju obično je njihovo prethodno generiranje i ugradnja rootfs
. za /var
Jedan od mogućih pristupa je da se montira na posebnu particiju na koju se može pisati, dok /
montiran samo za čitanje. Još jedna popularna alternativa je korištenje povezivanja ili preklapanja nosača.
Nosači koji se mogu povezati i slagati, njihova upotreba u kontejnerima
Izvršavanje naredbe man mount
je najbolji način da naučite o povezivanju i preklapanju, koji programerima i sistemskim administratorima daju mogućnost da kreiraju sistem datoteka na jednoj putanji, a zatim ga izlože aplikacijama na drugoj. Za ugrađene sisteme, to znači mogućnost pohranjivanja datoteka /var
na fleš disku koji je samo za čitanje, ali preklapajuća ili poveziva putanja za montiranje iz tmpfs
в /var
prilikom učitavanja, omogućit će aplikacijama da tamo pišu bilješke (škrabanje). Sljedeći put kada uključite promjene na /var
će biti izgubljen. Preklopni nosač stvara spoj između tmpfs
i osnovni sistem datoteka i omogućava vam da napravite prividne promjene u postojećim datotekama u ro-tootf
dok spajanje može učiniti nove praznim tmpfs
folderi vidljivi kao upisi u njih ro-rootfs
načine. Dok overlayfs
ovo je ono pravo (proper
) tip sistema datoteka, u koji je implementirano montiranje koje se može vezati
Na osnovu opisa preklapanja i povezivog nosača, nikog to ne čudi mountsnoop
iz bcc
.
Call system-nspawn
pokreće kontejner dok radi mountsnoop.py
.
Da vidimo šta se desilo:
Запуск mountsnoop
dok se kontejner "podiže" pokazuje da vrijeme izvođenja kontejnera u velikoj mjeri ovisi o povezivanju (prikazuje se samo početak dugog izlaza).
to je systemd-nspawn
pruža odabrane datoteke u procfs
и sysfs
host do kontejnera kao putanje do njega rootfs
... Pored toga MS_BIND
zastavicu koja postavlja vezujuće montiranje, neke druge zastavice na montiranju definiraju odnos između promjena u imenskom prostoru hosta i kontejnera. Na primjer, povezano montiranje može ili preskočiti promjene na /proc
и /sys
u kontejner ili ih sakrijte u zavisnosti od poziva.
zaključak
Razumijevanje unutrašnjeg rada Linuxa može izgledati kao nemoguć zadatak, budući da sam kernel sadrži ogromnu količinu koda, ostavljajući po strani aplikacije korisničkog prostora Linuxa i sučelja sistemskih poziva u C bibliotekama kao što su glibc
. Jedan od načina da se postigne napredak je čitanje izvornog koda jednog podsistema kernela, s naglaskom na razumijevanju sistemskih poziva i zaglavlja korisničkog prostora, kao i glavnih internih sučelja kernela, kao što je tablica file_operations
. Operacije datotekama pružaju princip "sve je datoteka", što ih čini posebno ugodnim za upravljanje. Izvorne datoteke C kernela u direktoriju najviše razine fs/
predstavljaju implementaciju virtuelnih sistema datoteka, koji su sloj omotača koji obezbeđuje široku i relativno jednostavnu kompatibilnost između popularnih sistema datoteka i uređaja za skladištenje. Povezivanje i montiranje preklapanja preko Linux imenskih prostora je magija VFS-a koja omogućava kreiranje kontejnera samo za čitanje i root fajl sistema. U kombinaciji sa pregledom izvornog koda, eBPF alata i njegovog interfejsa bcc
čineći istraživanje jezgra lakšim nego ikad.
Prijatelji, pišite, da li vam je ovaj članak bio koristan? Možda imate bilo kakav komentar ili primjedbu? A oni koji su zainteresovani za kurs Linux Administrator su pozvani
izvor: www.habr.com