在Ubuntu 22.04测试ebpf-go入门例子

文章目录

    • 1、eBPF-Go依赖
      • 1.1 Ubuntu安装ssh server
      • 1.2 安装go
      • 1.3 安装llvm和clang
      • 1.4 安装libbpf和Linux kernel headers
    • 2 编写eBPF C程序
    • 3 使用bpf2go编译eBPF C程序
    • 4 编写Go程序
    • 5 编译运行Go应用程序

eBPF-Go是一个使用eBPF的Go库。它不依赖于C、libbpf或除标准库之外的任何其他Go库,这让它成为编写运行在各种体系结构上独立的、可移植工具的绝佳选择。
官网: https://ebpf-go.dev/
GitHub: https://github.com/cilium/ebpf

1、eBPF-Go依赖

  • Linux kernel version 5.7 or later, for bpf_link support
  • LLVM 11 or later 1 (clang and llvm-strip)
  • libbpf headers 2
  • Linux kernel headers 3
  • Go compiler version supported by ebpf-go’s Go module

1.1 Ubuntu安装ssh server

本文例子是在虚拟机装的Ubuntu 22.04
Ubuntu安装ssh server,方便与主机文件传输

# 安装OpenSSH服务器软件包:
sudo apt install openssh-server# 安装完成后,SSH服务将自动启动。检查SSH服务器的状态:
sudo systemctl status ssh# 如果SSH服务没有启动,您可以使用以下命令启动它:
sudo systemctl start ssh#SSH服务在系统启动时自动启动:
sudo systemctl enable ssh

1.2 安装go

wget https://go.dev/dl/go1.22.6.linux-amd64.tar.gz
sudo tar -xzf go1.22.6.linux-amd64.tar.gz -C /usr/local# 配置环境变量
vim ~/.profile
# ~/.profile文件末尾增加环境变量
export GOPROXY=https://goproxy.cn 
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
# 使配置生效
source ~/.profile

1.3 安装llvm和clang

sudo apt update
sudo apt install llvm-13 clang-13# 安装完后,配置环境变量
vim ~/.profile
# ~/.profile文件末尾增加环境变量
export PATH=$PATH:/usr/lib/llvm-13/bin
# 使配置生效
source ~/.profile# 使用以下命令查看版本
llvm-config --version
clang --version

1.4 安装libbpf和Linux kernel headers

# 安装libbpf-dev依赖,避免'bpf/bpf_helpers.h' file not found
sudo apt-get install libbpf-dev 
# 软链接,避免'asm/types.h' file not found错误
ln -sf /usr/include/asm-generic/ /usr/include/asm

2 编写eBPF C程序

编写eBPF C程序,Go将引用C的结构。
counter.c


//go:build ignore#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>struct {__uint(type, BPF_MAP_TYPE_ARRAY); __type(key, __u32);__type(value, __u64);__uint(max_entries, 1);
} pkt_count SEC(".maps"); // count_packets atomically increases a packet counter on every invocation.
SEC("xdp") 
int count_packets() {__u32 key    = 0; __u64 *count = bpf_map_lookup_elem(&pkt_count, &key); if (count) { __sync_fetch_and_add(count, 1); }return XDP_PASS; 
}char __license[] SEC("license") = "Dual MIT/GPL";

3 使用bpf2go编译eBPF C程序

创建counter.c源文件后,创建另一个名为gen.go的文件,其中包含一个//go:generate语句。当在项目目录中运行go generate时,将使用bpf2go编译eBPF C程序。
文件gen.go

package main
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go counter counter.c

在使用Go工具链之前,Go需要先声明一个Go模块。

go mod init ebpf-test 
go mod tidy

添加bpf2go的依赖:

go get github.com/cilium/ebpf/cmd/bpf2go

运行go generate:
在这里插入图片描述

4 编写Go程序

main.go

