BPF虚拟文件系统是干什么的,以及它的作用

BPF最基本的的特征是基于文件描述符的映射,这意味着,当文件描述符关闭之后,这个map中的其他信息都会丢失。BPF的map是用于很短暂的隔离程序,他们不会share信息。随着时间的发展,开发人员需要保存Map中的信息,即使是相关的文件描述符已经关闭了。kenerl4.4引入了两个syscall,允许bpf程序从虚拟文件系统固定和获取map。固定到此文件系统的Maps和BPF程序将在创建它们的程序终止后仍然保留在内存中。
BPF默认的虚拟文件路径是在/sys/fs/bpf下,陪你可以使用下面的命令挂载虚拟文件系统

mount -t bpf /sys/fs/bpf /sys/fs/bpf

持久化BPF objects在文件系统中被定义为path,你可以随意指定你的path。有两种BPF Objects你可以在文件系统中保存。bpf的Maps和完整的bpf程序。他们都被标识为一个文件描述符,这些对象只能被bpf系统调用来处理。你是不能使用open等来处理的。
BPF_PIN_FD是去保存bpf对象到文件系统的指令。当这个指令成功时,你将能在/sys/fs/bpf下面看到你创建的path.如果失败了,返回一个负数,同时设置了全局的错误变量:errno。
BPF_OBJ_GET是去获取BPF对象的指令。(前提是之前被Pinned到filesysteme中的)。这个命令使用文件路径去load对象。成功返回文件描述符,失败返回负数,同时设置了全局的错误变量:errno。

#include <errno.h>
#include <linux/bpf.h>
#include <stdio.h>
#include <string.h>

#include "bpf_load.h"
#include "bpf_util.h"
#include "libbpf.h"

static const char *file_path = "/sys/fs/bpf/my_array";

int main(int argc, char **argv) {
  int key, value, fd, added, pinned;

  fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), sizeof(int), 100, 0);
  if (fd < 0) {
    printf("Failed to create map: %d (%s)\n", fd, strerror(errno));
    return -1;
  }

  key = 1, value = 1234;
  added = bpf_map_update_elem(fd, &key, &value, BPF_ANY);
  if (added < 0) {
    printf("Failed to update map: %d (%s)\n", added, strerror(errno));
    return -1;
  }

  pinned = bpf_obj_pin(fd, file_path);
  if (pinned < 0) {
    printf("Failed to pin map to the file system: %d (%s)\n", pinned,
           strerror(errno));
    return -1;
  }

  return 0;
}

首先,我们创建了一个hash-table的map,然后更新了一个元素进去。然后使用bpf_obj_pin去保存map在这个文件系统中。你可以看到/sys/fs/bpf/my_array.然后你就可以使用其他的程序去获取这个map的值,即使是上面的save已经退出了。

能够将BPF对象保存在文件系统中,这为更有趣的应用程序打开了大门。 您的数据和程序不再绑定到单个执行线程。 信息可以由不同的应用程序共享,并且BPF程序甚至可以在创建它们的应用程序终止后运行。 如果没有BPF文件系统,这将为他们提供额外的级别或可用性

"could not open bpf map" 错误通常是由于没有访问 BPF 映射的权限所导致的。 BPF 映射是一种特殊的内核数据结构,用于存储 BPF 程序运行时的状态和数据。BPF 映射通常由内核模块或 BPF 程序创建,并通过文件系统暴露给用户空间程序使用。 如果您在运行 BPF 程序时遇到 "could not open bpf map" 错误,通常是由于当前用户没有访问 BPF 映射的权限。您可以通过以下方法解决该问题: 1. 确认 BPF 映射文件的权限 首先,您需要确认 BPF 映射文件的权限是否正确。BPF 映射通常会以文件的形式暴露给用户空间程序使用,因此您可以通过 `ls -l` 命令查看 BPF 映射文件的权限,例如: ``` $ ls -l /sys/fs/bpf/my_map -rw-r--r-- 1 root root 0 Jul 2 10:52 /sys/fs/bpf/my_map ``` 上述输出表示 BPF 映射文件 `/sys/fs/bpf/my_map` 的权限为 `-rw-r--r--`,即只有 root 用户和属于 root 组的用户才有读写权限,其他用户只有读权限。如果当前用户不是 root 用户或属于 root 组的成员,则可能无法访问该文件。 2. 将当前用户添加到 BPF 组中 如果您需要让当前用户访问 BPF 映射,可以将该用户添加到 BPF 组中。BPF 组是一个特殊的用户组,用于控制对 BPF 映射的访问权限。 您可以通过以下命令将当前用户添加到 BPF 组中: ``` sudo usermod -aG bpf your_username ``` 其中,`your_username` 是要添加到 BPF 组中的用户名。添加完成后,您需要注销并重新登录才能使更改生效。 3. 重新加载内核模块 如果您的 BPF 程序使用了内核模块创建 BPF 映射,那么您可能需要重新加载该模块。重新加载内核模块可以重新创建 BPF 映射,并将其权限设置为当前用户可访问。 您可以通过以下命令重新加载内核模块: ``` sudo modprobe -r my_module sudo modprobe my_module ``` 其中,`my_module` 是要重新加载的内核模块的名称。需要注意的是,重新加载内核模块可能会导致系统状态发生变化,请谨慎使用该命令。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值