美文网首页
ebpf入门

ebpf入门

作者: wwq2020 | 来源:发表于2023-10-18 16:28 被阅读0次

    简介

    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
    

    相关文章

      网友评论

          本文标题:ebpf入门

          本文链接:https://www.haomeiwen.com/subject/hydcidtx.html