Tere kõigile, jagame teiega väljaande "Virtuaalsed failisüsteemid Linuxis: miks neid vaja on ja kuidas need töötavad" teist osa. Saate lugeda esimest osa
Kuidas jälgida VFS-i eBPF-i ja bcc-tööriistade abil
Lihtsaim viis aru saada, kuidas kernel failidega töötab sysfs
on seda praktikas näha ja lihtsaim viis ARM64 vaatamiseks on kasutada eBPF-i. eBPF (lühend sõnadest Berkeley Packet Filter) koosneb sisse töötavast virtuaalmasinast query
) käsurealt. Kerneli allikad ütlevad lugejale, mida tuum suudab; eBPF-i tööriistade käivitamine laaditud süsteemis näitab, mida kernel tegelikult teeb.
Õnneks on eBPF-i kasutamise alustamine tööriistade abil üsna lihtne bcc
on Pythoni skriptid väikeste C-koodi sisestustega, mis tähendab, et igaüks, kes tunneb mõlemat keelt, saab neid hõlpsasti muuta. IN bcc/tools
Pythoni skripte on 80, mis tähendab, et suure tõenäosusega suudab arendaja või süsteemiadministraator valida probleemi lahendamiseks midagi sobivat.
Proovige, et saada vähemalt pealiskaudne ettekujutus sellest, mida VFS-id töötavad süsteemis teevad vfscount
või vfsstat
. See näitab, oletame, et kümneid kõnesid vfs_open()
ja "tema sõpru" juhtub sõna otseses mõttes iga sekund.
vfsstat.py
on Pythoni skript C-koodi lisadega, mis lihtsalt loeb VFS-i funktsioonikutsed.
Toome triviaalsema näite ja vaatame, mis juhtub, kui sisestame USB-mälupulga arvutisse ja süsteem selle tuvastab.
eBPF-i kasutades näete, mis toimub
/sys
kui USB-mälupulk on sisestatud. Siin on lihtne ja keeruline näide.
Ülaltoodud näites bcc
tööriist sysfs_create_files()
. Me näeme seda sysfs_create_files()
käivitati kasutades kworker
voog vastuseks tõsiasjale, et mälupulk sisestati, kuid milline fail loodi? Teine näide näitab eBPF-i võimsust. Siin trace.py
Prindib kerneli tagasijälje (-K) ja loodud faili nime sysfs_create_files()
. Ühe lause sisestamine on C-kood, mis sisaldab kergesti äratuntavat vormingustringi, mille pakub LLVM-i käivitav Pythoni skript just-in-time kompilaator. See kompileerib selle rea ja käivitab selle tuuma sees olevas virtuaalses masinas. Täisfunktsiooni allkiri sysfs_create_files ()
tuleb teises käsus reprodutseerida, et vormingustring saaks viidata ühele parameetritest. Vead selles C-kooditükis põhjustavad C-kompilaatoris äratuntavaid vigu. Näiteks kui parameeter -l on välja jäetud, näete teadet "BPF-teksti kompileerimine ebaõnnestus". Arendajad, kes tunnevad C ja Pythonit, leiavad tööriistad bcc
lihtne laiendada ja muuta.
Kui USB-draiv on sisestatud, näitab kerneli tagasijälg, et PID 7711 on lõime kworker
mis faili lõi «events»
в sysfs
. Vastavalt sellele helistati sysfs_remove_files()
näitab, et draivi eemaldamine tõi kaasa faili kustutamise events
, mis vastab viiteloenduse üldkontseptsioonile. Samal ajal vaatamine sysfs_create_link ()
eBPF-iga USB-draivi sisestamise ajal näitab, et on loodud vähemalt 48 sümboolset linki.
Mis on sündmuste faili mõte? Kasutamine disk_add_events ()
ja kas "media_change"
Või "eject_request"
saab salvestada sündmuse faili. Siin teavitab kerneli ploki kiht kasutajaruumi, et "ketas" on ilmunud ja väljutatud. Pange tähele, kui informatiivne on see uurimismeetod USB-draivi sisestamine, võrreldes sellega, kui proovite aru saada, kuidas asjad toimivad puhtalt allikast.
Kirjutuskaitstud juurfailisüsteemid võimaldavad manustatud seadmeid
Loomulikult ei lülita keegi serverit ega oma arvutit pistikupesast tõmmates välja. Aga miks? Selle põhjuseks on asjaolu, et füüsilistele salvestusseadmetele ühendatud failisüsteemidel võib kirjutus olla mahajäänud ja nende olekut salvestavad andmestruktuurid ei pruugi olla salvestusruumi kirjutamisega sünkroonitud. Kui see juhtub, peavad süsteemi omanikud utiliidi käivitamiseks ootama järgmise alglaadimiseni. fsck filesystem-recovery
ja halvimal juhul andmete kadu.
Kuid me kõik teame, et paljud IoT-seadmed, aga ka ruuterid, termostaadid ja autod töötavad nüüd Linuxiga. Paljudel neist seadmetest on kasutajaliides vähe või puudub üldse ning neid ei saa kuidagi "puhtalt" välja lülitada. Kujutage ette tühja akuga auto käivitamist, kui juhtseadme toide on katkenud fsck
millal mootor lõpuks tööle hakkab? Ja vastus on lihtne. Manustatud seadmed tuginevad juurfailisüsteemile ro-rootfs
(kirjutuskaitstud juurfailisüsteem)).
ro-rootfs
pakuvad palju eeliseid, mis on vähem ilmsed kui autentsus. Üks eelis on see, et pahavara ei saa sinna kirjutada /usr
või /lib
, kui ükski Linuxi protsess ei saa sinna kirjutada. Teine on see, et suures osas muutumatu failisüsteem on kaugseadmete välitoe jaoks kriitilise tähtsusega, kuna tugipersonal tugineb kohalikele süsteemidele, mis on nominaalselt identsed välisüsteemidega. Võib-olla kõige olulisem (kuid ka kõige salakavalam) eelis on see, et ro-rootfs sunnib arendajaid otsustama, millised süsteemiobjektid on süsteemi projekteerimisetapis muutumatud. Ro-rootfidega töötamine võib olla ebamugav ja valus, kuna const-muutujad on sageli programmeerimiskeeltes, kuid nende eelised õigustavad kergesti lisakulusid.
loomine rootfs
Kirjutuskaitstud režiim nõuab manustatud arendajatelt lisapingutusi ja siin tuleb pildile VFS. Linux nõuab, et failid oleksid sees /var
olid kirjutatavad ja lisaks proovivad paljud manustatud süsteeme käitavad populaarsed rakendused luua konfiguratsiooni dot-files
в $HOME
. Kodukataloogi konfiguratsioonifailide üks lahendus on tavaliselt nende eelgenereerimine ja sisseehitamine rootfs
. Jaoks /var
Üks võimalik viis on paigaldada see eraldi kirjutatavale partitsioonile, samas /
monteeritud kirjutuskaitstud. Teine populaarne alternatiiv on sidumis- või ülekattekinnituste kasutamine.
Ühendatavad ja virnastatavad alused, nende kasutamine konteinerites
Käsu täitmine man mount
on parim viis siduvate ja ülekattetavate kinnituste tundmaõppimiseks, mis annavad arendajatele ja süsteemiadministraatoritele võimaluse luua failisüsteem ühel teel ja seejärel avaldada see teise rakendustele. Manussüsteemide puhul tähendab see võimalust faile salvestada /var
kirjutuskaitstud välkmälupulgal, kuid ülekatte või linkitava paigaldustee kaudu tmpfs
в /var
laadimisel võimaldab see rakendustel sinna märkmeid kirjutada (scrawl). Järgmine kord, kui lülitate muudatused sisse /var
läheb kaduma. Ülekattekinnitus loob liidu tmpfs
ja selle aluseks olev failisüsteem ning võimaldab teil olemasolevates failides näiliselt muudatusi teha ro-tootf
samas kui sidutav kinnitus võib uued tühjaks teha tmpfs
kaustad, mis on nähtavad sissekirjutatavatena ro-rootfs
viise. Kuigi overlayfs
see on õige (proper
) failisüsteemi tüüp, millesse on rakendatud siduv ühendamine
Ülekatte ja ühendatava kinnituse kirjelduse põhjal ei imesta see keegi mountsnoop
pärit bcc
.
Väljakutse system-nspawn
käivitab konteineri töötamise ajal mountsnoop.py
.
Vaatame, mis juhtus:
Käivita mountsnoop
konteineri käivitamise ajal näitab, et konteineri käitusaeg sõltub suuresti lingitavast ühendusest (kuvatakse ainult pika väljundi algust).
see on systemd-nspawn
pakub valitud faile procfs
и sysfs
hostist konteinerisse kui teed selle juurde rootfs
. Välja arvatud MS_BIND
lipp, mis seadistab sidumisühenduse, määratlevad mõned muud ühendusmärgid hosti ja konteineri nimeruumide muudatuste vahel. Näiteks võib lingitud kinnitus muudatused vahele jätta /proc
и /sys
mahutisse või peita need olenevalt kõnest.
Järeldus
Linuxi sisemise toimimise mõistmine võib tunduda võimatu ülesandena, kuna kernel ise sisaldab tohutul hulgal koodi, jättes kõrvale Linuxi kasutajaruumi rakendused ja süsteemikõnede liidesed C-teekides, nagu näiteks glibc
. Üks viis edusammude saavutamiseks on lugeda ühe tuuma alamsüsteemi lähtekoodi, pannes rõhku süsteemikutsete ja kasutajaruumi päiste, aga ka peamiste sisemiste kerneli liideste (nt tabel) mõistmisele. file_operations
. Failitoimingud pakuvad "kõik on fail" põhimõtet, muutes nende haldamise eriti nauditavaks. C-kerneli lähtefailid tipptaseme kataloogis fs/
esitlevad virtuaalsete failisüsteemide teostust, mis on ümbriskiht, mis tagab laialdase ja suhteliselt lihtsa ühilduvuse populaarsete failisüsteemide ja salvestusseadmete vahel. Linkimine ja ülekattega ühendamine Linuxi nimeruumide kaudu on VFS-i võlu, mis võimaldab luua kirjutuskaitstud konteinereid ja juurfailisüsteeme. Koos lähtekoodi, eBPF-i põhitööriista ja selle liidese uurimisega bcc
muutes põhiuuringute lihtsamaks kui kunagi varem.
Sõbrad, kirjutage, kas see artikkel oli teile kasulik? Võib-olla on teil kommentaare või märkusi? Ja kes on huvitatud Linuxi administraatori kursusest, on oodatud
Allikas: www.habr.com