package mainimport ("log""net""os""os/signal""time""github.com/cilium/ebpf/link""github.com/cilium/ebpf/rlimit"
)func main() {// Remove resource limits for kernels <5.11.if err := rlimit.RemoveMemlock(); err != nil {log.Fatal("Removing memlock:", err)}// Load the compiled eBPF ELF and load it into the kernel.var objs counterObjectsif err := loadCounterObjects(&objs, nil); err != nil {log.Fatal("Loading eBPF objects:", err)}defer objs.Close()ifname := "ens33" // Change this to an interface on your machine.iface, err := net.InterfaceByName(ifname)if err != nil {log.Fatalf("Getting interface %s: %s", ifname, err)}// Attach count_packets to the network interface.link, err := link.AttachXDP(link.XDPOptions{Program:   objs.CountPackets,Interface: iface.Index,})if err != nil {log.Fatal("Attaching XDP:", err)}defer link.Close()log.Printf("统计虚拟网卡%s数据包..", ifname)// Periodically fetch the packet counter from PktCount,// exit the program when interrupted.tick := time.Tick(time.Second)stop := make(chan os.Signal, 5)signal.Notify(stop, os.Interrupt)for {select {case <-tick:var count uint64err := objs.PktCount.Lookup(uint32(0), &count)if err != nil {log.Fatal("Map lookup:", err)}log.Printf("收到 %d 数据包", count)case <-stop:log.Print("收到退出信号..")return}}
}

最终文件目录如下
在这里插入图片描述

5 编译运行Go应用程序

go build && sudo ./ebpf-test

运行效果
在这里插入图片描述

参考自官网英文入门文档:https://ebpf-go.dev/guides/getting-started/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409259.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows单机安装配置mongodb+hadoop+spark+pyspark用于大数据分析

目录 版本选择安装配置Java环境配置Hadoop配置Spark配置 安装pyspark使用Jupyter Notebook进行Spark MongoDB测试参考 版本选择 根据Spark Connector&#xff1a;org.mongodb.spark:mongo-spark-connector_2.13:10.3.0 的前提要求 这里选择使用最新的MongoDB 7.0.12社区版 ht…

基于R语言进行AMMI分析3

参考资料&#xff1a;https://cran.r-project.org/web/packages/agricolae/agricolae.pdf 1、plot()函数 本次介绍的是Agricolae包中的plot.AMMI()函数。此函数可以绘制AMMI双标图&#xff0c;也可以绘制三标图&#xff08;三个坐标轴&#xff0c;IPCA1&#xff0c;IPCA2&…

TiggerRamDisk绕过激活界面,支持最新iOS17.4.1绕过

&#x1f427;技术交流&#xff1a;582022476 ——————— iOS15等待越狱的日子实在太久了&#xff01;checkra1n越狱目前还未发布iOS15系统越狱。 可很多朋友不小心或者大意已经升级到了最新iOS15系统。一般来说这并没有什么大碍&#xff0c;但如果是绕过激活的设备&#…

Cesium 展示——绘制水面动态升高

