ubuntu21.10搭建ebpf环境,BCC和bpftrace

2023-11-18

1. 安装虚拟机

虽说centos是生产环境中的标准系统,但是从个人学习角度还是推荐ubuntu,各种软件安装包都能方便地找到,操作界面时也很漂亮。之前一直在centos7.6上折腾,自己升级内核版本,自己安装各种高版本依赖,有一段时间被折磨得放弃了很久。这次决定直接从最新版的ubuntu21.10开始学习,centos8可能也会好很多,只是我没有尝试过。

1.1. 下载镜像

选择下载最新的桌面版就好,下载地址 https://cn.ubuntu.com/download/desktop,写这篇总结的时候版本已经更新到了22.04,下载速度还是挺快的

1.2 安装虚拟机

在《Linux内核观察技术BPF》中使用的是Vagrant安装打包好的镜像,应该会方便很多。我之前一直用vmfusion for mac,可以和共享文件夹,用起来比较习惯,所以还是在vmfusion上进行安装。

安装过程按照提示默认安装就好,建议把系统更新配置关闭,因为我在安装完之后发现内核小版本升了一级,安装的头文件可能会对不上。

1.3 基础配置

1.3.1 与物理机间共享文件夹

apt-get install open-vm-tools
在/etc/fstab中添加:.host:/    /mnt/hgfs/    fuse.vmhgfs-fuse allow_other,default    0    0

在虚拟机-共享-共享设置,添加共享文件夹,就可以在宿主机和虚拟机之间共享文件夹了

1.3.2 基础工具安装

安装ssh

sudo apt-get update
sudo apt-get install openssh-server
这样就可以从宿主机ssh到虚拟机了

安装vim

apt-get install vim
配置./usr/share/vim/.vimrc:
			set nocompatible
			set backspace=indent,eol,start
			set number
			set ruler
			set showcmd
			set history=1000
			set showmatch
			set autoindent
			set cindent
			syntax enable
			syntax on
			set t_Co=256
			set ignorecase
			set mouse=a
			set tabstop=4
			set shiftwidth=4
			set autoindent
			set softtabstop=4
			set smarttab
			set expandtab
			set encoding=utf-8
			set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
			set ff=unix
			filetype on
			filetype indent on
			filetype plugin on
			filetype plugin indent on

安装git

apt-get install git
git config --global core.editor "vim"   设置git使用vim作为默认编辑器
git config --global user.name "username"
git config --global user.email useremail@qq.com 
git添加远程仓库的密钥大家可以搜索下教程

网络工具

apt-get install net-tools iproute2

基础编译工具

apt-get install build-essential cmake golang-go

安装内核源码

apt-cache search linux-source   查看有哪些版本的资源
如果提示没有apt-cache 
apt-get install apt-cache
uname -r 	查看内核版本,我这里是5.13.0-40-generic
sudo apt-get install linux-source-对应版本   选择和你的内核版本对应的源码
下载目录在/usr/src/下面, 是一个bz2压缩包,解压之后就可以了
tar -jxvf linux-source-xx.tar.bz2

2. 编译BPF samples

在内核中提供了一些BPF的例子,我们进行编译学习

安装依赖,这里安装的是最新的llvm-13,clang-13,安装llvm-11在测试中是无法完成后面的编译的

apt install libncurses5-dev flex bison libelf-dev binutils-dev libssl-dev
apt-get install clang llvm
llc -version //查看是否成功

编译例子,安装过程在samples/bpf/README.md中也有,推荐先看一遍

https://elixir.bootlin.com/linux/v5.13/source/samples/bpf/README.rst

cd kernel_src/    	进入源码的目录下
make defconfig
make headers_install
make M=samples/bpf

完成后可以在samples/bpf下面看到很多编译完成的二进制文件

3. 编译bpftool

安装bpftool

apt-get install -y linux-tools-$(uname -r)
bpftool version

但是我又重新编译安装了一遍,因为在使用时发现

sudo bpftool prog dump jited id 21
Error: No libbfd support

可能是安装包在编译时没有开启libbfd支持,所以我们重新编译下

