Hej allihopa, vi delar med er den andra delen av publikationen "Virtuella filsystem i LinuxVarför behövs de och hur fungerar de? Den första delen kan lÀsas . LÄt oss pÄminna dig om att denna serie av publikationer Àr tidsinstÀlld att sammanfalla med lanseringen av en ny kursström , som börjar mycket snart.
Hur man övervakar VFS med eBPF och bcc-verktyg
Det enklaste sĂ€ttet att förstĂ„ hur kĂ€rnan hanterar filer sysfs â Ă€r att se det i praktiken, och det enklaste sĂ€ttet att observera ARM64 Ă€r att anvĂ€nda eBPF. eBPF (förkortning för Berkeley Packet Filter) bestĂ„r av en virtuell maskin som körs in , som privilegierade anvĂ€ndare kan begĂ€ra (query) frĂ„n kommandoraden. KĂ€rnkĂ€llorna talar om för lĂ€saren vad kĂ€rnan kan göra; Att köra eBPF-verktyg pĂ„ ett uppstartat system avslöjar vad kĂ€rnan faktiskt gör.

Lyckligtvis Ă€r det ganska enkelt att komma igĂ„ng med eBPF med verktyg , som Ă€r tillgĂ€ngliga som paket frĂ„n den allmĂ€nna distributionen och dokumenterat i detalj . Verktyg bcc â det hĂ€r Ă€r Python-skript med smĂ„ insatser av C-kod, vilket innebĂ€r att alla som Ă€r bekanta med bĂ„da sprĂ„ken enkelt kan Ă€ndra dem. I bcc/tools Det finns 80 Python-skript, vilket betyder att en utvecklare eller systemadministratör med största sannolikhet kommer att kunna hitta nĂ„got som passar för att lösa ett problem.
För att fÄ Ätminstone en översiktlig uppfattning om vilken typ av arbete VFS gör i ett körande system, försök vfscount eller vfsstat. Detta kommer att visa, lÄt oss sÀga, att dussintals samtal vfs_open() och "hans vÀnner" hÀnder bokstavligen varje sekund.

vfsstat.pyâ detta Ă€r ett Python-skript med C-kodinlĂ€gg som helt enkelt rĂ€knar VFS-funktionsanrop.
LÄt oss ta ett mer trivialt exempel och se vad som hÀnder nÀr vi sÀtter in ett USB-minne i en dator och systemet upptÀcker det.

