Silav her kesî, em beşa duyemîn a weşana "Pergalên pelan ên virtual di ... de" bi we re parve dikin. LinuxÇima pêwîst in û çawa dixebitin? Beşa yekem dikare were xwendin . Ka em ji we re bi bîr bînin ku ev rêze weşanan bi destpêkirina qursek nû re hevdem e. , ku pir zû dest pê dike.
Meriv çawa VFS-ê bi karanîna amûrên eBPF û bcc çavdêrî dike
Awayê herî hêsan ku meriv fêm bike ka kernel li ser pelan çawa dixebite sysfs dîtina wê di pratîkê de ye, û riya herî hêsan a temaşekirina ARM64 karanîna eBPF ye. eBPF (kurteya Parzûna Pakê ya Berkeley) ji makîneyek virtual ku tê de dixebite pêk tê , ku bikarhênerên xwedî îmtiyaz dikarin daxwaz bikin (query) ji rêzika fermanê. Çavkaniyên kernel ji xwendevan re dibêjin ku kernel dikare çi bike; xebitandina amûrên eBPF li ser pergalek barkirî nîşan dide ku kernel bi rastî çi dike.

Xwezî, destpêkirina karanîna eBPF bi alîkariya amûran pir hêsan e , ku wekî pakêtên ji belavkirina gelemperî hene û bi berfirehî hatiye belgekirin . Amûrên bcc Skrîptên Python-ê bi navgînên piçûk ên koda C-yê ne, ku tê vê wateyê ku her kesê ku bi her du zimanan jî nas dike dikare bi hêsanî wan biguhezîne. LI bcc/tools 80 nivîsarên Python hene, ku tê vê wateyê ku bi îhtîmalek mezin pêşdebirek an rêveberê pergalê dê bikaribe ji bo çareserkirina pirsgirêkê tiştek guncan hilbijêrin.
Ji bo ku hûn bi kêmanî ramanek rûbirû ya ku VFS li ser pergalek xebitandinê dikin, biceribînin vfscount an vfsstat. Ev dê nîşan bide, em bêjin, ku bi dehan bang vfs_open() û "hevalên wî" bi rastî her saniye diqewimin.

vfsstat.pySkrîpta Python-ê ye ku bi navgîniya koda C-yê ve tê de ye ku tenê bangên fonksiyona VFS-ê dihejmêre.
Werin em mînakek piçûktir bidin û bibînin ka çi diqewime dema ku em ajokerek USB-yê têxin nav komputerek û pergal wê nas bike.

