Moien alleguer, mir deelen den zweeten Deel vun der Publikatioun "Virtuell Dateisystemer an LinuxFirwat gi se gebraucht a wéi funktionéieren se? Den éischten Deel kann gelies ginn . Loosst eis Iech drun erënneren datt dës Serie vu Publikatiounen ZÀit ass fir mam Start vun engem neie Stream um Cours zesummen ze kommen , déi ganz geschwënn ufÀnkt.
Wéi iwwerwaacht VFS mat eBPF a bcc Tools
Deen einfachste Wee fir ze verstoen wéi de Kernel op Dateien funktionnéiert sysfs ass et an der Praxis ze gesinn, an deen einfachste Wee fir ARM64 ze kucken ass eBPF ze benotzen. eBPF (kuerz fir Berkeley Packet Filter) besteet aus enger virtueller Maschinn déi an , déi privilegiéiert Benotzer kënnen ufroen (query) vun der Kommandozeil. D'Kernelquelle soen dem Lieser wat de Kernel ka maachen; d'eBPF Tools op engem geluedene System lafen weist wat de Kernel tatsÀchlech mécht.

GlĂ©cklech, unzefĂ€nken eBPF ze benotzen ass ganz einfach mat der HĂ«llef vun Tools , dĂ©i als Packagen aus der allgemenger Verdeelung verfĂŒgbar sinn an am Detail dokumentĂ©iert . Tools bcc si Python Scripte mat klengen Insertiounen vum C Code, dat heescht datt jiddereen dee mat bĂ©ide Sprooche vertraut ka se einfach Ă€nneren. IN bcc/tools Et ginn 80 Python Scripten, dat heescht, datt hĂ©chstwahrscheinlech en EntwĂ©ckler oder System Administrateur fĂ€heg sinn eppes gĂ«eegent fir de Problem ze lĂ©isen wielen.
Fir op d'mannst eng iwwerflÀchlech Iddi ze kréien iwwer wéi eng Aarbecht VFSs op engem lafende System maachen, probéiert vfscount oder vfsstat. Dëst wÀert weisen, loosst eis soen, datt Dosende vun Uruff vfs_open() an "seng Frënn" geschéien wuertwiertlech all zweet.

vfsstat.pyass e Python Skript mat C Code Inserts déi einfach VFS Funktioun Uruff zielen.
Loosst eis e méi trivial Beispill ginn a kucken wat geschitt wa mir en USB Flash Drive an e Computer setzen an de System et erkennt.

