تقنية eBPF هي تقنية برمجة مدفوعة بالأحداث تمكّن المطوّرين من كتابة برامج فعّالة وآمنة وغير متطفّلة تعمل مباشرة في مساحة نواة نظام تشغيل Linux، بما يوسّع عمليًا وظائف نواة نظام التشغيل.
تُعَدّ نواة نظام التشغيل كيانًا مستقرًّا للغاية، وبشكلٍ مقصود. ولأنّها تدعم نظام التشغيل بالكامل، فقد صُمِّمت بحيث يكون تعديلها أو تغييرها عملية معقّدة وتتطلّب جهدًا كبيرًا. تعالج تقنية eBPF هذا التحدّي المتعلّق بقابلية التوسّع من خلال تمكين المطوّرين من تشغيل برامج تعمل وفق آلية تحديد الوصول (sandbox) في سياقات ذات صلاحيات مرتفعة، مثل نواة نظام التشغيل.
يمكن تقسيم بنية نظام التشغيل إلى ثلاث طبقات منطقية: طبقة العتاد، وطبقة النواة، وطبقة المستخدم. تُعَدّ طبقة النواة جوهر نظام التشغيل. وتقع بين الطبقة الفيزيائية—التي تضمّ جميع عناصر الأجهزة والذاكرة والتخزين في نظام التشغيل—وطبقة المستخدم—التي تضمّ متصفّحات الويب والتطبيقات على نظام التشغيل.
يجب أن تتواصل التطبيقات والمتصفّحات في مساحة المستخدم مع مكوّنات الطبقة الفيزيائية لإنجاز مهامها، غير أنّ لكلّ مكوّن من مكوّنات الطبقة الفيزيائية بروتوكولات اتصال ومتطلّبات توافق خاصة به. وهنا تحديدًا تأتي طبقة النواة (أو مساحة النواة) لتؤدّي دورها. فهي تفسّر استدعاءات النظام وتمكّن التطبيقات من التواصل بفاعلية مع مكوّنات الشبكة الفعلية.
تساعد أدوات eBPF المطوّرين على توسيع مزايا البرمجيات القائمة بسهولة أكبر أثناء وقت التشغيل، دون الحاجة إلى تعديل التعليمات البرمجية المصدرية للنواة، أو تحميل وحدات نواة إضافية (أجزاء من تعليمات برمجية يمكن تحميلها لتوسيع وظائف النواة)، أو إحداث أي تعطيل في مساحة النواة.
تمثّل تقنيات eBPF تطوّرًا لمرشح حزم بيركلي الأصلي Berkeley Packet Filter (BPF)، الذي قدّم طريقة بسيطة لاختيار حزم الشبكة وتحليلها داخل برنامج يعمل في مساحة المستخدم. ولكن، بخلاف تصفية الحزم، كانت برامج BPF تفتقر إلى المرونة اللازمة للتعامل مع المهام الأكثر تعقيدًا داخل النواة.
بعد إدراك الحاجة إلى تقنية أكثر مرونة، طوّر مجتمع Linux تقنية eBPF التي بُنيت على الوظائف الخلفية في BPF، لكنها وسَّعت قابليّة البرمجة داخل النواة. تُمكِّن الميزات المتقدّمة لبرامج eBPF، إلى جانب آلية تحديد الوصول، المطوّرين من تنفيذ عمليات محسَّنة لتصفية الحزم، وتحسين قابلية الملاحظة وقدرات المراقبة في مساحة النواة، وإجراء تحليلات أداء متقدّمة، وفرض سياسات أمنية على مستوى النواة في كلٍّ من مراكز البيانات المحلية وبيئات السحابة الأصلية.
تتكوّن برامج eBPF في الأساس من العناصر التالية:
تُكتَب برامج eBPF في البداية باستخدام مجموعة فرعية مقيّدة من لغة C، ثم تُحوَّل إلى تعليمات بايت eBPF bytecode باستخدام أدوات مثل LLVM، التي تعمل كواجهة خلفية (back-end) لبرامج eBPF التي تُطوَّر بلغات واجهة أمامية مثل Clang. وتمثّل تعليمات bytecode مجموعة مقيّدة من التعليمات التي تلتزم ببنية مجموعة تعليمات eBPF، وتساعد على تجنّب أخطاء بيئة التشغيل.
تستطيع تقنية نواة Linux تحويل تعليمات eBPF bytecode إلى إجراءات قابلة للتنفيذ، لكن المُترجِمات الفورية (JIT) توفّر أداءً أعلى. إذ يمكن لمترجمات JIT تحويل bytecode إلى تعليمات برمجية أصيلة للجهاز على منصّات أجهزة محدّدة، حسب الحاجة.
أدوات التحميل في مساحة المستخدم هي برامج تعمل في مساحة المستخدم وتقوم بتحميل تعليمات eBPF bytecode إلى النواة، وربطها بنِقَاط الربط المناسبة (hooks)، وإدارة أي خرائط eBPF maps مرتبطة بها. ومن أمثلة أدوات التحميل في مساحة المستخدم: BPF Compiler Collection (BCC) وbpftrace.
تُعَدّ خرائط eBPF maps هياكل بيانات تعتمد على أزواج المفتاح والقيمة، وتوفّر إمكانية القراءة والكتابة، ومساحة تخزين مشتركة تُسهِّل التفاعل بين برامج eBPF التي تعمل في النواة وتطبيقات مساحة المستخدم. وتُنشأ خرائط eBPF وتُدار من خلال استدعاءات النظام، كما يمكن استخدامها للاحتفاظ بالحالة (state) بين الدورات المختلفة لتنفيذ برامج eBPF.
تتولّى أداة التحقّق (verifier) — وهي مكوّن محوري في أنظمة eBPF — فحص تعليمات bytecode قبل تحميلها في النواة لضمان أن البرنامج لا يحتوي على أي عمليات ضارّة، مثل الحلقات اللانهائية، أو التعليمات غير المسموح بها، أو الوصول إلى مواقع خارج حدود الذاكرة المخصّصة. وتُسهم أيضًا في ضمان انتهاء جميع مسارات البيانات في البرنامج بنجاح.
أما نِقَاط الربط (hooks)، فهي مواضع محدّدة داخل تعليمات النواة البرمجية يمكن إرفاق برامج eBPF بها. عند وصول النواة إلى نقطة ربط (hook)، تُشغِّل برنامج eBPF المرتبط بها.
تمنح أنواع نقاط الربط المختلفة، مثل tracepoints وkprobes وuprobes وnetwork packet receive queues، برامج eBPF نطاقًا واسعًا من الوصول إلى البيانات وتمكّنها من تنفيذ مجموعة متنوعة من العمليات. فعلى سبيل المثال، تُمكِّن tracepoints البرامج من فحص البيانات المتعلقة بالنواة أو العمليات الأخرى وجمعها، بينما يمكن استخدام نقاط الربط في طبقة traffic control لفحص حزم الشبكة وتعديلها. كما تتيح kprobes وuprobes إجراء تتبّع ديناميكي على مستوى النواة وعلى مستوى المستخدم.
تُعد XDPs مسارات بيانات عالية الأداء تُسرِّع معالجة الحزم على مستوى برنامج التشغيل، وتُسهِّل تمريرها عبر طبقات الاتصال المختلفة. وتتيح لأنظمة eBPF اتخاذ قرارات توجيه البيانات قبل أن تصل حزم البيانات إلى النواة أصلًا.
لقد أتاح تكامل XDPs مع نواة Linux (منتصف العقد الثاني من الألفية) للمطوّرين نشر وظائف لموازنة الأحمال تعتمد على eBPF، قادرة على إدارة حركة البيانات حتى في أكثر مراكز البيانات ازدحامًا.
نظرًا إلى أن برامج eBPF لا يمكنها توليد دوال اعتباطية، ويجب أن تظل متوافقة مع جميع إصدارات النواة الممكنة، فإن مجموعات تعليمات eBPF الأساسية لا تكون أحيانًا مرنة بما يكفي لتنفيذ العمليات المتقدمة. وتسدّ الدوال المساعدة هذه الفجوة.
فالدوال المساعدة هي مجموعات من دوال النواة المحددة مسبقًا والمستندة إلى واجهة برمجة التطبيقات (APIs)، ويمكن لبرامج eBPF استدعاؤها من داخل النظام، لتُتيح لتلك البرامج تنفيذ عمليات أكثر تعقيدًا — مثل الحصول على التاريخ والوقت الحاليين أو توليد أرقام عشوائية — وهي عمليات لا تدعمها مجموعة التعليمات مباشرة.
بوجه عام، تعمل برامج eBPF كأجهزة افتراضية (VMs) داخل نواة Linux، مستندةً إلى معمارية مجموعة تعليمات منخفضة المستوى لتشغيل تعليمات eBPF bytecode. ومع أن عملية تشغيل برنامج eBPF معقّدة، فإنها تمرّ عادةً بعدد من الخطوات الرئيسة.
في البداية، يكتب المطوّرون برنامج eBPF ثم يُحوِّلونه إلى تعليمات bytecode. ويُحدِّد هدف البرنامج نوع التعليمات البرمجية المناسبة له. فعلى سبيل المثال، إذا أراد فريق ما مراقبة استخدام وحدة المعالجة المركزية (CPU)، فسيكتب تعليمات برمجية تتضمن دوال لجمع مقاييس الاستخدام.
بعد أن يحوّل المترجم الخاص بتقنية eBPF تعليمات C عالية المستوى إلى bytecode منخفض المستوى، يقوم محمِّل يعمل في مساحة المستخدم بإنشاء استدعاء نظام BPF لتحميل البرنامج إلى النواة. ويتولّى المحمِّل أيضًا معالجة الأخطاء وإعداد أي خرائط eBPF يحتاجها البرنامج.
وبعد تجهيز تعليمات bytecode للبرنامج والخرائط، تُجري تقنية eBPF عملية تحقّق للتأكد من أن البرنامج آمن للتشغيل داخل النواة. إذا تبيّن أنه غير آمن، يفشل استدعاء النظام المسؤول عن تحميل البرنامج، ويتلقى برنامج المحمِّل رسالة خطأ. أما إذا اجتاز البرنامج عملية التحقّق، فيُسمح له بالتشغيل.
وباستخدام المُفسِّر (interpreter) أو المترجم الفوري (JIT)، يجري تحويل تعليمات bytecode إلى تعليمات برمجية آلية قابلة للتنفيذ. لكن eBPF تقنية مدفوعة بالأحداث، لذا لا يعمل البرنامج إلا استجابةً لنقاط ربط (hooks) أو أحداث محددة داخل النواة، مثل استدعاءات النظام، أو أحداث الشبكة، أو بدء العمليات، أو خمول وحدة المعالجة المركزية. عند وقوع حدث، تنفذ تقنية eBPF برنامج تعليمات bytecode المقابلة، مما يتيح للمطورين فحص ومعالجة العناصر المختلفة للنظام.
أثناء تشغيل برنامج eBPF، يمكن للمطوّرين التفاعل معه من مساحة المستخدم باستخدام خرائط eBPF. فقد يقوم التطبيق، على سبيل المثال، بفحص خريطة بشكلٍ دوري لجمع بيانات من برنامج eBPF، أو تحديث الخريطة لتغيير سلوك البرنامج.
ويُعَد إلغاء تحميل البرنامج (unloading) الخطوة الأخيرة في معظم عمليات تنفيذ eBPF. وعندما ينهي eBPF مهمته، يمكن للمحمِّل استخدام استدعاء نظام BPF مرة أخرى لتفريغه من النواة؛ وعند هذه النقطة تتوقف تقنية eBPF عن التشغيل وتحرّر الموارد المرتبطة بها. قد تشمل عملية التفريغ أيضًا استعراض أي خرائط eBPF لم يعُد الفريق بحاجة إليها لتحرير العناصر المفيدة التي تتضمنها كلٌّ على حدة، ثم حذف الخريطة نفسها (باستخدام استدعاء النظام "delete").
طُوِّر مرشِّح حزم بيركلي (BPF) في الأصل كآلية لتصفية الحزم في الأنظمة المعتمِدة على Unix، مما يتيح للتعليمات البرمجية على مستوى المستخدم تعريف مرشِّحات يمكنها رصد حزم الشبكة داخل النواة ومعالجتها بكفاءة. لذلك أسهم هذا النهج في تقليل قدرة المعالجة المطلوبة لنقل البيانات غير الضرورية إلى مساحة المستخدم، وساعد على تبسيط شبكات الكمبيوتر وتحسينها.
يستخدم BPF وكيلاً يعمل داخل النواة لمعالجة الحزم عند نقطة دخول مموعة الشبكة. بعد تطوير برنامج BPF، يُحمَّل إلى مساحة النواة بواسطة وكيل BPF في النواة، الذي يتحقق من صحته قبل إرفاقه بمقبس الاتصال المعني. وبالتالي لا تستقبل في مساحة المستخدم، من ذلك المقبس، إلا الحزم التي تتطابق مع مرشِّح برنامج BPF. وتحصر هذه الآلية الوقائية وصول البرنامج في نطاق مناطق الذاكرة المسموح بها، مما يساعد على تجنّب الأعطال المحتملة في النواة.
ظهر eBPF لأول مرة في عام 2014، وكان في ذلك الحين تطوّرًا كبيرًا لمفهوم BPF الأصلي. وإلى جانب حالات الاستخدام الشبكية الأصلية، اتّسع نطاق تطبيقات eBPF ليشمل استدعاءات النظام ووظائف أخرى، ولذلك كان المطوّرون كثيرًا ما يشيرون إليه باسم "مرشِّح حزم بيركلي الموسَّع بالكامل" (fully extended Berkeley Packet Filter).
ومن أبرز المجالات التي يبرع فيها eBPF مراقبة أداء الشبكة. فهو يمكّن فرق تكنولوجيا المعلومات من إجراء تحليلات في الوقت الفعلي واستكشاف الأعطال وإصلاحها، من خلال تزويدهم برؤى تفصيلية حول سلوك الشبكة، ومقاييس الأداء، ونقاط الاختناق. كما يؤدّي eBPF دورًا محوريًا في أمن الشبكات، إذ يراقب استدعاءات النظام وأنشطة الشبكة ويُجري تصفيتها، ويساعد في فرض سياسات أمن الشبكة واكتشاف حالات الخلل في النظام.
يوفّر eBPF أيضًا للمطورين أداة بالغة الأهمية لتتبع أداء التطبيقات في كلٍّ من النواة ومساحة المستخدم، وتنفيذ إجراءات مخصّصة وتحويلات على البيانات أثناء مرورها عبر النواة، مما يعزّز بصورة كبيرة من مرونته وتعدّد استخداماته. ونظرًا لهذه القدرات الواسعة – التي تتجاوز بكثير مجرّد تصفية الحزم – يُتعامَل اليوم مع eBPF بوصفه مصطلحًا مستقلًا، لا مجرد اختصار لعبارة extended Berkeley Packet Filter.
وقد دفعت التطورات في تقنية eBPF مطوّري البرمجيات إلى توسيع نطاق تطبيقاته ليشمل مختلف أنظمة التشغيل، حتى تتمكّن المنصات غير المعتمِدة على Linux من الاستفادة من قدراته المتقدّمة في التتبع، والشبكات، والمراقبة.1
وفي الواقع، استثمرت مؤسسة eBPF — وهي كيان تابع لمؤسسة Linux وتضم بين أعضائها شركات مثل Google وMeta وNetflix وMicrosoft وIntel وIsovalent وغيرها — استثمارات كبيرة لتوسيع توافق برامج eBPF مع أنظمة التشغيل المختلفة، بهدف تعزيز مجالات الاستفادة من برمجة eBPF على المدى البعيد.2
وعلى الرغم من أن BPF قد وضع الأساس لتصفية الحزم بكفاءة، فإن eBPF وسّع هذا النطاق بلا شك. وأصبح eBPF في صورته الحديثة أداة متكاملة لتعزيز قابلية الملاحظة وتحسين الأداء ورفع مستوى الأمان في أنظمة Linux. وتفتح قدرته على تشغيل برامج ديناميكية يعرّفها المستخدم داخل النواة آفاقًا جديدة لمراقبة الأنظمة وإدارتها، مما يجعل eBPF أداة لا غنى عنها لمطوّري البرمجيات ومبرمجي الكمبيوتر على حدّ سواء.
أصبحت تقنيات eBPF بالفعل عاملًا أساسيًا في أنظمة Linux الحديثة؛ فهي تتيح تحكّمًا دقيقًا في نواة النظام، وتمكّن الشركات من تطوير برامج أكثر ابتكارًا ضمن النظام البنائي لنظام Linux.
سَهَّل eBPF تحقيق تقدّم كبير في مجالات، من بينها:
يتيح eBPF للمطورين إضافة إمكانات أكثر سرعة وتخصيصًا لمعالجة الحزم، وعمليات موازنة الأحمال، وسيناريوهات تحليل أداء التطبيقات، وآليات مراقبة الشبكة. كما تعتمد منصات مفتوحة المصدر مثل Cilium على eBPF لتوفير شبكات آمنة وقابلة للتوسع وذات قابلية ملاحظة عالية لمجموعات Kubernetes وأحمال التشغيل والخدمات المصغّرة المعتمدة على الحاويات.
يساعد eBPF فرق تكنولوجيا المعلومات على فرض قواعد بسيطة ومعقّدة في وقت مبكر من مسار الحدث، لتحسين توجيه حركة المرور الشبكية، وتصفية المحتوى، والحدّ من حالات الفقد. وباستخدام منطق تمرير الحزم على مستوى النواة، يمكن لبرامج eBPF تقليل زمن الانتقال، وتبسيط عمليات التوجيه، وتمكين استجابة أسرع للشبكة ككل.
ومع تقسيم التطبيقات إلى خدمات مصغَّرة، قد تصبح قابلية الملاحظة داخل مساحة المستخدم تحدّيًا حقيقيًا. توفّر برامج eBPF لأدوات المراقبة منظورًا من داخل مساحة النواة، بحيث تظل قابلية الملاحظة قائمة من البداية إلى النهاية.
وتُمكِّن eBPF المطوّرين من تهيئة النواة وتطبيقات مساحة المستخدم بأدوات القياس اللازمة لجمع بيانات تفصيلية عن الأداء ومقاييسه، من دون التأثير بشكل ملحوظ في أداء النظام. وتساعد هذه القدرات المؤسسات على البقاء في موقع متقدّم، من خلال تمكين المراقبة وقابلية الملاحظة في الوقت الفعلي لكل مكوّن من مكوّنات الشبكة واعتمادياته.
ويمكن لبرامج eBPF مراقبة استدعاءات النظام، وحركة مرور الشبكة، وسلوك النظام على مستوى النواة والمقابس معًا، لاكتشاف التهديدات الأمنية المحتملة والاستجابة لها في الوقت الفعلي. فعلى سبيل المثال، تستخدم أداة Falco (أداة أمان وقت التشغيل مبنية على السحابة الأصلية) تقنيات eBPF لتنفيذ تدقيق أمني في وقت التشغيل ودعم الاستجابة للحوادث، مما يعزّز مستوى الأمان العام للنظام.
يمكن للعديد من أدوات eBPF تتبُّع استدعاءات النظام، ومراقبة استخدام وحدة المعالجة المركزية (CPU)، وتتبع استخدام الموارد (مثل عمليات الإدخال/الإخراج على القرص). ويمكن أن تساعد هذه الميزات المطوّرين على استكشاف عنق الزجاجة في أداء النظام بسهولة أكبر، وتطبيق بروتوكولات تصحيح الأخطاء، وتحديد فرص تحسين الأداء.
كما يمكن لبرامج eBPF تطبيق وفرض سياسات أمان على مستوى النواة — مثل مرشّحات حركة مرور الشبكة، وجدران الحماية، وقيود السلوك — إلى جانب إجراء فحوصات السلامة، لمنع الجهات الخبيثة والمستخدمين غير المصرّح لهم من الوصول إلى الشبكة.
في بنية الخدمات المُصغَّرة، تُعدّ الرؤية الواضحة لأحمال التشغيل الإنتاجية داخل الحاوية أمرًا بالغ الأهمية. ومع ذلك، قد تجد أدوات قابلية الملاحظة التقليدية صعوبة في مواكبة الخدمات المُصغَّرة المنقولة بالحاويات.
الحاويات بطبيعتها كيانات سريعة الزوال؛ تُنشأ عند الحاجة ثم تُزال فور انتهاء الغرض منها. تعمل كل حاوية كمضيف مستقل، وفي بيئات الإنتاج يمكن لحجم المقاييس الذي تولّده هذه الحاويات أن يرهق بسهولة أدوات المراقبة القياسية للتطبيقات والشبكات والبنية التحتية. قد تتصرّف الأجهزة الافتراضية بطريقة مشابهة، ولكن وتيرة إنشاء الحاويات وإيقافها السريعة تجعل عملية التقاط بيانات القياس عن بُعد أكثر تعقيدًا.
وفوق ذلك، غالبًا ما تُنشَر الحاويات بأعداد كبيرة في بيئات السحابة، مما يزيد من صعوبة تحقيق الرؤية الكاملة.
يُمكِّن eBPF، الذي يعمل على مستوى نواة المضيف أو الحاوية، المطوّرين من جمع بيانات القياس عن بُعد من كيانات البيانات قصيرة العمر. ويساعد على دمج رؤية الشبكة والتطبيقات والبنية التحتية في خدمة موحَّدة قائمة على eBPF. ومع eBPF، يمكن للمطوّرين التقاط بيانات عن العمليات، واستخدام الذاكرة، ونشاط الشبكة، والوصول إلى الملفات على مستوى الحاوية، حتى إن لم يتم نشر الحاويات في السحابة.
وبالمثل، في البيئات المنقولة بالحاويات والمبنيّة على Kubernetes، يستخدم eBPF واجهة واحدة ومجموعة أدوات واحدة لجمع البيانات من مجموعات متباينة، بحيث لا تحتاج فرق تكنولوجيا المعلومات إلى نشر وكلاء في مساحة المستخدم على كل جزء من الشبكة لإتمام مهام جمع البيانات. ويمكن لأدوات eBPF أن تعمل على عُقَد مستوى التحكّم (على سبيل المثال لمراقبة خادم واجهة برمجة التطبيقات API)، وأن تراقب عُقَد العمل، لتوليد رؤى تربط بين نقاط البيانات والرؤى المستخرجة من كلا نوعَي العقد، بما يوفّر قابلية ملاحظة أدقّ للمجموعة.
Red Hat OpenShift on IBM Cloud هي منصة حاويات OpenShift (OCP) المُدارة بالكامل.
محاكاة افتراضية آمنة وفعالة وجديرة بالثقة للتخزين لبيئات VMware مع IBM Spectrum Virtualize.
العثور على حل البنية التحتية السحابية الذي يلبي احتياجات أعمالك وتوسيع نطاق الموارد عند الطلب.
1 Foundation Proposes Advancing eBPF Adoption Across Multiple OSes, DevOps.com, 21 أغسطس 2021.
2 Latest eBPF Advances Are Harbingers of Major Changes to IT, DevOps.com, 13 September 2023.