Virtualni datotečni sistemi u Linuxu: zašto su potrebni i kako funkcioniraju? Dio 2

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 ovdje. Podsjetimo da je ova serija publikacija tempirana da se poklopi sa pokretanjem novog streama na kursu "Linux administrator", koja počinje vrlo brzo.

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 jezgro, koji privilegirani korisnici mogu zatražiti (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.

Virtualni datotečni sistemi u Linuxu: zašto su potrebni i kako funkcioniraju? Dio 2

Srećom, početak korištenja eBPF-a je prilično jednostavan uz pomoć alata bcc, koji su dostupni kao paketi iz opće distribucije Linux i detaljno dokumentovana Bernard Gregg. Alati 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.

Virtualni datotečni sistemi u Linuxu: zašto su potrebni i kako funkcioniraju? Dio 2

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.

Virtualni datotečni sistemi u Linuxu: zašto su potrebni i kako funkcioniraju? Dio 2

Koristeći eBPF možete vidjeti šta se dešava /syskada je USB fleš disk umetnut. Ovdje je prikazan jednostavan i složen primjer.

U gore prikazanom primjeru, bcc alatka trace.py ispisuje poruku kada se naredba pokrene 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 kworkerkoji 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 cscope Za pretragu __device_add_disk(), pokazuje šta uzrokuje 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 Linux stalno skaču gore-dole. Kako to da se sistem pokreće bez dugog fsckkada motor konačno počinje da radi? A odgovor je jednostavan. Ugrađeni uređaji se oslanjaju na korijenski sistem datoteka samo za čitanje (skraćeno 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 VFS imenski prostor.

Na osnovu opisa preklapanja i povezivog nosača, nikog to ne čudi Linux kontejneri aktivno se koriste. Da vidimo šta se dešava kada koristimo systemd-nspawn da pokrenete kontejner pomoću alata 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 Dan otvorenih vrata, koji će se održati 18. aprila.

Prvi deo.

izvor: www.habr.com

Dodajte komentar