Linux编译安装bcc tools
发布时间:2023-05-15 10:28:29.501 文章来源:AiSoftCloud 浏览次数:1748 下载次数:1 

111222

BCC TOOLS简介

BCC是基于eBPF的一套内核探测工具,如cachestat可以探测Linux文件系统缓存命中率和状态。

虽然官方文档中给出了使用软件包的方式直接安装,但是安装好后部分工具无法正常使用。

参照文档从源码安装是最稳妥的做法。

参考:https://blog.csdn.net/weixin_42306122/article/details/104935911

安装BCC TOOLS

有两种安装方法:源码编译安装及apt安装

参考:https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu---source

安装前必须删除旧的bcc tools:

  1. sudo apt-get autoremove bpfcc-tools linux-headers-$(uname -r) python-bpfcc libbpfcc

二进制安装(apt安装)

  1. sudo apt-get install bpfcc-tools linux-headers-$(uname -r) python-bpfcc libbpfcc

测试

  1. sudo /usr/share/bcc/tools/cachestat 1 3

源码安装

github地址:https://github.com/iovisor/bcc.git

安装依赖

  1. sudo apt-get -y install zip bison build-essential cmake flex git libedit-dev \
  2. libllvm6.0 llvm-6.0-dev libclang-6.0-dev python zlib1g-dev libelf-dev libfl-dev python3-setuptools \
  3. liblzma-dev arping netperf iperf

上面是官方给出的,由于llvm和clang版本太低(6.0),编译会报错:

  1. /tmp/bcc/src/cc/bpf_module.cc: In member function 'virtual void ebpf::MyMemoryManager::notifyObjectLoaded(llvm::ExecutionEngine*, const llvm::object::ObjectFile&)':
  2. /tmp/bcc/src/cc/bpf_module.cc:117:46: error: no matching function for call to 'llvm::object::SectionRef::getName() const'
  3. 117 | auto sec_name = section.get()->getName();

若llvm和clang版本是10,也会报错:

  1. /usr/bin/ld: /usr/lib/llvm-10/lib/libclangCodeGen.a(BackendUtil.cpp.o): in function `(anonymous namespace)::EmitAssemblyHelper::EmitAssemblyWithNewPassManager(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream> >)':
  2. (.text._ZN12_GLOBAL__N_118EmitAssemblyHelper30EmitAssemblyWithNewPassManagerEN5clang13BackendActionESt10unique_ptrIN4llvm17raw_pwrite_streamESt14default_deleteIS5_EE+0x1f15): undefined reference to `getPollyPluginInfo()'
  3. collect2: error: ld returned 1 exit status

根据issue4008,使用12版的llvm和clang:

更新apt源:

  1. printf "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-12 main" |sudo tee /etc/apt/sources.list.d/llvm-toolchain-bionic-12.list
  2. wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key |sudo apt-key add -
  3. sudo apt-get update
  4. sudo apt-get install llvm-12

安装llvm及clang:

  1. sudo apt-get install llvm-12
  2. sudo apt-get install libclang-12-dev

安装完后必须将python切换成python3:

  1. sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 100
  2. # sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 99

最后一个数字100表示优先级,数字越大优先级越高,比如上面两行命令同时输入的的话,最终的python使用的是python3,而不是python2.7,如果要切换回python2.7,将后面的数字调大即可(比如设置成101,大于python3的100)。

编译

  1. git clone https://github.com/iovisor/bcc.git
  2. cd bcc
  3. mkdir build
  4. cd build
  5. cmake ..
  6. make -j5
  7. sudo make install
  8. cmake -DPYTHON_CMD=python3 ..
  9. pushd src/python/
  10. make -j5
  11. sudo make install
  12. popd

安装好后将包加入到python路径:

  1. export PYTHONPATH=/usr/lib/python3/dist-packages:${PYTHONPATH}

测试

  1. cd /usr/share/bcc/tools
  2. sudo ./cachestat 1 3

如果报以下错误:

  1. (base) yangxiaokai@noa-Precision-Tower-7910:/usr/share/bcc/tools$ sudo ./cachestat 1 3
  2. Traceback (most recent call last):
  3. File "./cachestat", line 22, in <module>
  4. from bcc import BPF
  5. File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 27, in <module>
  6. from .libbcc import lib, bcc_symbol, bcc_symbol_option, bcc_stacktrace_build_id, _SYM_CB_TYPE
  7. File "/usr/lib/python3/dist-packages/bcc/libbcc.py", line 20, in <module>
  8. lib.bpf_module_create_b.restype = ct.c_void_p
  9. File "/usr/lib/python3.6/ctypes/__init__.py", line 361, in __getattr__
  10. func = self.__getitem__(name)
  11. File "/usr/lib/python3.6/ctypes/__init__.py", line 366, in __getitem__
  12. func = self._FuncPtr((name_or_ordinal, self))
  13. AttributeError: /usr/lib/x86_64-linux-gnu/libbcc.so.0: undefined symbol: bpf_module_create_b

解决方法:将源码编译的libbcc.so等动态库拷贝到python3的库中:

参考:AttributeError: /lib/x86_64-linux-gnu/libbcc.so.0: undefined symbol: bpf_module_create_b

  1. sudo cp -r build/src/cc/* /usr/lib/python3/dist-packages/bcc/

解决后继续运行sudo ./cachestat 1 3命令,如果报以下错误:

  1. Traceback (most recent call last):
  2. File "./cachestat", line 22, in <module>
  3. from bcc import BPF
  4. File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 27, in <module>
  5. from .libbcc import lib, bcc_symbol, bcc_symbol_option, bcc_stacktrace_build_id, _SYM_CB_TYPE
  6. ImportError: dynamic module does not define module export function (PyInit_libbcc)

一般是环境问题,重新安装

参考文章

Ubuntu 18.04 LTS上编译安装BCC

安装bcc、cachetop、cachestat

github安装文档地址

更多文章可关注公众号
aisoftcloud