Show HN: BPF プログラムは Go で、C では書かなくて OK

2026/05/22 1:25

Show HN: BPF プログラムは Go で、C では書かなくて OK

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Gobee ツールは、厳密な Go サブセットを BPF C に変換し、ユーザーランド側向けに型付き Go バインディングを生成することで、実行中のカーネルに対してロードをゲートし、Go から開発の重要なボトルネックを解消します。その最大の利点は安全性であり、ロード時に

bpfvet
を実行してホストシステムよりも新しいカーネル機能が必要な場合に即座に失敗させ、ランタイムクラッシュを防ぎます。また、CO-RE、BTF、 verifier-friendly コード生成のために成熟した clang バックエンドと互換性のある読みやすい BPF C コードをエミットし、コンパイラを再構築することなく実現します。

Gobee は診断プロセスを簡素化し、verifier エラーを Go ソースファイル内(例:

counter.go:18:5
)に自動的に注釈付けることで、手動の診断パイピングを行う必要性を排除します。本ツールは Solod および Aya などのプロジェクトからインスピレーションを得ており、移植可能な Go パッケージが
bpf/
に、カーネルソースと clang アーティファクトが
bpf/src/
に配置される清潔なレイアウトを維持しています。各
.bpf.c
ファイルには、オフラインでの Gobee 診断に用いられる sourcemap サイドカー(
<stem>.bpf.c.map
)がペア付けられています。

ツールチェーンは Linux arm64 と amd64 のクロスアーキテクチャビルドをサポートし、XDP、tracepoint、kprobe/kretprobe、uprobe/uretprobe、sock_ops、TC、cgroup_skb、LSM という 8 つのプログラムタイプ、ならびに ringbuf、perf_event_array、storage maps を含む 19 のマップタイプをカバーします。Gobee は

vmlinux.h
を含み
BPF_CORE_READ
を使用することで BTF レディな出力をエミットしますが、clang コンパイルの責任はユーザーに委ねており、Ubuntu 24.04(カーネル 6.x)での実カーネル verifier 受入を含む 4 つのレイヤーにおける CI サポートを提供します。ツールチェーンには、どこでも動作する純粋な Go トランpiler と clang(
.bpf.o
をコンパイルするために必要)が組み合わさっており、ディストリビューションパッケージまたは macOS 上での
brew install llvm
で入手可能です。最終的に、MIT ライセンスのこのプロジェクトは、コンパイラの再構築を行わないままシステムレイヤー全体にわたる信頼性の高い CI カバレッジを求めているチームにとって、堅牢で移植可能なソリューションを提供しており、libbpf v1.5.0 ヘルパーセットをカバーする約 200 の型付き Go スタブをエミットし、誤りしやすい文字列ベースのルックアップを置き換えるために、ユーザー定義ヘルパーを静的な
__always_inline
C 関数として出力します。

本文

gobee: Go で記述する eBPF

gobee は、Go の厳密なサブセットを eBPF C コードに変換(トランスパイール)し、ユーザースペース向けの型付きバインディングを生成するツールです。 このツールは成熟した

clang
のバックエンドを活用しつつ、カーネル開発における古くからの「C で記述せよ」という制約から解放されます。


特徴と仕組み

1. トランスパイールによるアプローチ

  • gobee: Go のサブセットを C に変換し、成熟した clang の BPF バックエンドを活用します。
  • Aya (Rust):
    rustc
    に BPF バックエンドを追加するアプローチを採用しています。

2. 生成されるアーティファクト

gobee は以下の 3 つの要素を生成します。

  1. BPF C コード:
    .bpf.c
    ファイルとして出力されます。
  2. ソースマップ (Sourcemap): Verifier エラーと Go ソースコードを行番号付きでマッピングしたファイル(例:
    events.bpf.c.map
    )。
  3. 型付きバインディング: ユーザースペースで使用するための型定義ファイル(例:
    bpf/events_bindings.go
    )。

3. ユーザースペースとの親和性

  • 冗長な文字列検索 (
    coll.Programs["..."]
    ) を避け、同一の構造体を用いてリングバッファへの直接デコードが可能です。
  • 生成された C コードは意図的に可読性を高めており、
    gobee
    が意図しない奇妙なコードを出力しても確認可能に設計されています。

使用例:Tracepoint からのイベント収集

リングバッファ経由で全ての

execve
システムコールをストリーミングするトレースポイントの構成例です。

Go コード (入力)

//go:build ignore

package main

import "github.com/boratanrikulu/gobee/bpf"

//bpf:license GPL

