Awọn ọna faili foju ni Lainos: kilode ti wọn nilo ati bawo ni wọn ṣe n ṣiṣẹ? Apa 2

Kaabo gbogbo eniyan, a n pin pẹlu rẹ apakan keji ti ikede “Awọn ọna ṣiṣe faili foju ni Linux: kilode ti wọn nilo ati bawo ni wọn ṣe n ṣiṣẹ?” O le ka apakan akọkọ nibi. Jẹ ki a leti pe jara ti awọn atẹjade yii jẹ akoko lati ṣe deede pẹlu ifilọlẹ ṣiṣan tuntun kan lori iṣẹ-ẹkọ naa. "Alakoso Linux", eyiti o bẹrẹ laipẹ.

Bii o ṣe le ṣe atẹle VFS nipa lilo awọn irinṣẹ eBPF ati bcc

Ọna to rọọrun lati ni oye bi ekuro ṣe n ṣiṣẹ lori awọn faili sysfs ni lati rii ni iṣe, ati pe ọna ti o rọrun julọ lati wo ARM64 ni lati lo eBPF. eBPF (kukuru fun Berkeley Packet Filter) ni ẹrọ foju kan ti n ṣiṣẹ ninu mojuto, eyiti awọn olumulo ti o ni anfani le beere (query) lati laini aṣẹ. Awọn orisun kernel sọ fun oluka ohun ti ekuro le ṣe; nṣiṣẹ awọn irinṣẹ eBPF lori eto ti kojọpọ fihan ohun ti ekuro n ṣe ni otitọ.

Awọn ọna faili foju ni Lainos: kilode ti wọn nilo ati bawo ni wọn ṣe n ṣiṣẹ? Apa 2

Ni Oriire, bibẹrẹ lilo eBPF jẹ ohun rọrun pẹlu iranlọwọ ti awọn irinṣẹ Bcc, eyiti o wa bi awọn idii lati pinpin gbogbogbo Linux ati ni akọsilẹ ni apejuwe awọn Bernard Gregg. Awọn irinṣẹ bcc jẹ awọn iwe afọwọkọ Python pẹlu awọn ifibọ kekere ti koodu C, eyiti o tumọ si pe ẹnikẹni ti o faramọ awọn ede mejeeji le yipada ni irọrun. IN bcc/tools Awọn iwe afọwọkọ Python 80 wa, eyiti o tumọ si pe o ṣeeṣe julọ ti olupilẹṣẹ tabi oluṣakoso eto yoo ni anfani lati yan nkan ti o dara fun yiyan iṣoro naa.
Lati ni o kere ju imọran lasan ti kini iṣẹ VFS ṣe lori eto ṣiṣe, gbiyanju vfscount tabi vfsstat. Eyi yoo fihan, jẹ ki a sọ, pe dosinni ti awọn ipe vfs_open() ati "awọn ọrẹ rẹ" ṣẹlẹ gangan ni gbogbo iṣẹju.

Awọn ọna faili foju ni Lainos: kilode ti wọn nilo ati bawo ni wọn ṣe n ṣiṣẹ? Apa 2

vfsstat.py jẹ iwe afọwọkọ Python pẹlu awọn ifibọ koodu C ti o rọrun ka awọn ipe iṣẹ VFS.

Jẹ ki a fun apẹẹrẹ bintin diẹ sii ki o wo ohun ti o ṣẹlẹ nigbati a ba fi kọnputa filasi USB sinu kọnputa kan ati pe eto naa rii.

Awọn ọna faili foju ni Lainos: kilode ti wọn nilo ati bawo ni wọn ṣe n ṣiṣẹ? Apa 2

Lilo eBPF o le wo ohun ti n ṣẹlẹ ninu /sysnigbati okun USB ti wa ni fi sii. Apeere ti o rọrun ati eka ti han nibi.

