ʻO nā ʻōnaehana file virtual ma Linux: no ke aha lākou e pono ai a pehea lākou e hana ai? Mahele 2

Aloha kākou a pau, ke kaʻana nei mākou iā ʻoe i ka ʻāpana ʻelua o ka paʻi "Virtual file system in Linux: no ke aha lākou e pono ai a pehea lākou e hana ai?" Hiki iā ʻoe ke heluhelu i ka hapa mua maanei. E hoʻomanaʻo mākou iā ʻoe ua hoʻohālikelike ʻia kēia pūʻulu o nā paʻi me ka hoʻomaka ʻana o kahi kahawai hou ma ka papa. "Ka Luna Hoʻokele Linux", e hoʻomaka koke ana.

Pehea e nānā ai iā VFS me ka hoʻohana ʻana i nā mea hana eBPF a me bcc

ʻO ke ala maʻalahi e hoʻomaopopo i ka hana ʻana o ka kernel ma nā faila sysfs ʻo ia ke ʻike ma ka hoʻomaʻamaʻa, a ʻo ke ala maʻalahi e nānā iā ARM64 ʻo ia ka hoʻohana ʻana i ka eBPF. ʻO ka eBPF (pōkole no Berkeley Packet Filter) he mīkini uila e holo ana i loko kumu, hiki i nā mea hoʻohana pono ke noi (query) mai ka laina kauoha. Hōʻike nā kumu kernel i ka mea heluhelu i ka mea hiki ke hana i ka kernel; ʻO ka holo ʻana i nā mea hana eBPF ma kahi ʻōnaehana i hoʻouka ʻia e hōʻike ana i ka hana maoli o ka kernel.

ʻO nā ʻōnaehana file virtual ma Linux: no ke aha lākou e pono ai a pehea lākou e hana ai? Mahele 2

ʻO ka pōmaikaʻi, maʻalahi ka hoʻomaka ʻana e hoʻohana i ka eBPF me ke kōkua o nā mea hana ke kanesa, i loaʻa ma ke ʻano he pūʻolo mai ka puʻunaue maʻamau Linux a i palapala ʻia i nā kikoʻī Bernard Gregg. Mea hana bcc ʻO nā palapala Python me nā hoʻokomo liʻiliʻi o ka code C, ʻo ia ka mea hiki i ka mea kamaʻāina me nā ʻōlelo ʻelua ke hoʻololi maʻalahi iā lākou. IN bcc/tools Aia he 80 mau palapala Python, ʻo ia hoʻi, hiki i ka mea hoʻomohala a i ʻole ka luna hoʻonohonoho ke koho i kahi mea kūpono no ka hoʻoponopono ʻana i ka pilikia.
No ka loaʻa ʻana o kahi manaʻo liʻiliʻi o ka hana a nā VFS ma kahi ʻōnaehana holo, e hoʻāʻo vfscount ai ole ia, vfsstat. E hōʻike ana kēia, e ʻōlelo kākou, he mau kakini kelepona vfs_open() a ʻo "kona mau hoaaloha" e hana maoli i kēlā me kēia kekona.

ʻO nā ʻōnaehana file virtual ma Linux: no ke aha lākou e pono ai a pehea lākou e hana ai? Mahele 2

vfsstat.py he palapala Python me ka C code inserts e helu wale i nā kelepona hana VFS.

E hāʻawi mākou i kahi hiʻohiʻona liʻiliʻi a ʻike i ka hopena ke hoʻokomo mākou i kahi USB flash drive i loko o kahi kamepiula a ʻike ka ʻōnaehana.

ʻO nā ʻōnaehana file virtual ma Linux: no ke aha lākou e pono ai a pehea lākou e hana ai? Mahele 2

Ke hoʻohana nei i ka eBPF hiki iā ʻoe ke ʻike i ka mea e hana nei /syske hoʻokomo ʻia kahi USB flash drive. Hōʻike ʻia kahi laʻana maʻalahi a paʻakikī ma aneʻi.

