虽说centos是生产环境中的标准系统,但是从个人学习角度还是推荐ubuntu,各种软件安装包都能方便地找到,操作界面时也很漂亮。之前一直在centos7.6上折腾,自己升级内核版本,自己安装各种高版本依赖,有一段时间被折磨得放弃了很久。这次决定直接从最新版的ubuntu21.10开始学习,centos8可能也会好很多,只是我没有尝试过。
选择下载最新的桌面版就好,下载地址 https://cn.ubuntu.com/download/desktop,写这篇总结的时候版本已经更新到了22.04,下载速度还是挺快的
在《Linux内核观察技术BPF》中使用的是Vagrant安装打包好的镜像,应该会方便很多。我之前一直用vmfusion for mac,可以和共享文件夹,用起来比较习惯,所以还是在vmfusion上进行安装。
安装过程按照提示默认安装就好,建议把系统更新配置关闭,因为我在安装完之后发现内核小版本升了一级,安装的头文件可能会对不上。
apt-get install open-vm-tools
在/etc/fstab中添加:.host:/ /mnt/hgfs/ fuse.vmhgfs-fuse allow_other,default 0 0
在虚拟机-共享-共享设置,添加共享文件夹,就可以在宿主机和虚拟机之间共享文件夹了
安装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
在内核中提供了一些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下面看到很多编译完成的二进制文件
安装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
再试一下就发现没有问题了
安装的方法就是按照官方文档的教程,分成安装包和编译安装两种,这两种实测会有相互影响,各有利弊,大家可以按照需求安装。
安装包,优点:简单,几行命令完成安装;缺点:版本会旧一些,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-bpfcc
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/,可以运行一下里面的一些工具测试一下。
到这里,已经把相关的环境都安装好了,如果还有问题可以直接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