Hello lil kulħadd, qed naqsmu miegħek it-tieni parti tal-pubblikazzjoni "Sistemi ta' fajls virtwali fil-Linux: għaliex huma meħtieġa u kif jaħdmu?" Tista' taqra l-ewwel parti
Kif timmonitorja l-VFS billi tuża għodod eBPF u bcc
L-eħfef mod biex tifhem kif il-qalba topera fuq il-fajls sysfs
huwa li taraha fil-prattika, u l-eħfef mod biex tara ARM64 huwa li tuża eBPF. eBPF (qosor għal Berkeley Packet Filter) jikkonsisti minn magna virtwali li taħdem query
) mil-linja tal-kmand. Is-sorsi tal-qalba jgħidu lill-qarrej x'jista' jagħmel il-qalba; it-tħaddim tal-għodod tal-eBPF fuq sistema mgħobbija juri x'qed jagħmel il-qalba fil-fatt.
Fortunatament, li tibda tuża eBPF hija pjuttost faċli bl-għajnuna ta 'għodod bcc
huma skripts Python b'inserzjonijiet żgħar ta 'kodiċi C, li jfisser li kull min huwa familjari maż-żewġ lingwi jista' faċilment jimmodifikahom. IN bcc/tools
Hemm 80 skripts Python, li jfisser li x'aktarx żviluppatur jew amministratur tas-sistema se jkun jista 'jagħżel xi ħaġa adattata biex issolvi l-problema.
Biex tikseb mill-inqas idea superfiċjali ta 'x'xogħol jagħmlu l-VFSs fuq sistema li taħdem, ipprova vfscount
jew vfsstat
. Dan se juri, ejja ngħidu, li għexieren ta 'sejħiet vfs_open()
u "ħbieb tiegħu" jiġri litteralment kull sekonda.
vfsstat.py
huwa skript Python b'inserzjonijiet tal-kodiċi C li sempliċement jgħodd is-sejħiet tal-funzjoni VFS.
Ejja nagħtu eżempju aktar trivjali u naraw x'jiġri meta ndaħħlu USB flash drive f'kompjuter u s-sistema tiskopriha.
Bl-użu tal-eBPF tista’ tara x’qed jiġri fih
/sys
meta tiddaħħal USB flash drive. Eżempju sempliċi u kumpless jidher hawn.
Fl-eżempju muri hawn fuq, bcc
għodda sysfs_create_files()
. Aħna naraw li sysfs_create_files()
tnieda bl-użu kworker
nixxiegħa bi tweġiba għall-fatt li l-flash drive kien imdaħħal, imma liema fajl inħoloq? It-tieni eżempju juri l-qawwa tal-eBPF. Hawn trace.py
Tipprintja backtrace tal-qalba (għażla -K) u l-isem tal-fajl li nħoloq sysfs_create_files()
. L-inserzjoni ta' stqarrija waħda hija kodiċi C li tinkludi sekwenza ta' format li tingħaraf faċilment ipprovduta mill-iskript Python li jmexxi LLVM kompilatur eżatt fil-ħin. Jiġbor din il-linja u jesegwixxiha f'magna virtwali ġewwa l-qalba. Firma tal-funzjoni sħiħa sysfs_create_files ()
trid tiġi riprodotta fit-tieni kmand sabiex is-sekwenza tal-format tkun tista' tirreferi għal wieħed mill-parametri. Żbalji f'din il-biċċa tal-kodiċi C jirriżultaw fi żbalji rikonoxxibbli mill-kompilatur C. Per eżempju, jekk il-parametru -l jitħalla barra, se tara "Falliet li tikkumpila test BPF." Iżviluppaturi li huma familjari ma 'C u Python se jsibu l-għodod bcc
faċli biex tespandi u tinbidel.
Meta l-USB drive tiddaħħal, il-backtrace tal-qalba se turi li PID 7711 huwa ħajt kworker
li ħoloq il-fajl «events»
в sysfs
. Għaldaqstant, is-sejħa minn sysfs_remove_files()
se juri li t-tneħħija tad-drajv irriżulta li l-fajl jitħassar events
, li jikkorrispondi għall-kunċett ġenerali ta' għadd ta' referenza. Fl-istess ħin, wiri sysfs_create_link ()
bl-eBPF waqt li ddaħħal il-USB drive se turi li mill-inqas 48 link simboliku inħolqu.
Allura x'inhu l-punt tal-fajl tal-avvenimenti? Użu disk_add_events ()
, u jew "media_change"
Jew "eject_request"
jistgħu jiġu rreġistrati f'fajl tal-avveniment. Hawnhekk is-saff tal-blokk tal-kernel jinforma lill-ispazju tal-utent li "disk" deher u ħarġet. Innota kemm dan il-metodu ta 'riċerka huwa informattiv billi ddaħħal USB drive, meta mqabbel ma' tipprova ssib kif l-affarijiet jaħdmu purament mis-sors.
Sistemi ta' fajls ta' għerq li jinqraw biss jippermettu apparati inkorporati
Naturalment, ħadd ma jitfi s-server jew il-kompjuter tiegħu billi jiġbed il-plagg mis-sokit. Imma għala? Dan huwa minħabba li s-sistemi tal-fajls immuntati fuq apparati tal-ħażna fiżika jista 'jkollhom kitba lagged, u l-istrutturi tad-dejta li jirreġistraw l-istat tagħhom jistgħu ma jkunux sinkronizzati mal-kitba fil-ħażna. Meta jiġri dan, is-sidien tas-sistema jridu jistennew sal-boot li jmiss biex iniedu l-utilità. fsck filesystem-recovery
u, fl-agħar każ, titlef id-data.
Madankollu, ilkoll nafu li ħafna apparati IoT, kif ukoll routers, termostati u karozzi, issa jaħdmu Linux. Ħafna minn dawn l-apparati għandhom ftit jew xejn user interface, u m'hemm l-ebda mod kif itfihom "b'mod nadif." Immaġina li tibda karozza b'batterija mejta meta l-enerġija għall-unità ta 'kontroll tkun fsck
meta l-magna finalment tibda taħdem? U t-tweġiba hija sempliċi. L-apparati inkorporati jiddependu fuq is-sistema tal-fajl tal-għeruq ro-rootfs
(fileystem għerq li jinqara biss)).
ro-rootfs
joffru ħafna benefiċċji li huma inqas ovvji mill-awtentiċità. Vantaġġ wieħed huwa li l-malware ma jistax jikteb /usr
jew /lib
, jekk l-ebda proċess Linux ma jista 'jikteb hemmhekk. Ieħor huwa li sistema ta' fajls fil-biċċa l-kbira immutabbli hija kritika għall-appoġġ fuq il-post ta' apparati remoti, peress li l-persunal ta 'appoġġ jiddependi fuq sistemi lokali li huma nominalment identiċi għas-sistemi fuq il-post. Forsi l-aktar benefiċċju importanti (iżda wkoll l-aktar insidjuż) huwa li ro-rootfs iġiegħel lill-iżviluppaturi jiddeċiedu liema oġġetti tas-sistema se jkunu immutabbli fl-istadju tad-disinn tas-sistema. Il-ħidma ma 'ro-rootfs tista' tkun skomda u ta 'uġigħ, peress li l-varjabbli const spiss ikunu f'lingwi ta' programmar, iżda l-benefiċċji tagħhom faċilment jiġġustifikaw l-overhead addizzjonali.
ħolqien rootfs
Il-qari biss jeħtieġ xi sforz żejjed għall-iżviluppaturi inkorporati, u dan huwa fejn jidħol l-istampa VFS. Linux jeħtieġ li l-fajls ikunu ġewwa /var
kienu writable, u barra minn hekk, ħafna applikazzjonijiet popolari li jmexxu sistemi inkorporati se jippruvaw joħolqu konfigurazzjoni dot-files
в $HOME
. Soluzzjoni waħda għall-fajls tal-konfigurazzjoni fid-direttorju tad-dar hija ġeneralment li jiġu ġġenerati minn qabel u jinbnewhom rootfs
. Biex /var
Approċċ wieħed possibbli huwa li jintramaw fuq partizzjoni separata li tista 'tinkiteb, filwaqt li /
immuntat għall-qari biss. Alternattiva popolari oħra hija l-użu ta 'bind jew overlay mounts.
Muntaturi linkable u stackable, l-użu tagħhom minn kontenituri
Eżekuzzjoni ta 'kmand man mount
huwa l-aħjar mod biex titgħallem dwar muntaturi li jistgħu jintrabtu u li jistgħu jiġu sovrapposti, li jagħtu lill-iżviluppaturi u lill-amministraturi tas-sistema l-abbiltà li joħolqu sistema ta 'fajls f'passaġġ wieħed u mbagħad jesponuha għal applikazzjonijiet f'oħra. Għal sistemi inkorporati, dan ifisser il-kapaċità li jinħażnu fajls fihom /var
fuq flash drive li jinqara biss, iżda overlay jew mogħdija tal-muntaġġ linkable minn tmpfs
в /var
waqt it-tagħbija, se tippermetti applikazzjonijiet biex jiktbu noti hemmhekk (scrawl). Il-ħin li jmiss li tixgħel il-bidliet għal /var
se jintilef. Mount overlay joħloq unjoni bejn tmpfs
u s-sistema tal-fajl sottostanti u tippermettilek tagħmel bidliet apparenti fil-fajls eżistenti fil ro-tootf
billi muntatura li tista' torbot tista' tagħmel oħrajn ġodda vojta tmpfs
folders viżibbli bħala writable fi ro-rootfs
modi. Filwaqt li overlayfs
din hija t-tajba (proper
) tip ta' sistema ta' fajls, muntatura li tista' torbot hija implimentata fi
Ibbażat fuq id-deskrizzjoni tal-overlay u l-muntatura linkable, ħadd ma huwa sorpriż li mountsnoop
minn bcc
.
Sejħa system-nspawn
jibda l-kontenitur waqt li jkun qed jaħdem mountsnoop.py
.
Ejja naraw x'ġara:
Tnedija mountsnoop
filwaqt li l-kontenitur huwa "booting" juri li l-runtime tal-kontenitur huwa dipendenti ħafna fuq il-muntatura li tkun konnessa (Huwa biss il-bidu tal-output twil).
Hawnhekk systemd-nspawn
jipprovdi fajls magħżula fi procfs
и sysfs
ospitanti għal kontenitur bħala mogħdijiet għalih rootfs
... Barra minn hekk MS_BIND
bandiera li tistabbilixxi l-muntatura vinkolanti, xi bnadar oħra fuq il-muntatura jiddefinixxu r-relazzjoni bejn il-bidliet fl-ispazji tal-isem tal-host u tal-kontenitur. Pereżempju, muntatura konnessa tista' jew taqbeż il-bidliet /proc
и /sys
fil-kontenitur, jew jaħbihom skont is-sejħa.
Konklużjoni
Il-fehim tal-ħidma interna tal-Linux jista 'jidher biċċa xogħol impossibbli, peress li l-kernel innifsu fih ammont kbir ta' kodiċi, u jħalli fil-ġenb l-applikazzjonijiet tal-ispazju tal-utent tal-Linux u l-interfaces tas-sejħa tas-sistema f'libreriji C bħal glibc
. Mod wieħed biex isir progress huwa li taqra l-kodiċi tas-sors ta 'subsistema tad-kernel waħda, b'enfasi fuq il-fehim tas-sejħiet tas-sistema u l-intestaturi tal-ispazju tal-utent, kif ukoll l-interfaces ewlenin tal-kernel interni, bħal tabella file_operations
. L-operazzjonijiet tal-fajl jipprovdu l-prinċipju ta '"kollox huwa fajl", li jagħmluhom partikolarment pjaċevoli biex jiġu mmaniġġjati. Fajls tas-sors tal-kernel C fid-direttorju tal-ogħla livell fs/
tippreżenta implimentazzjoni ta 'sistemi ta' fajls virtwali, li huma saff ta 'tgeżwir li jipprovdi kompatibilità wiesgħa u relattivament sempliċi bejn sistemi ta' fajls popolari u tagħmir ta 'ħażna. Il-konnessjoni u l-immuntar ta 'overlay permezz ta' spazji tal-isem Linux hija l-maġija ta 'VFS li tagħmilha possibbli li jinħolqu kontenituri li jinqraw biss u sistemi ta' fajls tal-għeruq. Flimkien ma 'eżami tal-kodiċi tas-sors, l-għodda ewlenija tal-eBPF u l-interface tagħha bcc
tagħmel l-esplorazzjoni tal-qalba aktar faċli minn qatt qabel.
Ħbieb, ikteb, dan l-artiklu kien utli għalik? Forsi għandek xi kummenti jew rimarki? U dawk li huma interessati fil-kors tal-Amministratur tal-Linux huma mistiedna
Sors: www.habr.com