Ma ka laana i hoikeia maluna, bcc mea kani trace.py paʻi i ka memo ke holo ke kauoha sysfs_create_files(). ʻIke mākou i kēlā sysfs_create_files() ua hoʻomaka ʻia me ka hoʻohana ʻana kworker kahawai i ka pane ʻana i ka ʻoiaʻiʻo ua hoʻokomo ʻia ka flash drive, akā he aha ka faila i hana ʻia? Hōʻike ka lua o ka laʻana i ka mana o eBPF. Eia trace.py E paʻi i kahi kernel backtrace (-K koho) a me ka inoa o ka faila i hana ʻia sysfs_create_files(). ʻO ka hoʻokomo ʻōlelo hoʻokahi ʻo C code e loaʻa ana i kahi string format maʻalahi i hāʻawi ʻia e ka palapala Python e holo ana i ka LLVM. mea hoʻopili pono-i-manawa. Hoʻopili ia i kēia laina a hoʻokō iā ia i loko o kahi mīkini virtual i loko o ka kernel. Pulima hana piha sysfs_create_files () pono e hana hou ʻia ma ke kauoha ʻelua i hiki i ke kaula hōʻano ke kuhikuhi i kekahi o nā ʻāpana. Loaʻa nā hewa i kēia ʻāpana C code i nā hewa ʻike ʻia mai ka C compiler. No ka laʻana, inā haʻalele ʻia ka -l parameter, e ʻike ʻoe "ʻAʻole hiki ke hoʻohui i ka kikokikona BPF." E ʻike nā mea hoʻomohala i kamaʻāina iā C a me Python i nā mea hana bcc maʻalahi e hoʻonui a hoʻololi.

Ke hoʻokomo ʻia ka USB drive, e hōʻike ka backtrace kernel i ka PID 7711 he kaula kworkerka mea i hana i ka faila «events» в sysfs. Nolaila, ke kahea mai sysfs_remove_files() e hōʻike ʻia ʻo ka wehe ʻana i ka drive ka mea i hoʻopau ʻia ka faila events, pili i ka manaʻo nui o ka helu kuhikuhi. I ka manawa like, nānā sysfs_create_link () me ka eBPF i ka hoʻokomo ʻana i ka USB drive e hōʻike ʻia ma kahi o 48 mau loulou hōʻailona i hana ʻia.

No laila he aha ke kumu o ka faila hanana? Hoʻohana cscope No ka huli __device_add_disk(), hōʻike i ke kumu o ia mea disk_add_events (), a me kekahi "media_change", aiʻole "eject_request" hiki ke hoʻopaʻa ʻia i kahi faila hanana. Ma ʻaneʻi e hōʻike ana ka papa poloka kernel i ka mea hoʻohana ua puka mai kahi "disk" a hoʻokuʻu ʻia. E hoʻomaopopo i ka ʻike ʻana o kēia ʻano noiʻi ma ka hoʻokomo ʻana i kahi drive USB, i hoʻohālikelike ʻia me ka hoʻāʻo ʻana e noʻonoʻo i ka hana ʻana o nā mea mai ke kumu.

Hiki i nā ʻōnaehana waihona waihona heluhelu-wale i nā mea i hoʻokomo ʻia

ʻOiaʻiʻo, ʻaʻohe mea e hoʻopau i ke kikowaena a i ʻole kā lākou kamepiula ma ka huki ʻana i ka plug mai ke kumu. Akā, no ke aha? No ka mea, ua lohi paha nā ʻōnaehana waihona i kau ʻia ma nā mea mālama kino, a ʻaʻole hiki ke hoʻonohonoho ʻia nā ʻikepili e hoʻopaʻa i ko lākou mokuʻāina me nā kākau i ka waihona. Ke hana ʻia kēia, pono nā mea nona ka ʻōnaehana e kali a hiki i ka boot hou e hoʻomaka ai i ka pono. fsck filesystem-recovery a, i ka pilikia loa, nalowale ʻikepili.

