Virtualios failų sistemos Linux sistemoje: kodėl jos reikalingos ir kaip jos veikia? 2 dalis

Sveiki visi, dalinamės su jumis antra leidinio „Virtualios failų sistemos Linux sistemoje: kam jos reikalingos ir kaip jos veikia“ dalimi? Galite perskaityti pirmąją dalį čia. Priminsime, kad ši publikacijų serija sutampa su naujo kurso srauto paleidimu "Linux administratorius", kuris prasideda labai greitai.

Kaip stebėti VFS naudojant eBPF ir bcc įrankius

Lengviausias būdas suprasti, kaip branduolys veikia su failais sysfs yra tai pamatyti praktiškai, o lengviausias būdas žiūrėti ARM64 yra naudoti eBPF. eBPF (sutrumpinimas iš Berkeley Packet Filter) susideda iš veikiančios virtualios mašinos šerdis, kurios privilegijuotieji vartotojai gali paprašyti (query) iš komandinės eilutės. Branduolio šaltiniai praneša skaitytojui, ką branduolys gali padaryti; eBPF įrankių paleidimas įkeltoje sistemoje parodo, ką iš tikrųjų daro branduolys.

Virtualios failų sistemos Linux sistemoje: kodėl jos reikalingos ir kaip jos veikia? 2 dalis

Laimei, pradėti naudoti eBPF yra gana paprasta naudojant įrankius nematoma kopija, kuriuos galima įsigyti kaip paketus iš bendrojo platinimo Linux ir išsamiai dokumentuota Bernardas Gregas. Įrankiai bcc yra Python scenarijai su mažais C kodo įterpimais, o tai reiškia, kad kiekvienas, susipažinęs su abiem kalbomis, gali lengvai juos modifikuoti. IN bcc/tools Yra 80 Python scenarijų, o tai reiškia, kad greičiausiai kūrėjas ar sistemos administratorius galės pasirinkti kažką tinkamo problemos sprendimui.
Norėdami gauti bent paviršutinišką supratimą apie tai, ką VFS atlieka veikiančioje sistemoje, pabandykite vfscount arba vfsstat. Tai parodys, tarkime, dešimtis skambučių vfs_open() o „jo draugai“ atsitinka tiesiogine prasme kas sekundę.

Virtualios failų sistemos Linux sistemoje: kodėl jos reikalingos ir kaip jos veikia? 2 dalis

vfsstat.py yra Python scenarijus su C kodo įterpimais, kuris tiesiog skaičiuoja VFS funkcijų iškvietimus.

Pateikiame banalesnį pavyzdį ir pažiūrėkime, kas nutinka, kai į kompiuterį įdedame USB atmintinę ir sistema ją aptinka.

Virtualios failų sistemos Linux sistemoje: kodėl jos reikalingos ir kaip jos veikia? 2 dalis

Naudodami eBPF galite pamatyti, kas vyksta /syskai įdėta USB atmintinė. Čia parodytas paprastas ir sudėtingas pavyzdys.

Aukščiau pateiktame pavyzdyje bcc įrankis trace.py spausdina pranešimą, kai vykdoma komanda sysfs_create_files(). Mes tai matome sysfs_create_files() buvo paleistas naudojant kworker srautas reaguojant į tai, kad „flash drive“ buvo įdėta, bet koks failas buvo sukurtas? Antrasis pavyzdys rodo eBPF galią. Čia trace.py Spausdina branduolio atgalinį sekimą (-K parinktis) ir sukurto failo pavadinimą sysfs_create_files(). Vieno sakinio įterpimas yra C kodas, apimantis lengvai atpažįstamą formato eilutę, kurią teikia Python scenarijus, paleidžiantis LLVM tik laiku kompiliatorius. Jis sukompiliuoja šią eilutę ir vykdo ją branduolio viduje esančioje virtualioje mašinoje. Visas funkcijos parašas sysfs_create_files () turi būti atkurtas antroje komandoje, kad formato eilutė galėtų nurodyti vieną iš parametrų. Klaidos šioje C kodo dalyje sukelia atpažįstamas C kompiliatoriaus klaidas. Pavyzdžiui, jei parametras -l praleistas, pamatysite "Nepavyko sudaryti BPF teksto". Kūrėjai, kurie yra susipažinę su C ir Python, ras įrankius bcc lengva plėsti ir keisti.

