Pozdrav svima, s vama dijelimo drugi dio publikacije “Virtualni datotečni sustavi u Linuxu: zašto su potrebni i kako rade?” Možete pročitati prvi dio
Kako nadzirati VFS pomoću eBPF i bcc alata
Najlakši način da shvatite kako kernel radi s datotekama sysfs
je vidjeti to u praksi, a najlakši način da gledate ARM64 je korištenje eBPF-a. eBPF (skraćenica za Berkeley Packet Filter) sastoji se od virtualnog stroja koji radi query
) iz naredbenog retka. Izvori kernela govore čitatelju što kernel može učiniti; pokretanje eBPF alata na učitanom sustavu pokazuje što kernel zapravo radi.
Srećom, početak korištenja eBPF-a prilično je jednostavan uz pomoć alata bcc
su Python skripte s malim umetcima C koda, što znači da ih svatko tko poznaje oba jezika može lako modificirati. U bcc/tools
Postoji 80 Python skripti, što znači da će najvjerojatnije programer ili administrator sustava moći odabrati nešto prikladno za rješavanje problema.
Da biste dobili barem površnu ideju o tome što rade VFS-ovi na pokrenutom sustavu, pokušajte vfscount
ili vfsstat
. Ovo će pokazati, recimo, desetke poziva vfs_open()
a "njegovi prijatelji" događaju se doslovno svake sekunde.
vfsstat.py
je Python skripta s umetcima C koda koja jednostavno broji pozive VFS funkcija.
Dajmo jedan trivijalniji primjer i vidimo što se događa kada umetnemo USB flash pogon u računalo i sustav to detektira.
Pomoću eBPF-a možete vidjeti što se događa u
/sys
kada je USB flash pogon umetnut. Ovdje je prikazan jednostavan i složen primjer.
U gore prikazanom primjeru, bcc
alat sysfs_create_files()
. Vidimo to sysfs_create_files()
pokrenut je pomoću kworker
stream kao odgovor na činjenicu da je flash pogon umetnut, ali koja je datoteka stvorena? Drugi primjer pokazuje snagu eBPF-a. Ovdje trace.py
Ispisuje povratni trag jezgre (opcija -K) i naziv datoteke koja je stvorena sysfs_create_files()
. Umetanje pojedinačne izjave je C kod koji uključuje lako prepoznatljiv niz formata koji pruža Python skripta koja pokreće LLVM pravovremeni kompilator. On kompajlira ovu liniju i izvršava je u virtualnom stroju unutar kernela. Potpuno funkcionalni potpis sysfs_create_files ()
mora se reproducirati u drugoj naredbi tako da se niz formata može odnositi na jedan od parametara. Pogreške u ovom dijelu C koda rezultiraju prepoznatljivim pogreškama C kompajlera. Na primjer, ako je parametar -l izostavljen, vidjet ćete "Nije uspjelo sastavljanje BPF teksta." Programeri koji poznaju C i Python pronaći će alate bcc
lako proširiti i promijeniti.
Kada se USB pogon umetne, povratno praćenje kernela pokazat će da je PID 7711 nit kworker
koji je kreirao datoteku «events»
в sysfs
. Sukladno tome, poziv od sysfs_remove_files()
pokazat će da je uklanjanje pogona rezultiralo brisanjem datoteke events
, što odgovara općem konceptu brojanja referenci. U isto vrijeme, gledanje sysfs_create_link ()
s eBPF-om tijekom umetanja USB pogona pokazat će da je stvoreno najmanje 48 simboličkih veza.
Koja je svrha datoteke događaja? Korištenje disk_add_events ()
, i ili "media_change"
Ili "eject_request"
može se zabilježiti u datoteku događaja. Ovdje sloj bloka kernela obavještava korisnički prostor da se "disk" pojavio i izbacio. Imajte na umu koliko je informativna ova metoda istraživanja umetanjem USB pogona, u usporedbi s pokušajem da shvatite kako stvari funkcioniraju samo iz izvora.
Korijenski datotečni sustav samo za čitanje omogućuje ugrađene uređaje
Naravno, nitko ne gasi server ili svoje računalo izvlačenjem utikača iz utičnice. Ali zašto? To je zato što montirani datotečni sustavi na fizičkim uređajima za pohranu mogu imati zaostale zapise, a podatkovne strukture koje bilježe njihovo stanje možda neće biti sinkronizirane s zapisima u pohranu. Kada se to dogodi, vlasnici sustava 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 usmjerivači, termostati i automobili sada pokreću Linux. Mnogi od tih uređaja imaju malo ili nimalo korisničkog sučelja i ne postoji način da ih se "čisto" isključi. Zamislite da upalite automobil s praznim akumulatorom dok nema struje u kontrolnoj jedinici fsck
kada motor konačno počinje raditi? A odgovor je jednostavan. Ugrađeni uređaji oslanjaju se na korijenski datotečni sustav ro-rootfs
(korijenski datotečni sustav samo za čitanje)).
ro-rootfs
nude mnoge prednosti koje su manje očite od autentičnosti. Jedna od prednosti je da zlonamjerni softver ne može pisati /usr
ili /lib
, ako nijedan Linux proces ne može tamo pisati. Drugi je da je uglavnom nepromjenjivi datotečni sustav kritičan za terensku podršku udaljenih uređaja, budući da se osoblje za podršku oslanja na lokalne sustave koji su nominalno identični terenskim sustavima. Možda je najvažnija (ali i najpodmuklija) korist to što ro-rootfs tjera programere da odluče koji će sistemski objekti biti nepromjenjivi u fazi projektiranja sustava. Rad s ro-rootfs-om može biti nezgodan i bolan, budući da su const varijable često u programskim jezicima, ali njihove prednosti lako opravdavaju dodatne troškove.
stvaranje rootfs
Samo za čitanje zahtijeva dodatne napore za ugrađene programere, a tu VFS dolazi na scenu. Linux zahtijeva da datoteke budu unutra /var
mogli su pisati, a osim toga, mnoge popularne aplikacije koje pokreću ugrađene sustave pokušat će stvoriti konfiguraciju dot-files
в $HOME
. Jedno rješenje za konfiguracijske datoteke u početnom direktoriju obično je njihovo prethodno generiranje i ugradnja rootfs
. Za /var
Jedan mogući pristup je montirati ga na zasebnu particiju za pisanje, dok /
montiran samo za čitanje. Još jedna popularna alternativa je korištenje nosača za uvezivanje ili preklapanje.
Nosači koji se mogu povezivati i slagati, njihova upotreba u kontejnerima
Izvršenje naredbe man mount
je najbolji način da naučite o uvezivim i preklapajućim montiranjima, koja programerima i administratorima sustava daju mogućnost stvaranja datotečnog sustava na jednom putu i zatim ga izlažu aplikacijama na drugom. Za ugrađene sustave to znači mogućnost pohranjivanja datoteka u /var
na flash pogonu samo za čitanje, ali preklapajući ili povezivi put montiranja 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
bit će izgubljeno. Preklopni nosač stvara spoj između tmpfs
i temeljni datotečni sustav te vam omogućuje da napravite prividne promjene u postojećim datotekama ro-tootf
dok nosač koji se može vezati može isprazniti nove tmpfs
mape vidljive kao u koje se može pisati ro-rootfs
načine. Dok overlayfs
ovo je ono pravo (proper
) vrsta datotečnog sustava, implementirano je povezivanje koje se može montirati
Na temelju opisa preklapanja i povezivog nosača, nitko se tome ne čudi mountsnoop
iz bcc
.
poziv system-nspawn
pokreće spremnik dok radi mountsnoop.py
.
Da vidimo što se dogodilo:
lansiranje mountsnoop
dok se spremnik "podiže" pokazuje da vrijeme izvođenja spremnika uvelike ovisi o montiranju koje se povezuje (prikazuje se samo početak dugog izlaza).
Ovdje systemd-nspawn
nudi odabrane datoteke procfs
и sysfs
host do spremnika kao staze do njega rootfs
... osim MS_BIND
zastavica koja postavlja vezanje montiranja, neke druge zastavice na montiranju definiraju odnos između promjena u imenskom prostoru hosta i spremnika. Na primjer, povezani nosač može preskočiti promjene na /proc
и /sys
u spremnik ili ih sakriti ovisno o pozivu.
Zaključak
Razumijevanje unutarnjeg rada Linuxa može izgledati kao nemoguć zadatak, budući da sama jezgra 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 za napredak je čitanje izvornog koda jednog podsustava jezgre, s naglaskom na razumijevanje sistemskih poziva i zaglavlja korisničkog prostora, kao i glavnih internih sučelja jezgre, kao što je tablica file_operations
. Datotečne operacije 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 virtualnih datotečnih sustava, koji su sloj omotača koji pruža široku i relativno jednostavnu kompatibilnost između popularnih datotečnih sustava i uređaja za pohranu. Povezivanje i montiranje preklapanja putem Linux imenskih prostora je magija VFS-a koja omogućuje stvaranje spremnika samo za čitanje i korijenskih datotečnih sustava. U kombinaciji s ispitivanjem izvornog koda, temeljnog alata eBPF i njegovog sučelja bcc
čineći istraživanje jezgre lakšim nego ikada.
Prijatelji, napišite, je li vam ovaj članak bio koristan? Možda imate komentare ili primjedbe? Pozivaju se i oni koji su zainteresirani za tečaj Linux Administrator
Izvor: www.habr.com