<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>OPSaid – eBPF</title><link>https://opsaid.net/docs/cloud-native/ebpf/</link><description>Recent content in eBPF on OPSaid</description><generator>Hugo -- gohugo.io</generator><atom:link href="https://opsaid.net/docs/cloud-native/ebpf/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: 程序类型</title><link>https://opsaid.net/docs/cloud-native/ebpf/program-types/</link><pubDate>Tue, 02 Apr 2024 11:38:14 +0800</pubDate><guid>https://opsaid.net/docs/cloud-native/ebpf/program-types/</guid><description>
&lt;h2 id="简要概述">简要概述&lt;/h2>
&lt;p>eBPF 程序类型大体上被分为两类：&lt;/p>
&lt;ol>
&lt;li>性能追踪类型；&lt;/li>
&lt;li>网络相关类型。&lt;/li>
&lt;/ol>
&lt;p>程序类型决定了它可以附加到哪些事件上，这反过来又定义了它能接收的上下文信息的类型，以及可调用的 helper 函数和 kfuncs 集合。&lt;/p>
&lt;h3 id="helper-函数">helper 函数&lt;/h3>
&lt;p>helper 函数是在内核中定义的 UAPI 稳定接口，如 &lt;a href="https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h">uapi/linux/bpf.h&lt;/a>，这些接口定义发布后就不会更改了，尽管内部函数或数据结构在将来的版本会发生变更。可使用 &lt;code>bpftool feature&lt;/code> 查看当前内核支持的 helper 函数。&lt;/p>
&lt;h3 id="kfuncs-集合">kfuncs 集合&lt;/h3>
&lt;p>与 helper 函数不同，&lt;a href="https://docs.kernel.org/bpf/kfuncs.html#core-kfuncs">kfuncs&lt;/a> 不提供兼容性保证，因此开发者必须考虑到内核版本之间可能发生的变化。它允许内核函数在 BPF 子系统中注册，以便验证器允许它们被 eBPF 程序调用。&lt;/p>
&lt;h2 id="性能追踪类型">性能追踪类型&lt;/h2>
&lt;h3 id="tracepoints">Tracepoints&lt;/h3>
&lt;p>它们绝不仅限于eBPF，并且长期以来一直被用来生成内核追踪输出，以及像SystemTap这样的工具。&lt;/p>
&lt;p>当前内核支持的事件：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>cat /sys/kernel/tracing/available_events
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="网络相关类型">网络相关类型&lt;/h2>
&lt;h3 id="所需运行权限">所需运行权限&lt;/h3>
&lt;p>需要有 &lt;code>CAP_NET_ADMIN&lt;/code> 与 &lt;code>CAP_BPF&lt;/code> 能力，或者 &lt;code>CAP_SYS_ADMIN&lt;/code> 能力。&lt;/p>
&lt;p>下图是 BPF 程序类型在网络堆栈的各个点上钩子：&lt;/p>
&lt;p>&lt;img src="https://i.opsaid.net/dochub/dev-framework/ebpf/5e6b76e1-0642-4a92-b61d-52b19823b4d7.png" alt="test">&lt;/p>
&lt;h3 id="特性socket">特性：Socket&lt;/h3>
&lt;p>TODO;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>BPF_PROG_TYPE_SOCKET_FILTER
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>BPF_PROG_TYPE_SOCK_OPS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>BPF_PROG_TYPE_SK_SKB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="特性traffic-control">特性：Traffic Control&lt;/h3>
&lt;p>TODO;&lt;/p>
&lt;p>TC 子系统用于控制网络流量的调度，同时也拥有操控、丢弃或重定向数据包的能力，附加在 TC 中的 eBPF 程序也可以作为复杂网络行为的构建基础。&lt;/p>
&lt;p>在 TC 子系统中附加的 ebpf 程序会使用存储在内核网络堆栈中的 [sk_buff] 数据结构的指针作为上下文参数。&lt;/p>
&lt;p>网络数据栈中的一部分数据流动有两个方向：入口（从网络接口传入）或出口（向网络接口传出）。eBPF程序可以在任何一个方向上进行附加，并且只会影响那个方向的流量。不同于XDP，可以附加多个序列处理的eBPF程序。&lt;/p>
&lt;h3 id="特性xdp">特性：XDP&lt;/h3>
&lt;p>通过 XDP（eXpress Data Path）可以把特定的程序附加到指定的网卡上。如通过 &lt;code>bpftool&lt;/code> 挂载 &amp;ldquo;hello.bpf.o&amp;rdquo; 程序：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>bpftool prog load hello.bpf.o /sys/fs/bpf/hello
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bpftool net attach xdp id &lt;span style="color:#0000cf;font-weight:bold">540&lt;/span> dev eth0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者通过 &lt;code>ip&lt;/code> 进行挂载：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>ip link &lt;span style="color:#204a87">set&lt;/span> dev eth0 xdp obj hello.bpf.o sec xdp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>卸载：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>ip link &lt;span style="color:#204a87">set&lt;/span> dev eth0 xdp off
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="特性flow-dissector">特性：Flow Dissector&lt;/h3>
&lt;p>TODO;&lt;/p>
&lt;h3 id="特性lightweight-tunnels">特性：Lightweight Tunnels&lt;/h3>
&lt;p>TODO;&lt;/p>
&lt;h3 id="特性cgroups">特性：Cgroups&lt;/h3>
&lt;p>TODO;&lt;/p>
&lt;h3 id="特性infrared-controllers">特性：Infrared Controllers&lt;/h3>
&lt;p>TODO;&lt;/p></description></item></channel></rss>