Magandang araw sa lahat, ibabahagi namin sa inyo ang ikalawang bahagi ng publikasyong “Mga Virtual file system sa LinuxBakit kailangan ang mga ito at paano gumagana ang mga ito? Mababasa ang unang bahagi Bilang paalala, ang serye ng mga publikasyong ito ay nakatakdang magkasabay sa paglulunsad ng isang bagong stream ng kurso. , na magsisimula sa lalong madaling panahon.
Paano Subaybayan ang VFS gamit ang eBPF at bcc Tools
Ang pinakamadaling paraan upang maunawaan kung paano pinangangasiwaan ng kernel ang mga file sysfs - ay upang makita ito sa pagsasanay, at ang pinakamadaling paraan upang obserbahan ang ARM64 ay ang paggamit ng eBPF. Ang eBPF (maikli para sa Berkeley Packet Filter) ay binubuo ng isang virtual machine na tumatakbo , na maaaring hilingin ng mga may pribilehiyong user (query) mula sa command line. Ang mga mapagkukunan ng kernel ay nagsasabi sa mambabasa kung ano ang magagawa ng kernel; Ang pagpapatakbo ng mga tool ng eBPF sa isang naka-boot na sistema ay nagpapakita kung ano talaga ang ginagawa ng kernel.

Sa kabutihang palad, ang pagsisimula sa eBPF ay medyo madali gamit ang mga tool , na magagamit bilang mga pakete mula sa pangkalahatang pamamahagi at nakadokumento nang detalyado . Mga gamit bcc – Ito ang mga script ng Python na may maliliit na pagsingit ng C code, na nangangahulugan na ang sinumang pamilyar sa parehong wika ay madaling baguhin ang mga ito. bcc/tools Mayroong 80 script ng Python, na nangangahulugang malamang na ang isang developer o system administrator ay makakahanap ng bagay na angkop para sa paglutas ng isang problema.
Upang makakuha ng hindi bababa sa isang maikling ideya kung ano ang ginagawa ng VFS sa isang tumatakbong sistema, subukan vfscount o vfsstatIpapakita nito, sabihin natin, na dose-dosenang mga tawag vfs_open() at literal na nangyayari ang "kanyang mga kaibigan" bawat segundo.

vfsstat.py– ay isang script ng Python na may mga pagsingit ng C code na binibilang lamang ang mga tawag sa function ng VFS.
Kumuha tayo ng mas maliit na halimbawa at tingnan kung ano ang mangyayari kapag nagpasok tayo ng USB flash drive sa isang computer at nakita ito ng system.