Eia nō naʻe, ʻike mākou a pau he nui nā mea IoT, a me nā mea ala, nā thermostats a me nā kaʻa, e holo nei i Linux. ʻO ka hapa nui o kēia mau mea hana he liʻiliʻi a ʻaʻohe mea hoʻohana, a ʻaʻohe ala e hoʻohuli iā lākou "maʻemaʻe." E noʻonoʻo i ka hoʻomaka ʻana i kahi kaʻa me kahi pākaukau make i ka wā e loaʻa ai ka mana o ka mana Linux lele mau i luna a i lalo. Pehea ka ʻōnaehana kāmaʻa me ka lōʻihi ʻole fscki ka manawa hea e hoʻomaka ai ka holo ʻana o ka ʻenekini? A maʻalahi ka pane. Ke hilinaʻi nei nā mea i hoʻokomo ʻia i ka ʻōnaehana waihona kumu no ka heluhelu wale no (hoʻopōkole ʻia ro-rootfs (heluhelu-wale no ke kumu waihona waihona)).

ro-rootfs hāʻawi i nā pono he nui i ʻike ʻole ʻia ma mua o ka ʻoiaʻiʻo. ʻO kekahi pōmaikaʻi ʻaʻole hiki i ka malware ke kākau iā ia /usr ai ole ia, /lib, inā ʻaʻohe kaʻina Linux hiki ke kākau ma laila. ʻO kekahi mea ʻē aʻe he mea koʻikoʻi ka ʻōnaehana faila hiki ʻole ke hoʻololi ʻia no ke kākoʻo kahua o nā mea mamao, no ka mea ke hilinaʻi nei nā limahana kākoʻo i nā ʻōnaehana kūloko e like me nā ʻōnaehana kahua. Malia paha ʻo ka pōmaikaʻi nui loa (akā, ʻoi loa ka insidious) ʻo ia ka ro-rootfs e hoʻoikaika i nā mea hoʻomohala e hoʻoholo i nā mea ʻōnaehana e loli ʻole i ka pae hoʻolālā o ka ʻōnaehana. ʻO ka hana pū ʻana me nā ro-rootfs hiki ke paʻakikī a ʻeha hoʻi, no ka mea, aia nā ʻano const i nā ʻōlelo papahana, akā ʻo kā lākou mau pōmaikaʻi e hōʻoiaʻiʻo i ka ʻoi aku o ke poʻo.

hanaia'na rootfs Pono ka heluhelu-wale i kekahi hooikaika hou no na mea hookumu i hookomoia, a ma keia kahi e komo ai o VFS i ke kii. Pono ʻo Linux e hoʻokomo i nā faila /var hiki ke kākau ʻia, a eia kekahi, nui nā noi kaulana e holo ana i nā ʻōnaehana hoʻokomo e hoʻāʻo e hana i ka hoʻonohonoho dot-files в $HOME. ʻO kahi hoʻonā no nā faila hoʻonohonoho i ka papa kuhikuhi home ʻo ia ka mea maʻamau e hana mua a kūkulu iā lākou i loko rootfs. no ka /var ʻO kahi ala hiki ke kau ʻia ma kahi ʻāpana hiki ke kākau ʻia, ʻoiai / kau ʻia he heluhelu wale nō. ʻO kahi koho kaulana ʻē aʻe ʻo ka hoʻohana ʻana i nā puʻu paʻa a i ʻole overlay.

Hiki ke hoʻopili ʻia a hoʻopaʻa ʻia, hoʻohana ʻia e nā pahu

Hoʻokō kauoha man mount ʻo ia ke ala maikaʻi loa e aʻo ai e pili ana i nā puʻu paʻa a hiki ke uhi ʻia, e hāʻawi ana i nā mea hoʻomohala a me nā luna ʻōnaehana i hiki ke hana i kahi ʻōnaehana faila ma kahi ala a laila e hōʻike i nā noi ma kahi ʻē aʻe. No nā ʻōnaehana hoʻopili, ʻo ia ka hiki ke mālama i nā faila i loko /var ma kahi kaʻa uila heluhelu wale nō, akā he ala mauna i uhi ʻia a hoʻopili ʻia mai tmpfs в /var ke hoʻouka ʻia, e ʻae ia i nā noi e kākau i nā memo ma laila (scrawl). I ka manawa aʻe e hoʻohuli ai ʻoe i nā hoʻololi i /var e lilo ana. Hoʻokumu kahi mauna overlay i kahi hui ma waena tmpfs a me ka ʻōnaehana faila lalo a hiki iā ʻoe ke hana i nā loli ostensible i nā faila i loaʻa i loko ro-tootf akā, hiki i kahi mauna paʻa ke hoʻoneʻe i nā mea hou tmpfs ʻike ʻia nā waihona e like me ke kākau ʻana i loko ro-rootfs ala. ʻOiai overlayfs ʻo kēia ka mea kūpono (proper) ʻano ʻōnaehana faila, hoʻokomo ʻia ka puʻu paʻa i loko Mokuna inoa VFS.