# 确认内核版本
uname -r
# 安装依赖,如果有重复安装的会直接跳过的
apt install binutils-dev libelf-dev libcap-dev
# 进入内核源码目录
cd linux-source-xxx/tools
make -C  bpf/bpftool/
#执行make的时候会打印出开启的选项
#Auto-detecting system features:
#...                        libbfd: [ on  ]
#...        disassembler-four-args: [ on  ]
#...                          zlib: [ on  ]
#...                        libcap: [ on ]
#...               clang-bpf-co-re: [ on ]
make install

再试一下就发现没有问题了

3. 安装BCC和bpftrace

安装的方法就是按照官方文档的教程,分成安装包和编译安装两种,这两种实测会有相互影响,各有利弊,大家可以按照需求安装。

  1. 安装包,优点:简单,几行命令完成安装;缺点:版本会旧一些,bcc库里的工具会有个-bpfcc后缀,运行时会有字段重复定义警告,很烦

  2. 编译安装,优点:工具名和教程中的名字一致,没有因为版本不适配造成的重复定义警告;缺点:麻烦

3.1 安装包

https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu—binary

https://github.com/iovisor/bpftrace/blob/master/INSTALL.md#ubuntu-packages

sudo apt-get install bpfcc-tools linux-headers-$(uname -r)
sudo apt-get install -y bpftrace

bcc的例子默认目录在/usr/sbin/

bpftrace的例子安装目录在/usr/sbin/

运行bcc例子时如果报错

from bcc import BPF
ImportError: No module named bcc

一般是因为系统中安装了python3,默认运行时使用的是python2,在运行命令前指定下

python3 execsnoop-bpfcc

3.2 编译安装

https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu—source

bcc

检查自己安装的llvm版本

dpkg -l | grep llvm

安装依赖,我把教程里的llvm-11换成和我自己版本一致的llvm-13

sudo apt install -y bison build-essential cmake flex git libedit-dev libllvm13 llvm-13-dev libclang-13-dev python zlib1g-dev libelf-dev libfl-dev python3-distutils
sudo apt-get -y install luajit luajit-5.1-dev #非必需的

编译

git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
cmake ..
make
sudo make install
cmake -DPYTHON_CMD=python3 .. # build python3 binding
pushd src/python/
make -j 2
sudo make install
popd

默认安装目录在 /usr/share/bcc/tools,可以运行一下里面的一些工具测试一下。

bpftrace

注意:bpftrace是依赖bcc的,所以这两个必须要用一致的安装方式,如果此时运行bpftrace会报错

Segmentation fault

这是因为我们编译安装bcc之后,libbcc库改变了,如果之前通过安装包直接安装过bcc库,需要卸载掉相关的依赖,重新编译安装bpftrace。这里我把llvm-12改成了我自己的版本llvm-13.

sudo apt-get remove libbpf-dev libbpfcc libbpfcc-dev bpfcc-tools

sudo apt-get install -y \
  bison \
  cmake \
  flex \
  g++ \
  git \
  libelf-dev \
  zlib1g-dev \
  libfl-dev \
  systemtap-sdt-dev \
  binutils-dev \
  libcereal-dev \
  llvm-13-dev \
  llvm-13-runtime \
  libclang-13-dev \
  clang-13 \
  libgtest-dev \
  libgmock-dev \
  asciidoctor
git clone https://github.com/iovisor/bpftrace
mkdir bpftrace/build; cd bpftrace/build;
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j2
sudo make install

默认安装目录在/usr/local/share/bpftrace/tools/,可以运行一下里面的一些工具测试一下。

4. 结束

到这里,已经把相关的环境都安装好了,如果还有问题可以直接Google搜索一下。理论上新版的系统的话是问题比较少的。

有一些问题的原因可能很奇怪,比如之前我手动编译安装gcc时提示

collect2: error: ld returned 1 exit status

查了半天以为是什么依赖问题,结果是因为虚拟机磁盘空间太小,导致安装空间不足了,把虚拟机扩了一下就好了

在运行一个bpf程序时提示

tracefs not mounted?

但是查看一下确实有这个目录的

mount  |grep trace

最后发现是没有使用root权限执行

https://www.ebpf.top/post/ubuntu_2104_bpf_env/

https://github.com/nevermosby/linux-bpf-learning/tree/master/bpf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ubuntu21.10搭建ebpf环境,BCC和bpftrace 的相关文章

随机推荐