Sa eBPF makikita mo kung ano ang nangyayari sa
/syskapag may nakapasok na USB flash drive. Ang isang simple at kumplikadong halimbawa ay ipinapakita dito.
Sa halimbawang ipinakita sa itaas, bcc kasangkapan nagpi-print ng mensahe kapag pinapatakbo ang command sysfs_create_files()Nakikita natin yan sysfs_create_files() ay inilunsad sa tulong ng kworker stream bilang tugon sa flash drive na ipinasok, ngunit anong file ang nilikha? Ang pangalawang halimbawa ay nagpapakita ng buong kapangyarihan ng eBPF. Dito trace.py nagpi-print ng kernel backtrace (-K na opsyon) at ang pangalan ng file na nilikha sysfs_create_files(). Ang single-statement insertion ay C code na may kasamang madaling makikilalang format string na ibinigay ng Python script na nagpapatakbo ng LLVM. just-in-time compilerPinagsasama-sama nito ang linyang ito at isinasagawa ito sa virtual machine sa loob ng kernel. Ang buong function na lagda sysfs_create_files () ay dapat na kopyahin sa pangalawang utos upang ang format na string ay maaaring sumangguni sa isa sa mga parameter. Ang mga error sa fragment ng C code na ito ay nagreresulta sa mga nakikilalang error sa C compiler. Halimbawa, kung inalis ang -l parameter, makikita mo ang "Nabigong i-compile ang BPF text." Ang mga developer na pamilyar sa C at Python ay makakahanap ng mga tool bcc madaling palawakin at baguhin.
Kapag ang USB drive ay ipinasok, ang kernel backtrace ay magpapakita na ang PID 7711 ay ang thread kworkerna gumawa ng file «events» в sysfs. Alinsunod dito, ang tawag sa sysfs_remove_files() ay magpapakita na ang pag-alis ng drive ay nagresulta sa pagtanggal ng file events, na naaayon sa pangkalahatang konsepto ng pagbibilang ng sanggunian. Kasabay nito ang pagtingin sysfs_create_link () na may eBPF kapag nagpasok ng USB drive ay magpapakita na hindi bababa sa 48 simbolikong link ang nagawa.
Kaya ano ang layunin ng file ng mga kaganapan? Paggamit para sa paghahanap , ay nagpapakita na ito ay sanhi disk_add_events (), at alinman "media_change"O "eject_request" maaaring isulat sa file ng kaganapan. Dito, ang kernel block layer ay nagpapaalam sa userspace tungkol sa pagpasok at pagtanggal ng "disk." Pansinin kung gaano kabatid ang paraan ng pagsisiyasat na ito, gamit ang halimbawa ng pagpasok ng USB drive, ay inihambing sa pagsubok na malaman kung paano gumagana ang lahat mula lamang sa source code.
Ginagawang posible ng mga read-only na root file system ang mga naka-embed na device
Siyempre, walang nagsasara ng server o ng kanilang computer sa pamamagitan ng paghila sa plug. Pero bakit? Ang mga naka-mount na file system sa mga pisikal na storage device ay maaaring naantala ang pagsusulat, at ang mga istruktura ng data na nagtatala ng kanilang estado ay maaaring hindi naka-sync sa storage. Kapag nangyari ito, ang mga may-ari ng system ay kailangang maghintay hanggang sa susunod na boot upang patakbuhin ang utility. fsck filesystem-recovery at, sa pinakamasamang kaso, mawalan ng data.
Gayunpaman, alam nating lahat na maraming IoT device, pati na rin ang mga router, thermostat at mga kotse, ay tumatakbo na ngayon sa LinuxMarami sa mga device na ito ay halos walang user interface, at walang paraan para patayin ang mga ito nang malinis. Isipin mong paandarin ang isang kotse nang wala nang baterya kapag naputol ang kuryente sa control device. Patuloy itong tumatalon pataas at pababa. Paano na ang sistema ay nagbo-boot nang walang tagal fsckKailan magsisimulang gumana ang makina? Simple lang ang sagot. Ang mga naka-embed na device ay umaasa sa root file system. (dinaglat ro-rootfs (read-only root filesystem)).
ro-rootfs nag-aalok ng maraming mga pakinabang na hindi gaanong halata kaysa sa pagiging tunay. Ang isang bentahe ay hindi maaaring sumulat ang malware /usr o /lib, kung walang proseso Linux hindi makasulat dito. Isa pa ay ang isang halos hindi nababagong file system ay mahalaga para sa field support ng mga remote device, dahil ang mga support personnel ay gumagamit ng mga lokal na sistema na halos kapareho ng mga sistemang on-site. Marahil ang pinakamahalaga (ngunit pinakamapanlinlang din) na bentahe ay pinipilit ng ro-rootfs ang mga developer na magdesisyon kung aling mga system object ang magiging hindi nababago sa simula pa lang ng disenyo ng system. Ang paggamit ng ro-rootfs ay maaaring maging mahirap at masakit, gaya ng kadalasang nangyayari sa mga const variable sa mga programming language, ngunit ang mga benepisyo nito ay mas malaki kaysa sa karagdagang overhead.
paglikha rootfs Ang read-only na functionality ay nangangailangan ng karagdagang pagsisikap para sa mga naka-embed na developer, at dito pumapasok ang VFS. Linux nangangailangan na ang mga file sa /var ay maaaring isulat, at bilang karagdagan, maraming sikat na application na tumatakbo sa mga naka-embed na system ang susubukang gumawa ng configuration dot-files в $HOMEAng isang solusyon para sa mga file ng pagsasaayos sa direktoryo ng bahay ay karaniwang paunang pagbuo ng mga ito at pagsama-samahin ang mga ito rootfs. Para sa /var isang posibleng diskarte ay ang pag-mount ito sa isang hiwalay na nasusulat na partisyon habang ang / Naka-mount na read-only. Ang isa pang tanyag na alternatibo ay ang paggamit ng bind o overlay mounts.
Bindable at stackable mounts, at ang kanilang paggamit sa mga lalagyan
Pagpapatupad ng utos man mount – ang pinakamahusay na paraan upang matutunan ang tungkol sa mga linkable at stackable mounts, na nagpapahintulot sa mga developer at system administrator na lumikha ng isang file system sa isang path at pagkatapos ay ilantad ito sa mga application sa isa pa. Para sa mga naka-embed na system, nangangahulugan ito ng kakayahang mag-imbak ng mga file /var sa isang read-only na flash drive, ngunit isang overlay o link mount ng path mula sa tmpfs в /var Kapag nag-boot, papayagan nito ang mga application na magsulat ng mga tala doon (scrawl). Sa susunod na i-on mo ang mga pagbabago sa /var ay mawawala. Ang overlay mounting ay lumilikha ng unyon sa pagitan tmpfs at ang pinagbabatayan na file system at nagbibigay-daan para sa diumano'y paggawa ng mga pagbabago sa mga kasalukuyang file sa ro-tootf samantalang ang isang link mount ay maaaring gumawa ng mga bagong walang laman tmpfs mga folder na nakikita bilang nasusulat sa ro-rootfs mga landas. Habang overlayfs ito ay tama (proper) uri ng file system, ipinapatupad ang linkable mounting sa .
Batay sa paglalarawan ng mga overlay at link mount, walang nagulat na aktibong gamitin ang mga ito. Obserbahan natin kung ano ang mangyayari kapag ginamit natin upang patakbuhin ang lalagyan gamit ang tool mountsnoop mula sa bcc.
Hamon system-nspawn sinisimulan ang lalagyan habang ito ay tumatakbo mountsnoop.py.
Tingnan natin kung ano ang nangyari:
Ilunsad mountsnoop sa panahon ng "boot" ng lalagyan ay nagpapakita na ang runtime ng lalagyan ay lubos na nakadepende sa bind mount (Ang simula lamang ng mahabang output ang ipinapakita).
Dito systemd-nspawn nagbibigay ng mga napiling file sa procfs и sysfs mag-host sa lalagyan bilang mga landas papunta dito rootfs... Bukod sa MS_BIND Bilang karagdagan sa flag na itinatakda ng bind mount, tinutukoy ng ilang iba pang flag sa mount ang kaugnayan sa pagitan ng mga pagbabago sa host at mga namespace ng container. Halimbawa, maaaring laktawan ng bind mount ang mga pagbabago /proc и /sys sa isang lalagyan, o itago ang mga ito depende sa tawag.
Konklusyon
Pag-unawa sa panloob na istruktura Linux maaaring mukhang imposibleng gawain, dahil ang kernel mismo ay naglalaman ng napakaraming code, kaya't hindi na kailangan ang mga user-space application Linux at mga interface ng system call sa mga C library tulad ng glibcAng isang paraan upang gumawa ng progreso ay ang pagbabasa ng source code ng isang kernel subsystem, na nakatuon sa pag-unawa sa mga tawag sa system at mga header na nakaharap sa espasyo ng gumagamit, pati na rin ang mga pangunahing panloob na interface ng kernel, tulad ng talahanayan file_operationsAng mga pagpapatakbo ng file ay nagpapatupad ng prinsipyong "lahat ng bagay ay isang file", na ginagawa itong partikular na kaaya-aya na pamahalaan. Ang C source file ng kernel ay nasa top-level na direktoryo. fs/ kumakatawan sa isang implementasyon ng mga virtual file system, na isang wrapper layer na nagbibigay ng malawak at medyo simpleng compatibility sa pagitan ng mga sikat na file system at storage device. Pag-mount gamit ang linking at overlaying sa pamamagitan ng mga namespace Linux — ay ang mahika ng VFS na nagbibigay-daan sa paglikha ng mga container at read-only root file system. Kasama ang pag-aaral ng source code, ang eBPF kernel tool at ang interface nito. bcc
gawing mas madali ang paggalugad ng kernel kaysa dati.
Mga kaibigan, ipaalam ninyo sa akin kung nakatulong sa inyo ang artikulong ito. Maaari ba kayong magkaroon ng anumang komento o mungkahi? At para sa mga interesado sa kursong "Administrator", Linux", inaanyayahan ka naming , na magaganap sa Abril 18.
Pinagmulan: www.habr.com
