eBPF技术介绍

news2024/11/26 0:38:33

前言

eBPF起源于linux内核,它可以以砂箱程序运行在操作系统内核的特权上下文,高效,安全,易于扩展而不需要修改内核源码或者加载内核模块。

操作系统一直是实现观测,安全和网络功能的最理想的地方,因为内核的特权可以查看和控制整个系统。同时,一个操作系统的内核也是很难进化的,因为核心处理的角色,稳定性和安全方面都是高需求的。所以相对于应用而言,操作系统级的创新是很难的。

而eBPF改变了这一情况。通过允许在操作系统中运行沙盒程序,应用程序开发人员可以运行eBPF程序,在运行时为操作系统添加额外的功能。然后,操作系统保证了安全性和执行效率,就好像是在实时(JIT)编译器和验证引擎的帮助下进行本机编译一样。这导致了一波基于eBPF的项目,涵盖了广泛的用例,包括下一代网络、可观察性和安全功能。

 如今,eBPF被广泛用于驱动各种各样的用例:在现代数据中心和云原生环境中提供高性能网络和负载平衡,以低开销提取细粒度的安全可观测性数据,帮助应用程序开发人员跟踪应用程序,为性能故障排除提供见解,预防性应用程序和容器运行时安全强制,等等。可能性是无限的,eBPF正在解锁的创新才刚刚开始。

底层概念与架构

Hook概述

eBPF程序是事件驱动的,当内核或应用程序 通过某个挂接点 时 运行。

预定义的挂钩包括:系统调用函数进入/退出内核跟踪点网络事件其他一些。

 如果不存在用于特定需求的预定义挂钩,则可以创建内核探针(kprobe)或用户探针(uprobe),以将eBPF程序连接到内核或用户应用程序中的几乎任何位置。

eBPF程序是如何编写的?

在很多情况下,eBPF不是直接使用,而是通过项目( Cilium, bcc, or bpftrace)间接使用提供了在eBPF之上的抽象,不需要直接编写程序,而是提供了指定基于意图的定义的能力,然后使用eBPF实现这些定义。如果不存在更高级别的抽象,则需要直接编写程序。Linux 内核期望 eBPF 程序以字节码的形式加载。虽然当然可以直接编写字节码,但更常见的开发实践是利用编译器套件,例如LLVM将伪 C 代码编译为 eBPF 字节码。

当确定了所需的钩子后,可以使用 bpf 系统调用将 eBPF 程序加载到 Linux 内核中。这通常使用可用的 eBPF 库来完成。当程序加载到 Linux 内核中时,它会在附加到请求的钩子之前经过两个步骤:Verification和JIT

Verification:

是确保eBPF程序安全的关键环节,验证包括:

  • 加载 eBPF 程序的进程具有所需的功能(权限)。除非启用了非特权 eBPF,否则只有特权进程才能加载 eBPF 程序。
  • 该程序不会崩溃或以其他方式损坏系统。
  • 程序总是运行到完成(即程序不会永远处于循环中,从而阻止进一步的处理)。

JIT:

是确保程序性能的关键之一

即时 (JIT) 编译步骤将程序的通用字节码转换为特定于机器的指令集,以优化程序的执行速度。这使得 eBPF 程序的运行效率与本机编译的内核代码或作为内核模块加载的代码一样高效。

 Map:

eBPF 程序的一个重要方面是共享收集的信息和存储状态的能力。为此,eBPF程序可以利用eBPF映射的概念在广泛的数据结构中存储和检索数据。eBPF 映射可以从 eBPF 程序访问,也可以通过系统调用从用户空间中的应用程序访问。

以下是支持的映射类型的不完整列表,以便了解数据结构的多样性。对于各种映射类型,共享和每 CPU 变体都可用。

  • 哈希表、数组
  • LRU(最近最少使用)
  • 环形缓冲器
  • 堆栈跟踪
  • LPM(最长前缀匹配)
  • ...

Helper

eBPF 程序不能调用任意内核函数。允许这样做会将 eBPF 程序绑定到特定的内核版本,并使程序的兼容性复杂化。相反,eBPF 程序可以将函数调用到帮助程序函数中,这是内核提供的众所周知且稳定的 API。

可用的帮助程序调用集在不断发展。可用的帮助程序调用示例:

  • 生成随机数
  • 获取当前时间和日期
  • eBPF 地图访问
  • 获取进程/c组上下文
  • 操作网络数据包和转发逻辑

Tail & Function Calls

eBPF 程序可以用尾部和函数调用的概念组合。函数调用允许在 eBPF 程序中定义和调用函数。尾部调用可以调用和执行另一个 eBPF 程序并替换执行上下文,类似于 execve() 系统调用对常规进程的操作方式。

eBPF对Linux内核的影响

现在让我们回到eBPF。为了理解 eBPF 对 Linux 内核的可编程性影响,它有助于对 Linux 内核的架构以及它如何与应用程序和硬件交互有一个高层次的了解。

Linux 内核的主要目的是抽象硬件或虚拟硬件,并提供一致的 API(系统调用),允许应用程序运行和共享资源。为了实现这一目标,需要维护一组广泛的子系统和层来分配这些职责。每个子系统通常允许进行某种级别的配置,以满足用户的不同需求。如果无法配置所需的行为,则需要更改内核,从历史上看,留下两个选项:

 使用 eBPF,可以使用一个新选项,允许重新编程 Linux 内核的行为,而无需更改内核源代码或加载内核模块。在许多方面,这与JavaScript和其他脚本语言如何解锁系统的发展非常相似,这些系统已经变得难以改变或成本高昂。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue基本的内置指令

前言 除了常见的v-bind,v-for,v-if,v-on.v-model等,本次学习一些vue提供的其他内置指令 1 v-text 给标签插入文本,类似于插值语法 它会把全部的字符串当成文本去解析,不会当成标签的,哪怕写的是标签结构 效果和插值语法是一样的 插值语法比v-text更加…

P1037 [NOIP2002 普及组] 产生数

题目描述 给出一个整数 �n 和 �k 个变换规则。 规则: 一位数可变换成另一个一位数。规则的右部不能为零。 例如:�234,�2n234,k2。有以下两个规则: 2⟶52⟶5。3⟶63⟶6。 上面的整数 23423…

SpringBoot的配置和日志

1.配置文件的作用和意义 配置文件中配置整个项目中所有重要的数据,比如: 1.数据库的连接信息(包含用户名和密码的设置); 2.项目的启动端口; 3.第三方系统的调用秘钥等信息; 4.用于发现和定位问…

docker--harbor私有仓库部署与管理

目录 第一章.搭建本地私有仓库 1.1.下载 registry 镜像 1.2.运行 registry 容器 1.3.Docker容器的重启策略如下: 1.4.简单操作 第二章. Harbor 简介 2.1.什么是Harbor 2.2.Harbor的特性 2.3.Harbor的构成 第三章.部署服务 3.1.环境部署 3.2.部署 Docker…

USART串口协议和USART串口外设(USART串口发送串口发送和接收)

1、通信接口 • 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 • 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 异步:需要双方约定一个频率 2、 硬件电路 • 简单双向串口通信有两根通信…

基于springboot和ajax的简单项目 013 ztree插件使用,这是关于修改和新增的

先写写的是menu_list.html文件上的内容。 01.在自动加载函数上写点击事件 $(".input-group-btn").on("click",".btn-delete",doDeleteObject).on("click",".btn-add,.btn-update",doLoadEditUI);02.登录函数: …

30秒预测10天全球天气,上海人工智能实验室发布气象大模型“风乌”效果超DeepMind

4月7日,上海人工智能实验室联合中国科学技术大学、上海交通大学、南京信息工程大学、中国科学院大气物理研究所及上海中心气象台发布全球中期天气预报大模型“风乌”。基于多模态和多任务深度学习方法构建,AI大模型“风乌”首次实现在高分辨率上对核心大…

Speech and Language Processing-导读

朋友们,最近打算做一个大工程,我曾多次提过,chatgpt未来将是一股非常大的信息技术革命,有的人不以为然,或者国内很多企业好像并不是很重视,以我从业多年来的经验,chatgpt与之前的NLP技术有着较为…

【jenkins学习】windows环境下部署与设置中文显示

准备: jenkins安装包: https://www.jenkins.io/zh/download/ Java 17安装包: https://www.oracle.com/java/technologies/downloads/#jdk17-windows 1、jdk安装 不建议放在C盘,自定义一个不含中文的路径,安装即可 配置…

轻松掌握K8S目录持久卷PV/PVC的kubectl操作知识点04

1、介绍 在docker中可以将容器中的目录挂载出来,在k8s中pod可以部署在不同节点,假如该节点的机器宕机了,k8s可能就会将此Pod转移到其他机器,就不是原先的机器了。k8s有自己的一套挂载方案,如下图所示, 原…

Flink通过Maxwell读取mysql的binlog发送到kafka再写入mysql

1.准备环境 JDK1.8 MySQL Zookeeper Kakfa Maxweill IDEA 2.实操 2.1开启mysql的binlog 查看binlog 状态,是否开启 show variables like log_% 如果log_bin显示为ON,则代表已开启。如果是OFF 说明还没开启。 [Linux] 编辑 /etc/my.cnf 文件&…

什么品牌台灯最舒服?推荐最热门的护眼灯品牌排行

台灯是人们生活中用来照明的一个电器,平时阅读跟学习时都会用来照明,补充室内不足的光线。 那么,台灯哪个品牌最舒服?分享几款好用的护眼台灯给大家。 (1) 南卡护眼台灯Pro 南卡是目前国内护眼效果方面做得最棒的一个品牌&#x…

企业本地文档如何实现规范在线管理?

随着企业数字化生产方式的不断推进,网络办公和在线协作越来越普遍,企业内部可能出现大量的文件和文档,这些文档多存在于不同的设备和存储介质上,这给企业的信息管理带来了一定程度的困难。为了提高企业的知识管理效率,…

SpringCloudTencent:安装北极星polaris服务

腾讯推出了自己的微服务框架,其中polaris(北极星)服务更是核心,除了提供服务发现和治理中心,除服务发现、服务注册和健康检查之外,还提供流量控制、故障容错和安全能力。现在我们试着快速安装一下。 1.win…

Java笔记_11(常见算法)

Java笔记_11常见算法 一、常见算法1.1、查找算法1.2、排序算法 二、Arrays三、Lambda表达式四、综合练习4.1、按照要求进行排序4.2、不死神兔4.3、猴子吃桃子4.4、爬楼梯 一、常见算法 1.1、查找算法 基本查找 package Common_algorithms.Basic_Search;import java.util.Ar…

IT运维:服务器管理

服务器是连接到其他设备以提供服务的设备。其他设备称为客户端,此设置称为客户端-服务器模型。 服务器提供的服务包括存储数据、托管网站、运行应用程序、中继信息和执行计算。任何向发出请求的客户端提供服务的设备都可以充当服务器,但大型IT组织通常具…

笔试练习Day01

目录 选择题: 题一: String 类: StringBuffer 类的详解: 关于 Vector 的详解: 编程题: 题一:组队竞赛 题二:删除公共字符串 选择题: 题一: String 类…

node(express框架)连接mysql 基础篇

文章目录 电脑安装mysql配置mysql连接mysql 创建表 创建node文件启动node node 连接数据库连接数据库 电脑安装mysql 由于我的是mac 我就安装mac版本的 mysql 如已安装跳过此步骤 mysql官网选择版本安装配置 这里注意选择下面的 next输入mysql密码 点击finish 配置mysql 打…

ROS:TF变换

一.TF变换数据格式(msg) TransformStamped.msg(两个坐标系之间转换) std_msgs/Header header uint32 seq time stamp string frame_id 指明哪一个坐标系(父坐标系) string child_f…

汇编语言(第3版) - 学习笔记 - 实验8 分析一个奇怪的程序

实验8 分析一个奇怪的程序 题目解析顺序执行查看反汇编测试一下 题目 分析下面的程序,在运行前思考:这个程序可以正确返回吗? 运行后再思考:为什么是这种结果? 通过这个程序加深对相关内容的理解。 assume cs:codesg codesg segmentmov ax, 4c00h int 21h …