文章目录 需求分析需求 如图,绘制水面动态升高,作为洪水淹没的效果 分析 我们首先需要绘制一个面然后给这个面一个高度,在回调函数中进行动态设置值【这里有两种,一种是到达水面一定高度停止升高,一种是水面重新升高】/*** @description :洪水淹没* @author : Hukang*…

一起学Java(3)-Java项目构建工具Gradle和Maven场景定位和优缺点对比

在第一步创建的项目&#xff08;java-all-in-one&#xff09;项目里&#xff0c;我们提到了使用Gradle作为项目构建工具。看到这里&#xff0c;不知道你是否有疑惑&#xff0c;什么是项目构建工具。Java项目常用构建工具有哪些&#xff1f;都有什么特点&#xff1f; 带着疑惑&…

工厂现场多功能帮手,三防平板改善管理体验

随着制造业的智能化变革&#xff0c;信息化、自动化和智能化逐渐成为工厂管理的新常态。在这一波技术浪潮中&#xff0c;三防平板作为一种多功能的工作工具&#xff0c;正在逐步改善工厂现场的管理体验。 一、三防平板的定义与特点 三防平板&#xff0c;顾名思义&#xff0c;是…

Python测试框架之—— pytest介绍与示例

Pytest是一个功能强大且易于使用的Python测试框架&#xff0c;它提供了丰富的功能和灵活的用法&#xff0c;使得编写和运行测试变得简单而高效。 一、Pytest的特点 简单灵活&#xff1a;Pytest的语法简洁清晰&#xff0c;容易上手&#xff0c;并且支持复杂的测试场景。自动发…

python库(21):

1 TextBlob简介 TextBlob 是一个基于 Python 的文本处理库&#xff0c;能够让基础的自然语言处理任务变得异常简单。 它提供了一个简单直观的 API&#xff0c;让你能够轻松执行词性标注、名词短语提取、情感分析、文本分类和关键词提取等功能。 值得一提的是&#xff0c;Tex…

Qt+FFmpeg开发视频播放器笔记(二):界面UI搭建

效果图 主要使用无边框窗体搭建,实现窗体的拖动和缩放&#xff0c;播放列表、文件打开等。 主要代码 manwindow设计类 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QMutex> #include "framelesshelper.h"QT_BEGIN_NA…

【网络】传输层协议——TCP协议(进阶)

目录 1.TCP连接的11种状态 2.再次理解三次挥手 2.1.再次理解三次握手 2.2.Socket编程和三次握手的关系 2.2.1.listen的参数 2.2.2.accept函数 2.3.TCP三次握手的优点 2.3.1.阻止重复历史连接的初始化 2.3.2.为什么两次握手不能防止旧的重复连接初始化造成混乱呢&am…

【附源码】Python :PYQT界面点击按钮随机变色

系列文章目录 Python 界面学习&#xff1a;PYQT界面点击按钮随机变色 文章目录 系列文章目录一、项目需求二、源代码三、代码分析3.1 导入模块&#xff1a;3.2 定义App类&#xff1a;3.3 构造函数&#xff1a;3.4 初始化用户界面&#xff1a;3.5 设置窗口属性&#xff1a;3.6 …

基于YOLOv7算法的高精度实时课堂场景下人脸检测系统

项目目标 开发一套基于YOLOv7的高精度实时人脸检测系统&#xff0c;适用于课堂场景。实现对图片、视频、文件夹内的图像及摄像头流的实时人脸检测。提供直观的图形界面&#xff0c;方便用户操作。支持模型权重的灵活选择与加载&#xff0c;以及后处理参数的调整。 主要功能 模…

基础算法--递推算法[信奥一本通]

本节所讲题源自【信奥一本通】C版&#xff1a;基础算法-第三章-递推算法 相信大家应该都接触过数列的概念。哎哟&#xff0c;一直在跟数组打交道&#xff0c;说数列感觉好陌生&#xff0c;哈哈。数列中的迭代法大家都还记得吗&#xff1a;通过反复应用特定规则&#xff0c;推导…

海思SD3403/SS928V100开发(16)Tsensor驱动开发

1. 前言 由于需要检测SD3403芯片内部实时温度,需要开发Tsensor传感器驱动和应用 查看手册发现SD3403内部有三个Tsensor传感器 可以参考之前我写的35系列平台Tsensor驱动开发记录 海思35系列平台Tsensor驱动开发(1)驱动编写_t sensor-CSDN博客 海思35系列平台Tsensor驱动…

MyBatis源码(6)拦截器

1、目标 本文的主要目标是学习MyBatis拦截器的源码&#xff0c;本文将以插入操作为例debug拦截器相关的源码 2、拦截器源码分析 调用mapper接口的insert插入记录方法&#xff0c;会调用SqlSession对象的insert方法 SqlSession执行insert方法 Spring容器会创建SqlSessionTemp…

【Algorithm】三步问题

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 1.三步问题1.题目连接2.算法原理讲解&&代码实现 2.最小花费爬楼梯1.题目连接2.算法原理讲解&&代码实现 3.解码方法1.题目连接2.算法原理讲解&&代码实现 1.三步问题 1.题目连…

如何在分布式环境中实现高可靠性分布式锁

目录 一、简单了解分布式锁 &#xff08;一&#xff09;分布式锁&#xff1a;应对分布式环境的同步挑战 &#xff08;二&#xff09;分布式锁的实现方式 &#xff08;三&#xff09;分布式锁的使用场景 &#xff08;四&#xff09;分布式锁需满足的特点 二、Redis 实现分…

1/f噪声影响及解决措施

在将6位半数字万用表输入短接时&#xff0c;观察其输出。在逐渐增加均值次数后&#xff0c;噪声开始下降&#xff0c;达到一定程度后便停止下降&#xff0c;随着时间的推移&#xff0c;停止下降的噪声在逐渐增加&#xff0c;该部分主要是1/f噪声影响。 这种1/f噪声&#xff08;…

404错误页面简约清新源码 非常好看

源码介绍 404错误页面简约清新源码 非常好看&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 源码下载 404错误页面简约清…

摄像头实时检查程序,插入设备,自动显示画面,支持多个摄像头,支持拍照,照片放大缩小

支持的特性 插入摄像头设备后&#xff0c;无需手动选择&#xff0c;自动显示摄像头画面&#xff0c;需要预先授权支持多个摄像头切换显示多个摄像头时支持 默认显示特定名称的摄像头支持拍照支持照片放大&#xff0c;缩小 显示效果 完整代码 <!DOCTYPE html> <html…