Mafayilo a Virtual mu Linux: chifukwa chiyani amafunikira ndipo amagwira ntchito bwanji? Gawo 2

Moni nonse, tikugawana nanu gawo lachiwiri la "Virtual file systems mu Linux: n'chifukwa chiyani amafunikira ndipo amagwira ntchito bwanji?" Mukhoza kuwerenga gawo loyamba apa. Tikukumbutseni kuti zofalitsa izi zafika nthawi kuti zigwirizane ndi kukhazikitsidwa kwa mtsinje watsopano pamaphunzirowa. "Linux Administrator", yomwe imayamba posachedwa kwambiri.

Momwe mungayang'anire VFS pogwiritsa ntchito zida za eBPF ndi bcc

Njira yosavuta yomvetsetsa momwe kernel imagwirira ntchito pamafayilo sysfs ndikuziwona mukuchita, ndipo njira yosavuta yowonera ARM64 ndikugwiritsa ntchito eBPF. eBPF (yachidule ya Berkeley Packet Filter) imakhala ndi makina enieni omwe akuyenda mkati pachimake, omwe ogwiritsa ntchito mwayi angapemphe (query) kuchokera pamzere wolamula. Magwero a kernel amauza owerenga zomwe kernel angachite; kuyendetsa zida za eBPF pamakina odzaza kukuwonetsa zomwe kernel ikuchita.

Mafayilo a Virtual mu Linux: chifukwa chiyani amafunikira ndipo amagwira ntchito bwanji? Gawo 2

Mwamwayi, kuyamba kugwiritsa ntchito eBPF ndikosavuta mothandizidwa ndi zida Bcc, zomwe zimapezeka ngati phukusi kuchokera kumagulu onse Linux ndi zolembedwa mwatsatanetsatane Bernard Gregg. Zida bcc ndi zolemba za Python zokhala ndi kachidindo kakang'ono ka C, zomwe zikutanthauza kuti aliyense wodziwa zilankhulo zonsezi akhoza kuzisintha mosavuta. MU bcc/tools Pali zolemba za 80 Python, zomwe zikutanthauza kuti mwina wopanga kapena woyang'anira dongosolo azitha kusankha chinthu choyenera kuthetsa vutoli.
Kuti mupeze lingaliro lachiphamaso la zomwe ma VFS amagwira ntchito pamakina othamanga, yesani vfscount kapena vfsstat. Izi ziwonetsa, tinene, kuti mafoni ambiri vfs_open() ndipo “mabwenzi ake” amapezeka kwenikweni sekondi iliyonse.

Mafayilo a Virtual mu Linux: chifukwa chiyani amafunikira ndipo amagwira ntchito bwanji? Gawo 2

vfsstat.py ndi Python script yokhala ndi ma code C omwe amangowerengera ma foni a VFS.

Tiyeni tipereke chitsanzo chochepa kwambiri ndikuwona zomwe zimachitika tikayika USB flash drive mu kompyuta ndipo dongosolo limazindikira.

Mafayilo a Virtual mu Linux: chifukwa chiyani amafunikira ndipo amagwira ntchito bwanji? Gawo 2

Pogwiritsa ntchito eBPF mutha kuwona zomwe zikuchitika /syspamene USB flash drive yayikidwa. Chitsanzo chosavuta komanso chovuta chikuwonetsedwa apa.

Muchitsanzo chomwe chili pamwambapa, bcc chida trace.py amasindikiza uthenga pamene lamulo likuyendetsedwa sysfs_create_files(). Ife tikuziwona izo sysfs_create_files() idayambitsidwa pogwiritsa ntchito kworker mtsinje poyankha kuti flash drive idayikidwa, koma ndi fayilo yanji idapangidwa? Chitsanzo chachiwiri chikuwonetsa mphamvu ya eBPF. Pano trace.py Isindikiza kernel backtrace (-K njira) ndi dzina la fayilo yomwe idapangidwa sysfs_create_files(). Kuyika mawu amodzi ndi kachidindo ka C komwe kumaphatikizapo chingwe chodziwika bwino choperekedwa ndi Python script yomwe ili ndi LLVM. basi-mu-nthawi compiler. Imapanga mzerewu ndikuupanga mu makina enieni mkati mwa kernel. Siginecha yantchito yonse sysfs_create_files () iyenera kupangidwanso mu lamulo lachiwiri kuti chingwe chamtunduwo chikhoza kutanthauza chimodzi mwa magawo. Zolakwa mu kachidutswa ka C kachidutswa kameneka zimabweretsa zolakwika zozindikirika kuchokera kwa C compiler. Mwachitsanzo, ngati -l parameter yasiyidwa, mudzawona "Yalephera kusonkhanitsa malemba a BPF." Madivelopa omwe amadziwa bwino C ndi Python apeza zida bcc zosavuta kukulitsa ndi kusintha.

USB drive ikayikidwa, kernel backtrace iwonetsa kuti PID 7711 ndi ulusi. kworkerzomwe zidapanga fayilo «events» в sysfs. Chifukwa chake, foni yochokera sysfs_remove_files() zidzawonetsa kuti kuchotsa galimoto kumapangitsa kuti fayiloyo ichotsedwe events, zomwe zimagwirizana ndi lingaliro lachidziwitso la kuwerengera kwa maumboni. Pa nthawi yomweyo, kuona sysfs_create_link () ndi eBPF ndikuyika USB drive iwonetsa kuti maulalo ophiphiritsa a 48 adapangidwa.

Ndiye kodi fayilo ya zochitika ndi chiyani? Kugwiritsa ntchito cscope Kusaka __chipangizo_add_disk(), limasonyeza chimene chimayambitsa disk_add_events (),ndipo "media_change", kapena "eject_request" ikhoza kulembedwa mu fayilo ya zochitika. Apa kernel block layer imadziwitsa ogwiritsa ntchito kuti "disk" yawonekera ndikutulutsidwa. Onani momwe njira yofufuzirayi ilili yophunzitsira poyika USB drive, poyerekeza ndi kuyesa kudziwa momwe zinthu zimagwirira ntchito kuchokera kugwero.

Mafayilo owerengeka okha amathandizira zida zophatikizidwa

Zachidziwikire, palibe amene azimitsa seva kapena kompyuta yake pokoka pulagi kuchokera pasoketi. Koma chifukwa chiyani? Izi ndichifukwa choti makina oyika mafayilo pazida zosungirako amatha kukhala ndi zolemba zotsalira, ndipo ma data omwe amalemba zomwe zikuchitika mwina sangagwirizane ndi zolembera zosungirako. Izi zikachitika, eni madongosolo amayenera kudikirira mpaka boot yotsatira kuti ayambe kugwiritsa ntchito. fsck filesystem-recovery ndipo, poipa kwambiri, kutaya deta.

Komabe, tonse tikudziwa kuti zida zambiri za IoT, komanso ma routers, ma thermostats ndi magalimoto, tsopano akuyendetsa Linux. Zambiri mwazidazi zimakhala ndi mawonekedwe ocheperako, ndipo palibe njira yozimitsira "mwabwino." Tangoganizani kuyambitsa galimoto yokhala ndi batire yakufa pomwe mphamvu yoyang'anira ili Linux kumalumpha mmwamba ndi pansi mosalekeza. Zimakhala bwanji kuti ma boot system popanda nthawi yayitali fsckkodi injiniyo imayamba liti? Ndipo yankho lake ndi losavuta. Zipangizo zophatikizidwa zimadalira mizu ya fayilo powerenga kokha (chidule ro-rootfs (read-only root fileystem)).

ro-rootfs perekani maubwino ambiri omwe sawoneka bwino kuposa zenizeni. Ubwino wina ndikuti pulogalamu yaumbanda siyingalembere /usr kapena /lib, ngati palibe njira ya Linux yomwe ingalembe pamenepo. Chinanso ndi chakuti mawonekedwe osasinthika amafayilo ndi ofunikira kwambiri pakuthandizira kumunda kwa zida zakutali, popeza othandizira amadalira machitidwe am'deralo omwe ali ofanana ndi machitidwe akumunda. Mwina phindu lofunika kwambiri (komanso lobisika) ndikuti ro-rootfs imakakamiza opanga kuti asankhe zinthu zomwe sizingasinthe pakapangidwe kadongosolo. Kugwira ntchito ndi ro-rootfs kumatha kukhala kovutirapo komanso kowawa, chifukwa zosintha za const nthawi zambiri zimakhala m'zilankhulo zopanga mapulogalamu, koma zopindulitsa zake zimangolungamitsa zowonjezera.

chilengedwe rootfs Kuwerenga-kokha kumafuna kuyesetsa kwina kwa opanga ophatikizidwa, ndipo apa ndipamene VFS imabwera pachithunzichi. Linux imafuna kuti mafayilo azikhalamo /var zinali zolembedwa, ndipo kuwonjezera apo, mapulogalamu ambiri otchuka omwe amayendetsa machitidwe ophatikizidwa adzayesa kupanga kasinthidwe dot-files в $HOME. Njira imodzi yothetsera mafayilo mu bukhu lanyumba nthawi zambiri imakhala yopangiratu ndikumanga rootfs. Chifukwa /var Njira imodzi yotheka ndikuyiyika pagawo lolembedwa, pomwe / zokwezedwa zowerengera zokha. Njira ina yotchuka ndiyo kugwiritsa ntchito ma bind kapena overlay mounts.

