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
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ê 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 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.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.
Bi karanîna eBPF hûn dikarin bibînin ka çi diqewime
/sys
dema 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 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 kworker
ku 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 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 fsck
kengî motor di dawiyê de dest pê dike? Û bersiv hêsan e. Amûrên pêvekirî xwe dispêrin pergala pelê root 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
Li ser bingeha danasîna serpêhatî û çiyayê girêdanê, kes ji vê yekê şaş nabe 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
Source: www.habr.com