LTTng在精简环境中部署的成功实践

内核编译

* 添加交叉编译环境变量 ARCH(板子arch下文件夹名) PATH(gcc bin系列文件) CROSS_COMPILE(gcc前缀带“-”)
* make defconfig
* 参考lttng module的README。使用./script/build-in脚本在内核源码中插入LTTng support编译选项。
* 开启menuconfig 打开README中提到的选项。Tracepoints似乎是通过界面中Tracer-- kconfig中Ftrace开启。
* 替换目标板中的Image

ko编译
更改内核后,对应的内核模块大概率(基本上就是)要重新编译,特别是对于加Trace这种操作。不重新编译的话,遭遇到启动过程中脚本加载模块指向非法空地址之类的错误,启动失败。

* 修改环境变量,参见其Makefile,修改交叉编译工具环境变量及内核源码top地址。如KERNELDIR
* make
* 复制对应的ko到目标板中目标地址,让启动脚本insmod。

尝试启动

* 电源重新上下电,如果能正常启动,可以zcat /proc/config.gz |grep LTTNG 查看是否成功运行并且带有想要开启的编译选项。如果有strace 或者perf之类的也可以查看已经开启的Tracepoint。增强自己的信心。

编译移植LTTng

* 找一块环境齐全的Arm板子(架构一样就行),在里面愉快的./configure make make install ldconfig 把lttng 的tools和ust及5个依赖库都装完。
* 如果什么都不改,那么会全部装在/usr/local/下面。把整个local都复制到目标板里。
* 去目标板的/usr下看看,发现local已经裁剪掉了,ok,建立软链接指向刚复制进去的local/。
* 加上环境变量 PATH LD_LIBRARY_PATH之类的。
* 尝试使用lttng-sessiond , lttng list -k
* 如果可以显示内核的tracepoint 恭喜你!

无法追踪内核问题解决failed to load kmod library resourcesunable to list kernel events: kernel tracer not available

* 通过查log打印出处的源码,我发现原因可能是在初始化tracer的第一步,调用了modprobe之类的工具,从标准的路径/lib/modules/内核版本号/下面加载需要的内核模块,哪怕我把LTTng编译进了内核也有这一步。
* 然而这个文件夹被精简掉了,所以找不懂kmod那一套文件,所以启动失败了。
* 解决方法是,在上文中的内核源码里。make modules_install 到INSTALL_MOD_PATH。然后把整个目录下的安装好的目录复制到对应的目标板地址,注意到source和build这两个指向内核源码的软链接需要去掉。否则cp 操作会把内核源码也往目标地址复制。
* 再次尝试lttng-sessiond , lttng list -k终于成功了。

猜你喜欢

转载自blog.csdn.net/kuno_y/article/details/128073744