Ma muli o ka wehewehe ʻana o ka overlay a me ka mauna pili, ʻaʻohe mea e kahaha i kēlā Nā pahu Linux hoʻohana ikaika ʻia lākou. E ʻike kākou i ka mea e hoʻohana ai ʻōnaehana-nspawn e holo i ka ipu me ka mea paahana mountsnoop от bcc.

Paʻi system-nspawn hoʻomaka ka pahu i ka wā e holo ana mountsnoop.py.

E ʻike kākou i ka mea i hana ʻia:

Hoʻollo mountsnoop ʻoiai ke "booting" ka pahu e hōʻike ana ua hilinaʻi nui ka holo o ka pahu i ka mauna i hoʻopili ʻia (ʻO ka hoʻomaka wale nō o ka puka lōʻihi e hōʻike ʻia).

he mea systemd-nspawn hāʻawi i nā faila i koho ʻia ma procfs и sysfs hoʻokipa i ka ipu i ala e hele ai rootfs. ^ E Ha yM. ʻOae MS_BIND ʻO ka hae e hoʻonohonoho i ka mauna paʻa, ʻo kekahi mau hae ʻē aʻe ma ka mauna e wehewehe i ka pilina ma waena o nā hoʻololi i ka host a me ka pahu inoa. No ka laʻana, hiki i kahi mauna i hoʻopili ʻia ke lele i nā loli i /proc и /sys i loko o ka pahu, a hūnā paha iā lākou ma muli o ke kelepona.

hopena

ʻO ka hoʻomaopopo ʻana i ka hana o loko o Linux e like paha me kahi hana hiki ʻole, no ka mea he nui nā code i loko o ka kernel ponoʻī, e haʻalele ana i nā noi kikowaena Linux mea hoʻohana a me nā pilina kelepona pūnaewele i nā hale waihona puke C e like me glibc. ʻO kahi ala e holomua ai, ʻo ia ka heluhelu ʻana i ke kumu kumu o hoʻokahi kernel subsystem, me ka manaʻo nui i ka hoʻomaopopo ʻana i nā kelepona ʻōnaehana a me nā poʻo poʻomanaʻo hoʻohana-space, a me nā pilina kernel kūloko nui, e like me ka papaʻaina. file_operations. Hāʻawi nā hana faila i ke kumu "he faila nā mea āpau", e ʻoluʻolu loa iā lākou ke hoʻokele. C kernel kumu waihona ma ka papa kuhikuhi kiʻekiʻe fs/ hōʻike i ka hoʻokō ʻana i nā ʻōnaehana faila virtual, ʻo ia kahi papa wīwī e hāʻawi ana i ka laulima ākea a maʻalahi hoʻi ma waena o nā ʻōnaehana faila kaulana a me nā mea mālama. ʻO ka hoʻopili ʻana a me ke kau ʻana ma luna o nā inoa inoa Linux ʻo ia ka mea kilokilo o VFS e hiki ai ke hana i nā ipu heluhelu wale nō a me nā ʻōnaehana file root. Hoʻohui ʻia me ka nānā ʻana i ke code kumu, ka mea hana kumu eBPF a me kāna interface bcc
e maʻalahi ana ka ʻimi kumu ma mua o ka wā ma mua.

E nā hoaaloha, e kākau, pono anei kēia ʻatikala iā ʻoe? He mau manaʻo paha kāu? A ua kono ʻia ka poʻe hoihoi i ka papa Linux Administrator Lā Hāmama, e hana ʻia ana ma ʻApelila 18.

Ma ka ʻāpana mua.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka