eBPF Summit 2024

eBPF Documentation

eBPF ni teknolojia ya mapinduzi yenye asili katika kiini cha Linux ambayo inaweza kutekeleza programu zilizoko ndani ya “Sandbox” katika muktadha wa hali ya juu kama kiini cha mfumo wa uendeshaji. Hutumiwa kwa usalama na ufanisi kuongeza uwezo wa kiini bila kuhitaji kubadilisha kodi cha chanzo(source code) cha kiini au kupakia moduli za kiini.

Kihistoria, mfumo wa uendeshaji umekuwa mahali pa kutekeleza ufuatiliaji, usalama, na utendaji wa mtandao kutokana na uwezo wa kiini wa kuangalia na kudhibiti mfumo mzima. Wakati huo huo, kiini cha mfumo wa uendeshaji ni ngumu kukuza kutokana na jukumu lake kuu na mahitaji makubwa ya utulivu na usalama. Kwa hivyo, kiwango cha ubunifu katika kiwango cha mfumo wa uendeshaji kimekuwa cha chini ikilinganishwa na utendaji uliotekelezwa nje ya mfumo wa uendeshaji.

Muhtasari

eBPF inabadilisha kabisa mseto huu, kwa kuruhusu kutekeleza programu za eBPF ndani ya mfumo wa uendeshaji, waendelezaji wa programu wanaweza kutumia programu za eBPF kuongeza uwezo wa mfumo wa uendeshaji wakati wa muda wa uendeshaji. Mfumo wa uendeshaji basi unahakikisha usalama na ufanisi wa utekelezaji kama vile imekusanywa kwa kutumia msaada wa kompileri ya Just-In-Time (JIT) na injini ya uhakiki(verification engine). Hii imesababisha wimbi la miradi yanayotegemea eBPF inayofunika anuwai ya matumizi, ikiwa ni pamoja na mtandao wa kizazi kijacho, ufuatiliaji, na utendaji wa usalama.

Leo hii, eBPF hutumiwa kwa kiasi kikubwa kusukuma anuwai ya matumizi: Kutoa mtandao wa utendaji ambayo ni bora na usambazaji wa mzigo(load balancing) katika vituo vya data za kisasa na mazingira ya wingu la asili(cloud native environments), kutoa data ya ufuatiliaji wa usalama wa kina kwa gharama ya chini, kusaidia waendelezaji wa programu kufuatilia programu, kutoa ufahamu kwa kutatua utendaji, utekelezaji wa usalama wa programu na vifurushi vya kontena, na mengi zaidi. Fursa ni za kutokuwa na kikomo, na ubunifu ambao eBPF inawezesha unaanza tu.

eBPF.io ni mahali pa kujifunza na kushirikiana kuhusu mada ya eBPF kwa kila mtu. eBPF ni jamii wazi na kila mtu anaweza kushiriki na kushiriki. Iwe unataka kusoma ufafanuzi wa kwanza wa eBPF, kutafuta vifaa vya kusoma zaidi, au kuanza kuchangia katika miradi kubwa ya eBPF, eBPF.io itakusaidia njiani.

Awali, BPF ilisimama kwa Berkeley Packet Filter, lakini sasa kwamba eBPF (extended BPF) inaweza kufanya mengi zaidi ya kuchuja pakiti, kifupi hicho hakifanyi tena maana. eBPF sasa inachukuliwa kuwa neno la pekee ambalo halimaanishi kitu chochote. Katika kanuni za chanzo za Linux, neno BPF linabaki, na katika zana na nyaraka, maneno BPF na eBPF kwa ujumla hutumiwa kwa kubadilishana. BPF ya awali mara nyingine huitwa cBPF (classic BPF) ili kutofautisha na eBPF.

