资讯动态

BCC Fedora Demo VM 搭建全流程:从 virt-install 虚拟化到 BPF 内核、LLVM 与 BCC 构建

发布时间:2026/9/20 15:03:54 来源:尧图企业网站定制
BCC Fedora Demo VM 搭建全流程从 virt-install 虚拟化到 BPF 内核、LLVM 与 BCC 构建【免费下载链接】bccBCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more项目地址: https://gitcode.com/gh_mirrors/bc/bcc本文基于 BCCBPF Compiler Collection仓库中 scripts/README.md 及其配套脚本完整讲解如何在 Fedora 系统上以无人值守方式构建一台 BCC 开发演示虚拟机Demo VM并依次完成 BPF 内核编译、带 BPF 后端支持的 LLVM 构建以及 BCC 自身的编译与测试。读者按本文操作可以复现出一条从裸机虚拟化到跑通 BCC 单元测试的完整开发环境链路并理解其中每个脚本、每个内核配置项和每个 CMake 参数的实际作用。一、整条链路概览三个脚本串起的 BCC 开发环境BCC 的运行依赖三样东西支持 BPF 特性的内核、能生成 BPF 字节码的 LLVM/Clang 工具链以及 BCC 本体。仓库中 scripts/bpf_demo.ks.erb 在虚拟机安装阶段%post 段就自动生成了三个可执行脚本把这三件事拆成三步步骤脚本职责1bpf-kernel-setup拉取 Linux net-next 内核源码配置并编译带有 BPF 选项的内核安装头文件并生成 kexec 切换脚本2bpf-llvm-setup克隆 LLVM 与 Clang 源码用启用 BPF Target 的 CMake 配置编译安装到/opt/local/llvm3bcc-setup克隆 BCC 仓库在启用新 LLVM 的 PATH 环境下用 CMake 构建并运行 CTest 单元测试配套的 scripts/build_bpf_demo.sh 负责第一步——调用virt-install用 Kickstart 无人值守文件把这台 VM 创建出来而文档中记录的四步操作构建 VM、配置内核、编译 LLVM、构建 BCC与这三个脚本一一对应。下面按文档给出的顺序逐步展开。二、构建 Demo VMbuild_bpf_demo.sh 与 virt-install文档强调运行脚本前必须确保系统上已安装 virt-install。脚本对此有显式检查——若which virt-install失败会直接输出Error: virt-install is not installed并退出见 scripts/build_bpf_demo.sh。文档给出的最小用法是./build_bpf_demo.sh -n bpf-demo -k bpf_demo.ks.erb其中-n指定虚拟机名称-k指定 Kickstart 模板路径必填。完整可用的参数如下表来自脚本 usage 输出与默认值逻辑参数长选项含义默认值-b--bridge BRNAME挂接的 Linux 网桥virbr0-c--cpu NUM分配给实例的 CPU 核数4-g--github_token XGitHub OAuth token供构建机使用空-k--kickstart KSKickstart 文件路径必填无-m--mirror URL可网络安装的软件源地址http://mirror.pnl.gov/fedora/linux/releases/22-M--mem NUM分配给实例的内存MB4094-n--name NAME实例名称必填无-p--password PASS虚拟机 root 密码iovisor-s--size NUM虚拟硬盘大小GB40脚本内部执行的关键逻辑如下对应 scripts/build_bpf_demo.sh渲染 Kickstart 模板用 Ruby ERB 把密码、主机名、镜像源等变量注入bpf_demo.ks.erb生成临时 KS 文件计算安装树路径$MIRROR/Server/x86_64/os/作为 virt-install 的--location发起无人值守安装核心命令形如virt-install --connectqemu:///system \ --networkbridge:virbr0 \ --initrd-inject生成的.ks文件 \ --controller typescsi,modelvirtio-scsi \ --extra-argsksfile:/ks文件名 consoletty0 consolettyS0,115200 \ --namevm名 \ --disk /var/lib/libvirt/images/vm名.img,cachenone,formatqcow2,size40,busscsi \ --ram 4094 --vcpus4 --check-cpu --accelerate --hvm \ --location镜像树 --nographics注意其中的--initrd-inject会把 Kickstart 文件注入 initrd--extra-args里consolettyS0,115200为无图形--nographics安装提供串口控制台。安装完成后默认密码即iovisor与文档一致也即-p参数的默认值。由于使用的是 DHCP文档提示安装完成后登录 VM先通过 DHCP 找到其 IP再以 root 身份 SSH 进入。说明脚本参数默认值、镜像源与虚拟化层细节均取自当前仓库 scripts/build_bpf_demo.sh其中镜像源为仓库当时的示例地址实际使用时请替换为你所在环境的可用 Fedora 安装源。三、Kickstart 模板解析bpf_demo.ks.erb 里埋了什么scripts/bpf_demo.ks.erb 是一份最小化 Kickstart 文件它决定了这台 VM 的系统形态也是后面三个脚本的生产车间磁盘与引导zerombrclearpart --all清空磁盘autopart --typelvm使用 LVM 自动分区bootloader追加串口控制台与crashkernelauto参数网络与安全network --bootproto dhcp走 DHCProot 密码由rootpw % password %注入即构建脚本的-p参数SELinux 保持--enforcing基础包集合%packages --nobase仅安装core并追加 BCC 构建所需的工具链ntp c-development development-tools rpm-development-tools ncurses-devel vim bc kexec-tools cmake libstdc-static python-netaddr python-cachetools python-futures这些包分别服务于后续步骤cmake是 BCC/LLVM 的构建系统ncurses-devel供内核make nconfig使用kexec-tools用于快速切换内核libstdc-static支撑 LLVM 静态链接构建三个 python 包是当时 BCC 的运行时依赖。%post段是核心除了关闭 NetworkManager、启用 network/ntpd、添加 rawhide 内核仓库并yum -y update外它用 heredoc 向/usr/local/bin/写入了三个脚本bpf-kernel-setup、bpf-llvm-setup、bcc-setup并赋予可执行权限——这就是文档里 SSH 进入 VM 后直接能敲这三个命令的原因。四、内核准备bpf-kernel-setup 与 BPF 内核配置文档中的第一步操作是运行bpf-kernel-setup它由 Kickstart 生成见 scripts/bpf_demo.ks.erb 中 %post 段[rootbpf-demo ~]# bpf-kernel-setup Cloning into net-next...脚本会克隆内核源码树net-next以当前运行内核的/boot/config-$(uname -r)为起点生成.config随后依次执行make nconfig弹出图形配置菜单、make bzImage、make modules、make modules_install、make install并用make INSTALL_HDR_PATH/usr/local headers_install把带bpf()系统调用的用户态头文件安装到/usr/local这正是 BCC 编译用户态代码所需的。脚本最后读取include/config/kernel.release自动生成并软链一个kexec-latest快速重启脚本。文档强调在弹出的内核配置菜单中必须确认以下选项处于正确状态General setup --- [*] Enable bpf() system call Networking support --- Networking options --- QoS and/or fair queueing --- M BPF-based classifier M BPF based action [*] enable BPF Just In Time compiler这四个菜单项对应的内核 CONFIG 分别为CONFIG_BPF_SYSCALL、CONFIG_NET_CLS_BPF、CONFIG_NET_ACT_BPF与CONFIG_BPF_JIT。仓库的 docs/kernel_config.md 对 BPF 相关内核配置做了更完整的分类归纳可作为配置时的参考清单功能域关键配置项说明基础CONFIG_BPF_SYSCALL启用bpf()系统调用文档中 * Enable bpf() system call 对应项基础CONFIG_BPF_JIT/CONFIG_HAVE_BPF_JITBPF JIT 编译器把 BPF 程序编译为原生代码以显著加速文档中 * enable BPF Just In Time compiler 对应项基础CONFIG_BPF/CONFIG_BPF_EVENTSBPF 虚拟机解释器允许将 BPF 程序挂到 kprobe/uprobe/tracepoint网络CONFIG_NET_CLS_BPF基于 BPF 的分类器用于 tc 的M BPF-based classifier网络CONFIG_NET_ACT_BPF在包上执行 BPF 代码决定放行或丢弃M BPF based action网络CONFIG_BPF_STREAM_PARSER、CONFIG_LWTUNNEL_BPF等SOCKMAP 流解析、路由后 nexthop BPF 等高级网络能力kprobesCONFIG_KPROBE_EVENTS、CONFIG_KPROBES通过 ftrace 接口动态添加跟踪事件uprobesCONFIG_UPROBE_EVENTS、CONFIG_UPROBES用户态探针TracepointsCONFIG_TRACEPOINTS、CONFIG_HAVE_SYSCALL_TRACEPOINTS内核跟踪点与系统调用进出跟踪BTFCONFIG_DEBUG_INFO_BTF等为 BCC/CO-RE 提供去重后的 BTF 类型信息保存.config后构建会继续并安装新内核。文档特别提醒新内核会把更新过的用户态头文件如bpf()系统调用声明安装到/usr/local/include头文件的正式打包是发行版相关的这也是后续 BCC 构建时使用-DCMAKE_INSTALL_PREFIX/usr并依赖/usr/local头文件的背景。五、LLVM 构建bpf-llvm-setup 与 BPF Target重启进入新内核之前文档先执行bpf-llvm-setup[rootbpf-demo ~]# bpf-llvm-setup Cloning into llvm...脚本克隆 LLVM 及llvm/tools/clang然后以如下 CMake 配置构建见 scripts/bpf_demo.ks.erb 中 %post 段cmake .. \ -DBUILD_SHARED_LIBSOFF \ -DCMAKE_BUILD_TYPERelease \ -DLLVM_ENABLE_TERMINFOOFF \ -DLLVM_TARGETS_TO_BUILDARM;CppBackend;X86;BPF \ -DCMAKE_INSTALL_PREFIX/opt/local/llvm关键点在于-DLLVM_TARGETS_TO_BUILD...;BPF——BCC 需要 Clang/LLVM 具备BPF 后端来把 C 程序编译成 eBPF 字节码-DBUILD_SHARED_LIBSOFF对应 Kickstart 里安装的libstdc-static即采用静态链接构建避免动态库路径问题安装前缀/opt/local/llvm与文档resulting libraries will be installed into /opt/local/llvm完全一致。脚本末尾还会把/opt/local/llvm/bin追加进$HOME/.bashrc的 PATH供下一步 BCC 构建使用。这里也能看到 BCC 对 LLVM 的依赖关系当前仓库的 CMakeLists.txt 中find_package(LLVM REQUIRED CONFIG)是硬性要求且ENABLE_CLANG_JIT默认 ON会进一步查找 libclang 系列库并把/opt/local/llvm/lib纳入CLANG_SEARCH搜索路径——正是这套 Demo 流程把 LLVM 装到/opt/local/llvm的原因。六、BCC 构建与测试bcc-setup最后一步用 kexec 切换进新内核后运行bcc-setup[rootbpf-demo ~]# kexec-4.1.0-rc1 Connection to 192.168.122.247 closed by remote host. Connection to 192.168.122.247 closed.kexec-4.1.0-rc1这个可执行文件名由bpf-kernel-setup依据内核版本自动生成kexec -l /boot/vmlinuz-$release --initrd/boot/initramfs-$release.img --reuse-cmdline; rebootSSH 断开即代表重启生效。重连后执行[rootbpf-demo ~]# bcc-setup Cloning into bcc... ... Linking CXX shared library libcc.so [100%] Built target bcc ... Running tests... Test project /root/bcc/build Start 1: py_test1 1/4 Test #1: py_test1 ......................... Passed 0.24 sec Start 2: py_test2 2/4 Test #2: py_test2 ......................... Passed 0.53 sec Start 3: py_trace1 3/4 Test #3: py_trace1 ........................ Passed 0.09 sec Start 4: py_trace2 4/4 Test #4: py_trace2 ........................ Passed 1.06 sec 100% tests passed, 0 tests failed out of 4bcc-setup实际完成的工作见 scripts/bpf_demo.ks.erb 中 %post 段包括安装 Python 依赖pyroute2克隆 BCC在export PATH/opt/local/llvm/bin:$PATH的环境下执行cmake .. -DCMAKE_INSTALL_PREFIX/usr make -j$numcpu其中-DCMAKE_INSTALL_PREFIX/usr与当前仓库 CMakeLists.txt 中默认安装前缀强制设为 /usr的逻辑一致make完成后输出libcc.so即核心 C 库。文档中展示的 4 个测试py_test1、py_test2、py_trace1、py_trace2来自 CTestpy_trace2至今仍是仓库测试套件的一员见 tests/python/CMakeLists.txt以sudo权限运行test_trace2.py而 CMakeLists.txt 的ENABLE_TESTS选项默认 ON控制测试是否构建。实际构建时测试数量取决于内核功能与系统环境README 中记录的是该 VM 当时的完整结果。七、配套开发辅助脚本与 Demo VM 流程同处 scripts/ 目录的还有若干开发辅助脚本它们服务于 BCC 的日常开发质量保障可作为扩展了解check-helpers.sh一致性校验脚本用 diff 对比 src/cc/libbpf.c、src/cc/compat/linux/bpf.h、src/cc/compat/linux/virtual_bpf.h、src/cc/export/helpers.h 与 docs/kernel-versions.md 中记录的 BPF helper 列表是否一致防止新增 helper 时四处文档脱节py-style-check.sh对tools、examples下 Python 代码执行pycodestyle忽略 E123/E125/E126/E127/E128/E302并检查可执行 Python 文件是否带#!/usr/bin/pythonshebangc-style-check.sh配合 git-clang-format 对 C/C 代码做 clang-format 风格检查仓库内同时提供了容器化的检查方式见 scripts/docker/。这些脚本与 Demo VM 脚本共同构成 BCC 的工程化一面前者负责可重复的环境构建后者负责代码质量与 helper 接口的一致性维护。八、小结与适用前提本文完整还原了 BCC 仓库 scripts/README.md 描述的 Fedora Demo VM 搭建流程build_bpf_demo.sh生成虚拟机 → Kickstart 预置三个脚本 →bpf-kernel-setup编译带 BPF 配置的内核 →bpf-llvm-setup构建带 BPF Target 的 LLVM →bcc-setup编译并测试 BCC。几点适用前提需要说明文档与脚本中的软件源mirror.pnl.gov的 Fedora 22 镜像、alt.fedoraproject.org的 rawhide-kernel 仓库与内核版本net-next、4.1.0-rc1等均为仓库当时的历史版本具体版本号与镜像地址以你实际运行环境为准但流程结构与内核配置项是通用的运行build_bpf_demo.sh需要宿主机装有virt-install及 libvirt默认网桥virbr0并以 root 或可 sudo 用户执行VM 内三个脚本均以 root 运行内核编译与 kexec 重启依赖 kexec-tools已在 Kickstart 包列表中BCC 对内核、LLVM 版本的适配以当前仓库实际支持范围为准生产环境建议参照 INSTALL.md 走发行版官方安装路径本文的 Demo VM 方案更适合用于隔离的实验与开发环境。【免费下载链接】bccBCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more项目地址: https://gitcode.com/gh_mirrors/bc/bcc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价