4章 bfp() システムコール
序章
bfp()とは
bpf()は extended BPF Mapまたはプログラムに対してコマンドを実行するために使う
bfp()のシグネチャ
int bpf(int cmd, union bpf_attr *attr, unsigned int size);
たくさんの種類のコマンドが存在し、eBPFプログラムやMapを操作するために使われます。
ユーザ空間とのやりとり
![](https://assets.st-note.com/img/1719115170569-2AT9ACg2hS.png?width=800)
サンプルプログラムの説明
configという名前のMap作成
BPF_HASH(config, u32, struct user_msg_t);outputという名前のPerfリングバッファを作成
BPF_PERF_OUTPUT(output);Mapに保存される型のポインタを定義
struct user_msg_t *p;eBPFのヘルパ関数でuidを取得
data.uid = bpf_get_current_uid_gid() & 0xFFFFFFFF;ユーザIDをキーとしてエントリを検索
p = config.lookup(&data.uid);Mapから読み出す
bpf_probe_read_kernel(&data.message, sizeof(data.message), p->message);Perfリングバッファに書き出す
output.perf_submit(ctx, &data, sizeof(data));
straceでシステムコールを見る
$ strace -e bpf ./hello-buffer-config.py
bpf(BPF_BTF_LOAD, ...) = 3
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_PERF_EVENT_ARRAY…) = 4
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH...) = 5
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE,...prog_name="hello",...) = 6
bpf(BPF_MAP_UPDATE_ELEM, ...}
...
4.1 BTFのデータのロード
BTF(BPF Type Format)とは
BTFによって、eBPFプログラムを複数のバージョンのカーネルで動作させ られるようになります。つまり、eBPFプログラムをコンパイルしたマシンとターゲットマシンで カーネル内部のデータ構造が変わっていてもeBPFプログラムを動作させる方法が存在するという ことです。
※2 BTFはカーネルv5.1からサポートされるようになった。ただしIO Visor(https://oreil.ly/LjcPN)で議論されているよう に、Linuxディストリビューションによっては、そのディストリビューションが使っているv5.1より前の古いカーネルにBTF のサポートをバックポートしている。
bpf()システムコールの説明 - 1
bpf(BPF_BTF_LOAD, {btf="\237\353\1\0...}, 128) = 3
BTFをカーネルに読みだしていて、そのファイル記述子が3
BPF_BTF_LOAD
Description
…
The btf parameter must point to valid memory providing btf_size bytes of BTF binary metadata.
4.2 Mapの作成
bpf()システムコールの説明 - 2
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_PERF_EVENT_ARRAY, , key_size=4, value_size=4, max_entries=4, ... map_name="output", ...}, 128) = 4
eBPF Mapの作成
MapのタイプはPERF_EVENT_ARRAY
bpf.h - include/uapi/linux/bpf.h - Linux source code (v6.9.6) - Bootlin
なぜ "*_ARRAY" なのかは後述
Mapの名前はoutput
kay/valueのサイズはそれぞれ4バイト
最大エントリ数を4
ファイル記述子は4
bpf()システムコールの説明 - 3
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH, key_size=4, value_size=12, max_entries=10240... map_name="config", ...btf_fd=3,...}, 128) = 5
MapのタイプはHASH
ファイル記述子3のBTFを渡す
4.3 プログラムのロード
bpf()システムコールの説明 - 4
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE, insn_cnt=44, insns=0xffffa836abe8, license="GPL", ... prog_name="hello", ... expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3,...}, 128) = 6
eBPFプログラムをカーネルに読み出す
kprobeへのアタッチを示すプログラムタイプ
insn_cntはeBPFプログラムのバイトコードの命令数、insnsで指定したメモリに保存
licenseはGPL、GPLライセンスのBPFヘルパ関数が使える
BPF_CGROUP_INET_INGRESSはただのデフォルト値で意味無し
ファイル記述子3のBTFデータを使う
4.4 Mapをユーザ空間から操作する
bpf()システムコールの説明 - 5
(Pythonのユーザ空間のコードがMapに文字列を設定)
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=5, key=0xffffa7842490, value=0xffffa7a2b410, flags=BPF_ANY}, 128) = 0
Map内のエントリを更新
対象のMapのファイル記述子は5
BPF_ANYはキーがなくともエントリを作成
※ファイル記述子はプロセスごとに割り当てられるものなので、別のプロセスでは同じ記述子でも別のものになりえる
bpf_toolで表示
bpf_toolでMapのkay/valueの値を表示できる
$ bpftool map dump name config
[{ "key": 0, "value": { "message": "Hey root!"} },{ … }]
bpftoolはBTFを利用して構造体の型を知る
イベントへのアタッチ方法
アタッチ方法はイベントによって異なり、bpf()システムコールを使わない場合もある (e.g. kprobeへのアタッチ)
4.5 BPFプログラムとMapへの参照
参照カウント
カーネルは、プロセスが終了すると使用しているファイル記述子を解法し、プログラムへの参照カウントを減らします。BPFプログラムへの参照が1つもなくなったときに、カーネルはプログラムを削除します。
ピン留め
ピン留め(ピンニング)すると明示的に参照を1つ増やせます。
bpftoolがピン留めをせずにプログラムを読み出したとすると、コマンド実行の意味がなくなり ます。なぜならbpftoolコマンドが終了したらファイル記述子は解放され、参照がゼロになってプ ログラムが削除されるからです。
参照カウンタはBPFプログラムがそれをトリガーするフックにアタッチされたときにも同じく 増加します。この参照カウンタの振る舞いはBPFプログラムタイプによって異なります。
In summary: xdp, tc, lwt, cgroup hooks are “global”, whereas kprobe, uprobe, tracepoint, perf_event, raw_tracepoint, socket filters, so_reuseport hooks are “local” to the process, since they're accessed via FD.
eBPF Mapにも参照カウンタがあり、これらも参照カウントがゼロになったら削除されます。参 照カウントは、Mapを使うeBPFプログラムがロードされるときや、ユーザ空間のプログラムが Mapへのファイル記述子を取得したときに増えます。
eBPFプログラムは、プログラムからは参照していないMapを定義することがあります。このよ うなMapの用途としては、例えばプログラムに関する何らかのメタデータを保存したい場合があ ります。メタデータ領域はグローバル変数として定義してMapの中に保存して、かつ、bpf(BPF_ PROG_BIND_MAP)システムコールコマンドによってこのMapをプログラムに結びつけておきます。こうすると、ユーザ空間のプログラムが終了してMapを参照しているファイル記述子が消えても メタデータを保持するMapは削除されません。4
BPF Link
BPF Linkは、eBPFプログラムとアタッチ対象のイベントとの間に抽象レイヤを作ります。 BPF Link自体もファイルシステムにピン留めができ、プログラムへの追加の参照を作成します。
4.6 eBPFに関係する他のシステムコール
bpf()システムコールの説明 - 5
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=4, key=0xffffa7842490, value=0xffffa7a2b410, flags=BPF_ANY}, 128) = 0
ファイル記述子4(Perfリングバッファ)を更新
関連するのはbpf()システムコールだけではない。
$ strace -e bpf,perf_event_open,ioctl,ppoll ./hello-buffer-config.py
他のシステムコールの説明 - 1
perf_event_open({type=0x6 /* PERF_TYPE_??? */, ...},...) = 7
type=6はkprobeイベントにアタッチしたことを示す
ファイル記述子7はkprobeのPerイベント
$ for i in $(ls /sys/bus/event_source/devices/*/type); do echo $i; cat $i; done
/sys/bus/event_source/devices/breakpoint/type
5
/sys/bus/event_source/devices/cpu/type
4
/sys/bus/event_source/devices/kprobe/type
6
/sys/bus/event_source/devices/msr/type
8
/sys/bus/event_source/devices/software/type
1
/sys/bus/event_source/devices/tracepoint/type
2
/sys/bus/event_source/devices/uprobe/type
7
他のシステムコールの説明 - 2
ioctl(7, PERF_EVENT_IOC_SET_BPF, 6) = 0
ファイル記述子6(BPFプログラム)をファイル記述子7(kprobeイベント)にアタッチする
他のシステムコールの説明 - 3
ioctl(7, PERF_EVENT_IOC_ENABLE, 0) = 0
ファイル記述子7(kprobeイベント)を有効にする
他のシステムコールの説明 - 4
perf_event_open({type=PERF_TYPE_SOFTWARE, size=0 /* PERF_ATTR_SIZE_??? */, config=PERF_COUNT_SW_BPF_OUTPUT, ...}, -1, X, -1, PERF_FLAG_FD_CLOEXEC) = Y
int syscall(SYS_perf_event_open, struct perf_event_attr *attr,
pid_t pid, int cpu, int group_fd, unsigned long flags);
4回発生しているシステムコールは、4つのCPUにそれぞれ存在するリングバッファに対応している。
他のシステムコールの説明 - 5
ppoll([{fd=8, events=POLLIN}, {fd=9, events=POLLIN}, {fd=10, events=POLLIN}, {fd=11, events=POLLIN}], 4, NULL, NULL, 0) = 1 ([{fd=8, revents=POLLIN}])
複数のファイル記述子に対してブロックして待ち受ける
いずれかのPerfリングバッファに書き込まれるとブロックが解除される
4.7 BPFリングバッファ
Prefリングバッファと比較して:
性能が良い
v5.8以上で利用可能
すべてのCPUコアで共有される1つの領域しかない(別のCPUから送信された場合もデータの受け取り順序を保証できる)
※実装の変更点としては s/perf/ringbuf/g, s/PERF/RINGBUG/gすれば良さげ
outputリングバッファを作成するbpf()システムコールの呼び出しは次のようになります。
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_RINGBUF, key_size=0, value_size=0, max_entries=4096, ... map_name="output", ...}, 128) = 4
strace出力における大きな違いは、perf_event_open()、ioctl()そしてbpf(BPF_MAP_UPDATE_ ELEM)を連続で4回呼び出している箇所がなくなったことです。BPFリングバッファの場合はバッ ファ数が1つのため、このような違いが生じています。
本書執筆時点ではBCCはPerfリングバッファの待ち受けにはppollを使っていますが、BPFリ ングバッファからのデータの待ち受けには、より新しいepollベースの方法を使っています。
他のシステムコールの説明 - 6
epoll_create1(EPOLL_CLOEXEC) = 8
epoll_ctl(8, EPOLL_CTL_ADD, 4, {events=EPOLLIN, data={u32=0, u64=0}}) = 0
epoll_pwait(8, [{events=EPOLLIN, data={u32=0, u64=0}}], 1, -1, NULL, 8) = 1
epollインスタンスを作成
Output用のバッファ(BFPリングバッファ)のファイル記述子4を指定
バッファ内部でデータが読み出せるようになるまでブロック
4.8 Mapからの情報の読み出し
bpftoolのbfp()システムコールの呼び出しを確認
$ strace -e bpf bpftool map dump name config
...
bpf(BPF_MAP_GET_NEXT_ID, {start_id=0,...}, 12) = 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=48...}, 12) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, ...}}, 16) = 0
bpf(BPF_MAP_GET_NEXT_ID, {start_id=48, ...}, 12) = 0
...
start_idで指定したものの次に来るMapのIDを取得
取得したMap IDに対応するファイル記述子を返却
オブジェクト(Map)に関する情報を取得
BTFも含まれる
3.6 BPF_OBJ_GET_INFO_BY_FD
Once a program/map fd is acquired, an introspection tool can get the detailed information from kernel about this fd, some of which are BTF-related. For example, bpf_map_info returns btf_id and key/value type ids. bpf_prog_info returns btf_id, func_info, and line info for translated bpf byte codes, and jited_line_info.
これらをBPF_MAP_GET_NEXT_IDがENOENTを返すまで繰り返す。(同じ名前のMapが複数存在し得る)
Mapの要素の読み出しを確認
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=NULL, next_key=0xaaaaf7a63960}, 24) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0xaaaaf7a63960, value=0xaaaaf7a63980, flags=BPF_ANY}, 32) = 0
[{ "key": 0, "value": { "message": "Hey root!" }
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0xaaaaf7a63960, next_key=0xaaaaf7a63960}, 24) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0xaaaaf7a63960, value=0xaaaaf7a63980, flags=BPF_ANY}, 32) = 0
},{ "key": 501, "value": { "message": "Hi user 501!" }
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0xaaaaf7a63960, next_key=0xaaaaf7a63960}, 24) = -1 ENOENT (No such file or directory)
} ]
Map内のキーを走査する
4.9 まとめ
4.10 演習
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE, insn_cnt=44, insns=0x7fdd11558ba8, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(5, 15, 153), prog_flags=0, prog_name="hello", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x27ec600, func_info_cnt=1, line_info_rec_size=16, line_info=0x28e0e80, line_info_cnt=21, attach_btf_id=0, attach_prog_fd=0}, 120) = 6
• insns is an array of struct bpf_insn instructions.
• insn_cnt is the number of instructions in the program referred to by insns.
struct bpf_insn {
__u8 code; /* opcode */
__u8 dst_reg:4; /* dest register */
__u8 src_reg:4; /* source register */
__s16 off; /* signed offset */
__s32 imm; /* signed immediate constant */
};
64 bits = 8 bytes
44 * 8 = 352 bytes
root@yujipc:/home/yuji#+ bpftool prog list
14: kprobe name hello tag 2b77904d73f76a56 gpl
loaded_at 2024-06-25T18:52:30+0900 uid 0
xlated 368B jited 206B memlock 4096B map_ids 18,17
btf_id 16
xlated 368B
16 bytes どこいった?
2.
root@yujipc:/home/yuji# bpftool map dump name config
[{
"id": 20,
"type": "hash",
"name": "config",
"flags": 0,
"elements": [{
"key": 0,
"value": {
"message": "Hey root!"
}
},{
"key": 501,
"value": {
"message": [72,105,32,117,115,101,114,32,53,48,49,33
]
}
}
]
},{
"id": 22,
"type": "hash",
"name": "config",
"flags": 0,
"elements": [{
"key": 501,
"value": {
"message": [72,105,32,117,115,101,114,32,53,48,49,33
]
}
},{
"key": 0,
"value": {
"message": "Hey root!"
}
}
]
}
]
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=NULL, next_key=0x56022375d6f0}, 128) = 0
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=4, key=NULL, next_key=0x56022375d710}, 128) = 0
Mapを検索している行
bpf(BPF_MAP_GET_NEXT_ID, {start_id=0, next_id=0, open_flags=0}, 128) = 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=23, next_id=0, open_flags=0}, 128) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, info_len=80, info=0x7ffd595d0cb0}}, 128) = 0
bpf(BPF_MAP_GET_NEXT_ID, {start_id=23, next_id=0, open_flags=0}, 128) = 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=24, next_id=0, open_flags=0}, 128) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, info_len=80, info=0x7ffd595d0cb0}}, 128) = 0
bpf(BPF_MAP_GET_NEXT_ID, {start_id=24, next_id=0, open_flags=0}, 128) = 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=27, next_id=0, open_flags=0}, 128) = 4
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=4, info_len=80, info=0x7ffd595d0cb0}}, 128) = 0
bpf(BPF_MAP_GET_NEXT_ID, {start_id=27, next_id=0, open_flags=0}, 128) = 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=28, next_id=0, open_flags=0}, 128) = 4
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=4, info_len=80, info=0x7ffd595d0cb0}}, 128) = 0
bpf(BPF_MAP_GET_NEXT_ID, {start_id=28, next_id=0, open_flags=0}, 128) = -1 ENOENT (No such file or directory)
Mapからエントリを取り出している行
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=5, info_len=32, info=0x7ffd595d0ca0}}, 128) = 0
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=5, info_len=32, info=0x7ffd595d0ca0}}, 128) = 0
[{
"id": 24,
"type": "hash",
"name": "config",
"flags": 0,
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=NULL, next_key=0x56022375d6f0}, 128) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0x56022375d6f0, value=0x56022375d710, flags=BPF_ANY}, 128) = 0
"elements": [{
"key": 0,
"value": {
"message": "Hey root!"
}
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0x56022375d6f0, next_key=0x56022375d6f0}, 128) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0x56022375d6f0, value=0x56022375d710, flags=BPF_ANY}, 128) = 0
},{
"key": 501,
"value": {
"message": [72,105,32,117,115,101,114,32,53,48,49,33
]
}
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0x56022375d6f0, next_key=0x56022375d6f0}, 128) = -1 ENOENT (No such file or directory)
}
]
3.
root@yujipc:/home/yuji# bpftool map dump name config
[{
"key": 0,
"value": {
"message": "Hey root!"
}
},{
"key": 501,
"value": {
"message": [72,105,32,117,115,101,114,32,53,48,49,33
]
}
}
]
root@yujipc:/home/yuji# bpftool map update name config key 0 0 0 0 value 72 65 32 72 65 32 72 65 32 72 65 0
root@yujipc:/home/yuji# bpftool map dump name config
[{
"key": 0,
"value": {
"message": "HA HA HA HA"
}
},{
"key": 501,
"value": {
"message": [72,105,32,117,115,101,114,32,53,48,49,33
]
}
}
]
4.
root@yujipc:/home/yuji# ps aux | grep hello
root 25892 9.6 1.0 106332 79272 pts/0 S+ 21:25 0:00 python3 hello-buffer-config.py
root 25894 0.0 0.0 8168 716 pts/1 S+ 21:25 0:00 grep --color=auto hello
root@yujipc:/home/yuji# bpftool prog list
23: kprobe name hello tag 2b77904d73f76a56 gpl
loaded_at 2024-06-25T21:25:43+0900 uid 0
xlated 368B jited 206B memlock 4096B map_ids 36,35
btf_id 25
root@yujipc:/home/yuji# bpftool prog pin name hello /sys/fs/bpf/hi
root@yujipc:/home/yuji# cat /sys/fs/bpf/hi
cat: /sys/fs/bpf/hi: Input/output error
root@yujipc:/home/yuji# file /sys/fs/bpf/hi
/sys/fs/bpf/hi: empty
root@yujipc:/home/yuji# ps aux | grep hello
root 25902 0.0 0.0 8168 644 pts/1 S+ 21:26 0:00 grep --color=auto hello
root@yujipc:/home/yuji# bpftool prog list
23: kprobe name hello tag 2b77904d73f76a56 gpl
loaded_at 2024-06-25T21:25:43+0900 uid 0
xlated 368B jited 206B memlock 4096B map_ids 36,35
btf_id 25
root@yujipc:/home/yuji# rm /sys/fs/bpf/hi
root@yujipc:/home/yuji# bpftool prog list
root@yujipc:/home/yuji#
5.
# diff -u hello-buffer-config.py hello-buffer-config-rawtracepoint.py
--- hello-buffer-config.py 2024-06-23 17:05:27.346030135 +0900
+++ hello-buffer-config-rawtracepoint.py 2024-06-25 22:34:42.597282827 +0900
@@ -19,7 +19,7 @@
char message[12];
};
-int hello(void *ctx) {
+RAW_TRACEPOINT_PROBE(sys_enter){
struct data_t data = {};
struct user_msg_t *p;
char message[12] = "Hello World";
@@ -44,7 +44,7 @@
b = BPF(text=program)
syscall = b.get_syscall_fnname("execve")
-b.attach_kprobe(event=syscall, fn_name="hello")
+#b.attach_kprobe(event=syscall, fn_name="hello")
b["config"][ct.c_int(0)] = ct.create_string_buffer(b"Hey root!")
b["config"][ct.c_int(501)] = ct.create_string_buffer(b"Hi user 501!")
bpf(BPF_RAW_TRACEPOINT_OPEN, {raw_tracepoint={name="sys_enter", prog_fd=6}}, 120) = 7
6.
root@yujipc:/home/yuji# bpftool link list
9: type 7 prog 82
10: type 7 prog 84
11: type 7 prog 85
12: type 7 prog 86
root@yujipc:/home/yuji# bpftool prog list
82: tracepoint name tracepoint__sys tag 9f196d70d0c1964b gpl
loaded_at 2024-06-25T23:31:41+0900 uid 0
xlated 248B jited 144B memlock 4096B map_ids 87,84
btf_id 55
84: tracepoint name tracepoint__sys tag 47b06acd3f9a5527 gpl
loaded_at 2024-06-25T23:31:41+0900 uid 0
xlated 248B jited 144B memlock 4096B map_ids 87,84
btf_id 55
85: tracepoint name tracepoint__sys tag 37f628f9e857b071 gpl
loaded_at 2024-06-25T23:31:41+0900 uid 0
xlated 792B jited 549B memlock 4096B map_ids 84,87,85
btf_id 55
86: tracepoint name tracepoint__sys tag 37f628f9e857b071 gpl
loaded_at 2024-06-25T23:31:41+0900 uid 0
xlated 792B jited 549B memlock 4096B map_ids 84,87,85
btf_id 55
7.
root@yujipc:/home/yuji# bpftool link list
13: type 7 prog 93
14: type 7 prog 95
15: type 7 prog 96
16: type 7 prog 97
root@yujipc:/home/yuji# bpftool prog list
93: tracepoint name tracepoint__sys tag 9f196d70d0c1964b gpl
loaded_at 2024-06-25T23:43:15+0900 uid 0
xlated 248B jited 144B memlock 4096B map_ids 93,90
btf_id 61
95: tracepoint name tracepoint__sys tag 47b06acd3f9a5527 gpl
loaded_at 2024-06-25T23:43:15+0900 uid 0
xlated 248B jited 144B memlock 4096B map_ids 93,90
btf_id 61
96: tracepoint name tracepoint__sys tag 37f628f9e857b071 gpl
loaded_at 2024-06-25T23:43:15+0900 uid 0
xlated 792B jited 549B memlock 4096B map_ids 90,93,91
btf_id 61
97: tracepoint name tracepoint__sys tag 37f628f9e857b071 gpl
loaded_at 2024-06-25T23:43:15+0900 uid 0
xlated 792B jited 549B memlock 4096B map_ids 90,93,91
btf_id 61
root@yujipc:/home/yuji# bpftool link pin id 15 /sys/fs/bpf/mylink
root@yujipc:/home/yuji# ps aux | grep opensnoop
root 30975 0.1 0.0 7280 2320 pts/0 R+ 23:43 0:00 ./opensnoop
root 30984 0.0 0.0 8168 648 pts/2 S+ 23:45 0:00 grep --color=auto opensnoop
root@yujipc:/home/yuji# ps aux | grep opensnoop
root 30988 0.0 0.0 8168 656 pts/2 S+ 23:46 0:00 grep --color=auto opensnoop
root@yujipc:/home/yuji# bpftool prog list
96: tracepoint name tracepoint__sys tag 37f628f9e857b071 gpl
loaded_at 2024-06-25T23:43:15+0900 uid 0
xlated 792B jited 549B memlock 4096B map_ids 90,93,91
btf_id 61
8.
リファレンス
learning-ebpf/chapter4 at main · lizrice/learning-ebpf · GitHub
WSL2でeBPFのhello_world.pyを動かすまで (zenn.dev)
WSL2-Linux-Kernel
export KVER="linux-msft-wsl-$(uname -r|awk -F'-' '{print $1}')"; git tag -l | grep $KVER && git checkout -b $KVER tags/$KVER
sudo ln -s /home/yuji/WSL2-Linux-Kernel /lib/modules/5.15.153.1-microsoft-standard-WSL2/build
bcc/libbpf-tools
git submodule init && git submodule update
ln -s /home/yuji/bcc/libbpf-tools/src/cc/libbpf bpftool/libbpf/
make opensnoop
この記事が気に入ったらサポートをしてみませんか?