网站首页 > 文章精选 正文
bpftrace可以让开发者能够在不修改内核代码的情况下,安全且高效地对内核以及用户空间的运行时行为进行跟踪、分析和故障排查等操作,特别是系统方面的疑难杂症问题,可以说是分析利器!手机和车机系统一般都采用的arm64架构,这里主要介绍怎么快速编译arm64的bpftrace。
环境准备
首先需要云服务器,并且需要梯子,基于办公环境安全考虑,我这里推荐使用aliyun的ECS,选择流量型的,大概0.5/h,编译快的话1h就搞定了。服务器地址选择美国,不需要单独梯子了。我这里选择的是ubuntu20.04,ARM64架构的。
静态编译
由于动态库的方式比较简单,这里只介绍静态编译。文章写作日(20250122)最新版本为0.22.x,bpftrace编译方式在0.19.x发生了较大变化,version<=0.19.x官方推荐使用docker方式编译,而在version>=0.20.x官方推荐使用的是nix。编译的细节差异较大,这里也分别进行说明。编译方法已经提交到了github:bpftrace-llvm-arm64.
0.19.x版本
0.19.x版本使用的编译器llvm版本为12,bpftrace提供的docker镜像Dockerfile.ubuntu-glibc是x86架构的,需要修改成
liuxinquan/bpftrace-llvm-arm64:focal-glibc231。具体的修改patch可以查看:bpftrace-static.patch。修改后可以直接运行build.sh脚本编译,等待完成即可。
diff --git a/build-docker-image.sh b/build-docker-image.sh
index cde302bd..2b48bb1f 100755
--- a/build-docker-image.sh
+++ b/build-docker-image.sh
@@ -1,5 +1,5 @@
#!/bin/bash
set -eu
pushd docker
// 如果云服务器是arm64的,可以不用指定--platform
-docker build --network host -t bpftrace-builder-${BASE} --build-arg LLVM_VERSION=${LLVM_VERSION} -f Dockerfile.${BASE} .
+docker build --platform linux/arm64 --network host -t bpftrace-builder-${BASE} --build-arg LLVM_VERSION=${LLVM_VERSION} -f Dockerfile.${BASE} .
popd
diff --git a/build.sh b/build.sh
index 4da38426..57e53c0a 100755
--- a/build.sh
+++ b/build.sh
@@ -2,6 +2,6 @@
set -e
export BASE=focal
export LLVM_VERSION=12
-export RUN_TESTS=1
-./build-docker-image.sh
-./build-release.sh "$@"
+export RUN_TESTS=0
+#./build-docker-image.sh
+./build-static.sh "$@" // 使用静态编译脚本
diff --git a/docker/Dockerfile.ubuntu-glibc b/docker/Dockerfile.ubuntu-glibc
index ee346908..3fb15038 100644
--- a/docker/Dockerfile.ubuntu-glibc
+++ b/docker/Dockerfile.ubuntu-glibc
@@ -1,6 +1,6 @@
ARG BASE="bionic"
ARG LLVM_VERSION="12"
// 修改成arm64的镜像
-FROM quay.io/iovisor/bpftrace-llvm:${BASE}_${LLVM_VERSION}
+FROM liuxinquan/bpftrace-llvm-arm64:focal-glibc231
0.21.x版本
最新版本的bpftrace要求llvm大于等于13,所以我提供了一个llvm14的镜像。编译脚本在bpftrace-arm64-0.21.x文件夹中build-static.sh。 对其中的文件进行说明下:
// 1.基础镜像bpftrace-llvm-arm64对应的dockerfile文件,编译不需要,只是提供参考。
Dockerfile-llvm14.arm64_focal
// 2.编译使用的dockerfile文件
Dockerfile-static.arm64
// 3.编译入口
build-static.sh
// 4. docker容器中用于真正编译bpftace脚本
make.sh
问题
疑问1:为啥要区分0.19和0.21
官方提供的编译方式变了,0.21推荐使用nix,而nix编译出来的二进制是基于alpine。采用的musl libc,而非常用的glibc。
疑问2:为啥提供了个不同的docker镜像。
liuxinquan/bpftrace-llvm-arm64和
liuxinquan/bpftrace-llvm14-arm64使用的llvm版本不一样,前者是12,后者是14,不同bpftrace版本的要求。每个镜像有2个标签focal-glibc231和jammy-glibc235,是由于glibc兼容性问题,glibc231对应的是glibc-2.31的版本,如果你的系统大于等于glibc2.31就可以使用,如果低于就会报找不到libc.so。而glibc235对应的版本为glibc-2.35。推荐使用glibc231,能兼容更多的系统。如果你的系统glibc版本低于2.31,可以尝试使用patchelf工具修改bpftrace中的libc版本(本人没有尝试过)。
疑问3:为啥静态链接生成的bpftrace还存在少量的so,如libc.so.6
系统中不存在这些静态库,并且这些库是系统必须的,不存在缺少情况,为了减少bpftrace的size,也可以使用动态库,不影响使用。
其他疑问可以留言
- 上一篇: 事务隔离级别
- 下一篇: 还在用Jenkins?试试这款面向DevOps的自动化部署工具吧,贼带劲
猜你喜欢
- 2025-03-14 《磁带妖怪》图文攻略 磁带妖怪图鉴及进化条件
- 2025-03-14 XV6 操作系统入门系列-01-环境配置
- 2025-03-14 还在用Jenkins?试试这款面向DevOps的自动化部署工具吧,贼带劲
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)