尧图精选

BCC Docker 快速上手:一条命令进入 eBPF 内核观测工具箱

🕒 发布时间:2026/9/20 11:58:37 📁 来源:尧图网络
eBPF可观测性性能剖析网络【免费下载链接】bccBCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more项目地址https://gitcode.com/gh_mirrors/bc/bcc点击查看免费下载BCCBPF Compiler Collection是一个面向 Linux 内核观测与操作的 eBPF 工具集而 QUICKSTART.md 给出了官方推荐的零编译体验路径通过 Docker 容器在数秒内获得一套预装好的 bcc 工具环境。本文将完整拆解这条快速启动命令的每一个参数及其背后的原理结合仓库中的 Dockerfile、构建脚本与工具源码说明容器内为什么能直接运行 eBPF 工具、能观测哪些内核事件以及如何从容器体验平滑过渡到宿主安装与深度开发。读完本文你将能够理解并安全地运行 bcc 容器、在容器内执行 execsnoop、opensnoop、biolatency 等十余类观测工具、判断宿主内核是否满足 eBPF 运行前提并沿着官方教程路径继续深入 bcc 的 Python 开发接口。快速开始一条 docker run 命令进入 bcc 世界QUICKSTART.md 给出的官方命令极其简洁——在宿主机的 shell 中执行docker run -it --rm \ --privileged \ -v /lib/modules:/lib/modules:ro \ -v /usr/src:/usr/src:ro \ -v /etc/localtime:/etc/localtime:ro \ --workdir /usr/share/bcc/tools \ zlim/bcc命令执行后你将进入一个以/usr/share/bcc/tools为工作目录的交互式容器 shell其中预装了整套 bcc 工具。下面逐项拆解这条命令的语义参数作用为什么需要它docker run -it以交互模式-i并分配伪终端-t运行容器工具输出是持续刷新的字符流需要交互式终端展示--rm容器退出后自动删除其文件系统层容器是无状态体验环境退出即清理不留垃圾--privileged赋予容器全部特权能力bcc 工具需要加载 BPF 程序到宿主机内核并访问内核调试接口普通容器不具备该权限-v /lib/modules:/lib/modules:ro将宿主机内核模块目录只读挂载进容器bcc 工具运行时需要访问与当前内核版本匹配的模块信息与符号-v /usr/src:/usr/src:ro将宿主机内核源码/头文件目录只读挂载进容器内核头文件kernel headers是 bcc 编译 BPF 程序、解析内核结构的必要依赖-v /etc/localtime:/etc/localtime:ro同步宿主机时区文件保证工具输出的时间戳与宿主机时区一致--workdir /usr/share/bcc/tools设置容器内初始工作目录直接落在工具目录进入容器即可./execsnoop使用其中最关键的是--privileged与两个只读挂载。eBPF 程序的本质是由用户态编译、注入内核沙箱执行的字节码而 bcc 在运行时仍需要依赖 LLVM/Clang 将 C 编写的 BPF 程序编译成字节码并解析内核数据结构BTF、tracepoint 格式等因此/usr/src中与当前内核匹配的头文件必不可少/lib/modules则承载内核模块与符号信息。/usr/share/bcc/tools是工具的标准安装目录——INSTALL.md 中 iovisor 官方 apt 仓库安装 bcc-tools 后工具同样位于/usr/share/bcc/tools。容器内的世界预装工具与第一个观测命令进入容器后工作目录/usr/share/bcc/tools下就是 bcc 的全部命令行工具。这些工具与仓库 tools/ 目录中的 Python 脚本一一对应覆盖进程、内存、网络、存储、CPU 调度、文件系统等观测维度。抓新进程execsnoop# ./execsnoop PCOMM PID RET ARGS supervise 9660 0 ./run supervise 9661 0 ./run mkdir 9662 0 /bin/mkdir -p ./main run 9663 0 ./run [...]execsnoop 通过追踪exec()系统调用而非fork()打印每一个新进程专用于发现短命进程——这类进程会消耗 CPU 资源却常常逃过周期性采样的监控工具的视线。其源码位于 tools/execsnoop.py支持-x包含失败的 exec、-T带时间戳、-P PPID按父进程过滤、-u UID按用户过滤等选项。追踪文件打开opensnoop# ./opensnoop PID COMM FD ERR PATH 1565 redis-server 5 0 /proc/1565/stat 1565 redis-server 5 0 /proc/1565/stat 1603 snmpd 9 0 /proc/net/dev 1603 snmpd -1 2 /sys/class/net/eth0/device/vendor [...]opensnoop 为每次open()系统调用输出一行直接暴露应用的配置文件、数据文件与日志文件访问行为也能快速定位反复尝试读取不存在文件导致的性能问题。见源码 tools/opensnoop.py支持按 PID/TID/UID 过滤、-x只看失败打开、-d限时观测等。磁盘 I/O 时延分布biolatency# ./biolatency Tracing block device I/O... Hit Ctrl-C to end. ^C usecs : count distribution 0 - 1 : 0 | | 2 - 3 : 0 | | 4 - 7 : 0 | | 16 - 31 : 0 | | 64 - 127 : 1 | | 128 - 255 : 12 |******** | 256 - 511 : 15 |********** | 1024 - 2047 : 52 |**************************************|biolatency 追踪块设备 I/O 从下发到完成的时间结束时Ctrl-C 或指定间隔以直方图汇总时延分布。相比 iostat 这类只给平均值的工具它能直接呈现时延长尾与多峰分布。容器内的使用方式与 docs/tutorial.md 第 1.4 节描述的完全一致。最小示例Hello World容器镜像同样安装了官方最小示例 examples/hello_world.py它的核心只有三行from bcc import BPF BPF(textint kprobe__sys_clone(void *ctx) { bpf_trace_printk(Hello, World!\n); return 0; }).trace_print()这段代码通过 bcc 的 Python 绑定把一个挂载在sys_clone内核函数上的 kprobe 程序编译并加载进内核每有新进程 fork 就在 trace 管道打印一行 Hello, World!。它展示了 bcc 的核心工作模型C 写内核侧 BPF 程序Python 写用户侧控制逻辑编译、加载、事件读取全部由bcc库封装完成。下图展示了 bcc 工具全家福容器中预装的正是这一类工具镜像的来龙去脉仓库中的 Dockerfile 与构建脚本QUICKSTART.md 使用的zlim/bcc是一个社区维护的预构建镜像。如果你希望基于当前仓库源码自行构建等价镜像仓库根目录的 docker/ 目录提供了两份官方 Dockerfiledocker/Dockerfile.ubuntu基于ubuntu:${OS_TAG}默认 22.04的多阶段构建。第一阶段用pbuilder与 scripts/build-deb.sh 把仓库源码打包成.deb安装包第二阶段安装 Python 3、binutils、libelf1、kmod、llvm-12-dev等运行时依赖再dpkg -i装入全部.deb。docker/Dockerfile.debian基于debian:stretch的单阶段构建同样依赖pbuilder与 build-deb.sh 产出并安装 bcc 包。而 scripts/build-deb.sh 揭示了打包的完整链路git submodule update拉取 libbpf 子模块bcc 自 v0.10.0 起依赖 libbpf 封装 bpf 系统调用与 uapi 头文件详见 INSTALL.md 的 libbpf Submodule 一节再用git archive归档主仓库与 libbpf 子模块、合并压缩为bcc_revision.orig.tar.gz最后以debuild产出.deb并复制到工作目录。镜像第二阶段正是在dpkg -i /root/bcc/*.deb时装入这些包。由此可以推断自行构建时若宿主是 Debian/Ubuntu 系仅需在仓库根目录执行docker build -f docker/Dockerfile.ubuntu -t my-bcc .即可得到与 zlim/bcc 能力等价的镜像。运行前提宿主内核的 eBPF 能力要求容器能跑 bcc 工具前提是宿主内核具备 eBPF 能力——因为 BPF 程序最终是注入宿主内核执行的容器的--privileged只解决权限问题无法弥补内核功能的缺失。根据 INSTALL.md 与 docs/kernel-versions.md内核须为 4.1 及以上且编译时开启以下配置项可用zcat /proc/config.gz | grep BPF或检查/boot/config-$(uname -r)确认CONFIG_BPFy CONFIG_BPF_SYSCALLy # [可选用于 tc 过滤器] CONFIG_NET_CLS_BPFm # [可选用于 tc 动作] CONFIG_NET_ACT_BPFm CONFIG_BPF_JITy # [Linux 内核 4.1 ~ 4.6] CONFIG_HAVE_BPF_JITy # [Linux 内核 4.7 及以后] CONFIG_HAVE_EBPF_JITy # [可选用于 kprobes] CONFIG_BPF_EVENTSy # 通过 /sys/kernel/kheaders.tar.xz 提供内核头文件 CONFIG_IKHEADERSy若运行网络类示例如 tc 相关的 examples/networking还建议开启CONFIG_NET_SCH_SFQm、CONFIG_NET_ACT_POLICEm、CONFIG_NET_ACT_GACTm、CONFIG_DUMMYm、CONFIG_VXLANm。如果容器内工具报 Failed to load program: Operation not permitted 之类的错误优先检查内核版本与配置、/lib/modules与/usr/src挂载是否与当前内核匹配、以及是否存在内核 lockdown 限制Fedora 系常见INSTALL.md 与 FAQ.txt 有说明。容器方式与宿主安装两种路线的选择容器的价值在于秒级起效、零编译依赖、用完即走——特别适合第一次接触 bcc、或需要在多台机器上临时排查问题的场景。但它的局限也很明显工具集版本受镜像固定、需要特权模式、且挂载的/usr/src必须与宿主内核匹配。如果你需要长期、深入地使用 bcc官方推荐直接安装到宿主主流发行版二进制安装Debian/Ubuntu 可用bpfcc-toolsUbuntu 中工具安装到/sbin以-bpfcc结尾如opensnoop-bpfccFedora 30 直接sudo dnf install bccArch 用pacman -S bcc bcc-tools python-bccAlpine 用apk add bcc-tools。完整清单见 INSTALL.md。源码编译安装Ubuntu 上安装 LLVM/Clang 开发库需带 BPF 后端、cmake、flex、bison、libelf-dev等依赖后执行标准的cmake .. make sudo make install详见 INSTALL.md 的 Source 一节。排障手册FAQ.txt 汇总了最常见的安装与运行问题。从体验到深入官方学习路径容器体验只是入口。QUICKSTART.md 与 README.md 共同勾勒了一条清晰的进阶路径docs/tutorial.md面向使用的教程。第 1 节 General Performance 给出通用性能排查清单——execsnoop → opensnoop → ext4slower → biolatency → biosnoop → cachestat → tcpconnect → tcpaccept → tcpretrans → runqlat → profile每类工具都配有真实输出与解读后续章节覆盖网络、磁盘、性能剖析等更多场景。docs/tutorial_bcc_python_developer.md面向开发的教程讲解如何用 Python 接口编写新的 bcc 程序从 examples/hello_world.py 这类最小程序起步。docs/reference_guide.mdbcc 与 bcc/BPF API 的参考手册涵盖BPF类方法、事件回调、映射Map等编程要素。源码研读仓库 examples/ 目录存放可直接运行的示例含 tracing 与 networking 两类tools/ 目录是全部生产级工具部分为单文件、部分带配套 C 文件libbpf-tools/ 则是基于 libbpf 的 C 实现版本是深入理解 eBPF 程序结构的极佳素材。小结BCC 容器快速体验是一条经过官方设计验证的零摩擦上手路径--privileged解决权限、/lib/modules与/usr/src的只读挂载补齐内核上下文、--workdir直达工具目录三步合一只为让你把时间花在观测问题上而不是环境搭建上。进入容器后execsnoop、opensnoop、biolatency 等工具即刻可用而理解镜像的构建过程、宿主内核的 eBPF 前提以及容器与宿主安装的取舍则能帮助你在体验之后平滑地走向 INSTALL.md 描述的宿主部署与 docs/tutorial_bcc_python_developer.md 描述的自主开发。赞分享eBPF可观测性性能剖析网络【免费下载链接】bccBCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more项目地址https://gitcode.com/gh_mirrors/bc/bcc点击查看免费下载相关推荐在 minikube 中运行 eBPF 工具用 BCC 观测本地 Kubernetes 集群内核行为在 minikube 中运行 eBPF 工具用 BCC 观测本地 Kubernetes 集群内核行为 eBPF 工具是用于观测 Linux 内核行为的高性能性云原生容器编排CLI开发工具FileCodeBox 快速上手指南一条 Docker 命令部署自托管文件快递柜FileCodeBox 快速上手指南一条 Docker 命令部署自托管文件快递柜 FileCodeBox 是一个轻量、现代的自托管文件与文本分享服务核心理念后端BCCBPF Compiler Collection实战指南基于 eBPF 的内核追踪与性能分析工具箱BCCBPF Compiler Collection实战指南基于 eBPF 的内核追踪与性能分析工具箱 BCCBPF Compiler CollectieBPF可观测性性能剖析网络上一篇HTTPS-PORTAL 常见问题解决方案下一篇【亲测免费】 Wayback Machine Downloader 常见问题解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →