Talofa tagata uma, matou te faʻasoa atu ia te oe le vaega lona lua o le lomiga "Virtual file system in Linux: aisea e manaʻomia ai ma faʻafefea ona latou galulue?" E mafai ona e faitau i le vaega muamua
E faʻafefea ona mataʻituina le VFS e faʻaaoga ai meafaigaluega eBPF ma bcc
Le auala pito sili ona faigofie e malamalama ai pe faʻafefea ona galue le kernel i faila sysfs
o le va'ai i le fa'atinoga, ma o le auala pito sili ona faigofie e matamata ai i le ARM64 o le fa'aogaina lea o le eBPF. eBPF (pu'upu'u mo Berkeley Packet Filter) o lo'o i ai se masini fa'apitoa o lo'o alu i totonu query
) mai le laina poloaiga. E ta'u atu i le tagata faitau mea e mafai e le fatu fatu ona fai; O le faʻaogaina o meafaigaluega eBPF i luga o se faʻapipiʻiina o loʻo faʻaalia ai le mea o loʻo faia e le fatu.
O le mea e laki ai, o le amata faʻaaogaina o le eBPF e faigofie tele ma le fesoasoani a meafaigaluega bcc
o faʻamaumauga a le Python ma faʻapipiʻi laiti o le C code, o lona uiga o soʻo se tasi e masani i gagana e lua e mafai ona faigofie ona suia. IN bcc/tools
O loʻo i ai 80 Python scripts, o lona uiga e foliga mai o le a mafai e se tagata faʻapipiʻi poʻo se pule faʻatonu ona filifili se mea talafeagai mo le foia o le faʻafitauli.
Ina ia maua se manatu papaʻu o mea e fai e VFS i luga o se faiga faʻaogaina, taumafai vfscount
poʻo vfsstat
. O lenei mea o le a faʻaalia, seʻi tatou fai atu, o le tele o telefoni vfs_open()
ma o “ana uo” e tutupu moni lava i sekone uma.
vfsstat.py
o se tusitusiga Python faʻatasi ai ma faʻapipiʻi C code e naʻo le faitauina o le VFS function calls.
Seʻi o tatou tuʻuina atu se faʻataʻitaʻiga e sili atu ona le taua ma vaʻai pe o le a le mea e tupu pe a tatou tuʻuina se USB flash drive i totonu o se komepiuta ma iloa ai e le polokalama.
Fa'aaoga le eBPF e mafai ona e va'ai i mea o lo'o tupu i totonu
/sys
pe a fa'aofi se USB flash drive. O se faʻataʻitaʻiga faigofie ma faigata o loʻo faʻaalia iinei.
I le faʻataʻitaʻiga o loʻo faʻaalia i luga, bcc
mea faifaaili sysfs_create_files()
. Ua tatou vaai i ai sysfs_create_files()
na faʻalauiloaina faʻaaogaina kworker
vaitafe i le tali atu i le mea moni o le flash drive na faʻaofiina, ae o le a le faila na faia? O le faʻataʻitaʻiga lona lua o loʻo faʻaalia ai le malosi o le eBPF. O iinei trace.py
Lolomi se kernel backtrace (-K filifiliga) ma le igoa o le faila na faia sysfs_create_files()
. O le faʻaofiina o faʻamatalaga e tasi o le C code lea e aofia ai se manoa faʻapipiʻi faigofie ona iloa e saunia e le Python script lea e faʻatautaia le LLVM. sa'o-i-taimi tu'ufa'atasi. E tu'ufa'atasia lenei laina ma fa'atino i totonu o se masini masini i totonu ole fatu. Saini galuega atoatoa sysfs_create_files ()
e tatau ona toe faia i le poloaiga lona lua ina ia mafai ona faasino le manoa faatulagaga i se tasi o tapulaʻa. O mea sese i lenei vaega o le C code e mafua ai ni mea sese mai le C compiler. Mo se faʻataʻitaʻiga, afai e le faʻaaogaina le -l parameter, o le a e vaʻaia "Ua le mafai ona faʻapipiʻi tusitusiga BPF." O tagata atiaʻe e masani ile C ma Python o le a maua meafaigaluega bcc
faigofie ona faalautele ma suia.
A faʻapipiʻi le USB drive, o le kernel backtrace o le a faʻaalia ai o le PID 7711 o se filo kworker
lea na faia ai le faila «events»
в sysfs
. E tusa ai, o le valaau mai sysfs_remove_files()
o le a faʻaalia ai o le aveeseina o le taʻavale na mafua ai ona tape le faila events
, lea e fetaui ma le manatu lautele o le faitau tusi. I le taimi lava e tasi, matamata sysfs_create_link ()
fa'atasi ai ma le eBPF a'o fa'aofiina le ta'avale USB o le a fa'aalia ai e le itiiti ifo i le 48 feso'ota'iga fa'atusa na faia.
O le a la le uiga o le faila faila? Fa'aoga disk_add_events ()
, ma a le o lea "media_change"
, po o "eject_request"
e mafai ona faamaumauina i se faila o mea na tupu. O iinei o le kernel block layer e logoina ai le avanoa e fa'aoga ai se "disk" ua aliali mai ma aveese. Manatua le faʻamatalaga o lenei metotia suʻesuʻe e ala i le faʻaofiina o le USB drive, pe a faʻatusatusa i le taumafai e iloa pe faʻafefea ona faʻaogaina mea mai le puna.
Na'o le faitau na'o faiga faila a'a e mafai ai masini fa'apipi'i
Ioe, e leai se tasi na te tapeina le server poʻo le latou komepiuta e ala i le tosoina o le polo mai le socket. Ae aiseā? E mafua ona o le faʻapipiʻiina o faila faila i luga o masini e teu ai le tino atonu na tuai ona tusitusi, ma o faʻamaumauga faʻamaumauga e faʻamaumau ai latou setete atonu e le o faʻatasi ma tusitusiga i le teuina. A tupu lenei mea, e tatau i tagata e ona le polokalama ona faʻatali seʻia oʻo i le isi seevae e faʻalauiloa ai le aoga. fsck filesystem-recovery
ma, i le tulaga sili ona leaga, leiloa faʻamatalaga.
Ae ui i lea, matou te iloa uma o le tele o masini IoT, faʻapea foʻi ma alalaupapa, thermostats ma taʻavale, o loʻo faʻatautaia nei Linux. O le tele o nei masini e itiiti pe leai se fa'aoga fa'aoga, ma e leai se auala e tape ai "mama." Vaai faalemafaufau i le amataina o se taavale i se maa ua mate pe a oo atu le malosiaga i le iunite pulea fsck
o afea e amata ai le afi? Ma o le tali e faigofie. O masini fa'apipi'i e fa'alagolago i le faiga faila faila ro-rootfs
(faitala a'a na'o faitau)).
ro-rootfs
ofoina atu le tele o faʻamanuiaga e itiiti ifo le manino nai lo le moni. O le tasi fa'amanuiaga e le mafai e malware ona tusi i ai /usr
poʻo /lib
, pe a leai se faiga Linux e mafai ona tusi ai iina. O le isi o le tele o faila faila e le mafai ona suia e taua tele mo le lagolago i fanua o masini mamao, talu ai o tagata lagolago e faʻalagolago i faiga faʻapitonuʻu e foliga tutusa ma le fanua. Masalo o le mea sili ona taua (ae sili ona taufaasese) o le ro-rootfs e faʻamalosia ai le au atinaʻe e filifili po o fea mea faʻaoga o le a le mafai ona suia i le mamanu o le faiga. O le galulue faatasi ma ro-rootfs e mafai ona fa'alavelave ma tiga, ona e masani ona i ai i gagana fa'apolokalame le fa'aogaina, ae o latou fa'amanuiaga e faigofie ona fa'amaonia le fa'aopoopoina o luga.
Fausia rootfs
Faitau-na'o mana'omia nisi taumafaiga fa'aopoopo mo atina'e fa'apipi'i, ma o le mea lea e sau ai le VFS i le ata. E manaʻomia e Linux ia faila i totonu /var
e mafai ona tusia, ma e le gata i lea, o le tele o talosaga lauiloa o loʻo faʻaogaina faiga faʻapipiʻi o le a taumafai e fai le faʻatulagaga dot-files
в $HOME
. O se tasi o fofo mo faila faila i totonu o le lisi o fale e masani lava ona faia muamua ma fausia i totonu rootfs
. Aua /var
O se tasi auala e mafai ona faʻapipiʻi i luga o se vaeluaga e mafai ona tusia, ao /
fa'apipi'i na'o le faitau. O le isi filifiliga lauiloa o le faʻaaogaina o fusi poʻo faʻapipiʻi faʻamau.
Fa'apipi'i fa'apipi'i ma fa'aputu, o lo'o fa'aogaina e koneteina
Fa'atinoina o se fa'atonuga man mount
o le auala sili lea e aʻoaʻo ai e uiga i faʻamau e mafai ona faʻapipiʻiina ma faʻapipiʻiina, lea e tuʻuina atu ai i tagata atinaʻe ma pule faʻatonu le tomai e fai ai se faila faila i le tasi auala ona faʻaalia lea i talosaga i le isi. Mo faiga fa'apipi'i, o lona uiga o le mafai ona teu faila i totonu /var
i luga o se kiliva e faitau na'o le flash drive, ae o se fa'apipi'i pe feso'ota'i le ala mauga mai tmpfs
в /var
pe a utaina, o le a faʻatagaina tusi talosaga e tusi ai faʻamatalaga iina (scrawl). O le isi taimi e te ki ai suiga i /var
o le a leiloa. O se fa'amau fa'apipi'i e fausia ai se fa'atasiga i le va tmpfs
ma le faiga faila o loʻo i lalo ma faʻatagaina oe e faia suiga faʻaalia i faila o loʻo iai i totonu ro-tootf
a o le mauga e mafai ona fusifusia e mafai ona fa'agaogaoina ai mea fou tmpfs
foliga vaaia e pei ona tusia i totonu ro-rootfs
auala. A o overlayfs
o le mea sa'o lea (proper
) ituaiga faila faila, fusifusia mauga o loʻo faʻatinoina i
Faʻavae i luga o le faʻamatalaga o le faʻapipiʻi ma le faʻapipiʻiina o le mauga, e leai se tasi e ofo i lena mea mountsnoop
от bcc
.
Lui system-nspawn
amata le koneteina a'o tamo'e mountsnoop.py
.
Sei o tatou vaai po o le a le mea na tupu:
Tatala mountsnoop
a'o le koneteina o lo'o "fa'aosoina" o lo'o fa'aalia ai e fa'alagolago tele le ta'aloga a le koneteina i luga o le mauga o lo'o feso'ota'i (Na'o le amataga o le gaosiga umi o lo'o fa'aalia).
o systemd-nspawn
saunia faila filifilia i procfs
и sysfs
fa'afeiloa'i i pusa e fai ma ala i ai rootfs
... E le gata MS_BIND
fuʻa e faʻatutuina le mauga fusifusia, o isi fuʻa i luga o le mauga e faʻamalamalamaina le va o suiga i le talimalo ma le koneteina namespaces. Mo se fa'ata'ita'iga, e mafai ona fa'ase'e suiga i se mauga feso'ota'i /proc
и /sys
i totonu o le koneteina, pe natia e faalagolago i le valaau.
iʻuga
O le malamalama i galuega i totonu o Linux e mafai ona foliga mai o se galuega e le mafai, talu ai o le fatu lava ia o loʻo i ai le tele o tulafono laiti, ma tuʻu ese ai le faʻaogaina o avanoa mo le faʻaogaina o le Linux ma fesoʻotaʻiga telefoni i totonu o faletusi C e pei o le. glibc
. O se tasi o auala e alualu ai i luma o le faitau lea o le source code o le tasi kernel subsystem, faatasi ai ma le faamamafa i le malamalama i le telefoni feaveaʻi ma faʻauluuluga o avanoa faʻaoga, faʻapea foʻi ma fesoʻotaʻiga autu i totonu ole kernel, e pei ole laulau. file_operations
. O fa'agaioiga faila e tu'uina atu ai le fa'avae "o mea uma lava o se faila", e fa'afiafiaina ai le fa'afoeina. C kernel puna'oa faila i le lisi pito i luga fs/
tuʻuina atu se faʻatinoga o faiga faila faila, o se afifi afifi e maua ai le fesoʻotaʻiga lautele ma faigofie i le va o faila faila lauiloa ma masini teu. Feso'ota'i ma fa'apipi'i fa'apipi'i i luga ole igoa ole Linux ole togafiti fa'amaneta ole VFS lea e mafai ai ona faia na'o koneteina faitau ma faila faila. Fa'atasia ma se su'esu'ega o le source code, le meafaigaluega autu eBPF ma lona atina'e bcc
fa'afaigofie su'esu'ega autu nai lo se isi lava taimi.
Uo, tusi mai, pe na aoga lenei tusiga ia te oe? Masalo e i ai ni au faʻamatalaga poʻo ni faʻamatalaga? Ma oi latou e fiafia i le Linux Administrator course e valaʻaulia i
puna: www.habr.com