Med eBPF kan du se vad som hÀnder i
/sys, nÀr ett USB-minne Àr isatt. Ett enkelt och komplext exempel visas hÀr.
I exemplet ovan, bcc ĐžĐœŃŃŃŃĐŒĐ”ĐœŃ skriver ut ett meddelande nĂ€r kommandot körs sysfs_create_files(). Det ser vi sysfs_create_files() lanserades med hjĂ€lp av kworker stream som svar pĂ„ det faktum att flashenheten sattes in, men vilken fil skapades? Det andra exemplet visar den fulla kraften hos eBPF. HĂ€r trace.py skriver ut kĂ€rnans bakĂ„tspĂ„rning (alternativ -K) och namnet pĂ„ filen som skapades sysfs_create_files(). Infogning av en enstaka pĂ„stĂ„ende Ă€r C-kod som innehĂ„ller en lĂ€tt igenkĂ€nnlig formatstrĂ€ng som tillhandahĂ„lls av ett Python-skript som kör LLVM just-in-time kompilator. Den kompilerar den hĂ€r raden och kör den i en virtuell maskin inuti kĂ€rnan. Full funktionssignatur sysfs_create_files () mĂ„ste Ă„terges i det andra kommandot sĂ„ att formatstrĂ€ngen kan referera till en av parametrarna. Fel i detta C-kodfragment resulterar i igenkĂ€nnliga C-kompilatorfel. Till exempel, om parametern -l saknas, kommer du att se "Det gick inte att kompilera BPF-text." Utvecklare som Ă€r bekanta med C och Python kommer att hitta verktyg bcc lĂ€tt att bygga ut och Ă€ndra.
NĂ€r USB-minnet Ă€r isatt kommer kĂ€rnans bakĂ„tspĂ„rning att visa att PID 7711 Ă€r trĂ„den kworker, som skapade filen «events» ĐČ sysfs. Följaktligen Ă€r uppmaningen sysfs_remove_files() kommer att visa att borttagning av enheten resulterade i att filen raderades events, vilket överensstĂ€mmer med det allmĂ€nna begreppet referensrĂ€kning. Samtidigt tittar sysfs_create_link () med eBPF nĂ€r du sĂ€tter i ett USB-minne kommer det att visa att minst 48 symboliska lĂ€nkar har skapats.
SÄ vad Àr poÀngen med hÀndelsefilen? AnvÀndande för sökning , visar att det orsakar disk_add_events (), och antingen "media_change"Eller "eject_request" kan skrivas till hÀndelsefilen. HÀr informerar kÀrnblockslagret anvÀndarutrymmet om utseendet och borttagningen av "disken". LÀgg mÀrke till hur informativ denna undersökningsmetod Àr baserad pÄ att sÀtta i ett USB-minne, jÀmfört med att försöka ta reda pÄ hur saker och ting fungerar utifrÄn kÀllkoden enbart.
LÀsbara rotfilsystem gör inbÀddade enheter möjliga
Naturligtvis stÀnger ingen av en server eller sin dator genom att dra ut kontakten ur uttaget. Men varför? Detta beror pÄ att monterade filsystem pÄ fysiska lagringsenheter kan ha fördröjda skrivningar, och de datastrukturer som registrerar deras tillstÄnd kanske inte Àr synkroniserade med posterna i lagringen. NÀr detta hÀnder mÄste systemÀgare vÀnta tills nÀsta start för att köra verktyget. fsck filesystem-recovery och i vÀrsta fall förlora data.
Vi vet dock alla att mÄnga IoT-enheter, sÄvÀl som routrar, termostater och bilar, nu körs pÄ LinuxMÄnga av dessa enheter har praktiskt taget inget anvÀndargrÀnssnitt, och det finns inget sÀtt att stÀnga av dem ordentligt. TÀnk dig att starta en bil med ett dött batteri nÀr strömmen till styrenheten bryts. stÀndigt hoppa upp och ner. Hur kommer det sig att systemet startar utan en lÄng tid fsck, nÀr börjar motorn Àntligen fungera? Och svaret Àr enkelt. InbÀddade enheter Àr beroende av rotfilsystemet (förkortat ro-rootfs (skrivskyddat rotfilsystem)).
ro-rootfs erbjuder mÄnga fördelar som Àr mindre uppenbara Àn Àkta. En av fördelarna Àr att skadlig programvara inte kan skriva till /usr eller /lib, om ingen process Linux kan inte skriva till den. En annan Àr att ett i stort sett oförÀnderligt filsystem Àr avgörande för fÀltsupport av fjÀrrenheter, eftersom supportpersonal anvÀnder lokala system som nominellt Àr identiska med systemen pÄ plats. Den kanske viktigaste (men ocksÄ mest lömska) fördelen Àr att ro-rootfs tvingar utvecklare att bestÀmma vilka systemobjekt som ska vara oförÀnderliga tidigt i systemdesignen. Att arbeta med ro-rootfs kan vara besvÀrligt och smÀrtsamt, vilket ofta Àr fallet med const-variabler i programmeringssprÄk, men fördelarna övervÀger vida den extra kostnaden.
skapande rootfs Skrivskyddad funktionalitet krĂ€ver lite extra anstrĂ€ngning för inbĂ€ddade utvecklare, och det Ă€r hĂ€r VFS kommer in i bilden. Linux krĂ€ver att filer i /var var skrivbara, och dessutom kommer mĂ„nga populĂ€ra applikationer som körs pĂ„ inbĂ€ddade system att försöka skapa konfiguration dot-files ĐČ $HOME. En lösning för konfigurationsfiler i hemkatalogen Ă€r vanligtvis att förgenerera dem och bygga in dem rootfs. För /var en möjlig metod Ă€r att montera den pĂ„ en separat skrivbar partition medan / monterad skrivskyddad. Ett annat populĂ€rt alternativ Ă€r att anvĂ€nda bind- eller överlagringsfĂ€sten.
Bindbara och stapelbara fÀsten och deras anvÀndning av containrar
Utför kommandot man mount â det bĂ€sta sĂ€ttet att lĂ€ra sig om lĂ€nkbara och staplingsbara monteringar, som gör det möjligt för utvecklare och systemadministratörer att skapa ett filsystem pĂ„ en vĂ€g och sedan exponera det för applikationer i en annan. För inbĂ€ddade system innebĂ€r detta möjligheten att lagra filer i /var pĂ„ en skrivskyddad flashenhet, men ett överlĂ€gg eller lĂ€nkfĂ€ste av sökvĂ€gen frĂ„n tmpfs ĐČ /var NĂ€r du laddar kommer det att tillĂ„ta applikationer att skriva anteckningar dĂ€r (scrawla). NĂ€sta gĂ„ng du slĂ„r pĂ„ Ă€ndringarna in /var kommer att gĂ„ förlorad. Ett överlĂ€ggsfĂ€ste skapar en förening mellan tmpfs och det underliggande filsystemet och lĂ„ter dig göra Ă€ndringar i befintliga filer i ro-tootf medan ett lĂ€nkbart fĂ€ste kan göra nya tomma tmpfs mappar som Ă€r synliga som skrivbara i ro-rootfs vĂ€gar. Medan overlayfs detta Ă€r korrekt (proper) filsystemstyp, lĂ€nkbar montering implementeras i .
Baserat pÄ beskrivningen av överlÀgg och lÀnkfÀsten Àr ingen förvÄnad över det de anvÀnds aktivt. LÄt oss se vad som hÀnder nÀr vi anvÀnder för att köra behÄllaren med hjÀlp av verktyget mountsnoop frÄn bcc.
samtal system-nspawn startar behÄllaren under drift mountsnoop.py.
LÄt oss se vad som hÀnde:
ĐапŃŃĐș mountsnoop under container "boot" visar att containerns körtid Ă€r starkt beroende av det bindbara fĂ€stet (endast början av den lĂ„nga utgĂ„ngen visas).
HÀr systemd-nspawn tillhandahÄller de valda filerna procfs О sysfs vÀrd i container som vÀgar i den rootfs... Förutom MS_BIND flaggan som stÀller in bindningsmonteringen, vissa andra flaggor i monteringen bestÀmmer förhÄllandet mellan Àndringar i vÀrd- och containernamnrymden. Till exempel kan en bindmontering antingen hoppa över Àndringar till /proc О /sys i en container, eller dölj dem beroende pÄ samtalet.
Slutsats
Att förstĂ„ den interna strukturen Linux kan verka som en omöjlig uppgift, eftersom kĂ€rnan i sig innehĂ„ller en enorm mĂ€ngd kod, bortsett frĂ„n anvĂ€ndarutrymmesapplikationer Linux och systemanropsgrĂ€nssnitt i C-bibliotek som glibc. Ett sĂ€tt att göra framsteg Ă€r att lĂ€sa kĂ€llkoden för ett kĂ€rndelsystem, med tonvikt pĂ„ att förstĂ„ systemanrop och rubriker som möter anvĂ€ndarutrymmet, sĂ„vĂ€l som de viktigaste interna kĂ€rngrĂ€nssnitten, sĂ„som tabellen file_operations. Filoperationer tillĂ€mpar principen "allt Ă€r en fil", vilket gör dem sĂ€rskilt trevliga att hantera. Kernel C-kĂ€llfiler i katalogen pĂ„ översta nivĂ„n fs/ representerar en implementering av virtuella filsystem, vilka Ă€r ett omslagslager som ger bred och relativt enkel kompatibilitet mellan populĂ€ra filsystem och lagringsenheter. Montering med lĂ€nkning och överlagring via namnrymder Linux â Ă€r magin med VFS som gör det möjligt att skapa containrar och skrivskyddade rotfilsystem. Kombinerat med en studie av kĂ€llkoden, kĂ€rnverktyget eBPF och dess grĂ€nssnitt bcc
gör kÀrnutforskning enklare Àn nÄgonsin.
VÀnner, lÄt mig veta om den hÀr artikeln var till hjÀlp för er. Kanske har ni nÄgra kommentarer eller förslag? Och för er som Àr intresserade av kursen "Administratör", Linux", vi inbjuder dig att , som Àger rum den 18 april.
KĂ€lla: will.com