Ninu apẹẹrẹ ti o han loke, bcc irinṣẹ wa kakiri.py tẹjade ifiranṣẹ nigbati aṣẹ ba ṣiṣẹ sysfs_create_files(). A ri pe sysfs_create_files() ti ṣe ifilọlẹ nipa lilo kworker ṣiṣan ni idahun si otitọ pe a ti fi kọnputa filasi sii, ṣugbọn kini faili ti o ṣẹda? Apẹẹrẹ keji fihan agbara eBPF. Nibi trace.py Ṣe atẹjade kernel backtrace (aṣayan-K) ati orukọ faili ti o ṣẹda sysfs_create_files(). Fi sii gbólóhùn ẹyọkan jẹ koodu C ti o pẹlu okun ọna kika ti o ni irọrun ti a pese nipasẹ iwe afọwọkọ Python ti o nṣiṣẹ LLVM o kan-ni-akoko alakojo. O ṣe akopọ laini yii o si ṣiṣẹ ni ẹrọ foju kan inu ekuro naa. Ibuwọlu iṣẹ ni kikun sysfs_create_files () gbọdọ tun ṣe ni aṣẹ keji ki okun ọna kika le tọka si ọkan ninu awọn paramita. Awọn aṣiṣe ninu nkan ti koodu C yii ni abajade ni awọn aṣiṣe ti o ṣe idanimọ lati inu akojọpọ C. Fun apẹẹrẹ, ti paramita -l ba ti yọkuro, iwọ yoo rii “Kuna lati ṣajọ ọrọ BPF.” Awọn olupilẹṣẹ ti o faramọ pẹlu C ati Python yoo wa awọn irinṣẹ bcc rọrun lati faagun ati yipada.

Nigbati a ba fi kọnputa USB sii, kernel backtrace yoo fihan pe PID 7711 jẹ okun. kworkerti o ṣẹda faili naa «events» в sysfs. Accordingly, ipe lati sysfs_remove_files() yoo fihan pe yiyọ awakọ naa yọrisi pe faili ti paarẹ events, eyiti o ni ibamu si imọran gbogbogbo ti kika itọkasi. Ni akoko kanna, wiwo sysfs_create_link () pẹlu eBPF lakoko fifi sii kọnputa USB yoo fihan pe o kere ju awọn ọna asopọ aami 48 ti ṣẹda.

Nitorinaa kini aaye ti faili iṣẹlẹ naa? Lilo gogo pari Fun wiwa _ẹrọ_afikun_disk(), fihan ohun ti o fa disk_add_events (), ati boya "media_change", tabi "eject_request" le ṣe igbasilẹ ni faili iṣẹlẹ kan. Nibi Layer block kernel sọfun aaye olumulo pe “disk” kan ti han ati jade. Ṣe akiyesi bawo ni ọna iwadii yii ṣe jẹ alaye nipa fifi kọnputa USB sii, ni akawe si igbiyanju lati ro ero bi awọn nkan ṣe n ṣiṣẹ lasan lati orisun.

Awọn ọna faili gbongbo kika-nikan jẹ ki awọn ẹrọ ti a fi sii

Nitoribẹẹ, ko si ẹnikan ti o pa olupin tabi kọnputa wọn nipa fifaa pulọọgi lati iho. Ṣugbọn kilode? Eyi jẹ nitori awọn ọna ṣiṣe faili ti a gbe sori awọn ẹrọ ibi ipamọ ti ara le ti kọ silẹ, ati awọn ẹya data ti o ṣe igbasilẹ ipinlẹ wọn le ma ṣe muuṣiṣẹpọ pẹlu kikọ si ibi ipamọ naa. Nigbati eyi ba ṣẹlẹ, awọn oniwun eto ni lati duro titi bata atẹle lati ṣe ifilọlẹ ohun elo naa. fsck filesystem-recovery ati, ninu awọn buru nla, nu data.

