شروعات ۾ اتي هڪ ٽيڪنالاجي هئي ۽ ان کي BPF سڏيو ويندو هو. اسان هن ڏانهن ڏٺو پوئين، هن سيريز جي پراڻي عهد نامي آرٽيڪل. 2013 ۾، Alexei Starovoitov ۽ Daniel Borkman جي ڪوششن سان، ان جو هڪ بهتر نسخو، جديد 64-bit مشينن لاءِ بهتر ڪيو ويو، ترقي ڪئي وئي ۽ لينڪس ڪنيل ۾ شامل ڪئي وئي. هن نئين ٽيڪنالاجي کي مختصر طور تي اندروني BPF سڏيو ويو، پوء ان جو نالو وڌايو ويو BPF، ۽ هاڻي، ڪيترن سالن کان پوء، هرڪو صرف ان کي BPF سڏيندو آهي.
عام طور تي ڳالهائڻ، بي پي ايف توهان کي اجازت ڏئي ٿو ته لينڪس ڪنييل اسپيس ۾ صوابديدي صارف جي فراهم ڪيل ڪوڊ کي هلائڻ، ۽ نئين فن تعمير ايترو ڪامياب ٿي ويو ته اسان کي ان جي سڀني ايپليڪيشنن کي بيان ڪرڻ لاء هڪ درجن کان وڌيڪ مضمونن جي ضرورت پوندي. (صرف شيء جيڪا ڊولپرز سٺو نه ڪيو، جيئن توهان هيٺ ڏنل ڪارڪردگي ڪوڊ ۾ ڏسي سگهو ٿا، هڪ مهذب لوگو ٺاهي رهيو هو.)
هي آرٽيڪل بيان ڪري ٿو BPF ورچوئل مشين جي جوڙجڪ، BPF سان ڪم ڪرڻ لاءِ ڪنيل انٽرفيس، ڊولپمينٽ ٽولز، گڏوگڏ موجوده صلاحيتن جو مختصر، تمام مختصر جائزو، يعني. هر شيء جيڪا اسان کي مستقبل ۾ بي پي ايف جي عملي ايپليڪيشنن جي گهڻي مطالعي جي ضرورت پوندي.
مضمون جو خلاصو
BPF فن تعمير جو تعارف. پهرين، اسان BPF فن تعمير جي پکيء جي اکين جو ڏيک وٺنداسين ۽ مکيه اجزاء کي بيان ڪنداسين.
ترقي جا اوزار. تجربن لاءِ گهربل يوٽيلٽيز ۽ ڪرنل کي ڪيئن گڏ ڪرڻ تي مدد سيڪشن.
نتيجو. مضمون جي آخر ۾، جيڪي هن پري تائين پڙهيا آهن انهن کي حوصلا افزائي وارا لفظ ملندا ۽ هيٺ ڏنل مضمونن ۾ ڇا ٿيندو ان جو مختصر بيان. اسان انهن لاءِ خود مطالعي لاءِ ڪجهه لنڪس پڻ لسٽ ڪنداسين جن ۾ تسلسل جو انتظار ڪرڻ جي خواهش يا صلاحيت نه آهي.
BPF فن تعمير جو تعارف
ان کان اڳ جو اسان BPF فن تعمير تي غور ڪرڻ شروع ڪيو، اسان ھڪڙو آخري وقت (اوھ) ڏانھن اشارو ڪنداسين کلاسک BPF، جيڪا RISC مشينن جي اچڻ جي جواب جي طور تي ترقي ڪئي وئي ۽ موثر پيڪيٽ فلٽرنگ جو مسئلو حل ڪيو. فن تعمير ايترو ڪامياب ٿي ويو جو، برڪلي UNIX ۾ نائين جي ڏهاڪي ۾ پيدا ٿيڻ کان پوء، اهو اڪثر موجوده آپريٽنگ سسٽم ڏانهن پورٽ ڪيو ويو، پاگل ويهن سالن ۾ بچيو ويو ۽ اڃا تائين نئين ايپليڪيشنون ڳولي رهيو آهي.
نئين بي پي ايف کي 64-bit مشينن، ڪلائوڊ سروسز ۽ SDN ٺاهڻ لاءِ اوزارن جي وڌندڙ ضرورت جي جواب جي طور تي ترقي ڪئي وئي (Sسامان-dصاف ٿيل nڪم ڪرڻ). kernel نيٽ ورڪ انجنيئرن پاران ترقي يافته BPF جي بهتر متبادل جي طور تي، نئين BPF لفظي طور تي ڇهن مهينن بعد لينڪس سسٽم کي ٽريڪ ڪرڻ جي مشڪل ڪم ۾ ايپليڪيشنون مليون، ۽ هاڻي، ان جي ظاهر ٿيڻ کان ڇهه سال پوءِ، اسان کي هڪ مڪمل ايندڙ مضمون جي ضرورت پوندي. پروگرامن جي مختلف قسمن جي فهرست.
مزاحيه تصويرون
ان جي بنيادي طور تي، بي پي ايف هڪ سينڊ باڪس ورچوئل مشين آهي جيڪا توهان کي هلائڻ جي اجازت ڏئي ٿي “منتقلي” ڪوڊ کي ڪنيل اسپيس ۾ بغير حفاظتي سمجهوتو ڪرڻ جي. BPF پروگرام ٺاهيا ويا آهن صارف جي جڳهه ۾، لوڊ ٿيل ڪنييل ۾، ۽ ڳنڍيل آهن ڪجهه واقعي جي ذريعن سان. ھڪڙو واقعو ٿي سگھي ٿو، مثال طور، ھڪڙي نيٽ ورڪ انٽرفيس ڏانھن ھڪڙي پيڪٽ جي ترسيل، ڪجھ ڪنيل فنڪشن جي شروعات، وغيره. هڪ پيڪيج جي صورت ۾، BPF پروگرام کي پيڪيج جي ڊيٽا ۽ ميٽا ڊيٽا تائين رسائي هوندي (پڙهڻ ۽ ممڪن طور تي لکڻ لاءِ، پروگرام جي قسم تي منحصر آهي)؛ ڪرنل فنڪشن کي هلائڻ جي صورت ۾، جا دليل فنڪشن، بشمول ڪنيل ميموري ڏانهن اشارو، وغيره.
اچو ته هن عمل تي هڪ ويجهي نظر رکون. شروع ڪرڻ سان، اچو ته کلاسک BPF کان پهرين فرق جي باري ۾ ڳالهايون، پروگرامن لاء جن لاء جمع ڪندڙ ۾ لکيل هئا. نئين ورزن ۾، فن تعمير کي وڌايو ويو ته جيئن پروگرامن کي اعلي سطحي ٻولين ۾ لکيو وڃي، بنيادي طور تي، يقينا، C ۾. ان مقصد لاء، llvm لاء هڪ پس منظر تيار ڪيو ويو، جيڪو BPF فن تعمير لاء بائيٽ ڪوڊ پيدا ڪرڻ جي اجازت ڏئي ٿو.
BPF فن تعمير ٺهيل هئي، جزوي طور تي، جديد مشينن تي موثر طريقي سان هلائڻ لاء. هن ڪم کي عملي طور تي ڪرڻ لاءِ، BPF بائيٽ ڪوڊ، هڪ ڀيرو ڪرنل ۾ لوڊ ڪيو ويندو آهي، هڪ جزو استعمال ڪندي اصلي ڪوڊ ۾ ترجمو ڪيو ويندو آهي جنهن کي JIT compiler (Jيوٽ In Time). اڳيون، جيڪڏهن توهان کي ياد آهي، کلاسک BPF ۾ پروگرام ڪرنل ۾ لوڊ ڪيو ويو ۽ ايونٽ جي ماخذ سان ايٽمي طور تي ڳنڍيل آهي - هڪ واحد سسٽم ڪال جي حوالي سان. نئين فن تعمير ۾، اهو ٻن مرحلن ۾ ٿئي ٿو - پهريون، ڪوڊ سسٽم ڪال استعمال ڪندي ڪرنل ۾ لوڊ ڪيو ويندو آهي. bpf(2)۽ پوءِ، بعد ۾، ٻين ميکانيزم ذريعي جيڪي مختلف ٿين ٿا پروگرام جي قسم جي لحاظ کان، پروگرام واقعي جي ماخذ سان ڳنڍي ٿو.
هتي پڙهندڙ هڪ سوال ٿي سگهي ٿو: ڇا اهو ممڪن آهي؟ اهڙي ڪوڊ جي عملدرآمد جي حفاظت جي ضمانت ڪيئن آهي؟ بي پي ايف پروگرامن جي لوڊشيڊنگ جي اسٽيج تي عملدرآمد جي حفاظت جي ضمانت ڏني وئي آهي جنهن کي ويريفير (انگريزي ۾ هن اسٽيج کي ويريفير چيو ويندو آهي ۽ مان انگريزي لفظ استعمال ڪرڻ جاري رکندس):
تصديق ڪندڙ هڪ جامد تجزيه ڪندڙ آهي جيڪو يقيني بڻائي ٿو ته هڪ پروگرام ڪرنل جي عام آپريشن ۾ خلل نٿو پوي. انهي جو مطلب اهو ناهي ته پروگرام سسٽم جي آپريشن ۾ مداخلت نٿو ڪري سگهي - بي پي ايف پروگرامن، قسم تي منحصر ڪري ٿو، پڙهي ۽ ٻيهر لکي سگھي ٿو ڪنيل ميموري جا حصا، واپسي جا قدر، ٽرم، ضميمه، ٻيهر لکڻ. ۽ اڃا اڳتي نيٽ ورڪ پيڪٽس. تصديق ڪندڙ ضمانت ڏئي ٿو ته BPF پروگرام هلائڻ سان ڪرنل کي حادثو نه ٿيندو ۽ اهو پروگرام جنهن کي، ضابطن جي مطابق، لکڻ جي رسائي آهي، مثال طور، ٻاهر نڪرندڙ پيڪٽ جي ڊيٽا، پيڪٽ جي ٻاهران ڪنيل ميموري کي اوور رائٽ ڪرڻ جي قابل نه هوندو. اسان BPF جي ٻين سڀني اجزاء کان واقف ٿيڻ کان پوء، لاڳاپيل سيڪشن ۾ ٿورو وڌيڪ تفصيل سان تصديق ڪندڙ کي ڏسنداسين.
پوءِ اسان هينئر تائين ڇا سکيو آهي؟ صارف سي ۾ هڪ پروگرام لکي ٿو، ان کي سسٽم ڪال استعمال ڪندي ڪرنل ۾ لوڊ ڪري ٿو bpf(2)، جتي ان کي تصديق ڪندڙ طرفان جانچيو ويندو آهي ۽ اصلي بائيٽ ڪوڊ ۾ ترجمو ڪيو ويندو آهي. پوءِ ساڳيو يا ٻيو صارف پروگرام کي واقعي جي ماخذ سان ڳنڍي ٿو ۽ اهو عمل ڪرڻ شروع ٿئي ٿو. بوٽ ۽ ڪنيڪشن کي الڳ ڪرڻ ڪيترن ئي سببن لاء ضروري آهي. پهرين، هڪ تصديق ڪندڙ هلائڻ نسبتا مهانگو آهي ۽ ساڳئي پروگرام کي ڪيترائي ڀيرا ڊائون لوڊ ڪرڻ سان اسان ڪمپيوٽر جو وقت ضايع ڪندا آهيون. ٻيو، بلڪل ڪيئن هڪ پروگرام ڳنڍيل آهي ان جي قسم تي منحصر آهي، ۽ هڪ "آفاقي" انٽرفيس هڪ سال اڳ ترقي يافته ٿي سگهي ٿو نئين قسم جي پروگرامن لاء مناسب ناهي. (جيتوڻيڪ هاڻي ته فن تعمير وڌيڪ پختو ٿي رهيو آهي، اتي هڪ خيال آهي ته هن انٽرفيس کي سطح تي متحد ڪرڻ لاء. libbpf.)
ڌيان ڏيڻ وارو پڙهندڙ شايد نوٽيس ڪري سگھي ٿو ته اسان اڃا تائين تصويرن سان ختم نه ڪيو آهي. درحقيقت، مٿين سڀني بيانن جي وضاحت نه ڪئي وئي آهي ڇو ته BPF بنيادي طور تي تصوير کي تبديل ڪري ٿو کلاسک BPF جي مقابلي ۾. ٻه جدت جيڪي خاص طور تي قابل اطلاق جي دائري کي وڌائين ٿيون، حصيداري ياداشت ۽ ڪنيل مددگار افعال استعمال ڪرڻ جي صلاحيت آهن. BPF ۾، شيئر ڪيل ميموري لاڳو ڪئي وئي آهي نام نهاد نقشا استعمال ڪندي - هڪ مخصوص API سان حصيداري ڪيل ڊيٽا جي جوڙجڪ. انهن کي شايد اهو نالو مليو آهي ڇاڪاڻ ته پهريون قسم جو نقشو ظاهر ٿيڻ لاءِ هيش ٽيبل هو. پوءِ صفا ظاهر ٿيا، مقامي (في-سي پي يو) هيش ٽيبل ۽ مقامي صفون، وڻن جي ڳولا، نقشا جن ۾ BPF پروگرامن ڏانهن اشارو ۽ گهڻو ڪجهه. هاڻي اسان لاءِ دلچسپ ڳالهه اها آهي ته BPF پروگرامن ۾ هاڻي ڪالن جي وچ ۾ رياست کي برقرار رکڻ جي صلاحيت آهي ۽ ان کي ٻين پروگرامن سان ۽ صارف جي جڳهه سان حصيداري ڪرڻ جي صلاحيت آهي.
سسٽم ڪال استعمال ڪندي صارف جي عملن مان نقشن تائين رسائي حاصل ڪئي وئي آهي bpf(2)، ۽ بي پي ايف پروگرامن مان جيڪي ڪنيل ۾ هلن ٿا مددگار افعال استعمال ڪندي. ان کان علاوه، مددگار موجود آهن نه رڳو نقشن سان ڪم ڪرڻ، پر ٻين ڪنييل صلاحيتن تائين رسائي لاء پڻ. مثال طور، BPF پروگرام مددگار افعال استعمال ڪري سگھن ٿا پيڪيٽ کي ٻين انٽرفيس ڏانهن اڳتي وڌائڻ لاءِ، پرف واقعا پيدا ڪرڻ، ڪنييل ڍانچي تائين رسائي، وغيره.
تت ۾، BPF صوابديدي لوڊ ڪرڻ جي صلاحيت مهيا ڪري ٿي، يعني، تصديق ڪندڙ-ٽيسٽ ٿيل، يوزر ڪوڊ ڪرنل اسپيس ۾. هي ڪوڊ ڪالن جي وچ ۾ رياست کي بچائي سگهي ٿو ۽ صارف جي اسپيس سان ڊيٽا مٽائي سگهي ٿو، ۽ هن قسم جي پروگرام پاران اجازت ڏنل ڪنيل سب سسٽم تائين رسائي پڻ آهي.
اهو اڳ ۾ ئي ڪنيل ماڊلز پاران مهيا ڪيل صلاحيتن سان ملندڙ جلندڙ آهي، جنهن جي مقابلي ۾ BPF جا ڪجهه فائدا آهن (يقيناً، توهان صرف ساڳئي ايپليڪيشنن جو مقابلو ڪري سگهو ٿا، مثال طور، سسٽم ٽريڪنگ - توهان بي پي ايف سان هڪ صوابديدي ڊرائيور نه ٿا لکي سگهو). توهان نوٽ ڪري سگهو ٿا هڪ هيٺين داخل ٿيڻ واري حد (ڪجهه افاديت جيڪي BPF استعمال ڪن ٿيون صارف کي ڪننل پروگرامنگ مهارتن جي ضرورت ناهي، يا عام طور تي پروگرامنگ مهارتون)، رن ٽائم حفاظت (توهان جو هٿ انهن ماڻهن لاءِ تبصرن ۾ وڌايو جن لکڻ دوران سسٽم کي نه ٽوڙيو. يا ٽيسٽنگ ماڊلز)، ايٽميٽي - ماڊلز کي ٻيهر لوڊ ڪرڻ وقت وقت ختم ٿئي ٿو، ۽ BPF سبسسٽم يقيني بڻائي ٿو ته ڪو به واقعو ياد نه ڪيو وڃي (منصفانه هجڻ لاء، اهو BPF پروگرامن جي سڀني قسمن لاء صحيح ناهي).
اهڙين صلاحيتن جي موجودگي BPF کي ڪنيل کي وڌائڻ لاءِ هڪ آفاقي اوزار بڻائي ٿي، جنهن جي عملي طور تي تصديق ٿئي ٿي: BPF ۾ وڌيڪ کان وڌيڪ نوان قسم جا پروگرام شامل ڪيا ويا آهن، وڌيڪ کان وڌيڪ وڏيون ڪمپنيون BPF کي جنگي سرورز تي استعمال ڪن ٿيون 24×7، وڌيڪ ۽ وڌيڪ. startups پنهنجو ڪاروبار ٺاهي انهن حلن تي جيڪي بي پي ايف تي ٻڌل آهن. BPF هر جڳهه استعمال ڪيو ويندو آهي: DDoS حملن جي خلاف حفاظت ۾، SDN ٺاهڻ (مثال طور، ڪبرنيٽس لاء نيٽ ورڪ لاڳو ڪرڻ)، مکيه سسٽم ٽريڪنگ ٽول ۽ شماريات ڪليڪٽر جي طور تي، مداخلت ڳولڻ واري نظام ۽ سينڊ باڪس سسٽم ۾، وغيره.
اچو ته مضمون جو جائزو حصو هتي ختم ڪريون ۽ ڏسو مجازي مشين ۽ BPF ماحولياتي نظام کي وڌيڪ تفصيل سان.
Digression: افاديت
هيٺين حصن ۾ مثالن کي هلائڻ جي قابل ٿيڻ لاء، توهان کي گهٽ ۾ گهٽ ڪيترن ئي افاديت جي ضرورت پوندي. llvm/clang بي پي ايف جي مدد سان ۽ bpftool. ڀا Inي ۾ ترقي جا اوزار توھان پڙھي سگھوٿا ھدايتن کي گڏ ڪرڻ لاءِ يوٽيلٽيز، گڏو گڏ توھان جو ڪنيل. هي سيڪشن هيٺ رکيو ويو آهي ته جيئن اسان جي پيشڪش جي هم آهنگي کي خراب نه ٿئي.
BPF ورچوئل مشين رجسٽر ۽ هدايتون سسٽم
BPF جو آرڪيٽيڪچر ۽ ڪمانڊ سسٽم ٺاهيا ويا آهن انهي حقيقت کي نظر ۾ رکندي ته پروگرام سي ٻوليءَ ۾ لکيا ويندا ۽ ڪرنل ۾ لوڊ ٿيڻ کان پوءِ، اصلي ڪوڊ ۾ ترجمو ڪيو ويندو. تنهن ڪري، رجسٽرن جو تعداد ۽ حڪمن جي سيٽ کي چونڪ جي نظر سان چونڊيو ويو، رياضياتي معنى ۾، جديد مشينن جي صلاحيتن جي. ان کان علاوه، پروگرامن تي مختلف پابنديون لاڳو ڪيون ويون آهن، مثال طور، تازو جيستائين اهو ممڪن نه هو ته لوپ ۽ سبروٽين لکڻ لاء، ۽ هدايتن جو تعداد 4096 تائين محدود هو (هاڻي مراعات يافته پروگرام هڪ ملين هدايتون لوڊ ڪري سگهن ٿيون).
BPF وٽ يارهن صارفن جي پهچ وارا 64-bit رجسٽر آهن r0-r10 ۽ هڪ پروگرام ڪائونٽر. رجسٽر r10 هڪ فريم پوائنٽر تي مشتمل آهي ۽ صرف پڙهڻ لاءِ آهي. پروگرامن کي رن ٽائم تي 512-بائيٽ اسٽيڪ تائين رسائي آهي ۽ نقشن جي صورت ۾ گڏيل ميموري جي لامحدود مقدار.
BPF پروگرامن کي پروگرام جي قسم جي ڪنيل مددگارن جي مخصوص سيٽ کي هلائڻ جي اجازت ڏني وئي آهي ۽، تازو، باقاعده افعال. هر سڏايل فنڪشن پنجن دليلن تائين وٺي سگھي ٿو، رجسٽر ۾ گذريو r1-r5، ۽ واپسي جي قيمت منظور ڪئي وئي آهي r0. اها ضمانت آهي ته فنڪشن مان موٽڻ کان پوء، رجسٽر جو مواد r6-r9 تبديل نه ٿيندو.
موثر پروگرام جي ترجمي لاءِ، رجسٽر r0-r11 سڀني سپورٽ ٿيل آرڪيٽيڪچرز لاءِ حقيقي رجسٽرن تي منفرد نقشا ٺاھيا ويا آھن، موجوده فن تعمير جي ABI خاصيتن کي مدنظر رکندي. مثال طور، لاء x86_64 رجسٽر r1-r5, فنڪشن پيٽرولر کي پاس ڪرڻ لاء استعمال ڪيو ويو، تي ڏيکاريل آهن rdi, rsi, rdx, rcx, r8، جيڪي استعمال ڪيا ويندا آھن پيرا ميٽرز کي ڪم ڪرڻ لاءِ x86_64. مثال طور، کاٻي پاسي جو ڪوڊ ساڄي پاسي واري ڪوڊ کي ترجمو ڪري ٿو:
رجسٽر r0 پڻ پروگرام جي عمل جي نتيجن کي واپس ڪرڻ لاء استعمال ڪيو ويو، ۽ رجسٽر ۾ r1 پروگرام جي حوالي سان هڪ اشارو ڏنو ويو آهي - پروگرام جي قسم تي منحصر ڪري، اهو ٿي سگهي ٿو، مثال طور، هڪ ساخت struct xdp_md (XDP لاءِ) يا جوڙجڪ struct __sk_buff (مختلف نيٽ ورڪ پروگرامن لاءِ) يا جوڙجڪ struct pt_regs (مختلف قسمن جي ٽريڪنگ پروگرامن لاءِ)، وغيره.
تنهن ڪري، اسان وٽ رجسٽرن جو هڪ سيٽ هو، ڪنيل مددگار، هڪ اسٽيڪ، هڪ حوالو پوائنٽر ۽ نقشن جي صورت ۾ حصيداري ڪيل ياداشت. اهو نه آهي ته اهو سڀ ڪجهه سفر ۾ بلڪل ضروري آهي، پر ...
جيڪڏهن پروگرام نقشا استعمال ڪري ٿو، پوء refcount اهي نقشا پروگرام کي لوڊ ڪرڻ کان پوءِ هڪ طرف وڌي ويا آهن، يعني. انهن جي فائل وضاحت ڪندڙ صارف جي عمل کان بند ٿي سگهي ٿو ۽ اڃا به refcount صفر نه ٿيندو:
ڪاميابيءَ سان هڪ پروگرام لوڊ ڪرڻ کان پوءِ، اسين عام طور تي ان کي ڪنهن قسم جي ايونٽ جنريٽر سان ڳنڍيون ٿا. مثال طور، اسان ان کي نيٽ ورڪ انٽرفيس تي رکي سگھون ٿا ايندڙ پيڪيٽ کي پروسيس ڪرڻ لاءِ يا ان کي ڪجهه سان ڳنڍڻ لاءِ tracepoint بنيادي ۾. هن نقطي تي، ريفرنس ڪائونٽر پڻ هڪ طرف وڌندو ۽ اسان لوڊر پروگرام ۾ فائل بيان ڪندڙ کي بند ڪري سگهنداسين.
ڇا ٿيندو جيڪڏهن اسان هاڻي بوٽ لوڊر کي بند ڪريون؟ اهو ايونٽ جنريٽر جي قسم تي منحصر آهي (هڪ). سڀ نيٽ ورڪ ٿلها موجود هوندا، لوڊر مڪمل ٿيڻ کان پوءِ، اهي نام نهاد عالمي ٿلها آهن. ۽، مثال طور، ٽريس پروگرامن کي جاري ڪيو ويندو پروسيس کان پوءِ جيڪو انهن کي ختم ڪيو ويو آهي (۽ انهي ڪري سڏيو ويندو آهي مقامي، "مقامي کان عمل"). تخنيقي طور تي، مقامي ٿلهو هميشه صارف جي جڳهه ۾ هڪ لاڳاپيل فائل بيان ڪندڙ آهي ۽ تنهن ڪري بند ڪيو ويندو آهي جڏهن اهو عمل بند ڪيو ويندو آهي، پر عالمي ٿلهو نه ڪندا آهن. هيٺ ڏنل شڪل ۾، ريڊ ڪراس استعمال ڪندي، مان اهو ڏيکارڻ جي ڪوشش ڪريان ٿو ته ڪيئن لوڊر پروگرام جي ختم ٿيڻ سان مقامي ۽ عالمي ٿلهو جي صورت ۾ شين جي زندگي تي اثر پوي ٿو.
مقامي ۽ عالمي ٿلهن جي وچ ۾ فرق ڇو آهي؟ نيٽ ورڪ پروگرامن جي ڪجهه قسمن کي هلائڻ بغير يوزر اسپيس جي سمجهه ۾ اچي ٿو، مثال طور، تصور ڪريو DDoS تحفظ - بوٽ لوڊر ضابطا لکي ٿو ۽ BPF پروگرام کي نيٽ ورڪ انٽرفيس سان ڳنڍي ٿو، جنهن کان پوءِ بوٽ لوڊر وڃي سگهي ٿو ۽ پاڻ کي ماري سگهي ٿو. ٻئي طرف، تصور ڪريو هڪ ڊيبگنگ ٽريس پروگرام جيڪو توهان پنهنجي گوڏن تي ڏهن منٽن ۾ لکيو آهي - جڏهن اهو ختم ٿي ويندو، توهان چاهيو ٿا ته سسٽم ۾ ڪو به گندو نه بچيو وڃي، ۽ مقامي ٿلهو انهي کي يقيني بڻائي سگهندا.
ٻئي طرف، تصور ڪريو ته توھان چاھيو ٿا ڳنڍڻ چاھيو ٿا ڪني ۾ ھڪڙي ٽريڪ پوائنٽ سان ۽ انگ اکر گڏ ڪريو ڪيترن سالن کان. انهي حالت ۾، توهان چاهيو ٿا ته صارف جو حصو مڪمل ڪريو ۽ انگن اکرن ڏانهن موٽڻ وقت وقت تي. بي پي ايف فائيل سسٽم اهو موقعو فراهم ڪري ٿو. اهو هڪ ان-ميموري-صرف pseudo-فائل سسٽم آهي جيڪو فائلن کي ٺاهڻ جي اجازت ڏئي ٿو جيڪو BPF شين جو حوالو ڏئي ٿو ۽ ان سان وڌائي ٿو. refcount شيون. هن کان پوء، لوڊ ڪندڙ ٻاهر نڪري سگهي ٿو، ۽ شيون جيڪي ٺاهيل آهن اهي زنده رهندا.
Bpffs ۾ فائلون ٺاهڻ جيڪي BPF شيون جو حوالو ڏين ٿيون "پننگ" سڏيو ويندو آهي (جيئن هيٺ ڏنل جملي ۾: "پروسيس پن ڪري سگھي ٿو BPF پروگرام يا نقشو"). BPF شين لاءِ فائل شيون ٺاهڻ جو مطلب نه رڳو مقامي شين جي زندگي کي وڌائڻ لاءِ ، پر عالمي شين جي استعمال لاءِ پڻ - عالمي DDoS تحفظ واري پروگرام سان مثال ڏانهن واپس وڃڻ ، اسان چاهيون ٿا ته اچو ۽ انگن اکرن کي ڏسو. وقت بوقت.
BPF فائل سسٽم عام طور تي نصب ٿيل آهي /sys/fs/bpf، پر اهو پڻ مقامي طور تي نصب ٿي سگهي ٿو، مثال طور، هن وانگر:
$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpoint
فائل سسٽم جا نالا ٺاهيا ويا آھن حڪم استعمال ڪندي BPF_OBJ_PIN BPF سسٽم ڪال. وضاحت ڪرڻ لاءِ، اچو ته هڪ پروگرام وٺون، ان کي مرتب ڪريون، ان کي اپلوڊ ڪريون ۽ ان کي پن ڪريون bpffs. اسان جو پروگرام ڪجھ به مفيد نه ٿو ڪري، اسان صرف ڪوڊ پيش ڪري رهيا آهيون ته جيئن توهان مثال ٻيهر پيش ڪري سگهو ٿا:
هتي اسان پروگرام کي استعمال ڪندي لوڊ ڪيو آهي BPF_PROG_LOAD, kernel مان هڪ فائل بيان ڪندڙ وصول ڪيو 3 ۽ حڪم استعمال ڪندي BPF_OBJ_PIN هن فائل جي وضاحت ڪندڙ کي فائل طور پن ڪيو "bpf-mountpoint/test". ان کان پوء بوٽ لوڊر پروگرام bpftool ڪم ختم ٿي ويو، پر اسان جو پروگرام ڪرنل ۾ رهيو، جيتوڻيڪ اسان ان کي ڪنهن به نيٽ ورڪ انٽرفيس سان ڳنڍيو ناهي.
$ sudo bpftool prog | tail -3
783: xdp name test tag 5c8ba0cf164cb46c gpl
loaded_at 2020-05-05T13:27:08+0000 uid 0
xlated 24B jited 41B memlock 4096B
اسان عام طور تي فائل اعتراض کي ختم ڪري سگھون ٿا unlink(2) ۽ ان کان پوء لاڳاپيل پروگرام کي ختم ڪيو ويندو:
$ sudo rm ./bpf-mountpoint/test
$ sudo bpftool prog show id 783
Error: get by id (783): No such file or directory
شيون ختم ڪرڻ
شين کي حذف ڪرڻ جي باري ۾ ڳالهائيندي، اهو واضح ڪرڻ ضروري آهي ته اسان پروگرام کي ٿلهو (ايونٽ جنريٽر) کان ڌار ڪرڻ کان پوء، هڪ نئون واقعو ان جي لانچ کي شروع نه ڪندو، جڏهن ته، پروگرام جي سڀني موجوده مثالن کي عام ترتيب ۾ مڪمل ڪيو ويندو. .
BPF پروگرامن جا ڪجهه قسم توهان کي پرواز تي پروگرام کي تبديل ڪرڻ جي اجازت ڏين ٿا، يعني. ايٽمي تسلسل فراهم ڪريو replace = detach old program, attach new program. انهي صورت ۾، پروگرام جي پراڻي ورزن جا سڀئي فعال مثال پنهنجو ڪم ختم ڪري ڇڏيندا، ۽ نئين پروگرام مان نوان ايونٽ هينڊلر ٺاهيا ويندا، ۽ هتي ”ايٽميٽي“ جو مطلب آهي ته هڪ به واقعو ياد نه ڪيو ويندو.
واقعن جي ذريعن سان پروگرامن کي ڳنڍڻ
هن آرٽيڪل ۾، اسان الڳ الڳ بيان نه ڪنداسين پروگرامن کي ڳنڍڻ واري پروگرامن جي ذريعن سان، ڇاڪاڻ ته اهو هڪ خاص قسم جي پروگرام جي حوالي سان مطالعو ڪرڻ جو مطلب آهي. سي ايم. مثال هيٺ، جنهن ۾ اسين ڏيکاريون ٿا ته ڪيئن پروگرامن جهڙوڪ XDP ڳنڍيل آهن.
بي پي ايف سسٽم ڪال استعمال ڪندي شين کي هٿي ڏيڻ
BPF پروگرام
سڀ BPF شيون ٺاهيا ويا آهن ۽ سسٽم ڪال استعمال ڪندي صارف جي جڳهه مان منظم ڪيا ويا آهن bpfهيٺ ڏنل پروٽوٽائپ سان گڏ:
#include <linux/bpf.h>
int bpf(int cmd, union bpf_attr *attr, unsigned int size);
هتي ٽيم آهي cmd قسم جي قدرن مان هڪ آهي enum bpf_cmd, attr - هڪ خاص پروگرام لاءِ پيرا ميٽرز ڏانهن اشارو ڪندڙ ۽ size - پوائنٽر جي مطابق اعتراض جي سائيز، يعني عام طور تي هي sizeof(*attr). ڪرنل 5.8 ۾ سسٽم ڪال bpf 34 مختلف حڪمن کي سپورٽ ڪري ٿو، ۽ وضاحتunion bpf_attr 200 لائنن تي قبضو ڪري ٿو. پر اسان کي ان کان خوفزده نه ٿيڻ گهرجي، ڇو ته اسان پاڻ کي ڪيترن ئي مضمونن جي دوران حڪمن ۽ معيارن سان واقف ڪنداسين.
اچو ته ٽيم سان شروع ڪريون BPF_PROG_LOAD، جيڪو BPF پروگرام ٺاهي ٿو - BPF هدايتن جو هڪ سيٽ وٺي ٿو ۽ ان کي ڪني ۾ لوڊ ڪري ٿو. لوڊ ڪرڻ جي وقت تي، تصديق ڪندڙ شروع ڪيو ويو آهي، ۽ پوء JIT مرتب ڪندڙ ۽، ڪامياب عمل کان پوء، پروگرام فائل بيان ڪندڙ صارف ڏانهن واپس آيو آهي. اسان ڏٺو ته ان سان ڇا ٿيندو پوئين حصي ۾ BPF شين جي زندگي جي چڪر بابت.
اسان هاڻي هڪ ڪسٽم پروگرام لکنداسين جيڪو هڪ سادي BPF پروگرام لوڊ ڪندو، پر پهريان اسان کي اهو فيصلو ڪرڻو پوندو ته اسان ڪهڙي قسم جو پروگرام لوڊ ڪرڻ چاهيون ٿا - اسان کي چونڊڻو پوندو. قسم ۽ هن قسم جي فريم ورڪ ۾، هڪ پروگرام لکو جيڪو تصديق ڪندڙ ٽيسٽ پاس ڪندو. بهرحال، پروسيس کي پيچيده نه ڪرڻ لاء، هتي هڪ تيار ڪيل حل آهي: اسان هڪ پروگرام کڻنداسين جهڙوڪ BPF_PROG_TYPE_XDP، جيڪو قدر واپس ڪندو XDP_PASS (سڀني پيڪيجز کي ڇڏي ڏيو). BPF جمع ڪندڙ ۾ اهو تمام سادو ڏسڻ ۾ اچي ٿو:
هڪ پروگرام ۾ دلچسپ واقعا هڪ صف جي تعريف سان شروع ٿين ٿا insns - اسان جو BPF پروگرام مشين ڪوڊ ۾. انهي صورت ۾، BPF پروگرام جي هر هدايت جي جوڙجڪ ۾ ڀريل آهي bpf_insn. پهريون عنصر insns هدايتن تي عمل ڪري ٿو r0 = 2، ٻيون - exit.
پر جيئن ته مقامي ڪوڊ ۾ BPF پروگرامن کي لکڻ صرف ضروري آهي ٽيسٽ لکڻ لاءِ ڪرنل ۾ ۽ BPF بابت آرٽيڪل، انهن ميڪروز جي غير موجودگي واقعي ڊولپر جي زندگي کي پيچيده نٿو ڪري.
BPF پروگرام جي وضاحت ڪرڻ کان پوء، اسان ان کي ڪرنل ۾ لوڊ ڪرڻ لاء اڳتي وڌو. اسان جي گھٽ ۾ گھٽ پيٽرولر جو سيٽ attr پروگرام جو قسم، سيٽ ۽ هدايتن جو تعداد، گهربل لائسنس، ۽ نالو شامل آھي "woo"، جنهن کي اسان ڊائون لوڊ ڪرڻ کان پوءِ سسٽم تي پنهنجو پروگرام ڳولڻ لاءِ استعمال ڪندا آهيون. پروگرام، جيئن واعدو ڪيو ويو، سسٽم ڪال استعمال ڪندي سسٽم ۾ لوڊ ڪيو ويو آهي bpf.
پروگرام جي آخر ۾ اسان هڪ لامحدود لوپ ۾ ختم ڪريون ٿا جيڪو پيل لوڊ کي نقل ڪري ٿو. ان کان سواء، پروگرام ڪرنل طرفان ماريو ويندو جڏهن فائل بيان ڪندڙ جيڪو سسٽم ڪال اسان ڏانهن واپس آيو آهي بند ڪيو ويندو. bpf، ۽ اسان ان کي سسٽم ۾ نه ڏسنداسين.
خير، اسان جاچ لاء تيار آهيون. اچو ته گڏ ڪريون ۽ پروگرام هيٺ هلون straceچيڪ ڪرڻ لاءِ ته هر شي ڪم ڪري رهي آهي جيئن ان کي گهرجي:
# bpftool prog dump jited id 390
bpf_prog_3b185187f1855c4c_woo:
0: nopl 0x0(%rax,%rax,1)
5: push %rbp
6: mov %rsp,%rbp
9: sub $0x0,%rsp
10: push %rbx
11: push %r13
13: push %r14
15: push %r15
17: pushq $0x0
19: mov $0x2,%eax
1e: pop %rbx
1f: pop %r15
21: pop %r14
23: pop %r13
25: pop %rbx
26: leaveq
27: retq
لاء تمام مؤثر نه آهي exit(2)، پر انصاف جي لحاظ کان، اسان جو پروگرام تمام سادو آهي، ۽ غير معمولي پروگرامن لاءِ JIT مرتب ڪندڙ پاران شامل ڪيل پرولوگ ۽ ايپيلاگ، يقيناً، گهربل آهن.
اچو ته فوري طور تي چئو ته نقشن جون صلاحيتون صرف حصيداري ياداشت تائين رسائي تائين محدود نه آهن. هتي خاص مقصد وارا نقشا آهن، مثال طور، BPF پروگرامن ڏانهن اشارو يا نيٽ ورڪ انٽرفيس ڏانهن اشارو، perf واقعن سان ڪم ڪرڻ لاءِ نقشا، وغيره. اسان هتي انهن بابت نه ڳالهائينداسين، جيئن پڙهندڙ کي پريشان نه ٿئي. ان کان سواء، اسان هم وقت سازي جي مسئلن کي نظر انداز ڪندا آهيون، ڇاڪاڻ ته اهو اسان جي مثالن لاء اهم ناهي. دستياب نقشي جي قسمن جي مڪمل فهرست ملي سگھي ٿي <linux/bpf.h>، ۽ هن حصي ۾ اسين مثال طور وٺنداسين تاريخي طور تي پهريون قسم، هيش ٽيبل BPF_MAP_TYPE_HASH.
جيڪڏهن توهان هڪ هيش ٽيبل ٺاهي، چئو، C ++، توهان چوندا unordered_map<int,long> woo، جنهن جو روسي ۾ مطلب آهي "مون کي ٽيبل جي ضرورت آهي woo لامحدود سائيز، جن جون ڪنجيون قسم جون آھن int، ۽ قدر آھن قسم long" BPF هيش ٽيبل ٺاهڻ لاءِ، اسان کي گهڻو ڪجهه ڪرڻو پوندو، سواءِ ان جي ته اسان کي ٽيبل جي وڌ ۾ وڌ سائيز جي وضاحت ڪرڻي پوندي، ۽ ڪي ۽ ويلز جي قسمن کي بيان ڪرڻ بدران، اسان کي انهن جي سائيز بائيٽ ۾ بيان ڪرڻ جي ضرورت آهي. . نقشا ٺاهڻ لاءِ ڪمانڊ استعمال ڪريو BPF_MAP_CREATE سسٽم ڪال bpf. اچو ته هڪ وڌيڪ يا گهٽ ۾ گهٽ پروگرام ڏسو جيڪو نقشو ٺاهي ٿو. پوئين پروگرام کان پوءِ جيڪو BPF پروگرامن کي لوڊ ڪري ٿو، اهو توهان کي سادو لڳي ٿو:
ھاڻي اچو ته اسان جي پروگرام کي پس منظر ڏانھن موڪليو يا ٻيو ٽرمينل کوليو ۽ يوٽيلٽي استعمال ڪندي پنھنجي اعتراض کي ڏسو bpftool (اسان پنهنجي نقشي کي ٻين کان ان جي نالي سان الڳ ڪري سگهون ٿا):
$ sudo bpftool map
...
114: hash name woo flags 0x0
key 4B value 4B max_entries 4 memlock 4096B
...
نمبر 114 اسان جي اعتراض جي عالمي ID آهي. سسٽم تي ڪو به پروگرام هن ID کي استعمال ڪري سگھي ٿو موجوده نقشي کي کولڻ لاءِ ڪمانڊ استعمال ڪندي BPF_MAP_GET_FD_BY_ID سسٽم ڪال bpf.
ھاڻي اسان پنھنجي ھيش ٽيبل سان راند ڪري سگھون ٿا. اچو ته ان جي مواد کي ڏسو:
$ sudo bpftool map dump id 114
Found 0 elements
خالي. اچو ته ان ۾ هڪ قدر وجهي hash[1] = 1:
$ sudo bpftool map update id 114 key 1 0 0 0 value 1 0 0 0
اچو ته ٽيبل تي ٻيهر ڏسو:
$ sudo bpftool map dump id 114
key: 01 00 00 00 value: 01 00 00 00
Found 1 element
هوري! اسان ھڪڙو عنصر شامل ڪرڻ ۾ مدد ڪئي. نوٽ ڪريو ته اسان کي بائيٽ جي سطح تي ڪم ڪرڻو پوندو ته جيئن bptftool خبر ناهي ته هيش ٽيبل ۾ ڪهڙي قسم جا قدر آهن. (هي علم هن کي BTF استعمال ڪندي منتقل ڪري سگهجي ٿو، پر هاڻي ان تي وڌيڪ.)
ڪيئن صحيح طور تي bpftool پڙهڻ ۽ عناصر شامل ڪندو؟ اچو ته هيٺان هڪ نظر وٺون:
BPF_MAP_GET_NEXT_ID: توهان کي سڀني موجوده نقشن ذريعي وڃڻ جي اجازت ڏئي ٿي، اهو ڪيئن ڪم ڪري ٿو bpftool map
BPF_MAP_GET_FD_BY_ID: موجوده نقشي کي ان جي عالمي ID ذريعي کوليو
BPF_MAP_LOOKUP_AND_DELETE_ELEM: ايٽمي طور تي هڪ اعتراض جي قيمت کي اپڊيٽ ڪريو ۽ پراڻي هڪ واپس آڻيو
BPF_MAP_FREEZE: نقشي کي يوزر اسپيس مان تبديل ڪرڻ لائق بڻايو (ھي آپريشن رد نه ٿو ڪري سگھجي)
BPF_MAP_LOOKUP_BATCH, BPF_MAP_LOOKUP_AND_DELETE_BATCH, BPF_MAP_UPDATE_BATCH, BPF_MAP_DELETE_BATCH: ڪاميٽي آپريشن. مثال طور، BPF_MAP_LOOKUP_AND_DELETE_BATCH - نقشي مان سڀني قدرن کي پڙھڻ ۽ ري سيٽ ڪرڻ جو اھو واحد قابل اعتماد طريقو آھي
اهي سڀئي ڪمانڊ سڀني نقشن جي قسمن لاءِ ڪم نه ٿا ڪن، پر عام طور تي ٻين قسمن جي نقشن سان ڪم ڪرڻ سان يوزر اسپيس مان بلڪل ائين ئي نظر اچن ٿا جيئن هيش ٽيبل سان ڪم ڪرڻ.
آرڊر جي خاطر، اچو ته اسان جي هيش ٽيبل تجربن کي ختم ڪريون. ياد رکو ته اسان هڪ ٽيبل ٺاهيو جنهن ۾ چار چاٻيون شامل هجن؟ اچو ته ڪجھ وڌيڪ عناصر شامل ڪريو:
$ sudo bpftool map update id 114 key 2 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 3 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 4 0 0 0 value 1 0 0 0
(پڙهندڙن لاءِ جيڪي گهٽ سطحي مثال جي کوٽ کان مطمئن نه آهن: اسان تفصيلي پروگرامن جو تجزيو ڪنداسين جيڪي نقشا ۽ مددگار افعال استعمال ڪندا آهن libbpf ۽ توهان کي ٻڌايو ته هدايت جي سطح تي ڇا ٿئي. پڙهندڙن لاء جيڪي غير مطمئن آهن تمام گهڻو، اسان شامل ڪيو مثال مضمون ۾ مناسب جڳهه تي.)
Libbpf استعمال ڪندي BPF پروگرام لکڻ
مشين ڪوڊ استعمال ڪندي BPF پروگرامن کي لکڻ صرف پهريون ڀيرو دلچسپ ٿي سگهي ٿو، ۽ پوء اطمينان سيٽ ۾. هن وقت توهان کي ڌيان ڏيڻ جي ضرورت آهي llvm، جنهن ۾ BPF آرڪيٽيڪچر لاءِ ڪوڊ ٺاهڻ لاءِ هڪ پس منظر آهي، انهي سان گڏ هڪ لائبريري libbpf، جيڪو توهان کي BPF ايپليڪيشنن جي صارف طرف لکڻ جي اجازت ڏئي ٿو ۽ استعمال ڪندي ٺاهيل BPF پروگرامن جو ڪوڊ لوڊ ڪري ٿو. llvm/clang.
حقيقت ۾، جيئن اسين هن ۽ ايندڙ مضمونن ۾ ڏسندا سين، libbpf ان کان سواءِ ڪافي ڪم ڪري ٿو (يا ساڳيا اوزار - iproute2, libbcc, libbpf-goوغيره) اهو رهڻ ناممڪن آهي. منصوبي جي قاتل خاصيتن مان هڪ آهي libbpf آهي BPF CO-RE (Compile One, Run Everywhere) - هڪ پروجيڪٽ جيڪو توهان کي BPF پروگرامن کي لکڻ جي اجازت ڏئي ٿو جيڪي هڪ ڪني کان ٻئي تائين پورٽيبل آهن، مختلف APIs تي هلائڻ جي صلاحيت سان (مثال طور، جڏهن ڪنيل جي جوڙجڪ ورجن مان تبديل ٿي وڃي ٿي. نسخو تائين). CO-RE سان ڪم ڪرڻ جي قابل ٿيڻ لاءِ، توھان جي ڪنيل کي BTF سپورٽ سان گڏ ڪرڻ گھرجي (اسين بيان ڪريون ٿا ته ھي ڪيئن ڪجي سيڪشن ۾ ترقي جا اوزار. توهان چيڪ ڪري سگهو ٿا ته توهان جو ڪنيبل BTF سان ٺهيل آهي يا نه بلڪل آسان - هيٺ ڏنل فائل جي موجودگي سان.
هي فائل سڀني ڊيٽا جي قسمن بابت معلومات کي ذخيرو ڪري ٿو جيڪو ڪني ۾ استعمال ڪيو ويو آهي ۽ استعمال ڪندي اسان جي سڀني مثالن ۾ استعمال ڪيو ويندو آهي libbpf. اسان ايندڙ مضمون ۾ CO-RE بابت تفصيل سان ڳالهائينداسين، پر هن ۾ - صرف پنهنجو پاڻ کي هڪ دانا ٺاهيو CONFIG_DEBUG_INFO_BTF.
لائبريري libbpf ڊاريڪٽري ۾ صحيح رهن ٿا tools/lib/bpf kernel ۽ ان جي ترقي ميلنگ لسٽ ذريعي ڪئي وئي آهي [email protected]. بهرحال، هڪ الڳ مخزن کي برقرار رکيو ويندو آهي ايپليڪيشنن جي ضرورتن لاءِ جيڪي ڪرنل کان ٻاهر رهن ٿا https://github.com/libbpf/libbpf جنهن ۾ ڪنيل لائبريري کي وڌيڪ يا گهٽ پڙهڻ جي رسائي لاءِ آئيني طور تي ظاهر ڪيو ويو آهي.
هن حصي ۾ اسين ڏسنداسين ته توهان هڪ پروجيڪٽ ڪيئن ٺاهي سگهو ٿا جيڪو استعمال ڪري ٿو libbpf، اچو ته لکون ڪيترائي (وڌيڪ يا گهٽ بي معنيٰ) ٽيسٽ پروگرام ۽ تفصيل سان تجزيو ڪريون ته اهو سڀ ڪيئن ڪم ڪري ٿو. اهو اسان کي وڌيڪ آسانيءَ سان وضاحت ڪرڻ جي اجازت ڏيندو ته هيٺين حصن ۾ بلڪل ڪيئن BPF پروگرامن نقشن، ڪنيل مددگار، BTF وغيره سان لهه وچڙ ۾ اچن ٿا.
عام طور تي منصوبا استعمال ڪندي libbpf شامل ڪريو GitHub مخزن کي گٽ ذيلي ماڊل جي طور تي، اسان ساڳيو ڪنداسين:
جيتوڻيڪ اسان جو پروگرام تمام سادو ٿي ويو، اسان کي اڃا تائين ڪيترن ئي تفصيلن تي ڌيان ڏيڻ جي ضرورت آهي. پهريون، پهريون هيڊر فائل جنهن ۾ اسان شامل آهيون vmlinux.h، جيڪو اسان صرف استعمال ڪري پيدا ڪيو bpftool btf dump - ھاڻي اسان کي kernel-headers پيڪيج کي انسٽال ڪرڻ جي ضرورت نه آھي اھو معلوم ڪرڻ لاءِ ته ڪھڙين جي جوڙجڪ جھڙا نظر اچن ٿا. هيٺ ڏنل هيڊر فائل اسان وٽ لائبريري مان اچي ٿي libbpf. هاڻي اسان کي صرف ميڪرو جي وضاحت ڪرڻ جي ضرورت آهي SEC، جيڪو ڪردار کي ELF اعتراض فائل جي مناسب حصي ڏانهن موڪلي ٿو. اسان جو پروگرام سيڪشن ۾ موجود آهي xdp/simple، جتي سليش کان اڳ اسان پروگرام جي قسم جي وضاحت ڪريون ٿا BPF - هي اهو ڪنوينشن آهي جنهن ۾ استعمال ڪيو ويو آهي libbpf، سيڪشن جي نالي جي بنياد تي اهو شروع ڪرڻ تي صحيح قسم کي متبادل ڪندو bpf(2). BPF پروگرام پاڻ آهي C - بلڪل سادو ۽ ھڪڙي لائن تي مشتمل آھي return XDP_PASS. آخرڪار، هڪ الڳ سيڪشن "license" لائسنس جي نالي تي مشتمل آهي.
اسان پنهنجي پروگرام کي llvm/clang، ورجن >= 10.0.0 استعمال ڪندي گڏ ڪري سگھون ٿا، يا اڃا بهتر، وڏو (ڏسو سيڪشن ترقي جا اوزار):
ها، اهو ڪم ڪيو! هاڻي، اسان وٽ پروگرام سان گڏ هڪ بائنري فائل آهي، ۽ اسان هڪ ايپليڪيشن ٺاهڻ چاهيون ٿا جيڪا ان کي ڪرنل ۾ لوڊ ڪندي. هن مقصد لاء لائبريري libbpf اسان کي ٻه اختيار پيش ڪري ٿو - هڪ هيٺين-سطح API يا اعلي-سطح API استعمال ڪريو. اسان ٻئي طريقي سان هلنداسين، ڇو ته اسان سکڻ چاهيون ٿا ته ڪيئن لکڻ، لوڊ ڪرڻ ۽ ڳنڍجي BPF پروگرامن کي گهٽ ۾ گهٽ ڪوشش سان انهن جي ايندڙ مطالعي لاءِ.
پهرين، اسان کي پنهنجي پروگرام جي "سڪيلٽن" پيدا ڪرڻ جي ضرورت آهي ان جي بائنري مان ساڳئي يوٽيلٽي استعمال ڪندي. bpftool - BPF دنيا جو سوئس چاقو (جنهن کي لفظي طور وٺي سگهجي ٿو، ڇاڪاڻ ته ڊينيئل بورڪمن، BPF جي تخليق ۽ سنڀاليندڙن مان هڪ، سوئس آهي):
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
فائل ۾ xdp-simple.skel.h اسان جي پروگرام جي بائنري ڪوڊ تي مشتمل آهي ۽ انتظام ڪرڻ لاءِ افعال - لوڊ ڪرڻ، ڳنڍڻ، اسان جي اعتراض کي ختم ڪرڻ. اسان جي سادي صورت ۾ اهو نظر اچي ٿو اوور ڪل، پر اهو ان صورت ۾ پڻ ڪم ڪري ٿو جتي اعتراض فائل ۾ ڪيترائي BPF پروگرام ۽ نقشا شامل آهن ۽ هن وڏي ELF کي لوڊ ڪرڻ لاءِ اسان کي صرف اسڪيٽ ٺاهڻ جي ضرورت آهي ۽ ڪسٽم ايپليڪيشن مان هڪ يا ٻه فنڪشن کي ڪال ڪرڻ جي ضرورت آهي. لکي رهيا آهيون اچو ته اڳتي هلون.
سختي سان ڳالهائڻ، اسان جو لوڊ ڪندڙ پروگرام ننڍڙو آهي:
#include <err.h>
#include <unistd.h>
#include "xdp-simple.skel.h"
int main(int argc, char **argv)
{
struct xdp_simple_bpf *obj;
obj = xdp_simple_bpf__open_and_load();
if (!obj)
err(1, "failed to open and/or load BPF objectn");
pause();
xdp_simple_bpf__destroy(obj);
}
اهو آهي struct xdp_simple_bpf فائل ۾ وضاحت ڪئي وئي آهي xdp-simple.skel.h ۽ اسان جي اعتراض فائل کي بيان ڪري ٿو:
اسان هتي گهٽ-سطح API جا نشان ڏسي سگهون ٿا: ساخت struct bpf_program *simple и struct bpf_link *simple. پهرين جوڙجڪ خاص طور تي اسان جي پروگرام کي بيان ڪري ٿو، سيڪشن ۾ لکيل آهي xdp/simple، ۽ ٻيو بيان ڪري ٿو ته پروگرام ڪيئن ڳنڍي ٿو واقعي جي ماخذ سان.
فعل xdp_simple_bpf__open_and_load, هڪ ELF اعتراض کوليندو آهي، ان کي پارس ڪري ٿو، سڀني جوڙجڪ ۽ ذيلي جوڙجڪ ٺاهي ٿو (پروگرام کان علاوه، ELF ۾ ٻيا حصا پڻ شامل آهن - ڊيٽا، صرف پڙهڻ واري ڊيٽا، ڊيبگنگ معلومات، لائسنس، وغيره)، ۽ پوء ان کي سسٽم استعمال ڪندي ڪرنل ۾ لوڊ ڪري ٿو. سڏ bpf، جيڪو اسان پروگرام کي گڏ ڪرڻ ۽ هلائڻ سان چيڪ ڪري سگھون ٿا:
”مثال طور سکيا“ جي فريم ورڪ جي اندر، اچو ته هڪ مددگار ڪم تي غور ڪريون، bpf_get_smp_processor_id(), يقيني فائل ۾ kernel/bpf/helpers.c. اهو پروسيسر جو تعداد واپس ڪري ٿو جنهن تي BPF پروگرام جنهن کي سڏيو وڃي ٿو اهو هلائي رهيو آهي. پر اسان ان جي اصطلاحن ۾ ايتري دلچسپي نه ٿا رکون جيترو حقيقت ۾ ته ان تي عمل درآمد هڪ لڪير ۾ ٿئي ٿو:
BPF مددگار فنڪشن جون معنائون لينڪس سسٽم ڪال جي تعريف سان ملندڙ جلندڙ آهن. هتي، مثال طور، هڪ فنڪشن بيان ڪيو ويو آهي جنهن ۾ ڪوبه دليل نه آهي. (هڪ فنڪشن جيڪو وٺندو آهي، چئو، ٽن دليلن کي ميڪرو استعمال ڪندي بيان ڪيو ويو آهي BPF_CALL_3. دليلن جو وڌ ۾ وڌ تعداد پنج آهي.) بهرحال، هي صرف تعريف جو پهريون حصو آهي. ٻيو حصو قسم جي جوڙجڪ جي وضاحت ڪرڻ آهي struct bpf_func_proto، جنهن ۾ مددگار فنڪشن جي وضاحت شامل آهي جيڪا تصديق ڪندڙ سمجهي ٿو:
هڪ خاص قسم جي BPF پروگرامن لاءِ هن فنڪشن کي استعمال ڪرڻ لاءِ، انهن کي ان کي رجسٽر ڪرڻ گهرجي، مثال طور قسم لاءِ BPF_PROG_TYPE_XDP هڪ فنڪشن kernel ۾ بيان ڪيو ويو آهي xdp_func_proto، جيڪو مددگار فنڪشن ID مان طئي ڪري ٿو ته ڇا XDP هن فنڪشن کي سپورٽ ڪري ٿو يا نه. اسان جو ڪم آهي مدد ڪري ٿو:
نئين بي پي ايف پروگرام جا قسم فائل ۾ "وضاحت ٿيل" آهن include/linux/bpf_types.h ميڪرو استعمال ڪندي BPF_PROG_TYPE. اقتباس ۾ بيان ڪيو ويو آهي ڇاڪاڻ ته اها هڪ منطقي تعريف آهي، ۽ C ٻوليء جي اصطلاحن ۾ ڪنڪريٽ جي جوڙجڪ جي مڪمل سيٽ جي تعريف ٻين هنڌن تي ٿئي ٿي. خاص طور تي، فائل ۾ kernel/bpf/verifier.c فائل مان سڀ تعريفون bpf_types.h ڍانچي جي هڪ صف پيدا ڪرڻ لاء استعمال ڪيو ويندو آهي bpf_verifier_ops[]:
اهو آهي، هر قسم جي بي پي ايف پروگرام لاء، قسم جي ڊيٽا جي جوڙجڪ ڏانهن اشارو بيان ڪيو ويو آهي struct bpf_verifier_ops، جيڪو قدر سان شروع ڪيو ويو آهي _name ## _verifier_opsيعني، xdp_verifier_ops لاء xdp. ساخت xdp_verifier_opsپرعزم فائل ۾ net/core/filter.c جيئن ته:
$ sudo ./xdp-simple
$ sudo bpftool p | grep simple
669: xdp name simple tag 4fca62e77ccb43d6 gpl
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 669
پروگرام جيڪو اسان ڊائون لوڊ ڪيو آهي ID 669 آهي ۽ اسان انٽرفيس تي ساڳيو ID ڏسون ٿا lo. اسان کي ڪجهه پيڪيجز موڪلينداسين 127.0.0.1 (درخواست + جواب):
$ ping -c1 localhost
۽ ھاڻي اچو ته ڏسو ڊيبگ ورچوئل فائل جي مواد کي /sys/kernel/debug/tracing/trace_pipe، ڪھڙي bpf_printk سندس پيغام لکي ٿو:
# cat /sys/kernel/debug/tracing/trace_pipe
ping-13937 [000] d.s1 442015.377014: bpf_trace_printk: running on CPU0
ping-13937 [000] d.s1 442015.377027: bpf_trace_printk: running on CPU0
ٻه پيڪيجز تي ڏٺا ويا lo ۽ CPU0 تي عمل ڪيو ويو - اسان جو پهريون مڪمل بي معني بي پي ايف پروگرام ڪم ڪيو!
اها ingالهه نوٽ ڪرڻ جي قابل آهي bpf_printk اهو ڪجهه به ناهي ته اهو ڊيبگ فائل ڏانهن لکي ٿو: اهو پيداوار ۾ استعمال لاءِ سڀ کان ڪامياب مددگار ناهي، پر اسان جو مقصد ڪجهه سادو ڏيکارڻ هو.
BPF پروگرامن مان نقشن تائين رسائي
مثال: BPF پروگرام مان نقشو استعمال ڪندي
پوئين سيڪشن ۾ اسان سکيو ته يوزر اسپيس مان نقشا ڪيئن ٺاهيا ۽ استعمال ڪيا وڃن، ۽ هاڻي اچو ته ڪرنل واري حصي کي ڏسو. اچو ته شروع ڪريون، معمول وانگر، هڪ مثال سان. اچو ته اسان جي پروگرام کي ٻيهر لکون xdp-simple.bpf.c جيئن ته:
اچو ته چيڪ ڪريون ته هوءَ ان سان جڙيل آهي lo ۽ ڪجھ پيڪٽ موڪليو:
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 108
$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; done
$ llvm-readelf -r xdp-simple.bpf.o | head -4
Relocation section '.relxdp/simple' at offset 0xe18 contains 1 entries:
Offset Info Type Symbol's Value Symbol's Name
0000000000000020 0000002700000001 R_BPF_64_64 0000000000000000 woo
پر جيڪڏهن اسان اڳ ۾ ئي لوڊ ٿيل پروگرام تي نظر رکون ٿا، اسان ڏسون ٿا هڪ اشارو درست نقشي ڏانهن (لائن 4):
اهڙيء طرح، اسان اهو نتيجو ڪري سگهون ٿا ته اسان جي لوڊر پروگرام کي شروع ڪرڻ وقت، لنڪ &woo هڪ لائبريري سان ڪنهن شيء سان تبديل ڪيو ويو libbpf. سڀ کان پهريان اسان ان پٽ کي ڏسنداسين strace:
۽ ان سان گڏ ذريعو رجسٽر کي تبديل ڪريو BPF_PSEUDO_MAP_FD، ۽ پهريون IMM اسان جي نقشي جي فائل بيان ڪندڙ ڏانهن ۽، جيڪڏهن اهو برابر آهي، مثال طور، 0xdeadbeef، پوءِ نتيجي طور اسان کي هدايت ملندي
18 11 00 00 ef eb ad de 00 00 00 00 00 00 00 00 r1 = 0 ll
اهو ڪيئن نقشو معلومات هڪ مخصوص لوڊ ٿيل BPF پروگرام ڏانهن منتقل ڪيو ويو آهي. انهي صورت ۾، نقشو استعمال ڪندي ٺاهي سگهجي ٿو BPF_MAP_CREATE، ۽ ID استعمال ڪندي کوليو BPF_MAP_GET_FD_BY_ID.
مجموعي طور، جڏهن استعمال ڪندي libbpf الورورٿم ھيٺ ڏنل آھي:
تاليف دوران، رڪارڊ ٺاھيا ويندا آھن نقل و حمل جي جدول ۾ نقشن جي لنڪ لاءِ
مشڪل حصو prog_load اسان جي بي پي ايف پروگرام جي تعريف آهي ساخت جي هڪ صف جي طور تي struct bpf_insn insns[]. پر جيئن ته اسان هڪ پروگرام استعمال ڪري رهيا آهيون جيڪو اسان وٽ سي ۾ آهي، اسان ٿورڙو ٺڳي سگهون ٿا:
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 160
هيري، سڀ ڪم ڪري ٿو. نوٽ، رستي جي ذريعي، اسان جو نقشو ٻيهر بائيٽ جي صورت ۾ ڏيکاريل آهي. هن حقيقت جي ڪري آهي ته، ان جي ابتڙ libbpf اسان قسم جي معلومات (BTF) لوڊ نه ڪيو. پر اسان ان بابت وڌيڪ ڳالهائينداسين ايندڙ وقت.
عام طور تي ڳالهائڻ، توهان کي BPF پروگرامن کي ترقي ڪرڻ لاء ڪجهه خاص ضرورت نه آهي - BPF ڪنهن به مهذب تقسيم ڪنيل تي هلندو آهي، ۽ پروگرامن کي استعمال ڪندي ٺاهيل آهن. clang، جيڪو پيڪيج مان فراهم ڪري سگهجي ٿو. جڏهن ته، حقيقت اها آهي ته BPF ترقي هيٺ آهي، ڪنيل ۽ اوزار مسلسل تبديل ٿي رهيا آهن، جيڪڏهن توهان 2019 کان پراڻي طريقي سان استعمال ڪندي BPF پروگرامن کي لکڻ نٿا چاهيو، ته پوء توهان کي مرتب ڪرڻو پوندو.
llvm/clang
pahole
ان جو بنيادي
bpftool
(ريفرنس لاءِ، هي سيڪشن ۽ مضمون ۾ سڀ مثال ڊيبين 10 تي هليا ويا.)
اسان انسٽال نه ڪنداسين پروگرام جيڪي اسان ٺاهيا آهن، پر ان جي بدران صرف انهن کي شامل ڪريو PATHمثال طور
export PATH="`pwd`/bin:$PATH"
(هن ۾ شامل ڪري سگھجي ٿو .bashrc يا هڪ الڳ فائل ڏانهن. ذاتي طور تي، مان اهڙيون شيون شامل ڪريان ٿو ~/bin/activate-llvm.sh ۽ جڏهن ضروري هجي ته آئون ڪندس . activate-llvm.sh.)
Pahole ۽ BTF
افاديت pahole بي ٽي ايف فارميٽ ۾ ڊيبگنگ جي معلومات ٺاهڻ لاءِ ڪنيل ٺاهڻ وقت استعمال ڪيو ويندو آهي. اسان هن مضمون ۾ BTF ٽيڪنالاجي جي تفصيل بابت تفصيل نه ڪنداسين، حقيقت اها آهي ته اهو آسان آهي ۽ اسان ان کي استعمال ڪرڻ چاهيون ٿا. تنهن ڪري جيڪڏهن توهان پنهنجو ڪنيل تعمير ڪرڻ وارا آهيو، پهرين تعمير ڪريو pahole (بغير pahole توهان اختيار سان ڪنيل تعمير ڪرڻ جي قابل نه هوندا CONFIG_DEBUG_INFO_BTF:
$ git clone https://git.kernel.org/pub/scm/devel/pahole/pahole.git
$ cd pahole/
$ sudo apt install cmake
$ mkdir build
$ cd build/
$ cmake -D__LIB=lib ..
$ make
$ sudo make install
$ which pahole
/usr/local/bin/pahole
BPF سان تجربا ڪرڻ لاءِ ڪنيل
جڏهن BPF جي امڪانن کي ڳولي رهيو آهيان، مان پنهنجي پنهنجي بنيادي کي گڏ ڪرڻ چاهيان ٿو. اهو، عام طور تي ڳالهائڻ، ضروري ناهي، ڇو ته توهان ورهائڻ واري ڪرنل تي BPF پروگرامن کي گڏ ڪرڻ ۽ لوڊ ڪرڻ جي قابل هوندا، جڏهن ته، توهان جي پنهنجي ڪرنل هجڻ توهان کي جديد BPF خاصيتون استعمال ڪرڻ جي اجازت ڏئي ٿي، جيڪي توهان جي تقسيم ۾ مهينن ۾ ظاهر ٿيندا. ، يا، جيئن ته ڪجهه ڊيبگنگ ٽولز جي صورت ۾ مستقبل ۾ مڪمل طور تي پيڪيج نه ڪيو ويندو. انهي سان گڏ، ان جو پنهنجو بنيادي ڪوڊ سان تجربو ڪرڻ ضروري محسوس ڪري ٿو.
ڪنيل ٺاهڻ لاءِ توھان کي ضرورت آھي، پھريون، پاڻ کي ڪنيل، ۽ ٻيو، ھڪڙي ڪنييل ترتيب واري فائيل. BPF سان تجربو ڪرڻ لاء اسان عام طور تي استعمال ڪري سگھون ٿا وينلا kernel يا ڊولپمينٽ ڪنلز مان هڪ. تاريخي طور تي، بي پي ايف جي ترقي لينڪس نيٽ ورڪنگ ڪميونٽي جي اندر ٿيندي آهي ۽ تنهن ڪري سڀ تبديليون جلدي يا بعد ۾ ڊيوڊ ملر، لينڪس نيٽ ورڪنگ سنڀاليندڙ ذريعي وڃو. انهن جي نوعيت تي منحصر آهي - تبديليون يا نيون خاصيتون - نيٽ ورڪ تبديليون ٻن حصن مان هڪ ۾ ٿينديون آهن net يا net-next. BPF جي تبديلين جي وچ ۾ ساڳئي طريقي سان ورهايل آهن bpf и bpf-next، جيڪي پوءِ ترتيب ڏنل net ۽ net-next ۾ گڏ ڪيا ويا آهن. وڌيڪ تفصيل لاءِ، ڏسو bpf_devel_QA и netdev-FAQ. تنھنڪري پنھنجي ذائقي ۽ سسٽم جي استحڪام جي ضرورتن جي بنياد تي ھڪڙو دانا چونڊيو جنھن تي توھان جاچ ڪري رھيا آھيو (*-next kernels انهن فهرستن مان سڀ کان وڌيڪ غير مستحڪم آهن).
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
$ cd bpf-next
گھٽ ۾ گھٽ ڪم ڪندڙ ڪنييل ترتيب ٺاھيو:
$ cp /boot/config-`uname -r` .config
$ make localmodconfig
فائل ۾ BPF اختيارن کي فعال ڪريو .config توهان جي پنهنجي پسند جي (گهڻو ڪري CONFIG_BPF اڳ ۾ ئي چالو ڪيو ويندو ڇاڪاڻ ته systemd ان کي استعمال ڪري ٿو). ھتي آھي اختيارن جي ھڪڙي فهرست ھن مضمون لاءِ استعمال ٿيل ڪنيل مان:
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_LSM=y
CONFIG_BPF_SYSCALL=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_IPV6_SEG6_BPF=y
# CONFIG_NETFILTER_XT_MATCH_BPF is not set
# CONFIG_BPFILTER is not set
CONFIG_NET_CLS_BPF=y
CONFIG_NET_ACT_BPF=y
CONFIG_BPF_JIT=y
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_BPF_KPROBE_OVERRIDE=y
CONFIG_DEBUG_INFO_BTF=y
پوءِ اسان آساني سان گڏ ڪري سگھون ٿا ۽ انسٽال ڪري سگھون ٿا ماڊيولز ۽ ڪنيل کي (انهي سان، توهان نئين گڏ ٿيل ڪتن کي استعمال ڪندي ڪنيل کي گڏ ڪري سگهو ٿا. clangشامل ڪرڻ سان CC=clang):
$ make -s -j $(getconf _NPROCESSORS_ONLN)
$ sudo make modules_install
$ sudo make install
۽ نئين ڪرنل سان ريبوٽ ڪريو (آئون ان لاءِ استعمال ڪريان ٿو kexec پيڪيج مان kexec-tools):
v=5.8.0-rc6+ # если вы пересобираете текущее ядро, то можно делать v=`uname -r`
sudo kexec -l -t bzImage /boot/vmlinuz-$v --initrd=/boot/initrd.img-$v --reuse-cmdline &&
sudo kexec -e
bpftool
مضمون ۾ سڀ کان وڌيڪ عام استعمال جي افاديت هوندي bpftoolلينڪس ڪنيل جي حصي طور فراهم ڪيو ويو. اهو BPF ڊولپرز پاران BPF ڊولپرز لاءِ لکيو ۽ سنڀاليو ويو آهي ۽ سڀني قسمن جي BPF شين کي منظم ڪرڻ لاءِ استعمال ٿي سگهي ٿو - پروگرام لوڊ ڪريو، نقشا ٺاهي ۽ ايڊٽ ڪريو، BPF ايڪو سسٽم جي زندگي جي ڳولا ڪريو، وغيره. انسان جي صفحن لاء ماخذ ڪوڊ جي صورت ۾ دستاويز ڳولهي سگهجن ٿا بنيادي ۾ يا، اڳ ۾ ئي مرتب ٿيل، خالص تي.
هن لکڻ جي وقت تي bpftool صرف RHEL، Fedora ۽ Ubuntu لاءِ تيار ٿيل آهي (ڏسو، مثال طور، هن سلسلي، جيڪو پيڪنگنگ جي نامڪمل ڪهاڻي ٻڌائي ٿو bpftool ديبين ۾). پر جيڪڏهن توهان اڳ ۾ ئي پنهنجو ڪنيل ٺاهيو آهي، پوء تعمير ڪريو bpftool پائي وانگر آسان:
$ cd ${linux}/tools/bpf/bpftool
# ... пропишите пути к последнему clang, как рассказано выше
$ make -s
Auto-detecting system features:
... libbfd: [ on ]
... disassembler-four-args: [ on ]
... zlib: [ on ]
... libcap: [ on ]
... clang-bpf-co-re: [ on ]
Auto-detecting system features:
... libelf: [ on ]
... zlib: [ on ]
... bpf: [ on ]
$
(هتي ${linux} - ھي آھي توھان جي ڪرنل ڊاريڪٽري.) انھن حڪمن تي عمل ڪرڻ کان پوءِ bpftool ڊاريڪٽري ۾ گڏ ڪيو ويندو ${linux}/tools/bpf/bpftool ۽ ان کي رستي ۾ شامل ڪري سگھجي ٿو (سڀ کان پهريان استعمال ڪندڙ کي root) يا صرف نقل ڪريو /usr/local/sbin.
گڏ ڪرڻ bpftool اهو آخري استعمال ڪرڻ لاء بهترين آهي clangگڏ ڪيو ويو جيئن مٿي بيان ڪيو ويو آهي، ۽ چيڪ ڪريو ته اهو صحيح طور تي گڏ ڪيو ويو آهي - استعمال ڪندي، مثال طور، حڪم
$ sudo bpftool feature probe kernel
Scanning system configuration...
bpf() syscall for unprivileged users is enabled
JIT compiler is enabled
JIT compiler hardening is disabled
JIT compiler kallsyms exports are enabled for root
...
اهو قياس سان ڪيو ويندو آهي پيڪيج مان افاديت سان iproute2، جتي اسان ڪري سگهون ٿا، مثال طور، چئو ip a s eth0 بدران بدران ip addr show dev eth0.
ٿڪل
BPF توهان کي هڪ پسو جوتا ڪرڻ جي اجازت ڏئي ٿو مؤثر انداز سان ماپ ڪرڻ لاءِ ۽ اڏامندي ئي بنيادي ڪارڪردگي کي تبديل ڪري ٿو. UNIX جي بهترين روايتن ۾ اهو نظام تمام گهڻو ڪامياب ثابت ٿيو: هڪ سادي ميکانيزم جيڪو توهان کي (ٻيهر) پروگرام ڪرڻ جي اجازت ڏئي ٿو ڪرنل ڪيترن ئي ماڻهن ۽ تنظيمن کي تجربو ڪرڻ جي اجازت ڏئي ٿو. ۽، جيتوڻيڪ تجربا، گڏوگڏ BPF انفراسٹرڪچر جي ترقي خود، ختم ٿيڻ کان پري آهن، سسٽم اڳ ۾ ئي هڪ مستحڪم ABI آهي جيڪو توهان کي قابل اعتماد، ۽ سڀ کان اهم، موثر ڪاروباري منطق ٺاهڻ جي اجازت ڏئي ٿو.
مان اهو نوٽ ڪرڻ چاهيان ٿو ته، منهنجي خيال ۾، ٽيڪنالاجي تمام مقبول ٿي چڪي آهي، ڇاڪاڻ ته، هڪ پاسي، اهو ڪري سگهي ٿو کيڏ (هڪ مشين جي فن تعمير کي هڪ شام ۾ گهٽ يا گهٽ سمجهي سگهجي ٿو)، ۽ ٻئي طرف، انهن مسئلن کي حل ڪرڻ لاء جيڪي ان جي ظاهر ٿيڻ کان اڳ (خوبصورت) حل نه ٿي سگهيا آهن. اهي ٻئي جزا گڏجي ماڻهن کي تجربا ۽ خواب ڏسڻ تي مجبور ڪن ٿا، جنهن جي نتيجي ۾ وڌيڪ ۽ وڌيڪ جديد حل پيدا ٿين ٿا.
هي آرٽيڪل، جيتوڻيڪ خاص طور تي مختصر ناهي، صرف BPF جي دنيا جو هڪ تعارف آهي ۽ "ترقي يافته" خاصيتن ۽ فن تعمير جي اهم حصن کي بيان نٿو ڪري. اڳتي وڌڻ جو منصوبو ڪجهه هن طرح آهي: ايندڙ آرٽيڪل BPF پروگرام جي قسمن جو هڪ جائزو هوندو (5.8 پروگرامن جا قسم آهن 30 ڪرنل ۾ سپورٽ ٿيل)، پوءِ اسان آخر ۾ ڏسنداسين ته ڪيئن لکڻيون حقيقي BPF ايپليڪيشنون استعمال ڪندي ڪنيل ٽريڪنگ پروگرامن کي. مثال طور، پوءِ اھو وقت آھي BPF آرڪيٽيڪچر تي وڌيڪ گہرے ڪورس لاءِ، بعد ۾ BPF نيٽ ورڪنگ ۽ سيڪيورٽي ايپليڪيشنن جا مثال.