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
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 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.
Feliĉe, komenci uzi eBPF estas sufiĉe facila kun la helpo de 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 vfscount
aŭ vfsstat
. Ĉi tio montros, ni diru, ke dekoj da vokoj vfs_open()
kaj "liaj amikoj" okazas laŭvorte ĉiun sekundon.
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.
Uzante eBPF vi povas vidi kio okazas en
/sys
kiam USB-memordisko estas enmetita. Simpla kaj kompleksa ekzemplo estas montrita ĉi tie.
En la ekzemplo montrita supre, bcc
ilo 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 kworker
kiu 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 disk_add_events ()
, kaj ĉu "media_change"
aŭ "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 fsck
kiam la motoro finfine ekfunkcias? Kaj la respondo estas simpla. Enkonstruitaj aparatoj dependas de la radika dosiersistemo 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
aŭ /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
Surbaze de la priskribo de la supermetaĵo kaj ligebla monto, neniu miras pri tio 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
fonto: www.habr.com