Sibẹsibẹ, gbogbo wa mọ pe ọpọlọpọ awọn ẹrọ IoT, ati awọn onimọ-ọna, awọn iwọn otutu ati awọn ọkọ ayọkẹlẹ, ni bayi nṣiṣẹ Linux. Pupọ ninu awọn ẹrọ wọnyi ni diẹ si ko si ni wiwo olumulo, ati pe ko si ọna lati pa wọn “ni mimọ.” Fojuinu ti o bẹrẹ ọkọ ayọkẹlẹ kan pẹlu batiri ti o ku nigbati agbara si ẹrọ iṣakoso jẹ Linux nigbagbogbo fo si oke ati isalẹ. Bawo ni o jẹ pe awọn bata orunkun eto lai gun fscknigbawo ni engine nipari bẹrẹ ṣiṣe? Ati awọn idahun ni o rọrun. Awọn ẹrọ ifibọ gbarale eto faili gbongbo nikan fun kika (kikuru ro-rootfs (ka-nikan root fileystem)).

ro-rootfs pese ọpọlọpọ awọn anfani ti o kere ju ti otitọ lọ. Ọkan anfani ni wipe malware ko le kọ si /usr tabi /lib, ti ko ba si ilana Linux le kọ nibẹ. Omiiran ni pe eto faili ti ko le yipada jẹ pataki fun atilẹyin aaye ti awọn ẹrọ latọna jijin, nitori pe oṣiṣẹ atilẹyin gbarale awọn eto agbegbe ti o jẹ aami aami si awọn eto aaye. Boya anfani ti o ṣe pataki julọ (ṣugbọn paapaa aibikita) anfani ni pe ro-rootfs fi agbara mu awọn olupilẹṣẹ lati pinnu iru awọn ohun elo eto yoo jẹ ailagbara ni ipele apẹrẹ ti eto naa. Nṣiṣẹ pẹlu ro-rootfs le jẹ airọrun ati irora, bi awọn oniyipada const nigbagbogbo wa ni awọn ede siseto, ṣugbọn awọn anfani wọn ni irọrun ṣe idalare afikun afikun.

Ṣẹda rootfs Ka-nikan nilo diẹ ninu igbiyanju afikun fun awọn olupilẹṣẹ ifibọ, ati eyi ni ibiti VFS wa sinu aworan naa. Lainos nilo pe awọn faili wa ninu /var jẹ kikọ, ati ni afikun, ọpọlọpọ awọn ohun elo olokiki ti o ṣiṣẹ awọn eto ifibọ yoo gbiyanju lati ṣẹda iṣeto ni dot-files в $HOME. Ojutu kan fun awọn faili iṣeto ni ilana ile jẹ igbagbogbo lati ṣe ipilẹṣẹ ati kọ wọn sinu rootfs. Fun /var Ọkan ṣee ṣe ona ni lati gbe o lori lọtọ writable ipin, nigba ti / agesin kika-nikan. Omiiran olokiki miiran ni lati lo dipọ tabi awọn agbekọja.

Linkable ati stackable gbeko, wọn lilo nipasẹ awọn apoti

Ṣiṣe pipaṣẹ kan man mount jẹ ọna ti o dara julọ lati kọ ẹkọ nipa bindable ati awọn agbeko agbekọja, eyiti o fun awọn olupilẹṣẹ ati awọn oludari eto ni agbara lati ṣẹda eto faili ni ọna kan ati lẹhinna fi han si awọn ohun elo ni omiiran. Fun awọn eto ifibọ, eyi tumọ si agbara lati fipamọ awọn faili sinu /var on a kika-nikan filasi drive, ṣugbọn ohun agbekọja tabi linkable òke ona lati tmpfs в /var nigba ikojọpọ, yoo gba awọn ohun elo laaye lati kọ awọn akọsilẹ nibẹ (scrawl). Nigbamii ti o ba tan awọn ayipada si /var yoo sọnu. Ohun agbekọja òke ṣẹda a Euroopu laarin tmpfs ati eto faili ti o wa labẹ ati gba ọ laaye lati ṣe awọn ayipada ostensible si awọn faili to wa ninu ro-tootf nígbà tí òke tí a lè so pọ̀ lè sọ àwọn tuntun di òfo tmpfs awọn folda han bi a kọ sinu ro-rootfs awọn ọna. Lakoko overlayfs eyi ni ẹtọ (proper) iru eto faili, oke bindable ti wa ni imuse ni Aaye orukọ VFS.

