Virtualaj dosiersistemoj en Linukso: kial ili estas bezonataj kaj kiel ili funkcias? Parto 2

Saluton al ĉiuj, ni dividas kun vi la duan parton de la eldonaĵo "Virtualaj dosiersistemoj en Linukso: kial ili estas bezonataj kaj kiel ili funkcias?" Vi povas legi la unuan parton tie. Ni memorigu vin, ke ĉi tiu serio de publikaĵoj estas tempigita por koincidi kun la lanĉo de nova fluo sur la kurso. "Linuksa Administranto", kiu komenciĝas tre baldaŭ.

Kiel monitori VFS per eBPF kaj bcc-iloj

La plej facila maniero kompreni kiel la kerno funkcias en dosieroj sysfs estas vidi ĝin praktike, kaj la plej facila maniero rigardi ARM64 estas uzi eBPF. eBPF (mallongigo de Berkeley Packet Filter) konsistas el virtuala maŝino funkcianta kerno, kiun privilegiitaj uzantoj povas peti (query) de la komandlinio. La kernofontoj rakontas al la leganto kion la kerno povas fari; ruli la eBPF-iloj sur ŝarĝita sistemo montras kion la kerno efektive faras.

Virtualaj dosiersistemoj en Linukso: kial ili estas bezonataj kaj kiel ili funkcias? Parto 2

Feliĉe, komenci uzi eBPF estas sufiĉe facila kun la helpo de iloj BCC, kiuj estas haveblaj kiel pakaĵoj de la ĝenerala distribuo linux kaj dokumentita detale Bernard Gregg. Iloj bcc estas Python-skriptoj kun malgrandaj enmetoj de C-kodo, kio signifas, ke iu ajn konata kun ambaŭ lingvoj povas facile modifi ilin. EN bcc/tools Estas 80 Python-skriptoj, kio signifas, ke plej verŝajne programisto aŭ sistemadministranto povos elekti ion taŭgan por solvi la problemon.
Por havi almenaŭ supraĵan ideon pri kia laboro VFS-oj faras sur funkcianta sistemo, provu vfscountvfsstat. Ĉi tio montros, ni diru, ke dekoj da vokoj vfs_open() kaj "liaj amikoj" okazas laŭvorte ĉiun sekundon.

Virtualaj dosiersistemoj en Linukso: kial ili estas bezonataj kaj kiel ili funkcias? Parto 2

vfsstat.py estas Python-skripto kun C-kodaj enigaĵoj, kiu simple kalkulas VFS-funkcivokojn.

Ni donu pli bagatelan ekzemplon kaj vidu, kio okazas kiam ni enmetas USB-memorilon en komputilon kaj la sistemo detektas ĝin.

Virtualaj dosiersistemoj en Linukso: kial ili estas bezonataj kaj kiel ili funkcias? Parto 2

Uzante eBPF vi povas vidi kio okazas en /syskiam USB-memordisko estas enmetita. Simpla kaj kompleksa ekzemplo estas montrita ĉi tie.

En la ekzemplo montrita supre, bcc ilo spuro.py presas mesaĝon kiam la komando estas rulita sysfs_create_files(). Ni vidas tion sysfs_create_files() estis lanĉita uzante kworker stream responde al la fakto, ke la poŝmemoro estis enmetita, sed kia dosiero estis kreita? La dua ekzemplo montras la potencon de eBPF. Jen trace.py Presas kernan malantaŭan spuron (-K opcio) kaj la nomon de la dosiero kreita sysfs_create_files(). Ununura deklaro-enmeto estas C-kodo, kiu inkluzivas facile rekoneblan formatan ĉenon provizitan de la Python-skripto, kiu funkcias LLVM. ĝustatempa kompililo. Ĝi kompilas ĉi tiun linion kaj plenumas ĝin en virtuala maŝino ene de la kerno. Plena funkcio subskribo sysfs_create_files () devas esti reproduktita en la dua komando por ke la formatĉeno povas rilati al unu el la parametroj. Eraroj en ĉi tiu peco de C-kodo rezultigas rekoneblajn erarojn de la C-kompilo. Ekzemple, se la parametro -l estas ellasita, vi vidos "Malsukcesis kompili BPF-tekston." Programistoj, kiuj konas C kaj Python, trovos la ilojn bcc facile vastigi kaj ŝanĝi.

