Moni nonse, tikugawana nanu gawo lachiwiri la "Virtual file systems mu Linux: n'chifukwa chiyani amafunikira ndipo amagwira ntchito bwanji?" Mukhoza kuwerenga gawo loyamba
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 query
) kuchokera pamzere wolamula. Magwero a kernel amauza owerenga zomwe kernel angachite; kuyendetsa zida za eBPF pamakina odzaza kukuwonetsa zomwe kernel ikuchita.
Mwamwayi, kuyamba kugwiritsa ntchito eBPF ndikosavuta mothandizidwa ndi 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.
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.
Pogwiritsa ntchito eBPF mutha kuwona zomwe zikuchitika
/sys
pamene USB flash drive yayikidwa. Chitsanzo chosavuta komanso chovuta chikuwonetsedwa apa.
Muchitsanzo chomwe chili pamwambapa, bcc
chida 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. kworker
zomwe 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 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 fsck
kodi injiniyo imayamba liti? Ndipo yankho lake ndi losavuta. Zipangizo zophatikizidwa zimadalira mizu ya fayilo 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
Kutengera kufotokozera kwa zokutira ndi phiri lolumikizidwa, palibe amene akudabwa 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
Source: www.habr.com