2025/04/05 08:16 BPF from Scratch in Rust

やっほー、ロボ子!今日はRustでBPFプログラムを書いて、`yeet`でカーネルにロードするって話なのじゃ。

BPFですか、博士。以前少し勉強しましたが、難しくて…。Rustで書けるのは知りませんでした。

そうじゃろ? BPFはLinuxカーネルの動作をプログラム可能な仮想マシンとして機能させるものじゃ。しかも、クラッシュしないように安全性を検証してから実行されるから安心なのじゃ。

なるほど。安全性が保証されているのは大きいですね。開発環境はどうなっているんですか?

Rustのビルドツールチェーンを使うのじゃ。`.cargo/config.toml`を設定して、BPFバイナリを生成するみたいじゃな。`target = "bpfel-unknown-none"`とか`rustflags`を設定するみたいじゃ。

`bpfel-unknown-none`ですか。初めて見ました。これはBPF専用のターゲットなんですね。

そうみたいじゃな。最小のBPFプログラムは、`#![no_std]`と`#![no_main]`を使うらしいぞ。トレースポイントにフックして、カウンターをインクリメントして、`bpf_trace_printk()`でメッセージを出すみたいじゃ。

トレースポイントですか。`#[link_section = "tracepoint/syscalls/sys_enter_nanosleep"]`で指定するんですね。`asm!`ブロックでBPFバイトコードを書くのも面白いです。

`asm!`ブロックの中身は、カウンターのインクリメントとトレースパイプへの出力じゃな。`r1 = {memory address of COUNTER}`とか`call 6` (`bpf_trace_printk`を呼び出す)とか書いてあるぞ。

アセンブリ言語みたいですね。少しハードルが高いかも…。

大丈夫じゃ! `cargo +nightly build --release`でビルドして、`yeet`をインストールすれば、簡単に実行できるぞ!

`yeet`ですか。初めて聞きました。どんなツールなんですか?

`yeet`はBPFプログラムの管理ツールじゃ。BPFオブジェクトを登録したり、開始したり、停止したりできるぞ。`sudo yeet add .`とか`sudo yeet start bpf-from-scratch`とかで操作するみたいじゃ。

便利そうですね!`yeet trace`で出力確認もできるんですね。これなら私にもできそうです。

そうじゃろ!しかも、`yeet`にはサンドボックスやパッケージマネージャーもあるらしいぞ。至れり尽くせりじゃな。

RustでBPFプログラムを書いて、`yeet`でカーネルにロードする。なんだか新しい扉が開けた気がします!

じゃろじゃろ? これでロボ子もカーネルハッカーの仲間入りじゃ!

ありがとうございます、博士!頑張ります!

ちなみに、`yeet`って名前、なんか勢いがあって面白いと思わない? 私は最初、誰かが間違ってタイプしたのかと思ったぞ!

確かにそうですね(笑)。でも、一度聞いたら忘れられない名前ですよね。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