Įdėjus USB atmintinę, branduolio atgalinis pėdsakas parodys, kad PID 7711 yra gija kworkerkuri sukūrė failą «events» в sysfs. Atitinkamai skambutis iš sysfs_remove_files() parodys, kad pašalinus diską failas buvo ištrintas events, kuris atitinka bendrą atskaitos skaičiavimo sampratą. Tuo pačiu ir žiūrėjimas sysfs_create_link () su eBPF įdėjus USB diską parodys, kad buvo sukurtos mažiausiai 48 simbolinės nuorodos.

Taigi kokia įvykių bylos prasmė? Naudojimas cscope Dėl paieškos __device_add_disk(), parodo, ką tai sukelia disk_add_events (), ir arba "media_change"Arba "eject_request" galima įrašyti į įvykio failą. Čia branduolio bloko sluoksnis informuoja vartotojo erdvę, kad atsirado ir buvo išstumtas „diskas“. Atkreipkite dėmesį, koks informatyvus yra šis tyrimo metodas įdėjus USB diską, palyginti su bandymu išsiaiškinti, kaip viskas veikia tik iš šaltinio.

Tik skaitomos šakninių failų sistemos įgalina įterptuosius įrenginius

Žinoma, serverio ar savo kompiuterio niekas neišjungia ištraukęs kištuką iš lizdo. Bet kodėl? Taip yra todėl, kad prijungtose failų sistemose fiziniuose saugojimo įrenginiuose įrašymas gali vėluoti, o duomenų struktūros, įrašančios jų būseną, gali būti nesinchronizuojamos su įrašais į saugyklą. Kai tai atsitiks, sistemos savininkai turi palaukti, kol bus paleistas kitas įrankis. fsck filesystem-recovery o blogiausiu atveju – duomenų praradimas.

Tačiau visi žinome, kad daugelis daiktų interneto įrenginių, taip pat maršrutizatoriai, termostatai ir automobiliai dabar veikia „Linux“. Daugelis šių įrenginių turi mažai arba visai neturi vartotojo sąsajos ir nėra galimybės jų „švariai“ išjungti. Įsivaizduokite, kad užveskite automobilį su išsikrovusiu akumuliatoriumi, kai valdymo bloko maitinimas yra įjungtas Linux nuolat šokinėja aukštyn ir žemyn. Kaip yra, kad sistema paleidžiama be ilgo fsckkada pagaliau pradės veikti variklis? Ir atsakymas paprastas. Įterptieji įrenginiai priklauso nuo šakninės failų sistemos tik skaitymui (sutrumpinta ro-rootfs (tik skaitoma šakninė failų sistema)).

ro-rootfs siūlo daug privalumų, kurie yra mažiau akivaizdūs nei autentiškumas. Vienas privalumas yra tai, kad kenkėjiška programa negali rašyti /usr arba /lib, jei joks Linux procesas negali ten įrašyti. Kitas dalykas yra tai, kad iš esmės nekintanti failų sistema yra labai svarbi nuotolinių įrenginių lauko palaikymui, nes pagalbinis personalas remiasi vietinėmis sistemomis, kurios nominaliai yra identiškos lauko sistemoms. Bene svarbiausia (bet ir klastingiausia) nauda yra ta, kad ro-rootfs verčia kūrėjus nuspręsti, kurie sistemos objektai bus nepakeičiami sistemos projektavimo etape. Darbas su ro-rootf gali būti nepatogus ir skausmingas, nes const kintamieji dažnai yra programavimo kalbose, tačiau jų privalumai lengvai pateisina papildomas išlaidas.

kūrimas rootfs Tik skaitymui reikia tam tikrų papildomų pastangų įterptiesiems kūrėjams, todėl čia atsiranda VFS. „Linux“ reikalauja, kad failai būtų įvesti /var buvo galima rašyti, be to, daugelis populiarių programų, kuriose veikia įterptosios sistemos, bandys sukurti konfigūraciją dot-files в $HOME. Vienas iš konfigūracijos failų namų kataloge sprendimų paprastai yra iš anksto juos sugeneruoti ir įterpti rootfs. Už /var Vienas iš galimų būdų yra prijungti jį prie atskiro įrašymo skaidinio, o / montuojamas tik skaitomas. Kita populiari alternatyva yra naudoti surišamus arba perdengiančius laikiklius.

Sujungiami ir sukraunami laikikliai, jų naudojimas konteineriuose

Komandos vykdymas man mount yra geriausias būdas sužinoti apie surišamus ir perdengiamus tvirtinimo elementus, kurie suteikia kūrėjams ir sistemos administratoriams galimybę sukurti failų sistemą viename kelyje ir tada atskleisti ją programoms kitame. Įterptųjų sistemų atveju tai reiškia galimybę saugoti failus /var tik skaitomame „flash“ diske, bet perdangoje arba susietame montavimo kelyje iš tmpfs в /var kraunant leis programoms ten rašyti pastabas (scrawl). Kai kitą kartą įjungsite pakeitimus į /var bus prarasta. Perdangos laikiklis sukuria sąjungą tarp tmpfs ir pagrindinėje failų sistemoje ir leidžia atlikti tariamus esamų failų pakeitimus ro-tootf o surišamas laikiklis gali ištuštinti naujus tmpfs aplankai, matomi kaip įrašomi ro-rootfs būdai. Nors overlayfs tai yra teisingas (proper) failų sistemos tipas, įdiegtas privalomas prijungimas VFS vardų erdvė.

Remiantis perdangos ir susiejamo laikiklio aprašymu, niekas tuo nestebina Linux konteineriai jie aktyviai naudojami. Pažiūrėkime, kas atsitiks, kai naudosime systemd-nspawn norėdami paleisti konteinerį naudodami įrankį mountsnoop nuo bcc.

Вызов system-nspawn paleidžia konteinerį veikiant mountsnoop.py.

Pažiūrėkime, kas atsitiko:

Paleidimas mountsnoop kol konteineris „paleidžiamas“, rodo, kad konteinerio vykdymo laikas labai priklauso nuo susieto laikiklio (rodoma tik ilgos išvesties pradžia).

Čia systemd-nspawn pateikia pasirinktus failus procfs и sysfs prieglobos į konteinerį kaip keliai į jį rootfs. Išskyrus MS_BIND vėliavėlė, kuri nustato susiejimo prijungimą, kai kurios kitos laikiklio vėliavėlės apibrėžia pagrindinio kompiuterio ir konteinerio vardų erdvių pakeitimų ryšį. Pavyzdžiui, susietas tvirtinimas gali praleisti pakeitimus /proc и /sys į konteinerį arba paslėpti juos priklausomai nuo skambučio.

išvada

Suprasti vidinį „Linux“ veikimą gali atrodyti neįmanoma užduotis, nes pačiame branduolyje yra didžiulis kiekis kodo, paliekant nuošalyje „Linux“ vartotojo erdvės programas ir sistemos skambučių sąsajas C bibliotekose, pvz. glibc. Vienas iš būdų padaryti pažangą yra perskaityti vieno branduolio posistemio šaltinio kodą, pabrėžiant sistemos iškvietimų ir vartotojo erdvės antraščių supratimą, taip pat pagrindines vidines branduolio sąsajas, pvz., lentelę. file_operations. Failų operacijos suteikia principą „viskas yra failas“, todėl jas ypač malonu valdyti. C branduolio šaltinio failai aukščiausio lygio kataloge fs/ Pateikiame virtualių failų sistemų diegimą, kurie yra įvyniojimo sluoksnis, užtikrinantis platų ir gana paprastą populiarių failų sistemų ir saugojimo įrenginių suderinamumą. Susiejimas ir perdangos montavimas naudojant „Linux“ vardų sritis yra VFS magija, leidžianti sukurti tik skaitomus konteinerius ir šaknines failų sistemas. Kartu su šaltinio kodo, eBPF pagrindinio įrankio ir jo sąsajos tyrimu bcc
todėl pagrindinių tyrinėjimų yra lengviau nei bet kada anksčiau.

Draugai, rašykite, ar šis straipsnis buvo jums naudingas? Gal turite kokių pastabų ar pastabų? O besidominčius Linux administratoriaus kursu kviečiame į Atvirų durų diena, kuris vyks balandžio 18 d.

Pirma dalis.

Šaltinis: www.habr.com

Добавить комментарий