Pergalên pelan ên virtual li Linux: çima ew hewce ne û ew çawa dixebitin? Beş 2

Silav her kes, em beşa duyemîn a weşanê bi we re parve dikin "Pergalên pelan ên virtual li Linux: çima ew hewce ne û ew çawa dixebitin?" Hûn dikarin beşa yekem bixwînin vir. Ka em ji we re bi bîr bînin ku ev rêze weşanan bi destpêkirina qursek nû re hevdem e. "Rêveberê Linux", 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ê navik, 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.

Pergalên pelan ên virtual li Linux: çima ew hewce ne û ew çawa dixebitin? Beş 2

Xwezî, destpêkirina karanîna eBPF bi alîkariya amûran pir hêsan e bcc, ku wekî pakêtên ji belavkirina gelemperî hene Linux û bi berfirehî hatiye belgekirin Bernard Gregg. 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.

Pergalên pelan ên virtual li Linux: çima ew hewce ne û ew çawa dixebitin? Beş 2

vfsstat.py Skrî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.

Pergalên pelan ên virtual li Linux: çima ew hewce ne û ew çawa dixebitin? Beş 2

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 şop.py 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 cscope Ji bo lêgerînê __device_add_disk(), 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 rêwer, termostat û otomobîl, naha Linux-ê dimeşînin. Gelek ji van amûran xwedan navbeynkariya bikarhênerek hindik û tine ne, û rêyek tune ku meriv wan "paqij" biqede. Bifikirin ku dema ku hêza yekîneya kontrolê ye, otomobîlek bi pîlê mirî dest pê bike Linux 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 tenê ji bo xwendinê (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, heke pêvajoyek Linux nikare li wir binivîse. Ya din ev e ku pergalek pelê ya pir neguhêrbar ji bo piştgiriya zeviyê ya cîhazên ji dûr ve krîtîk e, ji ber ku personelên piştgiriyê xwe dispêrin pergalên herêmî yên ku bi navgînî bi pergalên zeviyê re wekhev in. Belkî feydeya herî girîng (lê di heman demê de ya herî xapînok) ev e ku ro-rootfs pêşdebiran neçar dike ku biryar bidin ka kîjan tiştên pergalê dê di qonaxa sêwirana pergalê de neguhezbar bin. Karkirina bi ro-rootf-an re dibe ku nebaş û bi êş be, ji ber ku guhêrbarên konstê bi gelemperî di zimanên bernamesaziyê de ne, lê feydeyên wan bi hêsanî sermaya zêde rastdar dike.

creation rootfs Tenê-xwendin ji bo pêşdebirên pêvekirî hin hewildanek zêde hewce dike, û li vir e ku VFS dikeve nav wêneyê. Linux hewce dike ku pelan tê de bin /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 Navê cîhê VFS.

Li ser bingeha danasîna serpêhatî û çiyayê girêdanê, kes ji vê yekê şaş nabe Konteynerên Linux ew bi awayekî çalak têne bikaranîn. Ka em bibînin ka dema ku em bikar tînin çi dibe systemd-nspawn 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ê

Fêmkirina xebata hundurîn a Linux-ê dikare wekî karekî ne mumkun xuya bike, ji ber ku kernel bixwe hejmareke mezin kodê vedihewîne, ku sepanên cîhê bikarhênerê Linux û navgînên banga pergalê li pirtûkxaneyên C-yê yên 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 pergalên pelê yên virtual pêşkêş dikin, ku qatek pêçandî ne ku di navbera pergalên pelan ên populer û cîhazên hilanînê de lihevhatinek berfireh û nisbeten hêsan peyda dike. Girêdan û danîna servekirî bi navgîniya navên Linux-ê sêrbaziya VFS-ê ye ku çêkirina konteynerên tenê-xwendewar û pergalên pelan ên root gengaz dike. Bi vekolînek koda çavkaniyê, amûra bingehîn a eBPF û navbeynkariya wê ve girêdayî ye bcc
lêgerîna bingehîn ji her demê hêsantir dike.

Hevalno, binivîsin, ev gotar ji we re kêrhatî bû? Dibe ku tu têbînî û têbînî hebin? Û yên ku bi qursa Rêveberê Linux re eleqedar dibin têne vexwendin Roja vekirî, ku dê di 18ê Nîsanê de pêk were.

Beşa yekem.

Source: www.habr.com

Add a comment