Nyuki ni nembo rasmi ya eBPF na awali iliundwa na Vadim Shchekoldin. Katika Mkutano wa kwanza wa eBPF kulikuwa na kura iliyopigwa na nyuki akapewa jina la eBee. (Kwa maelezo kuhusu matumizi sahihi ya nembo, tafadhali angalia Mwongozo wa Nembo ya Linux Foundation.)

Vitabu vifuatavyo ni ufafanuzi wa haraka kuhusu eBPF. Ikiwa ungependa kujifunza zaidi kuhusu eBPF, tazama Mwongozo wa Marejeleo wa eBPF & XDP. Iwe wewe ni mwendelezaji anayetaka kujenga programu ya eBPF, au una nia ya kutumia suluhisho linalotumia eBPF, ni muhimu kuelewa dhana za msingi na muundo.

Programu za eBPF ni zinazosukumwa na tukio na hufanya kazi wakati kiini au maombi yanapopita kwenye hatua fulani ya Kigingi. Kigingi uliowekwa tayari ni pamoja na wito wa mfumo, kuingia/kutoka kwa kazi, vituo vya kufuatilia vya kiini, matukio ya mtandao, na mengine mengi.

Kigingi wa Wito wa Mfumo

Ikiwa hakuna Kigingi uliowekwa tayari kwa mahitaji fulani, ni inawezekana kuunda kizuizi cha kiini (kprobe) au kizuizi cha mtumiaji (uprobe) ili kuambatisha programu za eBPF karibu mahali popote katika kiini au maombi ya mtumiaji.

Maelezo ya Kigingi

Katika mazingira mengi, eBPF haikutumiwi moja kwa moja bali kwa njia isiyo moja kwa moja kupitia miradi kama Cilium, bcc, au bpftrace ambayo hutoa kuficha juu ya eBPF na hazihitaji kuandika programu moja kwa moja lakini badala yake hutoa uwezo wa kutaja ufafanuzi wa kusudi ambao kisha hutekelezwa kwa kutumia eBPF.

Clang

Ikiwa hakuna kuficha kwa kiwango ya juu inapatikana, programu lazima ziandikwe moja kwa moja. Kiini cha Linux kinatarajia programu za eBPF kuwa zimepakia kwa mfumo wa kanuni. Ingawa ni wazi kuwa inawezekana kuandika bytecode moja kwa moja, mazoea ya maendeleo yanayokubalika zaidi ni kutumia suite ya mtaalamu kama LLVM kuandika kanuni ya pseudo-C kuwa bytecode ya eBPF.

Baada ya Kigingi uliotakikana kutambuliwa, programu ya eBPF inaweza kupakia kwenye kiini cha Linux kwa kutumia wito wa mfumo wa bpf. Kwa kawaida hii hufanywa kwa kutumia moja ya maktaba za eBPF zilizopo. Sehemu inayofuata inatoa ufafanuzi wa vifaa vya maendeleo vinavyopatikana.

Go

Wakati programu inapakia kwenye kiini cha Linux, inapita kupitia hatua mbili kabla ya kuambatishwa kwenye Kigingi uliotakiwa:

Hatua ya uthibitishaji inahakikisha kuwa programu ya eBPF inaweza kutumika kwa usalama. Inathibitisha kuwa programu inakidhi hali kadhaa, kwa mfano:

Mjenzi
  • Mchakato unaopakia programu ya eBPF unamiliki uwezo unaohitajika (mamlaka). Isipokuwa eBPF isiyo na mamlaka inaruhusiwa, michakato iliyopewa mamlaka tu inaweza kupakia programu za eBPF.
  • Programu haiharibu au kudhuru mfumo kwa njia yoyote.
  • Programu inaendeshwa kila wakati hadi mwisho (yaani, programu haikai kwenye mzunguko milele, ikizuia usindikaji zaidi).

