Sistemụ faịlụ mebere na Linux: kedu ihe kpatara achọrọ ha yana kedu ka ha si arụ ọrụ? Akụkụ 2

Ndewo onye ọ bụla, anyị na-ekerịta gị akụkụ nke abụọ nke mbipụta “Sistemụ faịlụ mebere na Linux: kedu ihe kpatara achọrọ ha yana kedu ka ha si arụ ọrụ?” Ị nwere ike ịgụ akụkụ nke mbụ ebe a. Ka anyị chetara gị na usoro mbipụta a bụ oge dabara na mmalite nke iyi ọhụrụ na nkuzi a. "Onye nchịkwa Linux", nke na-amalite ngwa ngwa.

Otu esi enyocha VFS site na iji eBPF na bcc ngwaọrụ

Ụzọ kachasị mfe iji ghọta ka kernel si arụ ọrụ na faịlụ sysfs bụ ịhụ ya na omume, na ụzọ kachasị mfe iji lelee ARM64 bụ iji eBPF. eBPF (obere maka Berkeley Packet Filter) nwere igwe mebere nke na-abanye isi, nke ndị ọrụ nwere oke nwere ike ịrịọ (query) site na ahịrị iwu. Isi mmalite kernel na-agwa onye na-agụ ihe kernel nwere ike ime; na-agba ọsọ eBPF ngwaọrụ na sistemu arụnyere na-egosi ihe kernel na-eme n'ezie.

Sistemụ faịlụ mebere na Linux: kedu ihe kpatara achọrọ ha yana kedu ka ha si arụ ọrụ? Akụkụ 2

Ọ dabara nke ọma, ịmalite iji eBPF dị mfe site n'enyemaka nke ngwaọrụ Bcc, nke dị ka ngwugwu sitere na nkesa izugbe Linux ma dekwaa ya nke ọma Bernard Gregg. Ngwa bcc bụ script Python nwere obere ntinye nke koodu C, nke pụtara na onye ọ bụla maara asụsụ abụọ ahụ nwere ike gbanwee ha ngwa ngwa. N'ime bcc/tools Enwere script Python 80, nke pụtara na o yikarịrị ka onye nrụpụta ma ọ bụ onye nchịkwa sistemụ ga-enwe ike ịhọrọ ihe kwesịrị ekwesị maka idozi nsogbu ahụ.
Iji nweta ma ọ dịkarịa ala echiche dị elu nke ihe ọrụ VFS na-arụ na sistemụ na-agba ọsọ, gbalịa vfscount ma ọ bụ vfsstat. Nke a ga-egosi, ka anyị kwuo, na ọtụtụ oku vfs_open() na “ndị enyi ya” na-eme n'ezie kwa sekọnd ọ bụla.

Sistemụ faịlụ mebere na Linux: kedu ihe kpatara achọrọ ha yana kedu ka ha si arụ ọrụ? Akụkụ 2

vfsstat.py bụ edemede Python nwere ntinye koodu C nke na-agụta oku ọrụ VFS.

Ka anyị nye ihe atụ na-abaghị uru ma hụ ihe na-eme ma anyị tinye draịvụ USB n'ime kọmpụta wee chọpụta ya.

Sistemụ faịlụ mebere na Linux: kedu ihe kpatara achọrọ ha yana kedu ka ha si arụ ọrụ? Akụkụ 2

Iji eBPF ị nwere ike ịhụ ihe na-eme na /sysmgbe etinyere eriri USB. E gosipụtara ihe atụ dị mfe ma dị mgbagwoju anya ebe a.

N'ihe atụ egosiri n'elu, bcc ihe eji eme ihe trace.py na-ebipụta ozi mgbe iwu na-agba sysfs_create_files(). Anyị na-ahụ nke ahụ sysfs_create_files() eji kworker iyi na nzaghachi eziokwu na etinyere flash mbanye, ma kedu faịlụ e kere? Ihe atụ nke abụọ na-egosi ike eBPF. Ebe a trace.py Na-ebipụta kernel backtrace (-K nhọrọ) yana aha faịlụ emepụtara sysfs_create_files(). Otu ntinye nkwupụta bụ koodu C nke gụnyere eriri usoro a na-amata ngwa ngwa nke script Python na-arụ LLVM nyere. ngwa-ngwa-ngwa-ngwa. Ọ na-achịkọta ahịrị a wee rụọ ya na igwe mebere n'ime kernel. mbinye aka ọrụ zuru oke sysfs_create_files () a ga-emegharịghachi na iwu nke abụọ ka eriri usoro wee na-ezo aka na otu n'ime paramita. Njehie dị na koodu C nke a na-ebute mperi enwere ike ịmata site na nchịkọta C. Dịka ọmụmaatụ, ọ bụrụ na ewepụrụ paramita -l, ị ga-ahụ "Enweghị ike chịkọta ederede BPF." Ndị mmepe maara C na Python ga-achọta ngwaọrụ bcc dị mfe ịgbasa ma gbanwee.

