กลับไปหน้าบทความ

อ่าน 15 นาที

อีบีพีเอฟ

eBPF เป็นเทคโนโลยีที่สามารถเรียกใช้โปรแกรมในบริบทที่มีสิทธิ์พิเศษเช่นเคอร์เนล ของ ระบบปฏิบัติการเป็นเทคโนโลยีที่พัฒนาต่อจากBerkeley Packet Filter (BPF โดยที่ "e" เดิมหมายถึง...

อีบีพีเอฟ

อีบีพีเอฟ
ผู้เขียนต้นฉบับอเล็กซี่ สตาโรโวอิตอฟ, แดเนียล บอร์กมันน์[ 1 ] [ 2 ]
นักพัฒนาชุมชนโอเพซอร์ส Meta Google Isovalent Microsoft Netflix [ 1 ]
ปล่อย2014 [ 3 ] ( 2014 )
เขียนเป็นซี
ระบบปฏิบัติการลินุกซ์ , วินโดวส์[ 4 ]
พิมพ์ระบบรันไทม์
ใบอนุญาตลินุกซ์: ใบอนุญาต GPLไวโอเล็ต: ใบอนุญาต MIT
เว็บไซต์ebpf.io
ที่เก็บข้อมูลลินุซ์ : git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/ วินโดวส์: github.com/Microsoft/ebpf-for-windows/​​​​

eBPF เป็นเทคโนโลยีที่สามารถเรียกใช้โปรแกรมในบริบทที่มีสิทธิ์พิเศษเช่นเคอร์เนล ของ ระบบปฏิบัติการ[ 5 ]เป็นเทคโนโลยีที่พัฒนาต่อจากBerkeley Packet Filter (BPF โดยที่ "e" เดิมหมายถึง "ขยาย") ซึ่งเป็นกลไกการกรองใน Linux และยังใช้ในส่วนที่ไม่เกี่ยวข้องกับเครือข่ายของเคอร์เนล Linux ด้วย

ใช้เพื่อขยายขีดความสามารถของเคอร์เนลได้อย่างปลอดภัยและมีประสิทธิภาพในระหว่างการทำงาน โดย ไม่จำเป็นต้องเปลี่ยนแปลงซอร์สโค้ดของเคอร์เนลหรือโหลดโมดูลของเคอร์เนล[ 6 ]ความปลอดภัยมีให้ผ่านตัวตรวจสอบภายในเคอร์เนลซึ่งทำการวิเคราะห์โค้ดแบบคงที่และปฏิเสธโปรแกรมที่ขัดข้อง ค้าง หรือรบกวนเคอร์เนลในทางลบ[ 7 ] [ 8 ]

รูปแบบการตรวจสอบความถูกต้องนี้แตกต่างจาก สภาพแวดล้อม แซนด์บ็อกซ์ซึ่งสภาพแวดล้อมการดำเนินการถูกจำกัด และรันไทม์ไม่มีข้อมูลเชิงลึกเกี่ยวกับโปรแกรม[ 9 ]ตัวอย่างของโปรแกรมที่ถูกปฏิเสธโดยอัตโนมัติ ได้แก่ โปรแกรมที่ไม่มีการรับประกันการออกจากโปรแกรมที่แข็งแกร่ง (เช่น ลูป for/while ที่ไม่มีเงื่อนไขการออกจากโปรแกรม) และโปรแกรมที่อ้างอิงตัวชี้โดยไม่มีการตรวจสอบความปลอดภัย[ 10 ]

ออกแบบ

โปรแกรมที่โหลดซึ่งผ่านการตรวจสอบจะถูกตีความหรือคอมไพล์แบบทันทีในเคอร์เนล (JIT compiled) เพื่อประสิทธิภาพการทำงานแบบเนทีฟรูปแบบการทำงานเป็นแบบขับเคลื่อนด้วยเหตุการณ์และทำงานจนเสร็จสมบูรณ์โดย มีข้อยกเว้นเพียงเล็กน้อย [ 2 ]หมายความว่า โปรแกรมสามารถแนบกับ จุด เชื่อมต่อ ต่างๆ ใน เคอร์เนล ของระบบปฏิบัติการและจะทำงานเมื่อมีการเรียกใช้เหตุการณ์ กรณีการใช้งาน eBPF รวมถึง (แต่ไม่จำกัดเพียง) เครือข่ายเช่นXDPการติดตามและระบบย่อยด้านความปลอดภัย[ 5 ]ด้วยประสิทธิภาพและความยืดหยุ่นของ eBPF ที่เปิดโอกาสใหม่ๆ ในการแก้ปัญหาการผลิตBrendan Greggจึงขนานนาม eBPF ว่า "พลังวิเศษสำหรับ Linux" [ 11 ] Linus Torvaldsกล่าวว่า "BPF มีประโยชน์จริงๆ และพลังที่แท้จริงของมันคือวิธีที่มันอนุญาตให้ผู้คนเขียนโค้ดเฉพาะทางซึ่งจะไม่เปิดใช้งานจนกว่าจะมีการร้องขอ" [ 12 ] เนื่องจากความสำเร็จใน Linux รันไทม์ eBPF จึงถูกพอร์ตไปยังระบบปฏิบัติการอื่นๆ เช่นWindows [ 4 ]

ประวัติศาสตร์

eBPF พัฒนามาจาก Berkeley Packet Filter แบบคลาสสิก (cBPF ซึ่งเป็นชื่อที่ใช้ในภายหลัง) ในระดับพื้นฐานที่สุด eBPF ได้นำการใช้รีจิสเตอร์ 64 บิตจำนวน 10 ตัวมาใช้ (แทนที่จะเป็นรีจิสเตอร์ 32 บิต 2 ตัวสำหรับ cBPF) ความหมายของการกระโดดที่แตกต่างกัน คำสั่งเรียกและข้อกำหนดการส่งผ่านรีจิสเตอร์ที่สอดคล้องกัน คำสั่งใหม่ และการเข้ารหัสที่แตกต่างกันสำหรับคำสั่งเหล่านี้[ 13 ]

เหตุการณ์สำคัญที่สุดในการพัฒนา eBPF
วันที่เหตุการณ์
เมษายน 2554คอมไพเลอร์แบบ just-in-time (JIT compiler) ตัวแรกในเคอร์เนล Linux สำหรับ Berkeley Packet Filter แบบคลาสสิกได้รับการรวมเข้าด้วยกันแล้ว[ 14 ]
มกราคม 2555กรณีการใช้ งานที่ไม่ใช่เครือข่ายครั้งแรกของ Berkeley Packet Filter แบบคลาสสิกseccomp-bpf [ 15 ]ปรากฏขึ้น ซึ่งอนุญาตให้กรองการเรียกใช้ระบบโดยใช้นโยบายที่กำหนดค่าได้ซึ่งดำเนินการผ่านคำสั่ง BPF
มีนาคม 2557David S. Miller ผู้ดูแลหลักของสแต็กเครือข่าย Linux ยอมรับการปรับปรุง ตัวแปล BPF ในเคอร์เนลแบบเก่าโดยถูกแทนที่ด้วยตัวแปล eBPF และเคอร์เนล Linux จะแปล BPF แบบคลาสสิก (cBPF) เป็นคำสั่ง eBPF ภายใน[ 16 ]มีการเผยแพร่ในเวอร์ชัน 3.18 ของเคอร์เนล Linux [ 17 ]
มีนาคม 2558ความสามารถในการแนบ eBPF เข้ากับkprobesเป็น กรณีการใช้งาน การติดตาม ครั้งแรก ได้รับการผสานรวม[ 19 ] ในเดือนเดียวกันนั้น งานโครงสร้างพื้นฐานเบื้องต้นได้รับการยอมรับให้แนบ eBPF เข้ากับเลเยอร์ควบคุมการจราจรเครือข่าย (tc) ซึ่งอนุญาตให้แนบ eBPF เข้ากับเส้นทางขาเข้าหลักและต่อมาเส้นทางขาออกของสแต็กเครือข่าย ซึ่งต่อมาถูกนำไปใช้อย่างแพร่หลายโดยโครงการ ต่างๆเช่นCilium [ 20 ] [ 21 ] [ 22 ]
สิงหาคม 2558แบ็กเอนด์ คอมไพเลอร์ eBPF ได้รับการรวมเข้ากับLLVMเวอร์ชัน 3.7.0 [ 23 ]
กันยายน 2558Brendan Greggประกาศชุดเครื่องมือติดตามใหม่ที่ใช้ eBPF เป็นพื้นฐานในชื่อโครงการ bcc โดยจัดเตรียมส่วนหน้าสำหรับ eBPF เพื่อให้การเขียนโปรแกรมง่ายขึ้น[ 24 ]
กรกฎาคม 2559eBPF ได้รับความสามารถในการแนบเข้ากับเส้นทางรับหลักของไดรเวอร์เครือข่าย เลเยอร์นี้เป็นที่รู้จักในปัจจุบันในชื่อeXpress DataPath (XDP) และถูกเพิ่มเข้ามาเพื่อตอบสนองต่อDPDKเพื่อสร้างเส้นทางข้อมูลที่รวดเร็วซึ่งทำงานร่วมกับเคอร์เนล Linux แทนที่จะข้ามไป[ 25 ] [ 26 ] [ 27 ]
สิงหาคม 2559Ciliumได้รับการประกาศครั้งแรกในงานLinuxConในฐานะโครงการที่ให้ บริการเครือข่ายคอนเทนเนอร์ IPv6 ที่รวดเร็ว ด้วย eBPF และ XDP ปัจจุบัน Cilium ได้รับการนำไปใช้ ในบริการ Kubernetes ของผู้ให้บริการคลาวด์รายใหญ่ และเป็นหนึ่งใน CNI ที่ใช้กันอย่างแพร่หลายที่สุด[ 28 ] [ 22 ] [ 29 ]
พฤศจิกายน 2559Netronome เพิ่มการถ่ายโอนโปรแกรม eBPF สำหรับเลเยอร์ XDP และ tc BPF ไปยัง NIC ของพวกเขา[ 30 ]
พฤษภาคม 2560Katran ซึ่งเป็นโหลดบาลานเซอร์เลเยอร์ 4 ของMeta ได้เริ่มใช้งานแล้ว แพ็กเก็ตทุกแพ็กเก็ตที่ส่งไปยัง facebook.comตั้งแต่นั้นเป็นต้นมาได้รับการประมวลผลโดย eBPF และ XDP [ 31 ]
พฤศจิกายน 2560eBPF กลายเป็นระบบย่อยเคอร์เนลของตัวเองเพื่ออำนวยความสะดวกในการจัดการแพตช์เคอร์เนลที่เติบโตอย่างต่อเนื่อง คำขอพูลแรกโดยผู้ดูแล eBPF ได้รับการส่งแล้ว[ 32 ]
กันยายน 2560Bpftool ถูกเพิ่มเข้าไปในเคอร์เนล Linux เป็นยูทิลิตี้พื้นที่ผู้ใช้เพื่อตรวจสอบระบบย่อย eBPF [ 33 ]
มกราคม 2561มีการเผยแพร่ตระกูลซ็อกเก็ตใหม่ชื่อ AF_XDP ซึ่งช่วยให้สามารถประมวลผลแพ็กเก็ตที่มีประสิทธิภาพสูงด้วยความหมายแบบ zero-copy ที่เลเยอร์ XDP [ 34 ]ปัจจุบันDPDKมีการสนับสนุนไดรเวอร์โหมดโพล AF_XDP อย่างเป็นทางการ[ 35 ]
กุมภาพันธ์ 2561ต้นแบบ bpfilter ได้รับการเผยแพร่แล้ว ซึ่งอนุญาตให้แปลชุดย่อยของกฎ iptables เป็น eBPF ผ่านไดรเวอร์โหมดผู้ใช้ที่พัฒนาขึ้นใหม่ งานนี้ก่อให้เกิดข้อโต้แย้งเนื่องจากความพยายามในการพัฒนา nftables ที่กำลังดำเนินอยู่ และยังไม่ได้รวมเข้ากับ mainline [ 36 ] [ 37 ]
ตุลาคม 2561Brendan Greggได้ประกาศเครื่องมือ bpftrace ใหม่นี้ในชื่อDTrace 2.0 สำหรับ Linux [ 38 ]
พฤศจิกายน 2561การตรวจสอบภายใน eBPF ได้ถูกเพิ่มสำหรับkTLSเพื่อรองรับความสามารถในการบังคับใช้นโยบาย TLS ในเคอร์เนล[ 39 ]
พฤศจิกายน 2561BTF (BPF Type Format) ได้ถูกเพิ่มเข้าไปในเคอร์เนล Linux เป็นรูปแบบข้อมูลเมตาที่มีประสิทธิภาพ ซึ่งมีขนาดเล็กกว่าDWARF ประมาณ 100 เท่า [ 40 ]
ธันวาคม 2019หนังสือเล่มแรกเกี่ยวกับ BPF ที่มีความยาว 880 หน้า ซึ่งเขียนโดย Brendan Gregg ได้รับการเผยแพร่[ 41 ]
มีนาคม 2563Googleได้เพิ่มการสนับสนุน BPF LSM เข้าไปในเคอร์เนล Linux ทำให้สามารถตั้งโปรแกรมโมดูลความปลอดภัย Linux (LSM) ผ่าน eBPF ได้[ 42 ]
กันยายน 2020แบ็กเอนด์คอมไพเลอร์ eBPF สำหรับGNU Compiler Collection (GCC) ได้รับการผสานรวมแล้ว[ 43 ]
กรกฎาคม 2565ไมโครซอฟต์ได้ปล่อย eBPF สำหรับ Windows ซึ่งรันโค้ดในเคอร์เนล NT [ 4 ]
ตุลาคม 2567สถาปัตยกรรมชุดคำสั่ง (ISA) ของ eBPF ได้รับการ เผยแพร่ ใน RFC 9669 

สถาปัตยกรรมและแนวคิด

แผนที่ eBPF

แผนที่ eBPF เป็นที่เก็บข้อมูลแบบคีย์/ค่า ที่มีประสิทธิภาพ ซึ่งอยู่ในพื้นที่เคอร์เนลและสามารถใช้เพื่อแบ่งปันข้อมูลระหว่างโปรแกรม eBPF หลายโปรแกรมหรือเพื่อสื่อสารระหว่างแอปพลิเคชันในพื้นที่ผู้ใช้และโค้ด eBPF ที่ทำงานในเคอร์เนล โปรแกรม eBPF สามารถใช้ประโยชน์จากแผนที่ eBPF เพื่อจัดเก็บและเรียกค้นข้อมูลในโครงสร้างข้อมูลที่หลากหลาย การใช้งานแผนที่นั้นมีให้โดยเคอร์เนลหลัก มีหลายประเภท[ 44 ]รวมถึงแผนที่แฮช อาร์เรย์ และบัฟเฟอร์วงแหวน

ในทางปฏิบัติ แผนที่ eBPF มักใช้สำหรับสถานการณ์ต่างๆ เช่น โปรแกรมพื้นที่ผู้ใช้เขียนข้อมูลการกำหนดค่าเพื่อให้โปรแกรม eBPF เรียกใช้ โปรแกรม eBPF จัดเก็บสถานะเพื่อเรียกใช้ในภายหลังโดยโปรแกรม eBPF อื่น (หรือการเรียกใช้โปรแกรมเดียวกันในอนาคต) หรือโปรแกรม eBPF เขียนผลลัพธ์หรือเมตริกลงในแผนที่เพื่อให้โปรแกรมพื้นที่ผู้ใช้เรียกใช้เพื่อแสดงผลลัพธ์[ 45 ]

เครื่องเสมือน eBPF

เครื่องเสมือน eBPF ทำงานภายในเคอร์เนลและรับโปรแกรมในรูปแบบ คำสั่ง ไบต์โค้ด eBPF ซึ่งจะถูกแปลงเป็นคำสั่งเครื่องดั้งเดิมที่ทำงานบน CPU การใช้งาน eBPF ในช่วงแรกๆ จะใช้การตีความไบต์โค้ด eBPF แต่ปัจจุบันได้เปลี่ยนมาใช้ กระบวนการ คอมไพล์แบบ Just-in-Time (JIT) แทนแล้ว เพื่อเหตุผลด้านประสิทธิภาพและความปลอดภัย[ 45 ]

เครื่องเสมือน eBPF ประกอบด้วยรีจิสเตอร์ 64 บิตจำนวน 11 ตัวพร้อมรีจิสเตอร์ย่อย 32 บิต ตัวนับโปรแกรมและพื้นที่สแต็ก BPF ขนาด 512 ไบต์ รีจิสเตอร์ อเนกประสงค์เหล่านี้ จะติดตามสถานะเมื่อโปรแกรม eBPF ถูกดำเนินการ[ 46 ]  

เสียงร้องหาง

การเรียกแบบ Tail callสามารถเรียกและดำเนินการโปรแกรม eBPF อื่น และแทนที่บริบทการดำเนินการได้คล้ายกับวิธีการทำงานของระบบexecve() สำหรับกระบวนการปกติ โดยพื้นฐานแล้วสิ่งนี้อนุญาตให้โปรแกรม eBPF เรียกโปรแกรม eBPF อื่นได้ การเรียกแบบ Tail call ถูกนำไปใช้เป็นการกระโดดแบบยาว โดยใช้ เฟรมสแต็ก เดียวกัน การเรียกแบบ Tail call มีประโยชน์อย่างยิ่งใน eBPF ซึ่งสแต็กมีขนาดจำกัดเพียง 512 ไบต์ ในระหว่างรันไทม์ สามารถเพิ่มหรือแทนที่ฟังก์ชันการทำงานได้แบบอะตอมิก จึงเปลี่ยนแปลงพฤติกรรมการดำเนินการของโปรแกรม BPF [ 46 ]กรณีการใช้งานที่นิยมสำหรับการเรียกแบบ Tail call คือการกระจายความซับซ้อนของโปรแกรม eBPF ไปยังหลายโปรแกรม อีกกรณีการใช้งานหนึ่งคือการแทนที่หรือขยายตรรกะโดยการแทนที่เนื้อหาของอาร์เรย์โปรแกรมในขณะที่กำลังใช้งานอยู่ ตัวอย่างเช่น เพื่ออัปเดตเวอร์ชันโปรแกรมโดยไม่ต้องหยุดทำงานหรือเพื่อเปิด/ปิดใช้งานตรรกะ[ 47 ]

การโทร BPF ถึง BPF

โดยทั่วไปถือเป็นแนวปฏิบัติที่ดีในการพัฒนาซอฟต์แวร์ที่จะจัดกลุ่มโค้ดทั่วไปไว้ในฟังก์ชันโดยห่อหุ้มตรรกะเพื่อการนำกลับมาใช้ใหม่ ก่อนเคอร์เนล Linux 4.16 และ LLVM 6.0 โปรแกรม eBPF C ทั่วไปจะต้องสั่งให้คอมไพเลอร์ทำการอินไลน์ฟังก์ชัน อย่างชัดเจน ส่งผลให้ไฟล์ออบเจ็กต์ BPF มีฟังก์ชันที่ซ้ำกัน ข้อจำกัดนี้ถูกยกเลิกแล้ว และคอมไพเลอร์ eBPF กระแสหลักในปัจจุบันรองรับการเขียนฟังก์ชันในโปรแกรม eBPF ได้อย่างเป็นธรรมชาติ ซึ่งจะช่วยลดขนาดโค้ด eBPF ที่สร้างขึ้น ทำให้เป็นมิตรกับแคชคำสั่ง CPU มากขึ้น[ 45 ] [ 46 ]

ตัวตรวจสอบ eBPF

ตัวตรวจสอบเป็นส่วนประกอบหลักของ eBPF และหน้าที่หลักคือการรับรองว่าโปรแกรม eBPF ปลอดภัยต่อการทำงาน โดยจะทำการวิเคราะห์แบบคงที่ของไบต์โค้ด eBPF เพื่อรับประกันความปลอดภัย ตัวตรวจสอบจะวิเคราะห์โปรแกรมเพื่อประเมินเส้นทางการทำงานที่เป็นไปได้ทั้งหมด โดยจะตรวจสอบคำสั่งตามลำดับและประเมินผล กระบวนการตรวจสอบเริ่มต้นด้วยการค้นหาแบบเจาะลึกผ่านเส้นทางที่เป็นไปได้ทั้งหมดของโปรแกรม ตัวตรวจสอบจะจำลองการทำงานของแต่ละคำสั่งโดยใช้การตีความแบบนามธรรม[ 48 ]โดยติดตามสถานะของรีจิสเตอร์และสแต็ก หากคำสั่งใดอาจนำไปสู่สถานะที่ไม่ปลอดภัย การตรวจสอบจะล้มเหลว กระบวนการนี้จะดำเนินต่อไปจนกว่าจะวิเคราะห์เส้นทางทั้งหมดเสร็จสิ้นหรือพบการละเมิด ขึ้นอยู่กับประเภทของโปรแกรม ตัวตรวจสอบจะตรวจสอบการละเมิดกฎเฉพาะ กฎเหล่านี้อาจรวมถึงการตรวจสอบว่าโปรแกรม eBPF จะสิ้นสุดภายในระยะเวลาที่เหมาะสมเสมอ (ไม่มีลูปอนันต์หรือการเรียก ซ้ำอนันต์ ) การตรวจสอบว่าโปรแกรม eBPF ไม่ได้รับอนุญาตให้อ่านหน่วยความจำตามอำเภอใจ เนื่องจากความสามารถในการอ่านหน่วยความจำตามอำเภอใจอาจทำให้โปรแกรมรั่วไหลข้อมูลที่ละเอียดอ่อน การตรวจสอบว่าโปรแกรมเครือข่ายไม่ได้รับอนุญาตให้เข้าถึงหน่วยความจำนอกขอบเขตของแพ็กเก็ตเนื่องจากหน่วยความจำที่อยู่ติดกันอาจมีข้อมูลที่ละเอียดอ่อน การตรวจสอบว่าโปรแกรมไม่ได้รับอนุญาตให้เกิดภาวะเดดล็อกดังนั้นสปินล็อก ที่ถืออยู่ จะต้องถูกปล่อย และสามารถถือล็อกได้เพียงครั้งละหนึ่งล็อกเท่านั้นเพื่อหลีกเลี่ยงภาวะเดดล็อกข้ามหลายโปรแกรม การตรวจสอบว่าโปรแกรมไม่ได้รับอนุญาตให้อ่านหน่วยความจำที่ไม่ได้เริ่มต้น นี่ไม่ใช่รายการตรวจสอบทั้งหมดที่ตัวตรวจสอบดำเนินการ และมีข้อยกเว้นสำหรับกฎเหล่านี้ ตัวอย่างเช่น โปรแกรมติดตามสามารถเข้าถึงตัวช่วยที่อนุญาตให้พวกเขาอ่านหน่วยความจำในลักษณะที่ควบคุมได้ แต่โปรแกรมประเภทเหล่านี้ต้องการสิทธิ์ระดับรูทดังนั้นจึงไม่ก่อให้เกิดความเสี่ยงด้านความปลอดภัย[ 47 ] [ 45 ]

เมื่อเวลาผ่านไป ตัวตรวจสอบ eBPF ได้พัฒนาขึ้นเพื่อรวมคุณสมบัติและการปรับปรุงใหม่ๆ เช่น การรองรับลูปที่มีขอบเขตการกำจัดโค้ดที่ไม่ได้ใช้งาน การตรวจสอบทีละฟังก์ชัน และการเรียกกลับ (callback )

eBPF CO-RE (คอมไพล์ครั้งเดียว รันได้ทุกที่)

โปรแกรม eBPF ใช้หน่วยความจำและโครงสร้างข้อมูลจากเคอร์เนล โครงสร้างบางอย่างอาจถูกแก้ไขระหว่างเวอร์ชันเคอร์เนลที่แตกต่างกัน ทำให้เค้าโครงหน่วยความจำเปลี่ยนแปลงไป เนื่องจากเคอร์เนล Linux มีการพัฒนาอย่างต่อเนื่อง จึงไม่มีการรับประกันว่าโครงสร้างข้อมูลภายในจะยังคงเหมือนเดิมในเวอร์ชันต่างๆ CO-RE เป็นแนวคิดพื้นฐานในการพัฒนา eBPF สมัยใหม่ที่ช่วยให้โปรแกรม eBPF สามารถใช้งานได้กับเวอร์ชันและโครงสร้างเคอร์เนลที่แตกต่างกัน มันแก้ปัญหาความท้าทายของการเปลี่ยนแปลงโครงสร้างเคอร์เนลระหว่าง การแจกจ่าย และเวอร์ชันLinux ที่แตกต่างกัน CO-RE ประกอบด้วย BTF (BPF Type Format) ซึ่งเป็น รูปแบบ เมตาเดตาที่อธิบายประเภทที่ใช้ในเคอร์เนลและโปรแกรม eBPF และให้ข้อมูลโดยละเอียดเกี่ยวกับเค้าโครงโครงสร้าง ออฟเซ็ตฟิลด์ และประเภทข้อมูล มันช่วยให้สามารถเข้าถึงประเภทเคอร์เนลได้ในขณะทำงาน ซึ่งมีความสำคัญอย่างยิ่งต่อการพัฒนาและการตรวจสอบโปรแกรม BPF BTF ถูกรวมอยู่ในอิมเมจเคอร์เนลของเคอร์เนลที่เปิดใช้งาน BTF การย้ายตำแหน่งพิเศษจะถูกสร้างขึ้นโดยคอมไพเลอร์ (เช่น LLVM) การย้ายตำแหน่งเหล่านี้จะบันทึกคำอธิบายระดับสูงของข้อมูลที่โปรแกรม eBPF ตั้งใจจะเข้าถึง ไลบรารีlibbpfปรับโปรแกรม eBPF ให้ทำงานกับโครงสร้างข้อมูลในเคอร์เนลเป้าหมายที่โปรแกรมทำงาน แม้ว่าโครงสร้างนี้จะแตกต่างจากเคอร์เนลที่โค้ดถูกคอมไพล์ก็ตาม ในการทำเช่นนี้ libbpf ต้องการข้อมูลการย้ายตำแหน่ง CO-RE ของ BPF ที่สร้างโดย Clang ซึ่งเป็นส่วนหนึ่งของกระบวนการคอมไพล์[ 45 ]โปรแกรม eBPF ที่คอมไพล์แล้วจะถูกจัดเก็บไว้ในไฟล์ออบเจ็กต์Executable and Linkable Format (ELF) ไฟล์นี้มีข้อมูลประเภท BTF และ การย้ายตำแหน่งที่สร้างโดย Clangรูปแบบ ELF ช่วยให้ตัวโหลด eBPF (เช่น libbpf) สามารถประมวลผลและปรับโปรแกรม BPF แบบไดนามิกสำหรับเคอร์เนลเป้าหมายได้[ 49 ]

การสร้างแบรนด์

ชื่อเรียก eBPF มักใช้แทนกันได้กับ BPF [ 2 ] [ 50 ]ตัวอย่างเช่น โดยชุมชนเคอร์เนล Linux eBPF และ BPF ถูกอ้างถึงว่าเป็นชื่อเทคโนโลยีเช่นเดียวกับLLVM [ 2 ] eBPFพัฒนามาจากภาษาเครื่องสำหรับเครื่องเสมือนการกรองในBerkeley Packet Filterเป็นเวอร์ชันขยาย แต่เนื่องจากกรณีการใช้งานขยายออกไปนอกเครือข่าย ปัจจุบัน "eBPF" จึงถูกตีความว่าเป็น คำ ย่อเทียม[ 2 ]

ผึ้งเป็นโลโก้อย่างเป็นทางการของ eBPF ในการประชุมสุดยอด eBPF ครั้งแรก มีการลงคะแนนเสียงและตั้งชื่อมาสคอต ผึ้งว่า "eBee" [ 51 ] [ 52 ]โลโก้นี้สร้างขึ้นโดย Vadim Shchekoldin [ 52 ]ก่อนหน้านี้เคยมีมาสคอตที่ไม่เป็นทางการของ eBPF มาก่อน[ 53 ]แต่ไม่ได้รับการยอมรับอย่างแพร่หลาย

การปกครอง

มูลนิธิ eBPF ก่อตั้งขึ้นในเดือนสิงหาคม พ.ศ. 2564 โดยมีเป้าหมายเพื่อขยายการสนับสนุนเพื่อขยายขีดความสามารถอันทรงพลังของ eBPF และเติบโตไปไกลกว่า Linux [ 1 ]สมาชิกผู้ก่อตั้ง ได้แก่Meta , Google , Isovalent, MicrosoftและNetflixวัตถุประสงค์คือการระดมทุน จัดทำงบประมาณ และใช้เงินทุนเพื่อสนับสนุนโครงการโอเพนซอร์ส โอเพนดาต้า และ/หรือโอเพนมาตรฐานต่างๆ ที่เกี่ยวข้องกับเทคโนโลยี eBPF [ 54 ]เพื่อผลักดันการเติบโตและการนำระบบนิเวศ eBPF ไปใช้ให้มากขึ้น นับตั้งแต่เริ่มก่อตั้งRed Hat , Huawei , Crowdstrike , Tigera, DaoCloud, Datoms และ FutureWei ก็ได้เข้าร่วมด้วย[ 55 ]

การรับเลี้ยงบุตรบุญธรรม

eBPF ได้รับการนำไปใช้งานโดยผู้ใช้งานขนาดใหญ่จำนวนมาก ตัวอย่างเช่น:

  • Metaใช้ eBPF ผ่าน Katran layer 4 load balancer สำหรับทราฟฟิกทั้งหมดที่ส่งไปยัง facebook.com [ 56 ] [ 57 ] [ 58 ] [ 31 ]
  • Googleใช้ eBPF ในGKEพัฒนาและใช้ BPF LSM เพื่อทดแทนการตรวจสอบ และใช้ eBPF สำหรับเครือข่าย[ 29 ] [ 59 ] [ 60 ] [ 61 ]
  • Cloudflareใช้ eBPF สำหรับการปรับสมดุลโหลด การป้องกัน DDoS และการบังคับใช้ความปลอดภัย[ 62 ] [ 63 ] [ 64 ] [ 65 ] [ 66 ]
  • Netflix ใช้ eBPF สำหรับ การสังเกตการณ์เครือข่ายทั่วทั้งระบบและการวินิจฉัยประสิทธิภาพ[ 67 ] [ 68 ]
  • Dropboxใช้ eBPF ผ่าน Katran สำหรับการปรับสมดุลโหลดเลเยอร์ 4 [ 69 ]
  • Androidใช้ eBPF สำหรับ NAT46 และการตรวจสอบการรับส่งข้อมูล[ 70 ] [ 71 ] [ 72 ]
  • Samsung Galaxyใช้ eBPF สำหรับโซลูชันเครือข่าย[ 73 ]
  • Yahoo! Inc ใช้ eBPF ผ่าน Cilium สำหรับการปรับสมดุลโหลดเลเยอร์ 4 [ 74 ]
  • LinkedInใช้ eBPF สำหรับการสังเกตการณ์โครงสร้างพื้นฐาน[ 75 ]
  • Alibabaใช้ eBPF สำหรับ การปรับสมดุลโหลด ของ Kubernetes Pod [ 76 ]
  • Datadogใช้ eBPF สำหรับการสร้างเครือข่ายและการบังคับใช้ความปลอดภัยของ Kubernetes Pod [ 77 ] [ 78 ] [ 79 ]
  • Trip.comใช้ eBPF สำหรับเครือข่าย Pod ของ Kubernetes [ 80 ] [ 81 ]
  • Shopifyใช้ eBPF สำหรับการตรวจจับการบุกรุกผ่าน Falco [ 82 ]
  • DoorDash ใช้ eBPF ผ่าน BPFAgent สำหรับการตรวจสอบระดับเคอร์เนล[ 83 ]
  • Microsoftได้พอร์ต eBPF และ XDP ไปยัง Windows [ 84 ] [ 85 ] [ 86 ]
  • Seznamใช้ eBPF ผ่าน Cilium สำหรับการปรับสมดุลโหลดเลเยอร์ 4 [ 87 ]
  • DigitalOceanใช้ eBPF และ XDP เพื่อจำกัดอัตราการเข้าถึงบริการภายในในเครือข่ายเสมือน[ 88 ]
  • CapitalOneใช้ eBPF สำหรับการสร้างเครือข่าย Pod ของ Kubernetes [ 89 ]
  • Bell Canadaใช้ eBPF เพื่อปรับปรุงเครือข่ายโทรคมนาคมให้ทันสมัยด้วย SRv6 [ 90 ]
  • Elastic_NVใช้ eBPF สำหรับการวิเคราะห์โปรไฟล์โค้ดเป็นส่วนหนึ่งของการนำเสนอการตรวจสอบ[ 91 ]
  • Appleใช้ eBPF สำหรับความปลอดภัยของ Kubernetes Pod [ 92 ]
  • Skyใช้ eBPF สำหรับการสร้างเครือข่าย Pod ของ Kubernetes [ 93 ]
  • Walmartใช้ eBPF สำหรับการปรับสมดุลโหลดเลเยอร์ 4 [ 94 ] [ 95 ]
  • Huaweiใช้ eBPF ผ่านระบบบูตที่ปลอดภัย DIGLIM ของพวกเขา[ 96 ]
  • Ikeaใช้ eBPF สำหรับเครือข่าย Kubernetes Pod [ 97 ]
  • The New York Timesใช้ eBPF สำหรับการสร้างเครือข่าย[ 98 ]
  • Red Hatใช้ eBPF ในระดับใหญ่เพื่อการกระจายโหลดและการติดตามในระบบคลาวด์ส่วนตัวของตน
  • Palantir Technologiesใช้ eBPF เพื่อแก้ไขปัญหาเครือข่ายในคลัสเตอร์ Kubernetes ขนาดใหญ่[ 99 ]
  • Bloombaseใช้ eBPF สำหรับการตรวจจับและลดภัยคุกคามในระดับชั้นจัดเก็บข้อมูลเครือข่าย

ความปลอดภัย

เนื่องจากความง่ายในการเขียนโปรแกรม eBPF จึงถูกใช้เป็นเครื่องมือในการโจมตีช่องทางด้านข้างของ เวลาในระดับไมโครสถาปัตยกรรม เช่นSpectreต่อไมโครโปรเซสเซอร์ ที่ เปราะ บาง [ 100 ]ในขณะที่ eBPF ที่ไม่มีสิทธิ์พิเศษใช้มาตรการบรรเทาผลกระทบต่อ Spectre v1, v2 และ v4 สำหรับx86-64 [ 101 ] [ 102 ]การใช้งานที่ไม่มีสิทธิ์พิเศษนั้นถูกปิดใช้งานโดยค่าเริ่มต้นโดยชุมชนเคอร์เนลเพื่อปกป้องผู้ใช้สถาปัตยกรรมที่ไม่ได้รับการสนับสนุนและจำกัดผลกระทบของช่องโหว่ฮาร์ดแวร์ในอนาคต[ 103 ] บน x86-64 นั้น Spectre v1 จะถูกบรรเทาผลกระทบผ่านการรวมกันของการบังคับใช้ขอบเขตแบบไม่มีสาขา (เช่น คำสั่งปิดบัง) และการตรวจสอบเส้นทางการดำเนินการแบบคาดการณ์ Spectre v4 จะถูกบรรเทาผลกระทบโดยใช้สิ่งกีดขวางการคาดการณ์ (เช่น lfence) เท่านั้น และ Spectre v2 จะถูกบรรเทาผลกระทบผ่าน retpoline เมื่อมีให้ใช้งาน[ 104 ]หรือสิ่งกีดขวางการคาดการณ์ มาตรการบรรเทาเหล่านี้ป้องกันไม่ให้ข้อมูลที่ละเอียดอ่อนซึ่งเป็นของเคอร์เนล (เช่น ที่อยู่ของเคอร์เนล) รั่วไหลโดยโปรแกรม eBPF ที่เป็นอันตราย แต่ไม่ได้ออกแบบมาเพื่อป้องกันโปรแกรม eBPF ที่ไม่เป็นอันตรายจากการรั่วไหลของข้อมูลที่ละเอียดอ่อนที่ตนเองเป็นเจ้าของ/ประมวลผลโดยไม่ได้ตั้งใจ (เช่น คีย์การเข้ารหัสที่จัดเก็บเป็นตัวเลข) [ 102 ]

ดูเพิ่มเติม

อ่านเพิ่มเติม

  • เกร็กก์, เบรนแดน (ธันวาคม 2019). เครื่องมือเพิ่มประสิทธิภาพ BPF . แอดดิสัน-เวสลีย์. ISBN 978-0136554820.
  • David Calavera, Lorenzo Fontana (ธันวาคม 2019). การตรวจสอบระบบ Linux ด้วย BPF . สำนักพิมพ์ O'Reilly Media, Incorporated. ISBN 978-1492050209.
  • เกร็กก์, เบรนแดน (ธันวาคม 2020). ประสิทธิภาพของระบบ, ฉบับพิมพ์ครั้งที่สอง . แอดดิสัน-เวสลีย์. ISBN 978-0136820154.
  • ไรซ์, ลิซ (เมษายน 2022). eBPF คืออะไร? . ISBN 978-1492097259.
  • ไรซ์, ลิซ (เมษายน 2023). การเรียนรู้ eBPF: การเขียนโปรแกรมเคอร์เนลลินุกซ์เพื่อเพิ่มประสิทธิภาพการสังเกตการณ์ การเชื่อมต่อเครือข่าย และความปลอดภัย . สำนักพิมพ์ O'Reilly Media. ISBN 978-1098135126.
  • Thaler, Dave, บรรณาธิการ (ตุลาคม 2024). สถาปัตยกรรมชุดคำสั่ง BPF (ISA) . IETF . doi : 10.17487/RFC9669 . RFC 9669. สืบค้นเมื่อ5 มกราคม 2024 .
  • eBPF.io - บทนำ บทแนะนำ และแหล่งข้อมูลชุมชน eBPF
  • eBPF.foundation - เว็บไซต์ของมูลนิธิ eBPF แห่ง Linux Foundation
  • คู่มือสำหรับนักพัฒนา eBPF: เรียนรู้ eBPF ทีละขั้นตอนพร้อมตัวอย่าง
  • สารคดี eBPF - สารคดีเกี่ยวกับจุดเริ่มต้นของ eBPF
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=EBPF&oldid=1361446527 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ อีบีพีเอฟ

eBPF เป็นเทคโนโลยีที่สามารถเรียกใช้โปรแกรมในบริบทที่มีสิทธิ์พิเศษเช่นเคอร์เนล ของ ระบบปฏิบัติการเป็นเทคโนโลยีที่พัฒนาต่อจากBerkeley Packet Filter (BPF โดยที่ "e" เดิมหมายถึง...

ออกแบบ

โปรแกรมที่โหลดซึ่งผ่านการตรวจสอบจะถูก ตีความ หรือคอมไพล์ แบบทันทีในเคอร์เนล (JIT compiled) เพื่อประสิทธิภาพการทำงานแบบเนทีฟ รูปแบบการทำงาน เป็น แบบขับเคลื่อนด้วยเหตุการณ์ และ ทำงานจนเสร็จสมบูรณ์ โดย มีข้อยกเว้นเพียงเล็กน้อย [ 2 ] หมายความว่า...

ประวัติศาสตร์

eBPF พัฒนามาจาก Berkeley Packet Filter แบบคลาสสิก (cBPF ซึ่งเป็นชื่อที่ใช้ในภายหลัง) ในระดับพื้นฐานที่สุด eBPF ได้นำการใช้รีจิสเตอร์ 64 บิตจำนวน 10 ตัวมาใช้ (แทนที่จะเป็นรีจิสเตอร์ 32 บิต 2 ตัวสำหรับ cBPF) ความหมายของการกระโดดที่แตกต่างกัน...

แผนที่ eBPF

แผนที่ eBPF เป็น ที่เก็บข้อมูลแบบคีย์/ค่า ที่มีประสิทธิภาพ ซึ่งอยู่ใน พื้นที่เคอร์เนล และสามารถใช้เพื่อแบ่งปันข้อมูลระหว่างโปรแกรม eBPF หลายโปรแกรมหรือเพื่อสื่อสารระหว่างแอปพลิเคชันในพื้นที่ผู้ใช้และโค้ด eBPF ที่ทำงานในเคอร์เนล โปรแกรม eBPF...