Linuxカーネルを触らずに拡張したいならeBPFを使いなさい

「カーネルモジュールを書いてカーネルを拡張したい、でもカーネルをクラッシュさせるリスクが怖い」——かつてはそんなジレンマがありました。しかし今、eBPF(extended Berkeley Packet Filter)という技術がそのジレンマを解消しています。eBPFを使えば、Linuxカーネルのソースコードを変更することなく、カーネル内でプログラムを安全に実行できます。2024年〜2025年にかけて、可観測性・セキュリティ・ネットワーク分野での採用が急拡大しています。

eBPFをたとえで説明すると「原子力発電所の制御室にある監視カメラ」のようなものです。原子炉の内部に直接手を入れることなく、すべての動きをリアルタイムで観測し、必要なら介入できる——しかもカーネル自体の安定性は損なわない。これがeBPFの本質です。

新人エンジニアE:「本番サーバーでネットワークの遅延が発生してるんですが、strace使うとオーバーヘッドが大きすぎて…」
シニアエンジニアF:「eBPFベースのbccツールを使えばほぼオーバーヘッドゼロで調査できる。tcptracer試してみよう」
E:「カーネルを再コンパイルしなくていいんですか?」
F:「必要なし。動いてるカーネルにそのまま注入できる。それがeBPFの強みだよ」

eBPFを手軽に体験するには「bcc」または「bpftrace」が便利です。まずインストールしてみましょう(Ubuntu/Debian系の場合)。

sudo apt-get install -y bpftrace

# 全システムコールをトレース(誰が何をしているか観測)
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[probe] = count(); }'

# 5秒間のTCP接続をリアルタイムで確認
sudo bpftrace -e 'kprobe:tcp_connect { printf("%s -> connect\n", comm); }'

さらに実践的な例として、特定プロセスのディスクI/Oレイテンシを計測してみましょう。

# biolatency: ブロックI/Oのレイテンシ分布を表示(bccツール)
sudo /usr/share/bcc/tools/biolatency -D 10

# execsnoop: 新しいプロセス起動をリアルタイム監視
sudo /usr/share/bcc/tools/execsnoop

eBPFの応用範囲は非常に広く、CiliumはeBPFベースのKubernetesネットワーキング(CNI)として注目されており、FalcoやTetragonはeBPFでコンテナのランタイムセキュリティを実現しています。また、MetaやGoogle、Cloudflareといった大手企業がeBPFを本番環境の中核技術として採用しています。カーネルを壊さずにカーネルを拡張できる——eBPFはLinux運用の常識を変えつつある技術です。ぜひ手元の環境で動かしてみてください。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です