
ltmはLinux向けのマシン履歴デバッガです。eBPFを介してプロセス、ファイル、ネットワーク、メモリ、およびブロックI/Oのメタデータを記録し、タイムラインをクエリできるようにします。
Linux用のマシンヒストリーデバッガー。eBPFを介してプロセス、ファイル、ネットワーク、メモリ、ブロックI/Oを記録し、メタデータをSQLiteに保存し、そのマシンで何が起こったかについてのタイムライン/差分/平易な英語/SQLの質問に答えます。
⚠️ 現在はトレースポイントのみのキャプチャ — 現在の記録はトレースポイントプログラムを使用しています。まだkprobes、uprobes、XDP、TCフックは使用していません。そのため、より深いカーネル内部、ユーザースペース関数トレーシング、パケットパス検査よりも、安定したシステムコール/ブロック/プロセスメタデータを優先します。
go build -o bin/ltm ./cmd/ltm
sudo ./bin/ltm start # record (eBPF; root, Linux/x86_64)
./bin/ltm timeline --since 5m
./bin/ltm watch # live tail; Ctrl-C to stop
./bin/ltm diff --from 10m --to now
./bin/ltm query "who modified /etc/some.conf?"
sudo ./bin/ltm stop
記録にはroot(または CAP_BPF + CAP_PERFMON)が必要です。クエリにはrootは必要ありません。ライブLinuxレコーダーがない場合:ltm benchmark --count 1000 で合成イベントをDBにシードし、timeline、diff、query で検査できます。
グローバルフラグはサブコマンドの前に置きます(ltm --db /tmp/ltm.db status)。デフォルト:DB ~/.local/share/ltm/ltm.db、PID ~/.local/run/ltm.pid。機械可読出力を得るには、任意の読み取りコマンドに --json を追加します。
1つのSQLiteデータベースで、WALライターはデーモンが保持します。すべての読み取りパスは読み取り専用で開かれます(PRAGMA query_only=ON)— クエリはライターと競合したりログを変更したりすることはありません。メタデータのみ;ファイルコンテンツは含みません。
export LTM_AGENT=claude # or codex, cursor, gemini, auto, or a custom command
ltm query "which process wrote to files the most today?"
エージェントSQLが表示され、その後読み取り専用接続で実行され、単一の SELECT でない場合は拒否されます。エージェントがない(またはエージェントの失敗) → 組み込みテンプレート。
約60のトレースポイント:プロセス(exec、exit、fork、clone、kill)、ファイル(open/close、read/write、rename、unlink、link、symlink、mkdir、rmdir、chmod、chown、stat、access、truncate、dup、pipe、…)、メモリ(mmap、munmap、mprotect)、ネットワーク(socket、connect、bind、listen、accept、send/recv、shutdown)、ブロック(block_rq_issue)。
BPFは /proc、/sys、/dev とデーモン自身のPIDをスキップします。手書きのトレースポイントマニフェストは internal/abi/abi.yaml にあります;チェックインされたランタイムテーブルは internal/abi/tracepoints_gen.go に生成されます。collector.bpf.c を編集した後、make ebpf で再ビルドします。internal/abi/abi.yaml のABIメタデータを編集した後、make generate を実行し、カーネルイベントレイアウトまたはトレースポイントテーブルが変更された場合は make ebpf を実行します。
-D__TARGET_ARCH_x86 でビルドされています(#2)。クエリとベンチマーク生成のデモデータはLinux記録サポートを必要としません。readv/writev/sendmsg/recvmsg は 0 を報告します。go test ./... # local/unit tests
make generate # regenerate ABI/schema outputs from abi.yaml
make ebpf # regenerate checked-in BPF object/bindings (Linux)
make integration # real eBPF recording; Linux + root
レイアウト:cmd/ltm エントリポイント;それ以外は internal/ の下(abi、cli、daemon、collector、ebpf、storage、agent、diff、query)。
ABI/スキーマジェネレーターは、イベント定義、ストレージDDL、トレースポイントメタデータ、カーネル向け構造体を単一の情報源である internal/abi/abi.yaml に結び付けます。これは意図的にCPythonの Argument Clinic ワークフロー(ソース)と精神が似ています:新しいキャプチャイベント/モジュールサーフェスを追加するときは、マニフェストを更新してチェックインされた出力を再生成し、派生のGoまたはCファイルを手動で編集しないようにします。
ドキュメント:docs/(ABI、CLI、生成ファイル、クエリ、記録、アーキテクチャ、セキュリティ)。コントリビュータールール:AGENTS.md。
| Command | 説明 |
|---|
start / stop / status | レコーダーを制御 |
timeline | --pid --uid --comm --category --action --path --exe --since --until --limit でフィルタリング(繰り返し可能;--path/--exe は SQL LIKE) |
watch | ライブテール(--interval --since --category --comm --pid) |
diff --from --to | 2つの時点間のマシンステートの変更 |
query "<question>" | 平易な英語(テンプレート、またはエージェント → SQL) |
query sql ["<SELECT>"] | 読み取り専用SQL;引数なしでスキーマを表示(ltm sql も動作) |
prune --older-than 720h [--vacuum] | 古い行を削除、オプションでディスク領域を再利用 |
benchmark --count N | N個の合成イベントを書き込み(eBPF不要) |
version | ビルドバージョン、コミット、プラットフォーム |