type Event struct {
	Pid  uint32
	Comm [16]byte
}

var Events = bpf.RingBuf[Event]{
	MaxEntries: 4096,
}

//bpf:section tracepoint/syscalls/sys_enter_execve
func OnExec(ctx *bpf.ExecveEnterCtx) bpf.TpReturn {
	e, ok := Events.Reserve()
	if !ok {
		return bpf.TpOk
	}
	e.Pid = bpf.GetCurrentPid()
	bpf.GetTaskComm(&e.Comm)
	Events.Submit(e)
	return bpf.TpOk
}

func main() {}

生成された BPF C コード (出力)

// Code generated by gobee. DO NOT EDIT.

#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_core_read.h>

char _license[] SEC("license") = "GPL";

struct Event {
	__u32 Pid;
	__u8 Comm[16];
};

struct {
	__uint(type, BPF_MAP_TYPE_RINGBUF);
	__uint(max_entries, 4096);
} Events SEC(".maps");

SEC("tracepoint/syscalls/sys_enter_execve")
int OnExec(struct trace_event_raw_sys_enter *ctx) {
	struct Event *e = bpf_ringbuf_reserve(
		&Events, sizeof(struct Event), 0);
	if (!e) {
		return 0;
	}
	e->Pid = (__u32)(
		bpf_get_current_pid_tgid() >> 32);
	bpf_get_current_comm(&e->Comm, 16);
	bpf_ringbuf_submit(e, 0);
	return 0;
}

コマンド:

gobee translate --bindings-dir ./bpf ./bpf/src


他のツールとの比較

機能gobeeC + clang + bpf2goAya (Rust)bpftraceBCC
カーネル側言語Go のサブセットCRustDSLC
ユーザースペース統合型付き Go バインディングbpf2goaya-runtimeなしPython
CO-RE 対応✅ clang を介して✅ LLVM を介して
ヘルパー関数カバレッジ200 の型付き Go ラッパーC で記述必要完全限定的C で記述必要
ソースマッピング✅ Go ファイル:行:列❌ 生の C コード✅ Rust ファイル:行パーシャル
バージョンゲート✅ bpfvet を介してマニュアルマニュアルなしランタイム

注記: gobee は既存の C/libbpf ワークフローを置き換えることを意図しておりません。カーネル側・ユーザースペース側・ビルドパイプラインを一つの Go モジュール内で管理したい場合に最適です。