Bi karanîna eBPF hûn dikarin bibînin ka çi diqewime
/sysdema ku ajokerek flash USB tête danîn. Nimûneyek hêsan û tevlihev li vir tê nîşandan.
Di mînaka jorîn de, bcc amûr dema ku ferman tê meşandin peyamek çap dike sysfs_create_files(). Em vê yekê dibînin sysfs_create_files() bi kar hat destpêkirin kworker stream di bersiva vê rastiyê de ku ajokera flashê hate danîn, lê kîjan pelê hate afirandin? Mînaka duyemîn hêza eBPF nîşan dide. Vir trace.py Paşvekêşana kernelê (vebijarka -K) û navê pelê ku hatî çêkirin çap dike sysfs_create_files(). Tevnekirina daxuyaniya yekane koda C ye ku tê de rêzikek formatek bi hêsanî tê nas kirin ku ji hêla skrîpta Python ve ku LLVM dimeşîne ve tê peyda kirin. berhevkarê tenê-di-demê. Ew vê rêzê berhev dike û di makîneyek virtual ya di hundurê kernelê de pêk tîne. îmza fonksiyona Full sysfs_create_files () Pêdivî ye ku di fermana duyemîn de were nûve kirin da ku rêzika formatê bikaribe yek ji pîvanan vebêje. Çewtiyên di vê perçeya koda C de ji berhevkarê C-yê xeletiyên naskirî encam didin. Mînakî, heke pîvana -l ji holê rabe, hûn ê bibînin "Berhevkirina nivîsa BPF têk çû." Pêşdebirên ku bi C û Python-ê dizanin dê amûran bibînin bcc bi hêsanî berfirehkirin û guhertin.
Dema ku ajokera USB-ê tê xistin, paşkêşiya kernel dê nîşan bide ku PID 7711 mijarek e kworkerku pelê çêkir «events» в sysfs. Li gorî vê yekê, banga ji sysfs_remove_files() dê nîşan bide ku rakirina ajokerê bûye sedema jêbirina pelê events, ku bi têgeha giştî ya hejmartina referansê re têkildar e. Di heman demê de, dîtin sysfs_create_link () bi eBPF re dema ku ajokera USB-ê têxe nav wê nîşan bide ku bi kêmî ve 48 girêdanên sembolîk hatine afirandin.
Ji ber vê yekê dosyaya bûyeran çi ye? Bikaranîna Ji bo lêgerînê , nîşan dide ku ew çi dibe sedema disk_add_events (), û yan "media_change"an jî "eject_request" dikare di dosyayek bûyerê de were tomar kirin. Li vir qata bloka kernelê cîhê bikarhêner agahdar dike ku "dîskek" xuya bûye û derketiye. Bala xwe bidin ka ev rêbaza lêkolînê bi danasîna ajokerek USB-ê çiqas agahdar e, li gorî hewildana ku hûn fêr bibin ka tişt bi tenê ji çavkaniyê çawa dixebitin.
Pergalên pelan ên root-tenê-xwendin amûrên pêvekirî çalak dikin
Bê guman, kes server an komputera xwe bi kişandina fîşa ji soketê venake. Lê çima? Ev ji ber ku pergalên pelan ên siwarkirî yên li ser cîhazên hilanînê yên laşî dibe ku nivîsandina derengmayî be, û strukturên daneyê yên ku rewşa wan tomar dikin dibe ku bi nivîsandina hilanînê re neyên hevdem kirin. Dema ku ev diqewime, xwedan pergalê neçar in ku li benda boota din bisekinin ku karûbar dest pê bikin. fsck filesystem-recovery û, di rewşa herî xirab de, windakirina daneyan.
Lêbelê, em hemî dizanin ku gelek cîhazên IoT, û her weha router, termostat û otomobîl, naha li ser dixebitin LinuxGelek ji van cîhazan hema bêje tu navrûyeke bikarhêner nînin, û rêyek tune ku ew bi awayekî paqij werin girtin. Xeyal bikin ku hûn otomobîlekê bi bataryayek mirî didin destpêkirin dema ku elektrîka cîhaza kontrolê qut dibe. bi berdewamî jor û jêr dadikeve. Çawa ew e ku pergalê bêyî demek dirêj dest pê dike fsckkengî motor di dawiyê de dest pê dike? Û bersiv hêsan e. Amûrên pêvekirî xwe dispêrin pergala pelê root (kurtkirî ro-rootfs (pergala pelê root-tenê-xwendin)).
ro-rootfs gelek feydeyên ku ji rastiyê kêmtir eşkere ne pêşkêş dikin. Yek avantaj ev e ku malware nikare binivîsîne /usr an /lib, eger pêvajo tune be Linux nikare lê binivîse. Yekî din jî ev e ku pergaleke pelan a bi piranî neguhêrbar ji bo piştgiriya zeviyê ya cîhazên dûr girîng e, ji ber ku karmendên piştgiriyê pergalên herêmî bikar tînin ku bi navê xwe bi pergalên li ser cîh re yek in. Dibe ku avantaja herî girîng (lê di heman demê de ya herî nepenî jî) ev e ku ro-rootfs pêşdebiran neçar dike ku di destpêka sêwirana pergalê de biryar bidin ka kîjan tiştên pergalê dê neguhêrbar bin. Xebata bi ro-rootfs re dikare nebaş û êşdar be, wekî ku pir caran bi guherbarên const di zimanên bernamesaziyê de dibe, lê feydeyên wê bi hêsanî ji serbarê zêde girîngtir in.
creation rootfs Fonksiyona tenê-xwendinê ji bo pêşdebirên çespandî hin hewldanek zêde hewce dike, û li vir e ku VFS tê de dilîze. Linux pêwîst dike ku pelên di nav de /var nivîsandinê bûn, û ji bilî vê, gelek serîlêdanên populer ên ku pergalên binavkirî dimeşînin dê hewl bidin ku veavakirinê biafirînin dot-files в $HOME. Yek çareseriyek ji bo pelên vesazkirinê yên di pelrêça malê de bi gelemperî pêş-hilberandin û avakirina wan e rootfs. bo /var Yek nêzîkatiyek gengaz ev e ku meriv wê li ser dabeşek veqetandî ya veqetandî bihêle, dema / bi tenê-xwendinê siwar kirin. Alternatîfek din a populer ev e ku meriv mountên girêdan an pêvekirî bikar bîne.
Çiyayên girêdan û stûnbar, karanîna wan ji hêla konteyneran ve
Pêkanîna fermanekê man mount awayê çêtirîn e ku meriv li ser çiyayên bindable û servekirî fêr bibe, ku ji pêşdebiran û rêvebirên pergalê re şansê dide ku di rêyek de pergalek pelan biafirînin û dûv re wê ji serîlêdanên di rêyek din re eşkere bikin. Ji bo pergalên pêvekirî, ev tê vê wateyê ku kapasîteya hilanîna pelan tê de ye /var li ser ajokerek flash-tenê-xwendin, lê rêyek pêvekirî an girêdana çiyê ji tmpfs в /var dema barkirinê, ew ê bihêle ku serîlêdan li wir notan binivîsin (scrawl). Cara din ku hûn guheztinan vekin /var dê winda bibin. Çiyayek sergirtî di navbera hev de yekîtiyê çêdike tmpfs û pergala pelê ya bingehîn û destûrê dide te ku hûn di pelên heyî de guhertinên berbiçav bikin ro-tootf di heman demê de çiyayek girêdeyî dikare yên nû vala bike tmpfs peldankên ku di nav de têne nivîsandin têne xuyang kirin ro-rootfs awayên. Demek overlayfs ev rast e (proper) Cureyê pergala pelê, çîyayê bindable tê de tête bicîh kirin .
Li ser bingeha danasîna serpêhatî û çiyayê girêdanê, kes ji vê yekê şaş nabe ew bi awayekî çalak têne bikaranîn. Ka em bibînin ka dema ku em bikar tînin çi dibe da ku konteynerê bi karanîna amûrê bimeşîne mountsnoop ji bcc.
Rallenge system-nspawn dema ku dimeşe konteynir dest pê dike mountsnoop.py.
Ka em bibînin ka çi bûye:
Berdaye mountsnoop dema ku konteynir "booting" e destnîşan dike ku dema xebitandina konteynerê pir bi çîyayê ve girêdayî ye (Tenê destpêka derana dirêj tê xuyang kirin).
Ev e systemd-nspawn pelên hilbijartî tê de peyda dike procfs и sysfs mazûvaniya konteynerê wekî rêyên wê rootfs... Bêyî MS_BIND ala ku çîyayê girêdanê saz dike, hin alayên din ên li ser çiyê têkiliya di navbera guheztinên cîhên navên mêvandar û konteynerê de diyar dikin. Mînakî, çiyakek girêdayî dikare ji guhertinan derbas bibe /proc и /sys di konteynerê de, an li gorî bangê wan veşêrin.
encamê
Têgihîştina avahiya navxweyî Linux dibe ku wekî karekî ne gengaz xuya bike, ji ber ku kernel bi xwe gelek kod dihewîne, sepanên cîhê bikarhêner li aliyekî dihêle Linux û navrûyên banga pergalê di pirtûkxaneyên C de wekî glibc. Yek rê ji bo pêşkeftinê ev e ku meriv koda çavkaniyê ya yek binepergala kernelê bixwîne, bi giranî li ser têgihîştina bangên pergalê û sernavên cîhê bikarhêner, û her weha navbeynkên sereke yên kernelê yên navxweyî, wek tablo. file_operations. Operasyonên pelan prensîba "her tişt pelek e" peyda dike, ku wan bi taybetî bi rêvebirinê xweş dike. Pelên çavkaniya kernel C di pelrêça asta jorîn de fs/ pêkanînek ji pergalên pelan ên virtual temsîl dikin, ku tebeqeyek pêçanê ne ku lihevhatinek berfireh û nisbeten hêsan di navbera pergalên pelan ên populer û cîhazên hilanînê de peyda dike. Sazkirin bi girêdan û sergirtî bi rêya navên cihan Linux — ew sêrbaziya VFS ye ku çêkirina konteyner û pergalên pelên root ên tenê-xwendin gengaz dike. Digel lêkolînek li ser koda çavkaniyê, amûra kernel a eBPF û navrûya wê. bcc
lêgerîna bingehîn ji her demê hêsantir dike.
Hevalno, ji min re bibêjin ka ev gotar ji we re kêrhatî bû. Dibe ku şîrove an pêşniyarên we hebin? Û ji bo kesên ku bi qursa "Rêvebir" re eleqedar in, Linux", em we vedixwînin ku , ku dê di 18ê Nîsanê de pêk were.
Source: www.habr.com