Da lori apejuwe ti agbekọja ati ọna asopọ, ko si ọkan ti o yà pe Linux awọn apoti ti won ti wa ni actively lo. Jẹ ki a wo ohun ti o ṣẹlẹ nigbati a ba lo systemd-nspawn lati ṣiṣe awọn eiyan lilo awọn ọpa mountsnoop lati bcc.

Pe system-nspawn bẹrẹ awọn eiyan nigba ti nṣiṣẹ mountsnoop.py.

Jẹ ká wo ohun to sele:

Запуск mountsnoop nigba ti eiyan ti wa ni "booting" fihan wipe awọn eiyan ká asiko isise jẹ gíga ti o gbẹkẹle lori awọn òke ti wa ni ti sopọ (Nikan ni ibere ti awọn gun o wu ti han).

o ti wa ni systemd-nspawn pese awọn faili ti o yan ni procfs и sysfs gbalejo to eiyan bi ona si o rootfs... ayafi MS_BIND Flag ti o ṣeto soke abuda òke, diẹ ninu awọn miiran awọn asia lori òke setumo awọn ibasepọ laarin awọn ayipada si ogun ati eiyan namespaces. Fun apẹẹrẹ, oke ti a ti sopọ le boya foju awọn ayipada si /proc и /sys sinu apoti, tabi tọju wọn da lori ipe.

ipari

Loye awọn iṣẹ inu ti Lainos le dabi ẹnipe iṣẹ ti ko ṣeeṣe, nitori ekuro funrararẹ ni iye pupọ ti koodu, nlọ kuro ni apakan awọn ohun elo aaye olumulo Linux ati awọn atọkun ipe eto ni awọn ile-ikawe C gẹgẹbi glibc. Ọnà kan lati ni ilọsiwaju ni lati ka koodu orisun ti eto abẹlẹ ekuro kan, pẹlu tcnu lori agbọye awọn ipe eto ati awọn akọle aaye olumulo, ati awọn atọkun ekuro inu akọkọ, gẹgẹbi tabili. file_operations. Awọn iṣẹ ṣiṣe faili pese ipilẹ “ohun gbogbo jẹ faili kan”, ṣiṣe wọn ni igbadun ni pataki lati ṣakoso. Awọn faili orisun kernel C ninu itọsọna ipele-oke fs/ ṣafihan imuse ti awọn ọna ṣiṣe faili foju, eyiti o jẹ Layer ipari ti o pese ibaramu gbooro ati irọrun ti o rọrun laarin awọn eto faili olokiki ati awọn ẹrọ ibi ipamọ. Sisopọ ati iṣagbesori agbekọja nipasẹ awọn aaye orukọ Linux jẹ idan ti VFS ti o jẹ ki o ṣee ṣe lati ṣẹda awọn apoti kika-nikan ati awọn eto faili gbongbo. Ni idapọ pẹlu idanwo koodu orisun, ohun elo eBPF mojuto ati wiwo rẹ bcc
ṣiṣe awọn mojuto iwakiri rọrun ju lailai.

Awọn ọrẹ, kọ, ṣe nkan yii wulo fun ọ? Boya o ni eyikeyi awọn asọye tabi awọn asọye? Ati pe awọn ti o nifẹ si ilana Alakoso Linux ni a pe si Open Day, eyiti yoo waye ni Oṣu Kẹrin Ọjọ 18.

Apa akọkọ.

orisun: www.habr.com

Fi ọrọìwòye kun