Hatua ya Kuchapisha moja kwa moja (JIT) inabadilisha bytecode ya kawaida ya programu kuwa seti ya maagizo ya kompyuta ya kifaa ili kuongeza kasi ya utekelezaji wa programu. Hii inafanya programu za eBPF kukimbia kwa ufanisi kama kanuni ya kiini iliyopakwa kama kanuni au kanuni iliyopakiwa kama moduli ya kiini.

Kitu muhimu cha programu za eBPF ni uwezo wa kushiriki habari zilizokusanywa na kuhifadhi hali. Kwa kusudi hili, programu za eBPF zinaweza kutumia dhana ya ramani za eBPF kuweka na kufikia data katika seti kubwa ya miundo ya data. Ramani za eBPF zinaweza kupatikana kutoka programu za eBPF pamoja na kutoka kwa programu katika nafasi ya mtumiaji kupitia wito wa mfumo.

Muundo wa Ramani

Hapa kuna orodha isiyo kamili ya aina za ramani zilizoungwa mkono ili kutoa uelewa wa aina tofauti za miundo ya data. Kwa aina tofauti za ramani, kuna pia toleo la pamoja na toleo la kila CPU.

  • Hash Tables, Majedwali
  • LRU (Mara ya Mwisho Kutumika)
  • Mfuko wa Mzunguko
  • Kufuatilia Mfuko wa Mstari
  • LPM (Ufanani wa Prefix wa Muda mrefu)
  • ...

Programu za eBPF haziwezi kuita kazi za kiini zisizo na kipimo. Kuruhusu hii ingeifanya programu za eBPF zifungwe kwa mabadiliko fulani la kiini na ingefanya ugumu wa utangamano wa programu. Badala yake, programu za eBPF zinaweza kufanya wito wa kazi za msaada, API inayojulikana na thabiti inayotolewa na kiini.

Wito wa Msaada

Kundi la wito wa msaada uliopo linaendelea kubadilika. Mifano ya wito wa msaada uliopo:

  • Kuzalisha nambari za nasibu
  • Pata wakati na tarehe ya sasa
  • Kufikia ramani za eBPF
  • Pata muktadha wa mchakato/kikundi
  • Badilisha pakiti za mtandao na mantiki ya kuhamisha

Programu za eBPF zinaweza kuunganishwa na dhana ya kumbukumbu ya mkia na wito wa kazi. Wito wa kazi unaruhusu kutaja na kuita kazi ndani ya programu ya eBPF. Wito wa mkia unaweza kuita na kutekeleza programu nyingine ya eBPF na kubadilisha muktadha wa utekelezaji, kama vile jinsi wito wa mfumo wa execve() unavyofanya kazi kwa mchakato wa kawaida.

Kumbukumbu ya mkia

Kwa nguvu kubwa lazima kuwe na jukumu kubwa pia.

eBPF ni teknolojia yenye nguvu sana na sasa inaendeshwa katika moyo wa sehemu nyingi muhimu za miundombinu ya programu. Wakati wa maendeleo ya eBPF, usalama wa eBPF ulikuwa jambo muhimu zaidi wakati eBPF ilipokuwa inachunguzwa kuingizwa katika kiini cha Linux. Usalama wa eBPF unahakikishwa kupitia safu kadhaa:

Mamlaka Inayohitajika

Isipokuwa eBPF isiyo na mamlaka inaruhusiwa, michakato yote inayotaka kupakia programu za eBPF kwenye kiini cha Linux lazima iwe inaendeshwa katika hali ya mamlaka (root) au inahitaji uwezo wa CAP_BPF. Hii inamaanisha kuwa programu zisizoaminika haziwezi kupakia programu za eBPF.

Ikiwa eBPF isiyo na mamlaka inaruhusiwa, michakato isiyo na mamlaka inaweza kupakia programu za eBPF fulani kulingana na seti iliyopunguzwa ya utendaji na ufikiaji mdogo kwa kiini.

Thibitishaji

