ebpf學習筆記(一)——ebpf簡介與環境配置
參考書:《Learning-eBPF》
電子書鏈接: Learning-eBPF
ebpf簡介
BPF是“Berkeley Packet Filter”的簡稱。它于 1997 年首次引入 Linux(內核版本 2.1.75),在tcpdump中它被用作捕獲要跟蹤的數據包的有效方法。
最開始BPF確實只用于網絡數據包過濾方面,但隨著技術的應用,大家開始發覺到BPF在其它領域的重要作用。畢竟,誰能拒絕一個能在內核態高效實現程序員所寫的應用程序而不用重新編譯內核的工具呢?
引用書中對于BPF工作的簡短介紹:
我們今天所說的“eBPF”起源于 BSD 數據包過濾器,該過濾器于 1993 年在勞倫斯伯克利國家實驗室的 Steven McCanne 和 Van Jacobson 撰寫的一篇論文1 中首次描述。本文討論一種可以運行 filters 的 pseudomachine
這些程序是用 BPF 指令集編寫的,BPF 指令集是一組通用的 32 位指令,與匯編語言非常相似。下面是一個直接摘自該論文的示例:
ldh [12]
jeq #ETHERTYPE IP, L1, L2
L1: ret #TRUE
L2: ret #0
這一小段代碼過濾掉不是 Internet 協議(IP)的數據包。此過濾器的輸入是以太網數據包,第一條指令 (**ldh**) 加載從此數據包中的字節 12 開始的 2 字節值。在下一條指令 (**jeq**) 中,將該值與表示 IP 數據包的值進行比較。如果匹配,則執行將跳轉到標記為 **L1** 的指令,并通過返回非零值(此處標識為 **#TRUE**)來接受數據包。如果不匹配,則數據包不是 IP 數據包,并通過返回 0 來拒絕。
重要的是,過濾器的作者可以編寫自己的自定義程序,以便在內核中執行,這就是 eBPF 的核心功能
BPF 從 2014 年的內核版本 3.18 開始演變為我們所說的“extend BPF”或“eBPF”。現在我們說BPF和eBPF都是指一個東西。(Linux內核代碼里還是采用BPF的名稱)
在這其中BPF發生重大變化:
- BPF 指令集經過徹底修改,在 64 位機器上更加高效,解釋器也被完全重寫
- 引入了 eBPF maps,這是 BPF 程序和用戶空間應用程序可以訪問的數據結構,允許它們在它們之間共享信息。
- 添加了 bpf() 系統調用,以便用戶空間程序可以與內核中的 eBPF 程序進行交互。
- 添加了多個 BPF 幫助程序函數。
- 添加了 eBPF verifier,以確保 eBPF 程序可以安全運行。
環境配置
安裝依賴
sudo apt-get install -y apt-transport-https ca-certificates curl clang llvm jq
sudo apt-get install -y libelf-dev libpcap-dev libbfd-dev binutils-dev build-essential make
sudo apt-get install -y linux-tools-common linux-tools-$(uname -r)
sudo apt-get install -y bpfcc-tools
安裝bpftool
克隆bpftool
git clone --recurse-submodules https://github.com/libbpf/bpftool.git
如目錄內沒有libbpf文件夾,需要在克隆目錄內克隆libbpf
git clone https://github.com/libbpf/libbpf.git
在系統內安裝libbpf(注意需要使用較新版本的clang,否則編譯libbpf出錯)
$ cd bpftool/src
# make install

浙公網安備 33010602011771號