Mgbe etinyere draịva USB, kernel backtrace ga-egosi na PID 7711 bụ eri. kworkernke kere faịlụ «events» в sysfs. N'ihi ya, oku si sysfs_remove_files() ga-egosi na iwepụ mbanye ahụ mere ka ihichapụ faịlụ ahụ events, nke dabara na echiche izugbe nke ngụkọ ntụaka. N'otu oge ahụ, ikiri sysfs_create_link () ya na eBPF ka ị na-etinye draịvụ USB ga-egosi na ọ dịkarịa ala 48 njikọ ihe atụ ka emepụtara.

Yabụ kedu isi ihe bụ faịlụ mmemme ahụ? Ojiji cscope Maka ịchọ _ngwaọrụ_add_disk(), na-egosi ihe ọ na-akpata disk_add_events (), na nke ọ bụla "media_change", ma ọ bụ "eject_request" enwere ike ịdekọ na faịlụ mmemme. N'ebe a, oyi akwa kernel block na-agwa ohere onye ọrụ na "disk" apụtala wee wepụ ya. Rịba ama ka usoro nyocha a si bụrụ ihe ọmụma site n'ịtinye draịva USB, ma e jiri ya tụnyere ịnwa ịchọpụta ka ihe si arụ ọrụ naanị site na isi mmalite.

Sistemu faịlụ mgbọrọgwụ na-agụ naanị na-enyere ngwaọrụ agbakwunyere aka

N'ezie, ọ dịghị onye na-agbanyụ ihe nkesa ma ọ bụ kọmputa ha site na ịdọrọ plọg na oghere. Mana gịnị mere? Nke a bụ n'ihi na sistemụ faịlụ ndị etinyere na ngwaọrụ nchekwa anụ ahụ nwere ike na-ede akwụkwọ na-adịte aka, na usoro data ndị na-edekọ steeti ha nwere ike ọ gaghị emekọrịta ya na ederede na nchekwa ahụ. Mgbe nke a mere, ndị nwe sistemụ ga-echere ruo mgbe buut na-esote ịmalite ọrụ ahụ. fsck filesystem-recovery na, na nke kasị njọ, na-efunahụ data.

Agbanyeghị, anyị niile maara na ọtụtụ ngwaọrụ IoT, yana ndị na-anya ụgbọ ala, igwe ọkụ na ụgbọ ala, na-agba Linux ugbu a. Ọtụtụ n'ime ngwaọrụ ndị a nwere ntakịrị ihe ọ bụla na-enweghị onye ọrụ, ọ nweghịkwa ụzọ isi gbanyụọ ha "dị ọcha." Cheedị echiche ịmalite ụgbọ ala nwere batrị nwụrụ anwụ mgbe ike na ngalaba njikwa dị Linux na-awụli elu na ala mgbe niile. Kedu ka o si bụrụ na akpụkpọ ụkwụ akpụkpọ ụkwụ na-enweghị ogologo oge fsckKedu mgbe injin ahụ ga-amalite ịgba ọsọ? Na azịza dị mfe. Ngwa agbakwunyere na-adabere na sistemụ faịlụ mgbọrọgwụ naanị maka ịgụ ihe (ndebiri) ro-rootfs (agụ-naanị mgbọrọgwụ fileystem)).

ro-rootfs na-enye ọtụtụ uru ndị na-edoghị anya karịa nke bụ eziokwu. Otu uru bụ na malware enweghị ike idegara ya akwụkwọ /usr ma ọ bụ /lib, ma ọ bụrụ na ọ dịghị usoro Linux nwere ike ide ebe ahụ. Ihe ọzọ bụ na sistemụ faịlụ na-enweghị ike ịgbanwe dị oke mkpa maka nkwado ubi nke ngwaọrụ ndị dịpụrụ adịpụ, ebe ọ bụ na ndị ọrụ nkwado na-adabere na sistemụ mpaghara bụ nke yiri usoro ubi. Ikekwe uru kachasị mkpa (mana ọ dịkwa aghụghọ) bụ na ro-rootfs na-amanye ndị mmepe ka ha kpebie ihe sistemụ ga-enweghị ike ịgbanwe n'oge nhazi nke sistemụ. Ịrụ ọrụ na ro-rootfs nwere ike bụrụ ihe na-adịghị mma ma na-egbu mgbu, n'ihi na const variables na-adịkarị na asụsụ mmemme, mana uru ha na-eme ka ọ dị mfe karịa.

kere eke rootfs Ọgụgụ-naanị chọrọ mgbakwunye mgbakwunye maka ndị nrụpụta agbakwunyere, ebe a bụ ebe VFS na-abata na foto a. Linux chọrọ ka faịlụ banye /var bụ ndị a na-ede ede, na mgbakwunye, ọtụtụ ngwa ndị na-ewu ewu na-agba ọsọ na usoro agbakwunyere ga-anwa ịmepụta nhazi dot-files в $HOME. Otu ngwọta maka faịlụ nhazi na ndekọ ụlọ na-abụkarị ibu ụzọ mepụta ma wuo ha n'ime rootfs. N'ihi na /var Otu ụzọ enwere ike ime bụ ịkwanye ya na nkebi ederede dị iche, ebe / etinyere naanị ọgụgụ. Nhọrọ ọzọ na-ewu ewu bụ iji njide ma ọ bụ ihe mkpuchi.