Ikiwa mchakato unaruhusiwa kupakia programu ya eBPF, programu zote bado zinapitia thibitishaji wa eBPF. Thibitishaji wa eBPF unahakikisha usalama wa programu yenyewe. Hii inamaanisha, kwa mfano:

  • Programu zinathibitishwa kuhakikisha kuwa zinakimbia kila wakati hadi mwisho, kwa mfano, programu ya eBPF kamwe haiwezi kuzuia au kukaa kwenye mzunguko milele. Programu za eBPF zinaweza kuwa na anuwai ya mizunguko ya kikomo lakini programu inakubaliwa tu ikiwa thibitishaji unaweza kuhakikisha kuwa mzunguko una kipengele cha kutokea ambacho kinalazimika kuwa kweli.
  • Programu hazipaswi kutumia viendelezi vilivyo na thamani isiyojulikana(uninitialized variables) au kufikia kumbukumbu nje ya mipaka.
  • Programu lazima iwe ndani ya mahitaji ya ukubwa wa mfumo. Haiwezekani kupakia programu za eBPF za ukubwa usio na kikomo.
  • Programu inapaswa kuwa na utata uliopunguzwa. Thibitishaji utahakiki njia zote za utekelezaji zinazowezekana na lazima iweze kukamilisha uchambuzi ndani ya mipaka ya kikomo cha utata wa juu uliowekwa.

Thibitishaji umekusudiwa kama chombo cha usalama, kuhakikisha kuwa programu ni salama kutekelezwa. Si chombo cha usalama kinachosaili kile programu zinafanya.

Uimarishaji

Baada ya kukamilika kwa mafanikio ya uthibitishaji, programu ya eBPF inapitia mchakato wa uimarishaji kulingana na ikiwa programu inapakiwa kutoka kwa mchakato mwenye mamlaka au asiye na mamlaka. Hatua hii ni pamoja na:

  • Ulinzi wa Utekelezaji wa Programu: Kumbukumbu ya kiini inayoshikilia programu ya eBPF inalindwa na kuifanya kuwa ya kusoma tu. Ikiwa kwa sababu yoyote, iwe ni kasoro ya kiini au udanganyifu mbaya, programu ya eBPF inajaribu kubadilishwa, kiini kitageuka kuvurugika badala ya kuruhusu kuendelea kutekelezwa kwa programu iliyoharibika/inayodanganywa.
  • Kupunguza Dhidi ya Spectre: Kwa kutumia CPU zinazohusika na spekula, zinaweza kutofautisha matawi na kufanya athari za upande zinazoweza kutoa kupitia kituo cha upande. Kuorodhesha mifano kadhaa: programu za eBPF zinavuta upatikanaji wa kumbukumbu ili kuielekeza chini ya maagizo ya muda mfupi kwa maeneo yaliyoongozwa, thibitishaji pia unafuata njia za programu zinazoweza kufikiwa tu chini ya utekelezaji wa utabiri, na mchakato wa kuchapisha moja kwa moja unatoa Retpolines ikiwa wito wa mkia hauwezi kubadilishwa kuwa wito wa moja kwa moja.
  • Blind ya Constant: Vipimo vyote katika kanuni vimetiwa kipofu ili kuzuia mashambulizi ya Kompileri cha JIT. Hii inazuia wadukuzi kuingiza kanuni inayoweza kutekelezwa kama vipimo, ambavyo katika uwepo wa kasoro nyingine ya kiini, inaweza kuruhusu mshambuliaji kuruka kwenye sehemu ya kumbukumbu ya programu ya eBPF kutekeleza kanuni.

Muktadha wa Uendeshaji wa Kusimamishwa

Programu za eBPF haziwezi kufikia kumbukumbu ya kiini ya aina yoyote kwa moja kwa moja. Kupata data na miundo ya data ambayo iko nje ya muktadha wa programu lazima ifikiwe kupitia wito wa eBPF helpers. Hii inahakikisha ufikiaji thabiti wa data na kufanya ufikiaji wowote kuwa chini ya muktadha wa programu ya eBPF, kwa mfano, programu ya eBPF inayoruhusiwa inaweza kubadilisha data ya miundo fulani ya data ikiwa ubadilishaji unaweza kuhakikisha kuwa ni salama. Programu ya eBPF haiwezi kubadilisha miundo ya data kwa nasibu katika kiini.

Tuazime mfano. Je, unakumbuka GeoCities? Miaka 20 iliyopita, kurasa za wavuti zilikuwa karibu kabisa zimeandikwa kwa lugha ya alama ya tuli (HTML). Ukurasa wa wavuti ulikuwa kimsingi hati na programu (kivinjari) kinachoweza kuionyesha. Ukitazama kurasa za wavuti leo, kurasa za wavuti zimegeuka kuwa programu kamili na teknolojia inayotumika mtandaoni imebadilisha sehemu kubwa ya programu zilizoandikwa kwa lugha zinazohitaji kuhariri. Nini kilichowezesha mageuzi haya?

Geocities

Kwa ufupi huu ni uwezo wa kuunda programu na uanzishwaji wa JavaScript. Hii ilifungua mapinduzi makubwa ambayo yalisababisha vivinjari kuwa karibu na mifumo ya uendeshaji iliyotengwa.

Kwa nini mageuzi yalitokea? Waprogramu hawakuwa tena wamefungwa kwa watumiaji wanaotumia matoleo maalum ya kivinjari. Badala ya kuwashawishi vyombo vya kawaida vya viwango kwamba alama mpya ya HTML ilikuwa muhimu, upatikanaji wa vifaa vya ujenzi muhimu ulifunguliwa kutoka kwa mwendo wa ubunifu wa kivinjari cha msingi wa kujengwa juu yake. Hii ni rahisi kidogo kwani HTML ilibadilika kadri muda ulivyopita na kuchangia kwa mafanikio lakini mageuzi ya HTML yenyewe yangekuwa hayatoshi.

Kabla ya kuchukua mfano huu na kuutumia kwa eBPF, hebu tuzingatie mambo muhimu machache yaliyokuwa muhimu katika uanzishaji wa JavaScript:

  • Usalama: Kanuni isiyoaminika inaendeshwa kwenye kivinjari cha mtumiaji. Hii ilipatikana kwa kufunga programu za JavaScript kwenye sanduku na kutoa upatikanaji wa data ya kivinjari kwa njia ya kusanyiko.
  • Utoaji wa Kila wakati: Ukuaji wa mantiki ya programu lazima uwezekane bila kuhitaji daima kutoa matoleo mapya ya kivinjari. Hii ilipatikana kwa kutoa vifaa sahihi vya ujenzi wa kiwango cha chini vinavyotosha kujenga mantiki za kiholela.
  • Utendaji: Uwezo wa kuunda programu lazima upatikane bila kubeba mzigo mkubwa. Hii ilipatikana kwa kuanzishwa kwa Kompileri cha Just-in-Time (JIT). Kwa kila moja ya mambo haya, marudio sahihi yanaweza kupatikana katika eBPF kwa sababu sawa.

Sasa turudi kwa eBPF. Ili kuelewa athari ya uprogramu wa eBPF kwa kiini cha Linux, ni muhimu kuwa na uelewa wa kiwango cha juu cha usanifu wa kiini cha Linux na jinsi inavyoshirikiana na programu na vifaa.

Usanifu wa Kernel

Lengo kuu la kiini cha Linux ni kusitiri vifaa au vifaa vya kawaida na kutoa API thabiti (wito wa mfumo) kuruhusu programu kuendesha na kushiriki rasilimali. Ili kufikia hili, seti kubwa ya mfumo na safu zinasimamiwa kugawa majukumu haya. Kila mfumo kwa kawaida hutoa kiwango fulani cha usanidi kuzingatia mahitaji tofauti ya watumiaji. Ikiwa tabia inayotakiwa haiwezi kusanidiwa, mabadiliko ya kiini yanahitajika, kihistoria, ikibaki chaguo mbili:

Msaada wa Asilia

  1. Badilisha msimbo wa chanzo cha kiini na kushawishi jamii ya kiini cha Linux kwamba mabadiliko ni muhimu.
  2. Ngojea miaka kadhaa ili toleo jipya la kiini liwe la kawaida.

Moduli ya Kernel

  1. Andika moduli ya kiini
  2. Sasisha mara kwa mara, kwani kila toleo la kiini linaweza kulivunja
  3. Kuna hatari ya kuharibu kiini cha Linux chako kwa sababu ya ukosefu wa mipaka ya usalama.

Kwa eBPF, chaguo jipya linapatikana ambalo linaruhusu kubadilisha tabia ya kiini cha Linux bila kuhitaji mabadiliko kwenye msimbo wa chanzo cha kiini au kupakia moduli ya kiini. Kwa njia nyingi, hii ni sawa sana na jinsi JavaScript na lugha zingine za uandishi zilivyofungua ukuaji wa mifumo ambayo ilikuwa imekuwa ngumu au ghali kubadilisha.

Kuna zana kadhaa za maendeleo zinazosaidia katika maendeleo na usimamizi wa programu za eBPF. Zote zinashughulikia mahitaji tofauti ya watumiaji:

bcc

BCC ni mfumo ambao unawezesha watumiaji kuandika programu za Python na programu za eBPF zilizoingizwa ndani yao. Mfumo huu kimsingi unalenga matumizi ambayo yanahusisha uchambuzi/uchunguzi wa programu na mfumo ambapo programu za eBPF hutumiwa kukusanya takwimu au kuzalisha matukio na mwenzake katika nafasi ya mtumiaji hukusanya data na kuionyesha kwa mfumo wa kibinadamu. Kukimbia programu ya Python kutazalisha bytecode ya eBPF na kuipakia kwenye kiini.

bcc

bpftrace

bpftrace ni lugha ya ufuatiliaji wa kiwango cha juu kwa eBPF ya Linux na inapatikana kwenye majukumu ya Linux (4.x) ya hivi karibuni. bpftrace hutumia LLVM kama injini ya nyuma kwa kutekeleza hati kwa bytecode ya eBPF na kutumia BCC kwa kuingiliana na mfumo wa eBPF wa Linux pamoja na uwezo wa ufuatiliaji wa Linux uliopo: ufuatiliaji wa kiwango cha msingi cha kernel (kprobes), ufuatiliaji wa kiwango cha mtumiaji (uprobes), na alama za ufuatiliaji. Lugha ya bpftrace inainspired na awk, C, na wafuatiliaji wa awali kama DTrace na SystemTap.

bpftrace

eBPF Go Library

Libreria ya eBPF Go hutoa maktaba ya eBPF ya jumla ambayo inatenganisha mchakato wa kufika kwa bytecode ya eBPF na kupakia na kusimamia programu za eBPF. Programu za eBPF kawaida huundwa kwa kuandika lugha ya kiwango cha juu na kisha kutumia compiler ya clang/LLVM kuichakata kuwa bytecode ya eBPF.

Go

libbpf C/C++ Library

Libbpf ni maktaba ya eBPF ya jumla iliyotokana na C/C++ ambayo husaidia kutoa kipakiaji cha faili za eBPF zilizotengenezwa na kompyuta ya clang/LLVM kwa kiini na kwa ujumla inatenganisha mwingiliano na wito wa mfumo wa BPF kwa kutoa kiolesura rahisi kutumia APIs za maktaba kwa programu.

Libbpf

Ikiwa ungependa kujifunza zaidi kuhusu eBPF, endelea kusoma kutumia vifaa vifuatavyo vya ziada:

Generic

Deep Dives

Cilium

Hubble