Skip to content

Commit 88eece2

Browse files
authored
Merge pull request #19 from OpenCloudOS/dev
Dev
2 parents 7f9657c + 0c1efca commit 88eece2

11 files changed

Lines changed: 145194 additions & 100 deletions

File tree

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
__pycache__
33
*.pyc
44
output
5-
vmlinux.h
65
*.skel.h
76
*.o
87
.*

README.md

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,42 +25,36 @@
2525

2626
## 二、安装方法
2727

28-
nettrace是采用C语言编写的基于eBPF(libbpf)的命令行工具,在使用和安装时可以用编译好的RPM包和二进制程序。
28+
nettrace是采用C语言编写的基于eBPF(libbpf)的命令行工具,在使用和安装时可以用编译好的RPM包和二进制程序。**注意**:本工具目前仅在`4.14`及以上的内核版本上进行过兼容性测试,因此请确保当前的系统所使用的的内核版本在`4.14`以上。
2929

30-
## 2.1 系统要求
30+
### 2.1 RPM/DEB安装
3131

32-
**注意**:对于支持BTF特性(内核版本 >= 5.3,并且配置了`CONFIG_DEBUG_INFO_BTF=y`内核配置项)的内核,可以直接下载[releases](https://github.com/OpenCloudOS/nettrace/releases)中编译好的`nettrace-xxx-1.btf.x86_64.rpm``nettrace-xxx-1.btf.x86_64.deb`安装包进行安装使用,或者下载包含了二进制程序的`nettrace-xxx-1.btf.tar.bz2`压缩包;对于不支持BTF的低版本的内核,需要在对应的系统上手动编译后才能使用。
33-
34-
### 2.2 RPM/DEB安装
35-
36-
对于TencentOS系统,可以直接使用yum命令来进行在线安装:
32+
对于支持BTF特性(内核版本 >= 5.3,并且配置了`CONFIG_DEBUG_INFO_BTF=y`内核配置项)的内核,可以直接下载[releases](https://github.com/OpenCloudOS/nettrace/releases)中编译好的`nettrace-xxx-1.btf.x86_64.rpm``nettrace-xxx-1.btf.x86_64.deb`安装包进行安装使用;对于不支持BTF的低版本的内核,需要在对应的系统上手动编译后才能使用。对于TencentOS系统,可以直接使用yum命令来进行在线安装:
3733

3834
```shell
3935
sudo yum install nettrace
4036
```
4137

4238
也可以直接从[releases](https://github.com/OpenCloudOS/nettrace/releases)中下载对应的RPM/DEB安装包,手动进行安装。
4339

44-
### 2.3 二进制下载
40+
### 2.2 二进制下载
4541

46-
直接从[releases](https://github.com/OpenCloudOS/nettrace/releases)下载编译好的二进制包也是可以的,[releases](https://github.com/OpenCloudOS/nettrace/releases)中的`tar.bz2`格式的压缩包即为二进制程序。由于里面的工具采用的都是静态编译的方式,因此在内核版本支持的情况下,都是可以直接下载解压后运行的。**再次提醒**:对于不支持BTF的内核版本,最好在对应的环境上编译后使用
42+
直接从[releases](https://github.com/OpenCloudOS/nettrace/releases)下载编译好的二进制包也是可以的,[releases](https://github.com/OpenCloudOS/nettrace/releases)中的`tar.bz2`格式的压缩包即为二进制程序。由于里面的工具采用的都是静态编译的方式,因此在内核版本支持的情况下,都是可以直接下载解压后运行的。**再次提醒**:对于不支持BTF的内核版本,需要手动编译才能使用
4743

48-
### 2.4 手动编译
44+
### 2.3 手动编译
4945

50-
下面来介绍下如何在Centos、ubuntu等环境上进行nettrace工具的手动编译和安装。本工具目前在4.14/4.15/5.4/5.10/5.18等版本的内核上均进行过适配和测试,更低版本的内核暂未进行适配。
46+
下面来介绍下如何在Centos、ubuntu等环境上进行nettrace工具的手动编译和安装。本工具目前在4.14/4.15/5.4/5.10/5.18等版本的内核上均进行过适配和测试,更低版本的内核暂未进行适配。对于低版本的发行版,如ubuntu18,建议使用**基于docker**的方式来进行编译。
5147

52-
#### 2.4.1 依赖安装
48+
#### 2.3.1 依赖安装
5349

54-
本工具在编译的时候依赖于`libelf``libbpf``bpftool`组件,`clang``gcc`编译工具。其中,bpftool二进制程序已经直接预编译好放到源码包的script目录中,因此可以不安装。但是对于版本较高的内核,请尽量从软件仓库安装该工具。
55-
56-
在编译过程中,会优先尝试从`kernel-headers`头文件进行编译。如果头文件不存在(即目录`/lib/modules/$(uname -a)/build`不存在),则会尝试从BTF中构建`vmlinux.h`进行编译。需要注意:nettrace工具(即src目录中的代码)的编译必须要使用`kernel-headers`的方式,因为它用到的一些结构体在内核模块里,BTF中是找不到的。
50+
本工具在编译的时候依赖于`libelf``libbpf``bpftool`组件,`clang``gcc`编译工具。对于不支持BTF的内核,还需要安装`kernel-headers`头文件,可以通过查看目录`/lib/modules/$(uname -a)/build`是否存在来判断`headers`是否已经被安装了。
5751

5852
##### ubuntu
5953

6054
对于ubuntu系统,使用以下命令安装依赖:
6155

6256
```shell
63-
sudo apt install libelf-dev libbpf-dev linux-headers-`uname -r` clang llvm gcc linux-tools-`uname -r` linux-tools-generic
57+
sudo apt install libelf-dev libbpf-dev linux-headers-`uname -r` clang llvm gcc linux-tools-`uname -r` linux-tools-generic -y
6458
```
6559

6660
注意:如果当前发行版(如ubuntu16,ubuntu18)不支持libbpf-dev,请按照下文提示手动安装libbpf-0.2版本。同时,clang版本要在10+(低版本的测试有问题,暂时还没搞定),ubuntu18+直接安装clang-10 llvm-10即可,ubuntu16需要按照[这里](https://segmentfault.com/a/1190000040827790)的教程安装更新版本的clang。
@@ -70,7 +64,7 @@ sudo apt install libelf-dev libbpf-dev linux-headers-`uname -r` clang llvm gcc l
7064
对于centos用于,使用以下命令来安装依赖:
7165

7266
```shell
73-
sudo yum install elfutils-devel elfutils-devel-static libbpf-devel libbpf-static kernel-headers clang llvm bpftool
67+
sudo yum install elfutils-devel elfutils-devel-static libbpf-devel libbpf-static kernel-headers kernel-devel clang llvm bpftool -y
7468
```
7569

7670
请确保安装的clang版本在10+,如果版本较低请手边编译安装较高版本。在编译过程中,如果因为libbpf导致了编译失败,或者当前发行版没有libbpf可以安装,那么请点击[这里](https://github.com/libbpf/libbpf/releases)下载安装较新版本的libbpf:
@@ -82,7 +76,7 @@ cd libbpf-0.2/src
8276
make install
8377
```
8478

85-
#### 2.4.2 编译
79+
#### 2.3.2 编译
8680

8781
直接下载nettrace的源码即可进行编译安装:
8882

@@ -92,47 +86,42 @@ cd nettrace
9286
make all
9387
```
9488

95-
**注意**对于不支持BTF的5.X版本的内核,在编译的时候需要加参数`COMPAT=1`,如下所示(4.X版本的内核会自动启用该参数)
89+
**注意**对于不支持BTF的内核(内核版本低于5.3),在编译的时候需要加参数`COMPAT=1`,如下所示:
9690

9791
```shell
9892
make COMPAT=1 all
9993
```
10094

101-
启用该参数,eBPF程序会以BPF_PROBE_READ的方式来读取数据;否则,eBPF程序会以BPF_CORE_READ的方式来读取。
102-
103-
也可以单独编译其中的某个子工具,例如只编译nettrace命令:
95+
启用该参数,eBPF程序会以BPF_PROBE_READ的方式来读取数据;否则,eBPF程序会以BPF_CORE_READ的方式来读取。可以使用KERNEL来手动指定要使用的内核源码(内核头文件):
10496

10597
```shell
106-
make -C src all
98+
make KERNEL=/home/ubuntu/kernel COMPAT=1 all
10799
```
108100

109-
可以使用KERNEL来手动指定要使用的内核源码(内核头文件):
101+
对于发行版版本较低,难以安装高版本clang的情况下,可以基于docker来进行代码的编译,具体可参考[2.4](#2.4-基于docker编译)章节来进行安装。
110102

103+
同时,对于`ubuntu 16.04/ubuntu 18.04`系统,其内核似乎存在BUG,即其使用的内核版本实际为4.15.18,uname看到的却是4.15.0。这导致了加载eBPF程序的时候内核版本不一致,无法加载。因此对于这种情况,可以使用KERN_VER参数来手动指定内核版本(计算方式为:`(4<<16) + (15<<8) + 18`):
111104
```shell
112-
make KERNEL=/home/ubuntu/kernel all
105+
make KERN_VER=266002 COMPAT=1 all
113106
```
114107

115-
对于发行版版本较低,难以安装高版本clang的情况下,可以尝试在高版本上通过指定KERNEL来为低版本的系统编译工具。由于是静态编译,因此编译的二进制是可以在低版本上运行起来的。
108+
#### 2.3.3 打包
116109

117-
也可以使用VMLINUX来指定BTF的源文件(即不使用默认的`/sys/kernel/btf/vmlinux`路径):
110+
使用命令`make rpm`可制作rpm包;使用命令`make pack`可制作二进制包(二进制程序打包到压缩包中,默认存放路径为output文件夹)。
118111

119-
```shell
120-
make VMLINUX=/home/ubuntu/kernel/vmlinux all
121-
```
112+
### 2.4 基于docker编译
122113

123-
可以手动指定`bpftool`命令的路径:
124-
```shell
125-
make BPFTOOL=/usr/lib/linux-tools/5.15.0-43-generic/bpftool all
126-
```
114+
对于**支持BTF**的内核,无需安装任何依赖,可以直接使用以下命令来进行nettrace的编译,其中:`<nettrace path>`要替换成nettrace代码的绝对路径:
127115

128-
同时,对于`ubuntu 16.04/ubuntu 18.04`系统,其内核似乎存在BUG,即其使用的内核版本实际为4.15.18,uname看到的却是4.15.0。这导致了加载eBPF程序的时候内核版本不一致,无法加载。因此对于这种情况,可以使用KERN_VER参数来手动指定内核版本(计算方式为:`(4<<16) + (15<<8) + 18`):
129116
```shell
130-
make KERN_VER=266002 all
117+
docker run -it --rm --network=host --privileged -v <nettrace path>:/root/nettrace -v /lib/modules/:/lib/modules/ -v /usr/src/:/usr/src/ imagedong/nettrace-build make -C /root/nettrace/ all
131118
```
132119

133-
#### 2.4.3 打包
120+
对于**不支持BTF**的系统,这需要先安装`kernel-headers`软件包,如上面的手动编译里面所说的。ubuntu系统使用命令`apt install linux-headers-$(uname -r) -y`进行安装;centos使用命令`yum install kernel-headers kernel-devel -y`进行安装。然后使用下面的命令进行编译:
134121

135-
使用命令`make rpm`可制作rpm包;使用命令`make pack`可制作二进制包(二进制程序打包到压缩包中,默认存放路径为output文件夹)。
122+
```shell
123+
docker run -it --rm --network=host --privileged -v <nettrace path>:/root/nettrace -v /lib/modules/:/lib/modules/ -v /usr/src/:/usr/src/ imagedong/nettrace-build make -C /root/nettrace/ COMPAT=1 all
124+
```
136125

137126
## 三、使用方法
138127

@@ -573,4 +562,3 @@ begin trace...
573562
[2025.235967] TCP: 162.241.189.135:46756 -> 172.27.0.6:22 seq:1304582308, ack:1354418612, flags:AP, tcp_v4_do_rcv+0x70
574563
```
575564
576-

common.mk

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ include $(ROOT)/script/arch.mk
1818

1919
HEADERS := $(if $(KERNEL),$(KERNEL),/lib/modules/$(shell uname -r)/build/)
2020
NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
21-
BTF := $(if $(VMLINUX),$(VMLINUX),/sys/kernel/btf/vmlinux)
2221
export HEADERS
2322

2423
USERINCLUDE := \
@@ -42,28 +41,20 @@ KERNEL_CFLAGS += $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
4241
-Wno-unknown-warning-option -Wno-frame-address
4342

4443
cmd_download = @if [ ! -f $(1) ]; then wget -O $(1) $(REMOTE_ROOT)/$(2); fi
45-
cmd_exist = $(if $(wildcard $(1)),$(2),$(3))
46-
cmd_or_exist = $(call cmd_exist,$(1),$(1),$(2))
47-
ifeq ("$(wildcard $(HEADERS))$(wildcard $(BTF))","")
48-
$(error BTF is not found in your system, please install kernel headers)
49-
endif
5044

51-
ifeq ($(if $(KERNEL),$(wildcard $(KERNEL)),"pass"),)
52-
$(error kernel path not exist)
45+
ifdef KERN_VER
46+
CFLAGS += -DKERN_VER=$(KERN_VER)
5347
endif
5448

55-
ifeq ($(if $(VMLINUX),$(wildcard $(VMLINUX)),"pass"),)
56-
$(error vmlinux path not exist)
49+
ifdef COMPAT
50+
ifeq ($(wildcard $(HEADERS)),)
51+
$(error kernel headers not exist in COMPAT mdoe, please install it)
5752
endif
58-
59-
# preferred to compile from kernel headers, then BTF
60-
mode := $(if $(VMLINUX),'btf',$(call cmd_exist,$(HEADERS),'kernel','btf'))
61-
ifeq ($(mode),'btf')
62-
kheaders_cmd := ln -s vmlinux.h kheaders.h
63-
kheaders_dep := vmlinux.h
64-
else
6553
kheaders_cmd := ln -s vmlinux_header.h kheaders.h
54+
CFLAGS += -DCOMPAT_MODE
6655
BPF_CFLAGS += $(KERNEL_CFLAGS)
56+
else
57+
kheaders_cmd := ln -s ../shared/bpf/vmlinux.h kheaders.h
6758
endif
6859

6960
ifndef BPFTOOL
@@ -74,13 +65,10 @@ else
7465
endif
7566
endif
7667

77-
vmlinux.h:
78-
$(BPFTOOL) btf dump file $(BTF) format c > vmlinux.h
79-
80-
kheaders.h: $(kheaders_dep)
68+
kheaders.h:
8169
$(call kheaders_cmd)
8270

83-
progs/%.o: progs/%.c kheaders.h
71+
progs/%.o: progs/%.c $(BPF_EXTRA_DEP)
8472
clang -O2 -c -g -S -Wall -Wno-pointer-sign -Wno-unused-value \
8573
-Wno-incompatible-pointer-types-discards-qualifiers \
8674
-fno-asynchronous-unwind-tables \

legacy/.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,3 @@ build
22
dist
33
*.spec
44
nettrace
5-
nettrace.c

0 commit comments

Comments
 (0)