Ngwunye njikọ na stackable, ojiji ha site na arịa

Na-eme iwu man mount bụ ụzọ kachasị mma iji mụta banyere ihe nrịgo a na-ekekọta na nke a na-ekpuchi, nke na-enye ndị mmepe na ndị na-ahụ maka sistemụ ikike ịmepụta usoro faịlụ n'otu ụzọ wee kpughee ya na ngwa ọzọ. Maka sistemụ agbakwunyere, nke a pụtara ikike ịchekwa faịlụ na /var na flash mbanye na-agụ naanị, mana ihe mkpuchi ma ọ bụ ụzọ mgbago nwere ike jikọta site na tmpfs в /var mgbe ị na-ebunye, ọ ga-ekwe ka ngwa dee ndetu ebe ahụ (scrawl). Oge ọzọ ị gbanyere mgbanwe na /var ga-efunahụ. Ngwunye machie na-emepụta njikọ n'etiti tmpfs yana sistemụ faịlụ dị n'okpuru ma na-enye gị ohere ịme mgbanwe na-enweghị atụ na faịlụ ndị dị ugbu a ro-tootf ebe ugwu a na-ekekọta nwere ike ime ka ndị ọhụrụ tọgbọrọ chakoo tmpfs folda a na-ahụ anya dị ka edere na ya ro-rootfs ụzọ. Mgbe overlayfs nke a bụ nke ziri ezi (proper) Ụdị usoro faịlụ, a na-emejuputa n'elu ugwu a na-ekekọta Oghere aha VFS.

Dabere na nkọwa nke mkpuchi mkpuchi na ugwu njikọ, ọ dịghị onye ọ tụrụ anya ya Ngwa Linux ha na-arụsi ọrụ ike. Ka anyị hụ ihe na-eme mgbe anyị na-eji sistemu-nspawn iji na-eji ngwá ọrụ na-agba ọsọ akpa ahụ mountsnoop si bcc.

Kpọọ system-nspawn na-amalite akpa mgbe ọ na-agba ọsọ mountsnoop.py.

Ka anyị hụ ihe merenụ:

Mwepụta mountsnoop ebe akpa ahụ bụ "booting" na-egosi na oge nke akpa ahụ na-adabere na ugwu a na-ejikọta (naanị mmalite nke mmepụta ogologo oge ka egosiri).

ọ bụ systemd-nspawn na-enye faịlụ ahọpụtara n'ime procfs и sysfs nnabata na akpa ka ụzọ ya rootfs... E wezụga MS_BIND Ọkọlọtọ nke na-eguzobe ugwu njide, ụfọdụ ọkọlọtọ ndị ọzọ dị n'elu ugwu ahụ na-akọwa mmekọrịta dị n'etiti mgbanwe ndị nnabata na oghere aha akpa. Dịka ọmụmaatụ, ugwu ejikọrọ nwere ike mafe mgbanwe na /proc и /sys n'ime akpa, ma ọ bụ zoo ha dabere na oku a.

nkwubi

Ịghọta ọrụ dị n'ime nke Linux nwere ike ịdị ka ọrụ na-agaghị ekwe omume, ebe ọ bụ na kernel n'onwe ya nwere koodu buru ibu, na-ahapụ ngwa ngwa ohere onye ọrụ Linux na oghere oku usoro na ụlọ akwụkwọ C dị ka. glibc. Otu ụzọ ị ga-esi nwee ọganihu bụ ịgụ koodu isi mmalite nke otu kernel subsystem, na-emesi ike na ịghọta oku usoro na ndị isi oghere ndị ọrụ, yana isi ihe dị n'ime kernel interface, dị ka tebụl. file_operations. Ọrụ faịlụ na-enye ụkpụrụ "ihe niile bụ faịlụ", na-eme ka ha na-atọ ụtọ karịsịa ijikwa. Faịlụ isi iyi C kernel n'ime ndekọ aha ọkwa dị elu fs/ wepụta mmejuputa usoro faịlụ mebere, nke bụ akwa mkpuchi nke na-enye ndakọrịta sara mbara yana dịtụ mfe n'etiti sistemụ faịlụ ama ama na ngwaọrụ nchekwa. Njikọ na machie na-arị elu site na oghere aha Linux bụ anwansi nke VFS nke na-eme ka ịmepụta igbe na-agụ naanị na usoro faịlụ mgbọrọgwụ ga-ekwe omume. Ejikọtara ya na nyocha nke koodu isi mmalite, ngwa eBPF isi na interface ya bcc
na-eme ka nyocha isi dị mfe karịa mgbe ọ bụla.

Ndị enyi, dee, akụkọ a ọ bara gị uru? Ikekwe ị nwere okwu ma ọ bụ nkwupụta ọ bụla? A na-akpọkwa ndị nwere mmasị na nkuzi nchịkwa Linux Ụbọchị mepere emepe, nke ga-eme na Eprel 18.

Akụkụ mbụ.

isi: www.habr.com

Tinye a comment