在eBPF篇中,我們知道雖然可用 C 來實作 BPF,但編譯出來的卻仍然是 ELF 檔案,開發者需要手動析出真正可以注入核心的代碼。工作有些麻煩,于是就有人設計了 BPF Compiler Collection(BCC),BCC 是一個(基于 C 和 C++) python 庫,實作了對 BCC 應用層接口的封裝。
使用 BCC 進行 BPF 的開發仍然需要開發者自行利用 C 來設計 BPF 程式,其他的工作,包括編譯、解析 ELF、加載 BPF 代碼塊以及建立 map 等等基本可以由 BCC 承擔。
USDT 為user-mode
statically defined traces
bcc大概,基本可以了解成eBPF的使用架構。
1.
安裝
在Ubuntu中直接安裝二進制檔案,指令如下:
sudo apt-key adv --keyserver
keyserver.ubuntu.com --recv-keys D4284CDD
echo "deb
https://repo.iovisor.org/apt/xenial xenial main" | sudo tee
/etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install bcc-tools
libbcc-examples linux-headers-$(uname -r)
另外需要注意的是,bcc要求核心在4.1以上的版本。
2.
Ubuntu編譯
如果進行源碼編譯,對環境有些要求:
l  LLVM3.7.1版本以上。
l  通過LLVM編譯的Clang
l  Cmake大于等于3.1版本
l  Gcc大于等于4.7
l  如果要支援Lua,需要LuaJIT.
VER=trusty
echo "deb http://llvm.org/apt/$VER/
llvm-toolchain-$VER-3.7 main deb-src http://llvm.org/apt/$VER/ llvm-toolchain-$VER-3.7
main" | tee /etc/apt/sources.list.d/llvm.list
wget -O -
http://llvm.org/apt/llvm-snapshot.gpg.key | apt-key add -
apt-get update
# All versions
apt-get -y install bison build-essential
cmake flex git libedit-dev libllvm3.7 llvm-3.7-dev libclang-3.7-dev python
zlib1g-dev libelf-dev netperf iperf
# 支援Lua,安裝luajit。
sudo apt-get -y install luajit
luajit-5.1-dev
環境準備完畢後,進行編譯安裝
git clone
https://github.com/iovisor/bcc.git
mkdir bcc/build;
cd bcc/build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
make
make install
3.
紅帽環境編譯
紅帽編譯:llvm的下載下傳路徑:
http://releases.llvm.org/download.html#6.0.0下載下傳cmake,連結位址:https://cmake.org/download/
LLVM
source code
Clang source code
Clang Tools Extra source code
Compiler RT source code
LibC++ source code
1)clang-tools-extra-3.6.0.src.tar.xz解壓後重命名為extra
2)cfe-3.6.0.src.tar.xz解壓後重命名為clang
3)llvm-3.6.0.src.tar.xz解壓後重命名為llvm
4)compiler-rt-3.6.0.src.tar.xz解壓後命名為compiler-rt
mv clang/ llvm/tools/
mv extra/ llvm/tools/clang/
mv compiler-rt llvm/projects/
把四個檔案按如下的目錄結構進行存放:
#cd llvm
#mkdir build && cd build
#cmake ..
#make
需要足夠大的編譯空間。
或者使用外部源,設定llvm源如下:
[alonid-llvm-3.9.0]
name=Copr repo for llvm-3.9.0 owned by alonid
baseurl=https://copr-be.cloud.fedoraproject.org/results/alonid/llvm-3.9.0/epel-7-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/alonid/llvm-3.9.0/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1
然後運作#yum update
#yum install llvm-3.9.0 clang-3.9.0
compiler-rt-3.9.0 llvm-3.9.0-devel
clang-3.9.0-devel llvm-3.9.0-static
此外還需要安裝iperf。
進行安裝。
最後設定PATH環境變量, 為其增加如下變量:
/opt/llvm-3.9.0/bin/
4.
核心要求
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
#
[optional, for tc filters]
CONFIG_NET_CLS_BPF=m
[optional, for tc actions]
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
CONFIG_HAVE_BPF_JIT=y
[optional, for kprobes]
CONFIG_BPF_EVENTS=y
5.
示例
示例腳本主要位于examples/tracing檔案夾中,用過之後就難以戒掉了。
例如跟蹤磁盤I/O塊大小的柱狀圖:
./bitehist.py
# ./bitehist.py
Tracing... Hit Ctrl-C to end.
^C
kbytes : count distribution
0 -> 1 : 1
|****************************************|
跟蹤塊I/O延時:
./disksnoop.py
輸出如下:
TIME(s) T BYTES
LAT(ms)
9151.779756000 R 8
0.26
9153.795887000 R 8
0.31
9155.811593000 R
8 0.21
第一列是時間戳,第二列是IO類型,第三列是IO位元組數,第四列是本次的IO時間。
6.
bcc工具架構
bcc相關的工具架構如下:
