
ltm은 Linux용 머신-히스토리 디버거입니다. eBPF를 통해 프로세스, 파일, 네트워크, 메모리 및 블록 I/O 메타데이터를 기록한 후 타임라인을 쿼리할 수 있습니다.
Linux용 머신 히스토리 디버거입니다. eBPF를 통해 프로세스, 파일, 네트워크, 메모리 및 블록 I/O를 기록하고, 메타데이터를 SQLite에 저장하며, 박스에서 발생한 일에 대한 타임라인/차이/일반 영어/SQL 질문에 답변합니다.
⚠️ 현재는 Tracepoint 전용 캡처 — 현재 기록은 tracepoint 프로그램을 사용합니다. 아직 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
녹화에는 루트(또는 CAP_BPF + CAP_PERFMON)가 필요합니다. 질의는 필요하지 않습니다. 라이브 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을 추가하세요.
하나의 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개의 tracepoint: 프로세스 (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를 건너뜁니다. 수작업으로 작성된 tracepoint 매니페스트는 internal/abi/abi.yaml에 있으며, 체크인된 런타임 테이블은 internal/abi/tracepoints_gen.go로 생성됩니다. collector.bpf.c를 편집한 후 make ebpf로 재빌드하세요. internal/abi/abi.yaml의 ABI 메타데이터를 편집한 후 make generate를 실행한 다음, 커널 이벤트 레이아웃 또는 tracepoint 테이블이 변경된 경우 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, tracepoint 메타데이터 및 커널 측 구조체를 단일 진실 공급원인 internal/abi/abi.yaml에 연결합니다. 이는 의도적으로 CPython의 Argument Clinic 워크플로우(소스)와 유사합니다: 새로운 캡처된 이벤트/모듈 표면을 추가할 때 파생된 Go 또는 C 파일을 수동 편집하는 대신 매니페스트를 업데이트하고 체크인된 출력을 재생성합니다.
문서: docs/ (ABI, CLI, 생성된 파일, 질의, 녹화, 아키텍처, 보안).
기여자 규칙: AGENTS.md.
| 명령어 | 기능 |
|---|
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 | 두 시점 사이의 시스템 상태 변경 |
query "<question>" | 일반 영어 (템플릿 또는 에이전트 → SQL) |
query sql ["<SELECT>"] | 읽기 전용 SQL; 인자 없으면 스키마 출력 (ltm sql도 작동) |
prune --older-than 720h [--vacuum] | 오래된 행 삭제, 선택적으로 디스크 공간 회수 |
benchmark --count N | N개의 합성 이벤트 기록 (eBPF 없음) |
version | 빌드 버전, 커밋, 플랫폼 |