Ubuntu 21.10 编写 eBPF tc 程序
1. 安装基本依赖
apt-get install -y make gcc libssl-dev bc libelf-dev libcap-dev \clang gcc-multilib llvm libncurses5-dev git pkg-config libmnl-dev bison flex \graphviz
2. 编译安装 libbpf
wget https://github.com/libbpf/libbpf/archive/refs/tags/v0.6.0.tar.gz
tar xzf v0.6.0.tar.gz
cd libbpf-0.6.0/src/
make
make install
说明:libbpf 是包含在内核代码库中的,尽量选择与内核版本匹配的版本。因为 Ubuntu 21.10 内核版本是 5.13 ,所以我选的版本是 0.6.0。
3. 写一个 tc 程序
以下是 tc-example.c,一个示例程序的源码,改造自这篇文章:【这个程序定义了两个 section,一个会加载到 tc ingress,一个会加载到 tc egress,并且两者都使用一个全局的 map ,用来对进入接口和出接口的报文做字节数统计】
#include <linux/bpf.h>
#include <linux/pkt_cls.h>
#include <stdint.h>#include <iproute2/bpf_elf.h>#include <bpf/bpf_helpers.h>
#include <bpf/bpf_endian.h>struct bpf_elf_map SEC("maps") acc_map = {.type = BPF_MAP_TYPE_ARRAY,.size_key = sizeof(uint32_t),.size_value = sizeof(uint32_t),.max_elem = 2,.pinning = PIN_GLOBAL_NS,
};static __always_inline int account_data(struct __sk_buff *skb, uint32_t dir)
{uint32_t *bytes;bytes = bpf_map_lookup_elem(&acc_map, &dir);if (bytes)__sync_fetch_and_add(bytes, skb->len);return TC_ACT_OK;
}SEC("ingress")
int tc_ingress(struct __sk_buff *skb)
{return account_data(skb, 0);
}SEC("egress")
int tc_egress(struct __sk_buff *skb)
{return account_data(skb, 1);
}char __license[] SEC("license") = "GPL";
重要说明:<iproute2/bpf_elf.h>
头文件定义了 bpf_elf_map
结构。在 Ubuntu 21.10 中,这个头文件已经被系统包含了,完整路径是/usr/include/iproute2/bpf_elf.h
。如果是低版本的系统,可能没有这个头文件,那么就需要添加如下的结构体和宏定义【有可能还需要重新编译 iproute2 和 libbpf,所以尽量选择高版本的系统 】:
#define PIN_GLOBAL_NS 2struct bpf_elf_map {__u32 type;__u32 size_key;__u32 size_value;__u32 max_elem;__u32 flags;__u32 id;__u32 pinning;
};
要用这个结构体是因为后面我们要使用 tc
这个命令将程序加载到内核中,如果不使用 tc
命令而是自己写程序加载,那么就不需要使用这个结构体,而是使用在 libbpf 中定义的 bpf_map_def
结构,相应的 map 定义改为如下:
struct bpf_map_def SEC("maps") acc_map = {.type = BPF_MAP_TYPE_ARRAY,.key_size = sizeof(uint32_t),.value_size = sizeof(uint32_t),.max_entries = 2,.map_flags = LIBBPF_PIN_BY_NAME
};
4. 编译并加载程序
用 clang
编译出 ebpf 程序:
clang -O2 -Wall -target bpf -c tc-example.c -o tc-example.o
用 tc
分别加载 ebpf 程序的 ingress section 和 egress section 到一个接口的 tc ingress 和 tc egress:
tc qdisc add dev ens33 clsact
tc filter add dev ens33 ingress bpf da obj tc-example.o sec ingress
tc filter add dev ens33 egress bpf da obj tc-example.o sec egress
5. 验证程序效果
先安装 bpftool
:
apt-get install linux-tools-$(uname -r)
然后用 bpftool map 命令可以看到程序创建的 map:
root@ubuntu21:~/test# bpftool map
1: array name acc_map flags 0x0key 4B value 4B max_entries 2 memlock 4096B
还可以查看 map 中的数据:
root@ubuntu21:~/test# bpftool map dump id 1
key: 00 00 00 00 value: 80 21 00 00
key: 01 00 00 00 value: 02 21 00 00
Found 2 elements
root@ubuntu21:~/test# bpftool map dump id 1
key: 00 00 00 00 value: a8 22 00 00
key: 01 00 00 00 value: 2a 22 00 00
Found 2 elements
统计值在增加就证明我们的 tc 程序在工作了。Done!
Ubuntu 21.10 编写 eBPF tc 程序相关推荐
- 如何现在就用到 Ubuntu 21.10
Ubuntu 21.10 "Impish Indri" 刚刚发布.如果你正在使用 Ubuntu 21.04,你应该有升级到 Ubuntu 21.10 的选项.然而,这种推出将是逐步 ...
- 从 Ubuntu 21.04 升级到 Ubuntu 21.10
Ubuntu 21.10 "Impish Indri" 刚刚发布.如果你正在使用 Ubuntu 21.04,你应该有升级到 Ubuntu 21.10 的选项. 然而,这种推出将是逐 ...
- linux系统开发版下载,Ubuntu 21.10(Impish Indri)桌面开发版iso下载地址
Ubuntu 21.10(Impish Indri)已经提供开发版iso下载了,用户可下载impish-desktop-amd64.iso.arm64.iso试用,这些iso都是每日构建版本,使用这些 ...
- Ubuntu 21.10安装国内源
为什么要安装国内源?因为默认的软件更新源是国外的,在国内使用下载速度很慢.我们只需要把它默认更新软件的国外网址改成我们国内的镜像网址就行了. 首先将我们的原来的软件源备份:(这样就算改错了也能恢复) ...
- Ubuntu系统中编写c语言程序教程
目录 1.准备工作 1.1 安装GCC及必要软件包 2.使用GCC编写C语言程序 2.1 编写一个整型运算反回浮点型的程序 2.2 在windows系统下使用编译工具编译该程序 3.使用Makefil ...
- Ubuntu 21.10 ALC294 声卡无声音、音量只能最大或静音问题的解决办法
问题描述: 问题一:(华硕 及其他 ALC294 声卡用户)安装Ubuntu系统后,增减声音,音量条显示正常,但是无法发出声音,但是更换音频设备为耳机则有声音. 问题二:解决问题一后,又出现这种情况: ...
- 教你在 Kubuntu 21.10 中升级 KDE Plasma 5.24
KDE 开发人员启用了有名的 Backports PPA,以便你在 Kubuntu 21.10 中安装/升级到 KDE Plasma 5.24. 以下是方法. KDE Plasma 5.24 最近的 ...
- Ubuntu 12.10中的8个新功能,Quantal Quetzal
Ubuntu 12.10 has been released and you can download it now. From better integration with web apps an ...
- Ubuntu 21 .1安装wps office 2019并解决字体缺失问题教程
部署环境 系统:Ubuntu 21.10 软件:wps-office_11.1.0.10920_amd64.deb 组件:wps-fonts.zip字体包 1.访问WPS官网下载适用的DEB格式的安装 ...
- 我的ubuntu 8.10安装配置经验(Intrepid Ibex)(转)
总纲:分以下几部分工作 作者:皮皮彭原始链接:http://www.pengkuny.com/post/Install_Ubuntu8.10.html版权申明:欢迎大肆转载,任意修改,但请务必保留作者 ...
最新文章
- 【Java】找到链表中倒数第k个结点
- MTK 添加自定义PMS权限 Patch
- [转]终结PHP中文乱码的问题
- C++创建对象的两种方式
- 【学习笔记】Node.js学习笔记(二)
- 发现在创建云服务器ecs实例的磁盘快照时_玩转ECS第7讲|ECS数据保护-数据备份新特性与最佳实践...
- java 播放.pcm文件,java播发PCM文件
- java mapreduce程序_简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行...
- C++ 基类和派生类的构造函数
- 基于python的分类模型_python SVM 线性分类模型的实现
- 一提开发满脸泪,不如尬评来赢书 | 张开涛亲笔签名
- Amazon IoT Core 服务成本优化
- 在电脑上怎么做报表新手_初学者在电脑上如何制作电子表格
- React脚手架使用less
- 怎么用计算机计算行列式,行列式计算器怎么使用,行列式计算器安装使用教程...
- 自定义电子邮件 html_如何在Windows 10中设置和自定义电子邮件帐户
- 解闷又有趣的小游戏在这就有
- android fragment 白屏,当应用Crash后fragment出现白屏
- 解决MySQL CPU占用100%的经验总结 转
- 帧间预测-AMVP 模式