Kiam la USB-disko estas enigita, la kerna malantaŭa spuro montros, ke PID 7711 estas fadeno kworkerkiu kreis la dosieron «events» в sysfs. Sekve, la voko de sysfs_remove_files() montros ke forigo de la disko rezultigis la dosieron esti forigita events, kiu respondas al la ĝenerala koncepto de referenckalkulado. Samtempe, vidado sysfs_create_link () kun eBPF dum enmetado de la USB-disko montros, ke almenaŭ 48 simbolaj ligiloj estis kreitaj.

Do kio estas la signifo de la evento dosiero? Uzado cscope Por serĉo __device_add_disk(), montras kion ĝi kaŭzas disk_add_events (), kaj ĉu "media_change""eject_request" povas esti registrita en okazaĵdosiero. Ĉi tie la kernbloka tavolo informas uzantspacon ke "disko" aperis kaj elĵetis. Rimarku kiom informa ĉi tiu esplormetodo estas enmetante USB-diskon, kompare kun provi eltrovi kiel aferoj funkcias nur de la fonto.

Nurlegeblaj radikaj dosiersistemoj ebligas enigitajn aparatojn

Kompreneble, neniu malŝaltas la servilon aŭ sian komputilon tirante la ŝtopilon el la ingo. Sed kial? Ĉi tio estas ĉar muntitaj dosiersistemoj sur fizikaj stokaj aparatoj eble prokrastis skribojn, kaj la datumstrukturoj kiuj registras sian staton eble ne estas sinkronigitaj kun skribaĵoj al la stokado. Kiam ĉi tio okazas, sistemposedantoj devas atendi ĝis la sekva ekkuro por lanĉi la ilon. fsck filesystem-recovery kaj, en la plej malbona kazo, perdi datumojn.

Tamen ni ĉiuj scias, ke multaj IoT-aparatoj, same kiel enkursigiloj, termostatoj kaj aŭtoj, nun funkcias Linukso. Multaj el ĉi tiuj aparatoj havas malmulte aŭ neniun uzantinterfacon, kaj ne ekzistas maniero malŝalti ilin "pure". Imagu starti aŭton kun malfunkcia baterio kiam la potenco al la kontrolunuo estas linux konstante saltante supren kaj malsupren. Kiel estas, ke la sistemo ekfunkciigas sen longe fsckkiam la motoro finfine ekfunkcias? Kaj la respondo estas simpla. Enkonstruitaj aparatoj dependas de la radika dosiersistemo nur por legado (mallongigita ro-rootfs (nurlegebla radika dosiersistemo)).

ro-rootfs proponi multajn avantaĝojn, kiuj estas malpli evidentaj ol aŭtentikeco. Unu avantaĝo estas, ke malware ne povas skribi al /usr/lib, se neniu Linuksa procezo povas skribi tie. Alia estas ke plejparte neŝanĝebla dosiersistemo estas kritika por kampsubteno de malproksimaj aparatoj, ĉar helppersonaro fidas je lokaj sistemoj kiuj estas nominale identaj al la kamposistemoj. Eble la plej grava (sed ankaŭ plej insida) avantaĝo estas, ke ro-rootfs devigas programistojn decidi kiuj sistemaj objektoj estos neŝanĝeblaj en la dezajnstadio de la sistemo. Labori kun ro-rootfs povas esti mallerta kaj dolora, ĉar konst-variabloj ofte estas en programlingvoj, sed iliaj avantaĝoj facile pravigas la aldonan ŝarĝon.

kreaĵo rootfs Nurlegebla postulas iom da ekstra peno por enigitaj programistoj, kaj ĉi tie aperas VFS. Linukso postulas, ke dosieroj estu ene /var estis skribeblaj, kaj krome, multaj popularaj aplikoj, kiuj kuras enigitajn sistemojn, provos krei agordon dot-files в $HOME. Unu solvo por agordaj dosieroj en la hejma dosierujo estas kutime antaŭgeneri kaj enkonstrui ilin rootfs. por /var Unu ebla aliro estas munti ĝin sur aparta skribebla subdisko, dum / muntita nurlegebla. Alia populara alternativo estas uzi bind aŭ superkovrajn montojn.

