Virtualni datotečni sustavi u Linuxu: zašto su potrebni i kako rade? 2. dio

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 ovdje. Podsjetimo vas da je ova serija publikacija vremenski usklađena s pokretanjem novog streama na tečaju "Linux administrator", koji počinje vrlo brzo.

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 jezgra, koje povlašteni korisnici mogu zahtijevati (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.

Virtualni datotečni sustavi u Linuxu: zašto su potrebni i kako rade? 2. dio

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

Virtualni datotečni sustavi u Linuxu: zašto su potrebni i kako rade? 2. dio

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.

Virtualni datotečni sustavi u Linuxu: zašto su potrebni i kako rade? 2. dio

Pomoću eBPF-a možete vidjeti što se događa u /syskada je USB flash pogon umetnut. Ovdje je prikazan jednostavan i složen primjer.

U gore prikazanom primjeru, bcc alat trace.py ispisuje poruku kada se naredba pokrene 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 kworkerkoji 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 cscope Za pretragu __device_add_disk(), pokazuje što uzrokuje 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 Linux neprestano skačući gore-dolje. Kako to da se sustav diže bez dugog fsckkada motor konačno počinje raditi? A odgovor je jednostavan. Ugrađeni uređaji oslanjaju se na korijenski datotečni sustav samo za čitanje (skraćeno 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 VFS imenski prostor.

Na temelju opisa preklapanja i povezivog nosača, nitko se tome ne čudi Linux spremnici aktivno se koriste. Pogledajmo što se događa kada ga koristimo systemd-nspawn za pokretanje spremnika pomoću alata 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 Otvoreni dan, koji će se održati 18.

Prvi dio.

Izvor: www.habr.com

Dodajte komentar