Blog
Thoughts on engineering, design, and building great products.
libbpf và CO-RE: Tự Viết Một Công Cụ eBPF
bpftrace hợp cho câu hỏi nhanh. Khi cần một công cụ thật — đóng gói, phân phối, chạy lâu dài — ta viết chương trình eBPF bằng C với libbpf và CO-RE. Bài này dựng execsnoop từ đầu: chương trình nhân đẩy sự kiện exec qua ring buffer, bpftool sinh skeleton, một loader C dùng libbpf nạp và đọc sự kiện. Build đủ chuỗi clang → skeleton → link libbpf, rồi chạy thấy từng lần exec trên cụm hiện ra với pid, ppid, tên file — kèm một cái bẫy buffer thật.
BTF và CO-RE: Một Lần Biên Dịch, Chạy Mọi Kernel
Cấu trúc dữ liệu bên trong nhân như task_struct có layout khác nhau giữa các phiên bản kernel — field nằm ở offset nào tùy bản. Vậy làm sao một chương trình eBPF biên dịch sẵn đọc đúng field trên mọi kernel? Câu trả lời là BTF và CO-RE. Bài cuối Part I sinh vmlinux.h từ BTF của nhân, viết một chương trình đọc ppid bằng cách lần qua task->real_parent->tgid, biên dịch một lần và chạy — libbpf tự tìm offset đúng theo BTF của kernel đang chạy. Đây cũng là nền cho Part III tự viết công cụ thật.