Ligeblaj kaj stapileblaj montoj, ilia uzo per ujoj

Komanda ekzekuto man mount estas la plej bona maniero lerni pri ligeblaj kaj supermeteblaj montoj, kiuj donas al programistoj kaj sistemadministrantoj la kapablon krei dosiersistemon en unu vojo kaj poste elmontri ĝin al aplikoj en alia. Por enigitaj sistemoj, tio signifas la kapablon konservi dosierojn /var sur nurlegebla poŝmemoro, sed superkovraĵo aŭ ligebla munta vojo de tmpfs в /var dum ŝarĝo, ĝi permesos al aplikaĵoj skribi notojn tie (scrawl). La venontan fojon vi ŝaltos la ŝanĝojn al /var estos perdita. Superkovra monto kreas kuniĝon inter tmpfs kaj la subesta dosiersistemo kaj permesas al vi fari ŝajnajn ŝanĝojn al ekzistantaj dosieroj en ro-tootf dum ligebla monto povas malplenigi novajn tmpfs dosierujoj videblaj kiel skribeblaj en ro-rootfs manieroj. Dum overlayfs ĉi tiu estas la ĝusta (proper) dosiersistemo tipo, ligebla monto estas efektivigita en VFS nomspaco.

Surbaze de la priskribo de la supermetaĵo kaj ligebla monto, neniu miras pri tio Linuksaj ujoj ili estas aktive uzataj. Ni vidu, kio okazas kiam ni uzas systemd-nspawn ruli la ujon uzante la ilon mountsnoop el bcc.

Defio system-nspawn startas la ujon dum kurado mountsnoop.py.

Ni vidu kio okazis:

Lanĉu mountsnoop dum la ujo "ŝargas" montras ke la rultempo de la ujo estas tre dependa de la monto ligita (Nur la komenco de la longa eligo estas montrita).

estas systemd-nspawn provizas elektitajn dosierojn en procfs и sysfs gastiganto al ujo kiel vojoj al ĝi rootfs... Cetere MS_BIND flago kiu starigas la devigan monton, iuj aliaj flagoj sur la monto difinas la rilaton inter ŝanĝoj al la gastiganto kaj ujo nomspacoj. Ekzemple, ligita monto povas aŭ preterlasi ŝanĝojn al /proc и /sys en la ujon, aŭ kaŝi ilin depende de la voko.

konkludo

Kompreni la internan funkciadon de Linukso povas ŝajni neebla tasko, ĉar la kerno mem enhavas grandegan kvanton da kodo, forlasante Linuksan uzantspacan aplikaĵojn kaj sistemajn vokajn interfacojn en C-bibliotekoj kiel ekzemple. glibc. Unu maniero fari progreson estas legi la fontkodon de unu kernsubsistemo, kun emfazo sur komprenado de sistemvokoj kaj uzantspacaj kaplinioj, same kiel la ĉefaj internaj kerninterfacoj, kiel ekzemple tabelo. file_operations. Dosieraj operacioj provizas la principon "ĉio estas dosiero", igante ilin aparte agrablaj administreblaj. C-kernaj fontdosieroj en la supranivela dosierujo fs/ prezentu efektivigon de virtualaj dosiersistemoj, kiuj estas envolvaĵtavolo kiu disponigas larĝan kaj relative simplan kongruecon inter popularaj dosiersistemoj kaj stokaj aparatoj. Ligi kaj superkovri muntadon per Linuksaj nomspacoj estas la magio de VFS, kiu ebligas krei nurlegeblajn ujojn kaj radikajn dosiersistemojn. Kombinite kun ekzameno de la fontkodo, la kerna ilo eBPF kaj ĝia interfaco bcc
farante kerna esplorado pli facila ol iam ajn.

Amikoj, skribu, ĉu ĉi tiu artikolo estis utila al vi? Eble vi havas komentojn aŭ rimarkojn? Kaj tiuj, kiuj interesiĝas pri la kurso pri Linukso-Administranto, estas invitataj Malferma Tago, kiu okazos la 18-an de aprilo.

Unua parto.

fonto: www.habr.com

Aldoni komenton