虽说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.bz22. 编译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安装的方法就是按照官方文档的教程,分成安装包和编译安装两种,这两种实测会有相互影响,各有利弊,大家可以按照需求安装。
-
安装包,优点:简单,几行命令完成安装;缺点:版本会旧一些,bcc库里的工具会有个-bpfcc后缀,运行时会有字段重复定义警告,很烦
-
编译安装,优点:工具名和教程中的名字一致,没有因为版本不适配造成的重复定义警告;缺点:麻烦
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-bpfcc3.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