Zokwera zolumikizidwa komanso zosasunthika, zogwiritsidwa ntchito ndi zotengera

Kupereka lamulo man mount ndiye njira yabwino yophunzirira za zokwera zomangika komanso zophatikizika, zomwe zimapatsa opanga ndi oyang'anira dongosolo kuthekera kopanga mafayilo amafayilo munjira imodzi ndikuyiwonetsa ku mapulogalamu ena. Kwa makina ophatikizidwa, izi zikutanthauza kuthekera kosunga mafayilo mkati /var pa flash drive yowerengeka yokha, koma njira yokulirapo kapena yolumikizira yochokera tmpfs в /var ikatsegula, imalola mapulogalamu kuti alembe zolemba pamenepo (scrawl). Nthawi ina mukayatsa zosintha /var adzatayika. Kukwera pamwamba kumapanga mgwirizano pakati tmpfs ndi dongosolo lapansi la mafayilo ndikukulolani kuti musinthe zowoneka bwino pamafayilo omwe alipo ro-tootf pamene phiri lomangika lingapangitse zatsopano kukhala zopanda kanthu tmpfs zikwatu zowoneka ngati zolembedwa mkati ro-rootfs njira. Pamene overlayfs izi ndiye zolondola (proper) mtundu wa fayilo, mount bindable mount imayikidwa mkati Dzina la VFS.

Kutengera kufotokozera kwa zokutira ndi phiri lolumikizidwa, palibe amene akudabwa Zida za Linux amagwiritsidwa ntchito mwakhama. Tiyeni tiwone zomwe zimachitika tikamagwiritsa ntchito systemd-spawn kuyendetsa chidebecho pogwiritsa ntchito chida mountsnoop от bcc.

Chovuta system-nspawn imayamba chidebe pamene ikuyenda mountsnoop.py.

Tiyeni tiwone zomwe zidachitika:

Yambitsani mountsnoop pomwe chidebe "choyamba" chikuwonetsa kuti nthawi yoyendetsera chidebeyo imadalira kwambiri phiri lomwe likulumikizidwa (Kuyambira kokha kwa kutulutsa kwautali kumawonetsedwa).

ndi systemd-nspawn imapereka mafayilo osankhidwa mu procfs и sysfs landirani ku chidebe ngati njira zopitako rootfs... Komanso MS_BIND mbendera yomwe imakhazikitsa chokwera chomangirira, mbendera zina paphiri zimatanthawuza ubale womwe ulipo pakati pa kusintha kwa malo omwe ali ndi dzina ndi chidebe. Mwachitsanzo, chokwera cholumikizidwa chikhoza kulumpha kusintha /proc и /sys m'chidebe, kapena kuwabisa malinga ndi kuyitana.

Pomaliza

Kumvetsetsa momwe Linux imagwirira ntchito kumatha kuwoneka ngati ntchito yosatheka, popeza kernel palokha ili ndi ma code ambiri, kusiya pambali mapulogalamu a Linux ogwiritsira ntchito malo ochezera a pakompyuta m'mabuku a C monga glibc. Njira imodzi yopititsira patsogolo ndikuwerenga magwero a kernel subsystem, ndikugogomezera pakumvetsetsa kwamayimbidwe amachitidwe ndi mitu yamalo ogwiritsa ntchito, komanso mawonekedwe akulu amkati amkati, monga tebulo. file_operations. Ntchito zamafayilo zimapereka mfundo ya "chilichonse ndi fayilo", kuwapangitsa kukhala osangalatsa kuyang'anira. C kernel source mafayilo pamndandanda wapamwamba kwambiri fs/ perekani kukhazikitsidwa kwa kachitidwe ka mafayilo, omwe ndi gawo lopukutira lomwe limapereka kulumikizana kwakukulu komanso kosavuta pakati pamafayilo otchuka ndi zida zosungira. Kulumikiza ndi kuyika pamwamba kudzera pa Linux namespaces ndi matsenga a VFS omwe amapangitsa kupanga zotengera zowerengera zokha ndi mafayilo amafayilo kukhala kotheka. Kuphatikizidwa ndi kuwunika kwa code source, chida chachikulu cha eBPF ndi mawonekedwe ake bcc
kupangitsa kufufuza kwakukulu kukhala kosavuta kuposa kale.

Anzanga, lembani, kodi nkhaniyi idakuthandizani? Mwina muli ndi ndemanga kapena ndemanga? Ndipo omwe ali ndi chidwi ndi maphunziro a Linux Administrator akuitanidwa Tsiku Lotsegula, yomwe idzachitika pa April 18.

Gawo loyamba.

Source: www.habr.com

Kuwonjezera ndemanga