Mat eBPF kënnt Dir gesinn wat geschitt an
/syswann en USB Flash Drive agefouert gëtt. En einfacht a komplext Beispill gëtt hei gewisen.
Am Beispill hei uewen gewisen, bcc Instrument drĂ©ckt e Message wann de Kommando leeft sysfs_create_files(). Mir gesinn dat sysfs_create_files() gouf lancĂ©iert benotzt kworker Stream als Ăntwert op d'Tatsaach datt de Flash Drive agefouert gouf, awer wĂ©i eng Datei gouf erstallt? Dat zweet Beispill weist d'Kraaft vun eBPF. Hei trace.py DrĂ©ckt e Kernel Backtrace (-K Optioun) an den Numm vun der Datei dĂ©i erstallt gouf sysfs_create_files(). Eenzeg Ausso Insertion ass C Code deen eng liicht erkennbar Formatstring enthĂ€lt, dĂ©i vum Python Skript geliwwert gĂ«tt, deen LLVM leeft just-in-time Compiler. Et kompilĂ©iert dĂ«s Zeil an fĂ©iert se an enger virtueller Maschinn am Kernel aus. Voll Funktioun ĂnnerschrĂ«ft sysfs_create_files () muss am zweete Kommando reproduzĂ©iert ginn, sou datt d'Formatstring op ee vun de Parameteren bezĂ©ie kann. Feeler an dĂ«sem StĂ©ck C Code resultĂ©ieren zu erkennbaren Feeler vum C Compiler. Zum Beispill, wann de -l Parameter ewech gelooss gĂ«tt, gesitt Dir "Feiled to compile BPF Text." EntwĂ©ckler, dĂ©i mat C a Python vertraut sinn, fannen d'Tools bcc einfach ze vergrĂ©isseren an z'Ă€nneren.
Wann den USB Drive agebaut ass, weist de Kernel Backtrace datt PID 7711 e Fuedem ass kworkerdĂ©i d'Datei erstallt huet «events» ĐČ sysfs. Deementspriechend den Uruff vun sysfs_remove_files() wĂ€ert weisen datt d'Ewechhuele vum Drive zu der Datei gelĂ€scht huet events, wat dem allgemenge Konzept vun der Referenzzielung entsprĂ©cht. Zur selwechter ZĂ€it kucken sysfs_create_link () mat eBPF beim Asetzen vum USB Drive weist datt op d'mannst 48 symbolesch Linken erstallt goufen.
Also wat ass de Punkt vun der Eventdatei? Benotzung Fir Sich , weist wat et verursaacht disk_add_events (), an entweder "media_change", oder "eject_request" kann an engem Event Fichier opgeholl ginn. Hei informéiert d'Kernelblockschicht de Benotzerraum datt eng "Disk" erschéngt an ausgestouss ass. Notéiert wéi informativ dës Fuerschungsmethod ass andeems Dir en USB Drive setzt, am Verglach mam Versuch erauszefannen wéi d'Saachen reng aus der Quell funktionnéieren.
Read-only Root Dateisystemer aktivéieren embedded GerÀter
Natierlech schalt keen de Server oder hire Computer aus, andeems de Stecker aus der Socket zitt. Mee firwat? Dëst ass well montéiert Dateisystemer op physesch SpÀichergerÀter verlagert Schreiwe kënnen hunn, an d'Datestrukturen, déi hiren Zoustand ophuelen, kënnen net mat Schreiwen op d'SpÀichere synchroniséiert ginn. Wann dat passéiert, musse Systembesëtzer bis den nÀchsten Boot waarden fir den Utility ze starten. fsck filesystem-recovery an, am schlëmmste Fall, Verléierer Donnéeën.
Mir all wĂ«ssen awer, datt vill IoT-GerĂ€ter, souwĂ©i Routeren, Thermostaten an Autoen, elo op ... lafen. LinuxVill vun dĂ«sen Apparater hunn praktesch keng BenotzeruewerflĂ€ch, an et gĂ«tt keng MĂ©iglechkeet, se propper auszeschalten. Stellt Iech vir, Dir start en Auto mat enger eideler Batterie, wann de Stroum zum SteiergerĂ€t ausgeschalt gĂ«tt. stĂ€nneg op an erof sprangen. WĂ©i ass et, datt de System Stiwwelen ouni laang fsckwĂ©ini fĂ€nkt de motor endlech un? An d'Ăntwert ass einfach. Embedded GerĂ€ter vertrauen op de Root Dateisystem (ofgekierzt ro-rootfs (read-nĂ«mme root Dateisystem)).
ro-rootfs bitt vill Virdeeler dĂ©i manner offensichtlech sinn wĂ©i AuthentizitĂ©it. Ee Virdeel ass datt Malware net schreiwe kann /usr oder /lib, wann kee Prozess Linux kann net drop schreiwen. Eng aner ass, datt e grĂ©isstendeels onverĂ€nnerlecht Dateisystem entscheedend ass fir den Support vu FerngerĂ€ter am Feld, well den Supportpersonal lokal Systemer benotzt, dĂ©i nominell identesch mat de Systemer virun Ort sinn. De vlĂ€icht wichtegsten (awer och heimtĂŒckeschsten) Virdeel ass, datt ro-rootfs d'EntwĂ©ckler forcĂ©iert ze entscheeden, wĂ©i eng Systemobjekter frĂ©i am Systemdesign onverĂ€nnerlech sinn. D'Aarbecht mat ro-rootfs kann onpraktesch a penibel sinn, wĂ©i et dacks de Fall ass mat const Variablen a ProgrammĂ©iersproochen, awer seng Virdeeler iwwerweien dĂ€itlech den zousĂ€tzlechen Overhead.
Kreatioun rootfs D'Read-only-FunktionalitĂ©it erfuerdert e puer extra Ustrengungen fir Embedded-EntwĂ©ckler, an hei kĂ«nnt VFS an d'Spill. Linux verlaangt, datt Dateien an /var schrĂ«ftlech waren, an zousĂ€tzlech, vill populĂ€r Applikatiounen datt embedded Systemer lafen wĂ€ert probĂ©ieren Configuratioun ze schafen dot-files ĐČ $HOME. Eng LĂ©isung fir Konfiguratiounsdateien am Heemverzeechnes ass normalerweis fir se viraus ze generĂ©ieren an ze bauen rootfs. fir /var Eng mĂ©iglech Approche ass et op enger separater schreiwenbarer Partition ze montĂ©ieren, wĂ€rend / montĂ©iert nĂ«mmen liesen. Eng aner populĂ€r Alternativ ass d'Benotzung vu Bind- oder Overlay Mounts.
Linkbar a stackbar Mounts, hir Notzung vu Container
Kommando AusfĂ©ierung man mount ass de beschte Wee fir iwwer bindbar an iwwerlagerbare Mounts ze lĂ©ieren, dĂ©i EntwĂ©ckler a Systemadministrateuren d'FĂ€egkeet ginn e Dateiesystem op engem Wee ze kreĂ©ieren an et dann un Uwendungen an engem aneren auszesetzen. Fir embedded Systemer heescht dat d'FĂ€egkeet fir Dateien ze spĂ€icheren /var op engem liesen-nĂ«mmen Flash fueren, mee en overlay oder linkable Mount Wee vun tmpfs ĐČ /var wann Luede, et erlaabt Uwendungen Notizen do ze schreiwen (scrawl). DĂ©i nĂ€chst KĂ©ier Dir d'Ănnerungen op /var wĂ€ert verluer goen. Eng Iwwerlagerung schaaft eng Gewerkschaft tĂ«scht tmpfs an de Basisdaten Dateiesystem an erlaabt Iech scheinbar Ănnerungen un existente Dateien ze maachen ro-tootf wĂ€rend e bindbare Mount kann nei eidel maachen tmpfs Classeure siichtbar als schreiwen an ro-rootfs WeeĂ«r. WĂ€hrend overlayfs dat ass dĂ©i richteg (proper) Dateisystemtyp, bindbar Mount ass implementĂ©iert an .
BasĂ©ierend op d'Beschreiwung vun der Iwwerlagerung a verlinkbare Montage, ass keen iwwerrascht datt si sinn aktiv benotzt. Loosst eis kucken wat geschitt wa mir benotzen fir de Container mam Tool ze lafen mountsnoop ĐŸŃ bcc.
Rufft system-nspawn fÀnkt de Container beim Lafen un mountsnoop.py.
Loosst eis kucken wat geschitt ass:
Lancéiere mountsnoop wÀrend de Container "boott" weist datt d'Runtime vum Container héich ofhÀngeg ass vum Mount dat verlinkt ass (Nëmmen den Ufank vun der laanger Ausgang gëtt gewisen).
et ass systemd-nspawn stellt ausgewielte Dateien an procfs Đž sysfs Host zu Container als WeeĂ«r derzou rootfs... Donieft MS_BIND FĂ€ndel deen de verbindleche Mount opstellt, e puer aner FĂ€ndelen um Mount definĂ©ieren d'Relatioun tĂ«scht Ănnerunge vum Host a Containernummraim. Zum Beispill, e verlinkte Mount kann entweder Ănnerungen iwwersprangen /proc Đž /sys an de Container, oder verstoppt se ofhĂ€ngeg vum Uruff.
Konklusioun
D'intern Struktur verstoen Linux kann onmĂ©iglech ausgesinn, well de Kernel selwer eng enorm QuantitĂ©it u Code enthĂ€lt, ouni d'Userspace-Applikatiounen ze benotzen. Linux an Systemruff-Interfaces a C-BibliothĂ©iken wĂ©i z. B. glibc. Ee Wee fir FortschrĂ«tter ze maachen ass de Quellcode vun engem Kernel-Subsystem ze liesen, mat engem Akzent op d'Verstoe vu Systemruffen a Benotzerraum-Header, souwĂ©i d'Haaptintern Kernel-Interfaces, wĂ©i Tabell file_operations. Dateioperatioune bidden de "Alles ass e Fichier" Prinzip, wat se besonnesch agreabel mĂ©cht ze managen. C Kernel Quelldateien am Top-Level Verzeichnis fs/ representĂ©iert eng Implementatioun vu virtuelle Dateisystemer, dĂ©i eng Wrapper-Layer sinn, dĂ©i eng breet a relativ einfach KompatibilitĂ©it tĂ«scht populĂ€re Dateisystemer a SpĂ€ichermedien ubitt. Montage mat VerknĂ«ppung an Iwwerlagerung iwwer Namespaces Linux â ass d'Magie vu VFS, dĂ©i et ermĂ©iglecht, Container a read-only Root-Dateisystemer ze kreĂ©ieren. KombinĂ©iert mat enger Studie vum Quellcode, dem eBPF Kernel Tool a senger Interface bcc
mécht KÀr Exploratioun méi einfach wéi jee.
FrĂ«nn, loosst mech wĂ«ssen, ob dĂ«sen Artikel Iech hĂ«llefrĂ€ich war. VlĂ€icht hutt Dir Kommentarer oder VirschlĂ©i? A fir dĂ©i, dĂ©i un dem "Administrateur"-Cours interessĂ©iert sinn, Linuxâ, mir invitĂ©ieren Iech op , dĂ©i den 18. AbrĂ«ll stattfĂ«nnt.
Source: will.com