対応状況 (What's supported today)

詳細は docs/status.md を参照してください。

項目カバレッジ
プログラムタイプXDP, tracepoint, kprobe/kretprobe, uprobe/uretprobe, sock_ops, TC, cgroup_skb, LSM (全 8 種)
マップタイプarray, hash, lru_hash, per-CPU 変種、bloom_filter, lpm_trie, ringbuf, perf_event_array, prog_array, queue, stack, ストレージ型、devmap/cpumap/xskmap (全 19 種)
BPF ヘルパーlibbpf v1.5.0 のヘッダーから自動生成された ~200 の型付き Go スタブ
CO-RE✅ 自動検出。内核構造体 (
task_struct
,
sock
など) と UAPI コンテキストへの対応済み。
※ Ubuntu 24.04 (Linux 6.x) で確認済み。旧バージョンは未対応。
BTF レディな出力✅ C コードに BTF 情報を埋め込み、適切なリロケーション情報が含まれます。
vmlinux.h
は含みません。clang の管理はユーザー責任です。
ユーザー定義ヘルパー✅ トップレベルの Go 関数は、静的な
__always_inline
C 関数として生成されます。
型付きバインディング
Load
,
Close
,
Attach
,
AttachAll
などの機能と構造体タイプの再公開に対応。
バージョンゲート✅ ローダ (
bpfvet
) で実行。ホストとプログラムが異なるバージョンの場合、迅速に失敗します。
エラーマッピング✅ Verifier エラーに対し、Go ソースコードへの自動アノテーションを実行。
クロスアーキテクチャ✅ Linux arm64 + amd64 に対応

gobee が行うこと (Summary)

  • Go のサブセットを BPF C にトランスパイールし、誤利用をファイル・行・列単位で警告します (
    go/types
    を事前実行)。
  • .bpf.c
    の隣に型付きバインディング
    <Stem>_bindings.go
    を生成します。
  • LoadAndAssign
    からの Verifier エラーに対し、Go ソース位置を自動アノテーションします(手動パイプ不要)。
  • ローダ内 (
    Load<Stem>
    ) で
    bpfvet
    を実行し、カーネルバージョンの不整合を早期に検出します。
  • ~200 のヘルパー・スタブに加え、ユーザー定義ヘルパーも静的関数として生成します。

gobee が行わないこと (Limitations)

  • clang の置き換えはしません: CO-RE や BTF などの機能は clang に既に実装されており、再実装のメリットはありません。
  • cilium/ebpf の置き換えはしません: 生成されたバインディングは cilium/ebpf と互換性のあるスタックの上で動作します。
  • BPF プログラムを隠しません: Go サブセットは BPF C に 1:1 マッピングし、BPF を知らない場合でもマニュアル参照が必要です。
  • 自動ビルド・ロードは行いません: コンパイルからロードまでの手順は依然としてユーザーの手動作業(bpf2go と同様)が必要です。

なぜトランスパイールするか?

Go のコンパイラ (gc) には、LLVM ベースの BPF バックエンドが存在しません。rustc と異なり、その追加には多大なコストがかかります。 gobee は C を介して

clang
を再利用することで、以下のメリットを無料で得ています。

  • 成熟したコード生成
  • CO-RE / BTF サポート
  • Verifier フriendly な構造

クイックスタート

前提条件

  • Linux: ディストリビューションのパッケージから clang (BPF ターゲット) をインストール。
  • macOS:
    brew install llvm
    で LLVM/clang をインストールしてください。
  • Go バイナリ生成環境: arm64 または amd64 の Linux が必要です。
go install github.com/boratanrikulu/gobee/cmd/gobee@latest

cd example/helloworld
make build                     # トランスパイル、コンパイル、ビルドのワンステップ
sudo ./helloworld eth0

プロジェクト構造例

yourproject/
├── bpf/                      # import 可能な Go パッケージ
│   ├── embed_amd64.go        # CGO エンベディメント定義
│   ├── embed_arm64.go
│   ├── your_bindings.go      # gobee が生成したバインディング
│   ├── bin/{x86,arm64}/your.bpf.o  # コンパイル済みオブジェクトファイル
│   └── src/                  # clang の入力用ディレクトリ (Go パッケージではない)
│       ├── your.go           //go:build ignore を持つ BPF ソース
│       ├── your.bpf.c        # gobee が生成した C コード
│       ├── Makefile          # アーキテクチャ別のclang コンパイル設定
│       └── vmlinux.h         # バインダされた BTF ドンプ
├── main.go                   # bpf パッケージを import する実装ファイル
└── Makefile                  # 全工程のビルド管理

この構造は、

bpf/
を純粋な Go モジュールとしつつ、ネイティブコード生成物を
src/
に隔離することで、クリーンな開発環境を維持します。


リソース

実装例 (Examples)

  • example/helloworld: キャンノニカルな XDP パケットカウンタ(BPF 40 行 / ユーザースペース 80 行)。
  • example/sysmon: XDP、tracepoint、kprobe を統合。リングバッファ共有と
    AttachAll
    のデモ。

ドキュメント

影響を受けたプロジェクト

  • Solod: Go から C へのトランスパイールパターン。
  • Aya: ergonomics を重視する Rust eBPF フレームワーク。

ライセンス

MIT License Copyright (c) 2026 Bora Tanrikulu me@bora.sh

同じ日のほかのニュース

一覧に戻る →

2026/05/26 2:45

Exit IP VPN サーバー対策の展開

## 日本語訳: 2026 年 5 月 25 日付で、12 つの特定サーバー識別子への新しい緩和措置の適用を含む重要な運用上のアップデートが確認されました。この措置は、北米、ヨーロッパ、オセアニアを含む主要なグローバル地域にわたるインフラに影響します。影響を受けたサーバーは、以下の通り明示的にリストされています:au-mel-wg-402, au-syd-wg-001, ca-mtr-wg-302, de-fra-wg-103, fi-hel-wg-201, fr-par-wg-101, ie-dub-wg-101, no-osl-wg-101, se-sto-wg-208, us-dal-wg-701, us-lax-wg-002, us-nyc-wg-601, us-slc-wg-303。この実装は、内部での判断を踏まえたこれらのエンドポイントの状態における決定的な変化を表します。このアナウンスメントでは、識別子のリストとアップデートの日付のみが提供されており、脅威の具体的な性質、先行文脈、またはエンドユーザーおよび産業エンティティに対する直接的な影響について言及していません。したがって、この変更の原因や以降のタイムラインに関するさらなる説明はまだ発表されていません。 ## 原文: **Improved Summary:** Effective May 25, 2026, a significant operational update has been confirmed involving the application of a new mitigation to twelve specific server identifiers. This action impacts infrastructure across major global regions, including North America, Europe, and Oceania. The affected servers are explicitly listed as: au-mel-wg-402, au-syd-wg-001, ca-mtr-wg-302, de-fra-wg-103, fi-hel-wg-201, fr-par-wg-101, ie-dub-wg-101, no-osl-wg-101, se-sto-wg-208, us-dal-wg-701, us-lax-wg-002, us-nyc-wg-601, and us-slc-wg-303. This implementation marks a definitive shift in the status of these endpoints following an internal decision. The announcement provides only the list of identifiers and the update date; it does not elaborate on the specific nature of the threat, prior context, or direct impacts on end-users and industry entities. Consequently, further clarification regarding the reasons for this change or subsequent timelines has not yet been released.

2026/05/26 4:37

ノルウェーのHuaweiフラッシュストレージによる2ペタバイトとLLMトレーニング

## 日本語訳: ノルウェー国立図書館は、地元のノルウェー語に対する商用ソリューションの深刻な不足に対応するため、自らのデジタルアーカイブにのみ基づいて訓練された主権性の高い大規模言語モデルを起動する予定である。このプロジェクトは文化省によって推進され、IT 責任者マリウス・フスネス氏の率いるものであり、私企業の手に負えない著作権保護付き新聞への図書館特有の法的アクセスを活用して、約 60 ピタバイトのデジタル化された遺産(現在は 3-2-1 保存形式で保管されている)をこの AI に訓練している。 技術的なアーキテクチャでは、3 つの異なるシステムをオーケストレーションするものであり、初期処理段階には Nvidia DGX H200 クラスターと华为(Huawei)OceanStor Dorado フルフラッシュアレイ(高速フラッシュ容量 2 PB を提供)を用い、その後、最終的な訓練は国立スーパーコンピューター Sigma2 Olivia で行われる。主要なボトルネックは計算能力ではなく、データの品質、クリーニング、パイプラインのスループットであり、これは AI パイプラインの低遅延要求と大規模かつ高遅延の保存アーカイブとの間の遅延不一致によって複雑化している。さらに、使用制御のためのガバナンス枠組みの確立や標準的な評価ツールの利用という課題にも直面している。このイニシアチブにより、ノルウェーは外国のテクノロジー大手に依存せずに技術的未来を確保することができ、他の英語圏外における国々が主権性の高い AI 基盤を求めるためのモデルとして挙げられている戦略となっている。

2026/05/26 3:19

カリフォルニア州、Linuxの年齢認証免除を法改正で検討へ:抗議運動を受け

## Japanese Translation: カリフォルニア州の法律家は、2026年2月11日にデジタル年代保証法(Digital Age Assurance Act)からほとんどのオープンソースオペレーティングシステムを除外することを目的としたアセンブリビル1856号(AB 1856)を導入した後、厳格な年齢検証要件から撤退する方針を検討しています。AB 1856は、同州の以前のパックであるアセンブリビル1043号(2025年後期に可決)を改正し、2027年1月1日までに年齢検証の手続を個々のウェブサイトやアプリからオペレーティングシステムレベルへ移行することを求めていました。AB 1043の下では、オペレーティングシステムはセットアップ時にユーザーの生年月日を収集し、アプリおよびストアに対して「年齢層」(例:「13歳未満」、「18歳以上」)をシグナル送信することが義務付けられていました。提案されている改正案では、「オペレーティングシステム提供者」は、ソフトウェアのコピー、再配布、修改を可能にするライセンスの下でソフトウェアを配布する者を含まないと定義しています。この定義により、Debian、Fedora、Ubuntu、Arch Linux、Mintなど主流のLinuxディストリビューションが遵守要件から除外され、Electronic Frontier Foundationなどのプライバシー擁護者や、無限にフォーク可能なプロジェクトに対しては元の規則が侵襲的かつ実行不可能であるという懸念に対処しました。同法案は元の法的措置を廃止するものではありません。商用プラットフォームでプロプライエタリなアプリエコシステムを持つもの(ValveのSteamストアに紐づく特定のSteamOSバージョンなど)も引き続き審査の対象となる可能性があります。アセンブリメンバーBuffy Wicksによって提出された最新版は2026年5月18日付けのものであり、2026年5月19日に2回目に朗読され、3回目の朗読に付議されるよう命じられ、現在、委員会での審査が予定されている6月の間に立法機構を通過中としています。

Show HN: BPF プログラムは Go で、C では書かなくて OK | そっか~ニュース