简介
bpf程序分为user-space-program(USP)和kernel-space-program(KSP)
他们互相不可直接通信,通过buffer交换数据
运行bpf程序在linux 5.8之后需要CAP_BPF,之前需要CAP_SYS_ADMIN
准备环境
此处使用的是ubuntu,需要root权限
apt-get install clang
apt-get install make
apt install libbpf-dev
wget https://github.com/libbpf/bpftool/releases/download/v7.2.0/bpftool-v7.2.0-amd64.tar.gz
tar zxvf bpftool-v7.2.0-amd64.tar.gz
mv bpftool /usr/bin
demo
创建hello.bpf.c,内容如下
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
int counter = 0;
SEC("xdp")
int hello(struct xdp_md *ctx) {
bpf_printk("Hello World %d", counter);
counter++;
return XDP_PASS;
}
char LICENSE[] SEC("license") = "Dual BSD/GPL";
创建makefile,内容如下
TARGETS = hello hello-func
all: $(TARGETS)
.PHONY: all
$(TARGETS): %: %.bpf.o
%.bpf.o: %.bpf.c
clang \
-target bpf \
-I/usr/include/$(shell uname -m)-linux-gnu \
-g \
-O2 -o $@ -c $<
clean:
- rm *.bpf.o
- rm -f /sys/fs/bpf/hello
- rm -f /sys/fs/bpf/hello-func
编译bpf程序
make hello
加载bpf程序
bpftool prog load hello.bpf.o /sys/fs/bpf/hello
attach到网卡
bpftool net attach xdp name hello dev lo
测试
在一个终端执行
bpftool prog trace log(也可以使用cat /sys/kernel/debug/tracing/trace_pipe)
在另一个终端执行
ping localhost
修改hello.bpf.c
把XDP_PASS改为XDP_DROP
从网卡detach
bpftool net detach xdp dev lo
卸载bpf程序
rm /sys/fs/bpf/hello
编译bpf程序
make hello
加载bpf程序
bpftool prog load hello.bpf.o /sys/fs/bpf/hello
attach到网卡
bpftool net attach xdp name hello dev lo
测试
在一个终端执行
bpftool prog trace log(也可以使用cat /sys/kernel/debug/tracing/trace_pipe)
在另一个终端执行
ping localhost
可以看到此时ping是不通的
一些命令
查看内核已加载到bpf程序
bpftool prog list
查看指定id的bpf程序的字节码
bpftool prog dump xlated id ${id} linum
bpftool prog show name hello
查看内核加载的map
bpftool map list
查看内核加载的map
bpftool map show id
查看内核加载的map内容
bpftool map dump id ${id}
查看内核加载的map内容某个key的value
bpftool map lookup id ${id} key 100 0 0 0 0 0 0 0
更新内核加载的map内容某个key的value
bpftool map update id ${id} key 5 0 0 0 0 0 0 0 value 0 0 0 0 0 0 0 1
一些工具
bpftool
bpftrace
bcc
网友评论