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į
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 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.
Laimei, pradėti naudoti eBPF yra gana paprasta naudojant įrankius 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ę.
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.
Naudodami eBPF galite pamatyti, kas vyksta
/sys
kai įdėta USB atmintinė. Čia parodytas paprastas ir sudėtingas pavyzdys.
Aukščiau pateiktame pavyzdyje bcc
įrankis 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 kworker
kuri 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 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 fsck
kada pagaliau pradės veikti variklis? Ir atsakymas paprastas. Įterptieji įrenginiai priklauso nuo šakninės failų sistemos 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
Remiantis perdangos ir susiejamo laikiklio aprašymu, niekas tuo nestebina 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 į
Šaltinis: www.habr.com