Labdien, mÄs ar jums dalÄmies ar publikÄcijas otro daļu āVirtuÄlÄs failu sistÄmas operÄtÄjsistÄmÄ Linux: kÄpÄc tÄs ir vajadzÄ«gas un kÄ tÄs darbojas?ā JÅ«s varat izlasÄ«t pirmo daļu
KÄ pÄrraudzÄ«t VFS, izmantojot eBPF un Bcc rÄ«kus
VienkÄrÅ”Äkais veids, kÄ saprast, kÄ kodols darbojas ar failiem sysfs
ir redzÄt to praksÄ, un vienkÄrÅ”Äkais veids, kÄ skatÄ«ties ARM64, ir izmantot eBPF. eBPF (saÄ«sinÄjums no Berkeley pakeÅ”u filtra) sastÄv no virtuÄlÄs maŔīnas, kurÄ darbojas query
) no komandrindas. Kodola avoti stÄsta lasÄ«tÄjam, ko kodols var darÄ«t; eBPF rÄ«ku palaiÅ”ana ielÄdÄtÄ sistÄmÄ parÄda, ko kodols patiesÄ«bÄ dara.
Par laimi, ar rÄ«ku palÄ«dzÄ«bu sÄkt lietot eBPF ir diezgan vienkÄrÅ”i bcc
ir Python skripti ar nelieliem C koda ievietojumiem, kas nozÄ«mÄ, ka ikviens, kurÅ” pÄrzina abas valodas, var tos viegli modificÄt. IN bcc/tools
Ir 80 Python skripti, kas nozÄ«mÄ, ka, visticamÄk, izstrÄdÄtÄjs vai sistÄmas administrators varÄs izvÄlÄties kaut ko piemÄrotu problÄmas risinÄÅ”anai.
Lai iegÅ«tu vismaz virspusÄju priekÅ”statu par to, kÄdu darbu VFS veic darbojoÅ”Ä sistÄmÄ, izmÄÄ£iniet vfscount
vai vfsstat
. Tas parÄdÄ«s, teiksim, ka desmitiem zvanu vfs_open()
un "viÅa draugi" notiek burtiski katru sekundi.
vfsstat.py
ir Python skripts ar C koda ievietojumiem, kas vienkÄrÅ”i uzskaita VFS funkciju zvanus.
Sniegsim triviÄlÄku piemÄru un paskatÄ«simies, kas notiek, kad datorÄ ievietojam USB zibatmiÅu un sistÄma to konstatÄ.
Izmantojot eBPF, jÅ«s varat redzÄt, kas notiek
/sys
kad ir ievietots USB zibatmiÅas disks. Å eit ir parÄdÄ«ts vienkÄrÅ”s un sarežģīts piemÄrs.
IepriekÅ” parÄdÄ«tajÄ piemÄrÄ bcc
instruments sysfs_create_files()
. MÄs to redzam sysfs_create_files()
tika palaists, izmantojot kworker
straume, reaÄ£Äjot uz to, ka tika ievietots zibatmiÅas disks, bet kÄds fails tika izveidots? Otrais piemÄrs parÄda eBPF jaudu. Å eit trace.py
IzdrukÄ kodola izsekoÅ”anu (-K opcija) un izveidotÄ faila nosaukumu sysfs_create_files()
. Viena priekÅ”raksta ievietoÅ”ana ir C kods, kas ietver viegli atpazÄ«stamu formÄta virkni, ko nodroÅ”ina Python skripts, kas palaiž LLVM tieÅ”i laikÄ kompilators. Tas apkopo Å”o rindiÅu un izpilda to virtuÄlajÄ maŔīnÄ kodola iekÅ”pusÄ. Pilnas funkcijas paraksts sysfs_create_files ()
ir jÄatveido otrajÄ komandÄ, lai formÄta virkne varÄtu atsaukties uz kÄdu no parametriem. Kļūdas Å”ajÄ C koda daÄ¼Ä rada atpazÄ«stamas kļūdas no C kompilatora. PiemÄram, ja parametrs -l ir izlaists, jÅ«s redzÄsit "NeizdevÄs apkopot BPF tekstu". IzstrÄdÄtÄji, kuri pÄrzina C un Python, atradÄ«s rÄ«kus bcc
viegli paplaÅ”inÄt un mainÄ«t.
Kad USB diskdzinis ir ievietots, kodola aizmugures izsekoÅ”ana parÄdÄ«s, ka PID 7711 ir pavediens kworker
kas izveidoja failu Ā«eventsĀ»
Š² sysfs
. Attiecīgi zvans no sysfs_remove_files()
parÄdÄ«s, ka diska noÅemÅ”anas rezultÄtÄ fails tika izdzÄsts events
, kas atbilst vispÄrÄjam atsauces skaitÄ«Å”anas jÄdzienam. TajÄ paÅ”Ä laikÄ skatÄ«Å”anÄs sysfs_create_link ()
ar eBPF, ievietojot USB disku, parÄdÄ«s, ka ir izveidotas vismaz 48 simboliskas saites.
TÄtad, kÄda jÄga ir notikumu failam? LietoÅ”ana disk_add_events ()
, un vai nu "media_change"
Vai "eject_request"
var ierakstÄ«t notikumu failÄ. Å eit kodola bloka slÄnis informÄ lietotÄja telpu, ka ir parÄdÄ«jies un izstumts "disks". Å
emiet vÄrÄ, cik informatÄ«va ir Ŕī izpÄtes metode, ievietojot USB disku, salÄ«dzinot ar mÄÄ£inÄjumu noskaidrot, kÄ lietas darbojas tikai no avota.
Tikai lasÄmas saknes failu sistÄmas nodroÅ”ina iegultÄs ierÄ«ces
Protams, neviens neizslÄdz serveri vai datoru, izraujot kontaktdakÅ”u no rozetes. Bet kÄpÄc? Tas ir tÄpÄc, ka uzstÄdÄ«tajÄs failu sistÄmÄs fiziskajÄs atmiÅas ierÄ«cÄs ierakstÄ«Å”ana var bÅ«t aizkavÄjusies, un datu struktÅ«ras, kas reÄ£istrÄ to stÄvokli, var nebÅ«t sinhronizÄtas ar ierakstiem atmiÅÄ. Kad tas notiek, sistÄmas Ä«paÅ”niekiem ir jÄgaida lÄ«dz nÄkamajai sÄknÄÅ”anai, lai palaistu utilÄ«tu. fsck filesystem-recovery
un sliktÄkajÄ gadÄ«jumÄ datu zaudÄÅ”ana.
TomÄr mÄs visi zinÄm, ka daudzas IoT ierÄ«ces, kÄ arÄ« marÅ”rutÄtÄji, termostati un automaŔīnas tagad darbojas ar Linux. DaudzÄm no Ŕīm ierÄ«cÄm ir maz vai nav lietotÄja interfeisa, un nav iespÄjas tÄs izslÄgt "tÄ«ri". IedomÄjieties, ka iedarbiniet automaŔīnu ar izlÄdÄjuÅ”os akumulatoru, kad vadÄ«bas blokam ir pieslÄgta jauda fsck
kad beidzot motors sÄk darboties? Un atbilde ir vienkÄrÅ”a. IegultÄs ierÄ«ces balstÄs uz saknes failu sistÄmu ro-rootfs
(tikai lasÄma saknes failu sistÄma)).
ro-rootfs
piedÄvÄ daudzas priekÅ”rocÄ«bas, kas ir mazÄk acÄ«mredzamas nekÄ autentiskums. Viena priekÅ”rocÄ«ba ir tÄ, ka ļaunprÄtÄ«ga programmatÅ«ra nevar rakstÄ«t uz /usr
vai /lib
, ja tur nevar ierakstÄ«t neviens Linux process. VÄl viens ir tas, ka lielÄ mÄrÄ nemainÄ«ga failu sistÄma ir bÅ«tiska attÄlo ierÄ«Äu atbalstam uz vietas, jo atbalsta personÄls paļaujas uz vietÄjÄm sistÄmÄm, kas ir nominÄli identiskas lauka sistÄmÄm. IespÄjams, vissvarÄ«gÄkais (bet arÄ« mÄnÄ«gÄkais) ieguvums ir tas, ka ro-rootfs liek izstrÄdÄtÄjiem izlemt, kuri sistÄmas objekti bÅ«s nemainÄ«gi sistÄmas projektÄÅ”anas stadijÄ. Darbs ar ro-rootf var bÅ«t neÄrts un sÄpÄ«gs, jo const mainÄ«gie bieži ir programmÄÅ”anas valodÄs, taÄu to priekÅ”rocÄ«bas viegli attaisno papildu izmaksas.
radīŔana rootfs
Tikai lasÄ«Å”anas režīmÄ iegultiem izstrÄdÄtÄjiem ir jÄpieliek papildu pÅ«les, un Å”eit parÄdÄs VFS. Linux pieprasa, lai faili bÅ«tu iekÅ”Ä /var
bija rakstÄmas, un turklÄt daudzas populÄras lietojumprogrammas, kurÄs darbojas iegultÄs sistÄmas, mÄÄ£inÄs izveidot konfigurÄciju dot-files
Š² $HOME
. Viens no risinÄjumiem konfigurÄcijas failiem mÄjas direktorijÄ parasti ir to iepriekÅ”Äja Ä£enerÄÅ”ana un ievietoÅ”ana rootfs
. Par /var
Viena no iespÄjÄm ir uzstÄdÄ«t to atseviÅ”Ä·Ä rakstÄmÄ nodalÄ«jumÄ, kamÄr /
uzstÄdÄ«ts tikai lasÄms. VÄl viena populÄra alternatÄ«va ir iesieÅ”anas vai pÄrklÄjuma stiprinÄjumu izmantoÅ”ana.
Savienojami un sakraujami stiprinÄjumi, to izmantoÅ”ana konteineros
Komandas izpilde man mount
ir labÄkais veids, kÄ uzzinÄt par saistoÅ”iem un pÄrklÄjamiem stiprinÄjumiem, kas izstrÄdÄtÄjiem un sistÄmas administratoriem sniedz iespÄju izveidot failu sistÄmu vienÄ ceÄ¼Ä un pÄc tam pakļaut to lietojumprogrammÄm citÄ. IegultajÄm sistÄmÄm tas nozÄ«mÄ iespÄju saglabÄt failus /var
tikai lasÄmÄ zibatmiÅas diskÄ, bet pÄrklÄjums vai savienojams montÄžas ceļŔ no tmpfs
Š² /var
ielÄdÄjot, tas ļaus aplikÄcijÄm tur rakstÄ«t piezÄ«mes (scrawl). NÄkamajÄ reizÄ, kad ieslÄgsit izmaiÅas uz /var
tiks zaudÄts. PÄrklÄjuma stiprinÄjums rada savienÄ«bu starp tmpfs
un pamatÄ esoÅ”o failu sistÄmu un ļauj veikt Ŕķietamas izmaiÅas esoÅ”ajos failos ro-tootf
tÄ kÄ iesieÅ”anas stiprinÄjums var padarÄ«t jaunus tukÅ”us tmpfs
mapes, kas redzamas kÄ ierakstÄmas ro-rootfs
veidus. KamÄr overlayfs
Ŕis ir īstais (proper
) failu sistÄmas tips, ir ieviests saistoÅ”s stiprinÄjums
Pamatojoties uz pÄrklÄjuma un savienojamÄ stiprinÄjuma aprakstu, neviens par to nav pÄrsteigts mountsnoop
no bcc
.
Zvans system-nspawn
palaiž konteineru darbÄ«bas laikÄ mountsnoop.py
.
Apskatīsim, kas notika:
ŠŠ°ŠæŃŃŠŗ mountsnoop
kamÄr konteiners tiek "sÄknÄts", parÄda, ka konteinera izpildlaiks ir ļoti atkarÄ«gs no savienotÄ stiprinÄjuma (tiek rÄdÄ«ts tikai garÄs izvades sÄkums).
Å eit systemd-nspawn
nodroŔina atlasītos failus procfs
Šø sysfs
resursdatora uz konteineru kÄ ceļus uz to rootfs
. IzÅemot MS_BIND
karodziÅu, kas iestata saistoÅ”o stiprinÄjumu, daži citi stiprinÄjuma karodziÅi definÄ attiecÄ«bas starp izmaiÅÄm resursdatora un konteinera nosaukumvietÄs. PiemÄram, saistÄ«tais stiprinÄjums var izlaist izmaiÅas uz /proc
Šø /sys
konteinerÄ vai paslÄpiet tos atkarÄ«bÄ no izsaukuma.
SecinÄjums
Linux iekÅ”ÄjÄs darbÄ«bas izpratne var Ŕķist neiespÄjams uzdevums, jo pats kodols satur milzÄ«gu daudzumu koda, atstÄjot malÄ Linux lietotÄja telpas lietojumprogrammas un sistÄmas zvanu saskarnes C bibliotÄkÄs, piemÄram, glibc
. Viens no veidiem, kÄ panÄkt progresu, ir lasÄ«t vienas kodola apakÅ”sistÄmas avota kodu, liekot uzsvaru uz sistÄmas izsaukumu un lietotÄja telpas galveÅu izpratni, kÄ arÄ« uz galvenajÄm iekÅ”ÄjÄm kodola saskarnÄm, piemÄram, tabulu. file_operations
. Failu darbÄ«bas nodroÅ”ina principu "viss ir fails", padarot to pÄrvaldÄ«bu Ä«paÅ”i patÄ«kamu. C kodola avota faili augstÄkÄ lÄ«meÅa direktorijÄ fs/
piedÄvÄ virtuÄlo failu sistÄmu ievieÅ”anu, kas ir iesaiÅojuma slÄnis, kas nodroÅ”ina plaÅ”u un salÄ«dzinoÅ”i vienkÄrÅ”u saderÄ«bu starp populÄrÄm failu sistÄmÄm un atmiÅas ierÄ«cÄm. SaistÄ«Å”ana un pÄrklÄjuma montÄža, izmantojot Linux nosaukumvietas, ir VFS burvÄ«ba, kas ļauj izveidot tikai lasÄmus konteinerus un saknes failu sistÄmas. ApvienojumÄ ar pirmkoda, eBPF pamata rÄ«ka un tÄ saskarnes pÄrbaudi bcc
padarot galveno izpÄti vieglÄku nekÄ jebkad agrÄk.
Draugi, rakstiet, vai Å”is raksts jums bija noderÄ«gs? VarbÅ«t jums ir kÄdi komentÄri vai piezÄ«mes? Un tie, kurus interesÄ Linux administratora kurss, tiek aicinÄti uz
Avots: www.habr.com