Страница 3 из 4
Berkeley Packet Filter (BPF)
Добавлено: 24 июл 2023, 00:41
Olej
Olej писал(а): ↑23 июл 2023, 11:46
Глава 2..Запуск.программ.BPF
Написание программ BPF
Но я любые рассказки
без программного кода не воспринимаю...
Olej писал(а): ↑23 июл 2023, 15:15
Все примеры кода к книге - здесь:
Olej писал(а): ↑23 июл 2023, 15:15
если книга написана в 2018г., то примеры кодов переработана на июнь 2022г., т.е. всего годичной давности.
Но если вы подумаете, что примеры или с книги, или с GIT репозитория - соберутся и выполнятся, то вы глубоко заблуждаетесь.
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/eBPF/linux-observability-with-bpf/code/chapter-2/hello_world$ make bpfload
make: *** Нет правила для сборки цели «/kernel-src/samples/bpf/bpf_load.c», требуемой для «build». Останов.
Berkeley Packet Filter (BPF)
Добавлено: 24 июл 2023, 00:48
Olej
Olej писал(а): ↑24 июл 2023, 00:41
Но если вы подумаете, что примеры или с книги, или с GIT репозитория - соберутся и выполнятся, то вы глубоко заблуждаетесь.
Important note for readers (Jan 30th 2022)
Они отрабатывают свои примеры в достаточно жёстких размещениях:
1).
IMPORTANT NOTE: The examples assume that you clone the repo in your home folder ~/linux-observability-with-bpf, if you didn't do please remember to change your commands!
Ладно, перенесём, чтобы не переписывать Makefile.
Код: Выделить всё
[olej@xenix eBPF]$ mv linux-observability-with-bpf ~/
Код: Выделить всё
[olej@xenix ~]$ ls -l ~/linux-observability-with-bpf/code
итого 0
drwxrwxr-x 1 olej olej 22 июл 23 15:09 chapter-2
drwxrwxr-x 1 olej olej 66 июл 23 15:09 chapter-3
drwxrwxr-x 1 olej olej 162 июл 23 15:09 chapter-4
drwxrwxr-x 1 olej olej 86 июл 23 15:09 chapter-6
drwxrwxr-x 1 olej olej 48 июл 23 15:09 chapter-7
drwxrwxr-x 1 olej olej 14 июл 23 15:09 chapter-8
2). Они предполагают, что предварительно будет создан
вручную каталог /kernel-src, с исходными кодами ядра, для примеров bpf... Куда загружен код соответствующей версии кода ядра
Berkeley Packet Filter (BPF)
Добавлено: 24 июл 2023, 00:53
Olej
Olej писал(а): ↑24 июл 2023, 00:48
Они предполагают, что предварительно будет создан вручную каталог /kernel-src, с исходными кодами ядра, для примеров bpf... Куда загружен код соответствующей версии кода ядра
Мне, как оказалось, по их не очень внятным инструкциям в GIT, проще это проделать в Fedora:
Код: Выделить всё
[olej@xenix /]$ lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: Fedora
Description: Fedora release 38 (Thirty Eight)
Release: 38
Codename: ThirtyEight
Код: Выделить всё
[olej@xenix own.BOOKs]$ uname -r
6.3.12-200.fc38.x86_64
Код ядра беру здесь:
https://cdn.kernel.org/pub/linux/kernel/
https://cdn.kernel.org/pub/linux/kernel/v6.x/
Код: Выделить всё
olej@xenix ~]$ cd /tmp
[olej@xenix tmp]$ time wget -c https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.12.tar.gz -O - | tar -xz
--2023-07-23 19:38:55-- https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.12.tar.gz
Распознаётся cdn.kernel.org (cdn.kernel.org)… 151.101.1.176, 151.101.65.176, 151.101.129.176, ...
Подключение к cdn.kernel.org (cdn.kernel.org)|151.101.1.176|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 200 OK
Длина: 219292458 (209M) [application/x-gzip]
Сохранение в: «STDOUT»
- 100%[==================================================================>] 209,13M 3,58MB/s за 56s
/2023-07-23 19:39:57 (3,76 MB/s) - записан в stdout [219292458/219292458]
real 1m2,381s
user 0m29,130s
sys 0m11,935s
Код: Выделить всё
[olej@xenix /]$ du -hs /kernel-src
1,5G /kernel-src
Код: Выделить всё
[olej@xenix tmp]$ sudo mv linux-6.3.12/ /kernel-src
[sudo] пароль для olej:
Berkeley Packet Filter (BPF)
Добавлено: 24 июл 2023, 00:56
Olej
Olej писал(а): ↑24 июл 2023, 00:48
для примеров bpf...
Код: Выделить всё
[olej@xenix tmp]$ cd /kernel-src/tools/lib/bpf
Код: Выделить всё
[olej@xenix bpf]$ sudo make && sudo make install prefix=/
[sudo] пароль для olej:
HOSTCC fixdep.o
HOSTLD fixdep-in.o
LINK fixdep
GEN bpf_helper_defs.h
MKDIR staticobjs/
CC staticobjs/libbpf.o
CC staticobjs/bpf.o
CC staticobjs/nlattr.o
CC staticobjs/btf.o
CC staticobjs/libbpf_errno.o
CC staticobjs/str_error.o
CC staticobjs/netlink.o
CC staticobjs/bpf_prog_linfo.o
CC staticobjs/libbpf_probes.o
CC staticobjs/hashmap.o
CC staticobjs/btf_dump.o
CC staticobjs/ringbuf.o
CC staticobjs/strset.o
CC staticobjs/linker.o
CC staticobjs/gen_loader.o
CC staticobjs/relo_core.o
CC staticobjs/usdt.o
LD staticobjs/libbpf-in.o
LINK libbpf.a
MKDIR sharedobjs/
CC sharedobjs/libbpf.o
CC sharedobjs/bpf.o
CC sharedobjs/nlattr.o
CC sharedobjs/btf.o
CC sharedobjs/libbpf_errno.o
CC sharedobjs/str_error.o
CC sharedobjs/netlink.o
CC sharedobjs/bpf_prog_linfo.o
CC sharedobjs/libbpf_probes.o
CC sharedobjs/hashmap.o
CC sharedobjs/btf_dump.o
CC sharedobjs/ringbuf.o
CC sharedobjs/strset.o
CC sharedobjs/linker.o
CC sharedobjs/gen_loader.o
CC sharedobjs/relo_core.o
CC sharedobjs/usdt.o
LD sharedobjs/libbpf-in.o
LINK libbpf.so.1.2.0
GEN libbpf.pc
INSTALL libbpf.a
INSTALL libbpf.so.1.2.0
INSTALL libbpf.pc
INSTALL //include/bpf/bpf.h
INSTALL //include/bpf/libbpf.h
INSTALL //include/bpf/btf.h
INSTALL //include/bpf/libbpf_common.h
INSTALL //include/bpf/libbpf_legacy.h
INSTALL //include/bpf/bpf_helpers.h
INSTALL //include/bpf/bpf_tracing.h
INSTALL //include/bpf/bpf_endian.h
INSTALL //include/bpf/bpf_core_read.h
INSTALL //include/bpf/skel_internal.h
INSTALL //include/bpf/libbpf_version.h
INSTALL //include/bpf/usdt.bpf.h
INSTALL //include/bpf/bpf_helper_defs.h
INSTALL libbpf_headers
И в итоге:
Код: Выделить всё
[olej@xenix bpf]$ pkg-config --cflags --libs libbpf
-I/usr/local/include -L/usr/local/lib64 -lbpf
Berkeley Packet Filter (BPF)
Добавлено: 24 июл 2023, 00:59
Olej
Olej писал(а): ↑24 июл 2023, 00:53
проделать в Fedora
Ну и для полноты комплекта:
Код: Выделить всё
[olej@xenix ~]$ dnf list bcc
Последняя проверка окончания срока действия метаданных: 0:00:42 назад, Вс 23 июл 2023 19:54:40.
Имеющиеся пакеты
bcc.x86_64 0.25.0-3.fc38 updates
Код: Выделить всё
[olej@xenix ~]$ sudo dnf install bcc
[sudo] пароль для olej:
Последняя проверка окончания срока действия метаданных: 2:01:16 назад, Вс 23 июл 2023 17:54:24.
Зависимости разрешены.
===============================================================================================================================================
Пакет Архитектура Версия Репозиторий Размер
===============================================================================================================================================
Установка:
bcc x86_64 0.25.0-3.fc38 updates 631 k
Установка зависимостей:
clang15-libs x86_64 15.0.7-4.fc38 fedora 21 M
clang15-resource-filesystem x86_64 15.0.7-4.fc38 fedora 12 k
llvm15-libs x86_64 15.0.7-4.fc38 fedora 25 M
python3-bcc noarch 0.25.0-3.fc38 updates 130 k
python3-netaddr noarch 0.8.0-11.fc38 fedora 1.6 M
Установка слабых зависимостей:
bcc-tools x86_64 0.25.0-3.fc38 updates 537 k
Результат транзакции
===============================================================================================================================================
Установка 7 Пакетов
Объем загрузки: 49 M
Объем изменений: 230 M
Продолжить? [д/Н]: y
Загрузка пакетов:
(1/7): clang15-resource-filesystem-15.0.7-4.fc38.x86_64.rpm 16 kB/s | 12 kB 00:00
(2/7): python3-netaddr-0.8.0-11.fc38.noarch.rpm 290 kB/s | 1.6 MB 00:05
(3/7): bcc-0.25.0-3.fc38.x86_64.rpm 154 kB/s | 631 kB 00:04
(4/7): clang15-libs-15.0.7-4.fc38.x86_64.rpm 1.0 MB/s | 21 MB 00:20
(5/7): python3-bcc-0.25.0-3.fc38.noarch.rpm 74 kB/s | 130 kB 00:01
(6/7): llvm15-libs-15.0.7-4.fc38.x86_64.rpm 1.1 MB/s | 25 MB 00:22
(7/7): bcc-tools-0.25.0-3.fc38.x86_64.rpm 27 kB/s | 537 kB 00:19
-----------------------------------------------------------------------------------------------------------------------------------------------
Общий размер 1.5 MB/s | 49 MB 00:33
Проверка транзакции
Проверка транзакции успешно завершена.
Идет проверка транзакции
Тест транзакции проведен успешно.
Выполнение транзакции
Подготовка : 1/1
Установка : llvm15-libs-15.0.7-4.fc38.x86_64 1/7
Установка : python3-netaddr-0.8.0-11.fc38.noarch 2/7
Установка : clang15-resource-filesystem-15.0.7-4.fc38.x86_64 3/7
Установка : clang15-libs-15.0.7-4.fc38.x86_64 4/7
Установка : bcc-tools-0.25.0-3.fc38.x86_64 5/7
Установка : bcc-0.25.0-3.fc38.x86_64 6/7
Установка : python3-bcc-0.25.0-3.fc38.noarch 7/7
Запуск скриптлета: python3-bcc-0.25.0-3.fc38.noarch 7/7
Проверка : clang15-libs-15.0.7-4.fc38.x86_64 1/7
Проверка : clang15-resource-filesystem-15.0.7-4.fc38.x86_64 2/7
Проверка : llvm15-libs-15.0.7-4.fc38.x86_64 3/7
Проверка : python3-netaddr-0.8.0-11.fc38.noarch 4/7
Проверка : bcc-0.25.0-3.fc38.x86_64 5/7
Проверка : bcc-tools-0.25.0-3.fc38.x86_64 6/7
Проверка : python3-bcc-0.25.0-3.fc38.noarch 7/7
Установлен:
bcc-0.25.0-3.fc38.x86_64 bcc-tools-0.25.0-3.fc38.x86_64 clang15-libs-15.0.7-4.fc38.x86_64
clang15-resource-filesystem-15.0.7-4.fc38.x86_64 llvm15-libs-15.0.7-4.fc38.x86_64 python3-bcc-0.25.0-3.fc38.noarch
python3-netaddr-0.8.0-11.fc38.noarch
Выполнено!
Код: Выделить всё
[olej@xenix ~]$ clang --version
clang version 16.0.6 (Fedora 16.0.6-2.fc38)
Target: x86_64-redhat-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Berkeley Packet Filter (BPF)
Добавлено: 24 июл 2023, 01:04
Olej
Olej писал(а): ↑24 июл 2023, 00:48
перенесём, чтобы не переписывать Makefile
https://github.com/bpftools/linux-obser ... ello_world
Код: Выделить всё
[olej@xenix ~]$ cd ~/linux-observability-with-bpf/code/chapter-2/hello_world
[olej@xenix hello_world]$ make bpfload
make: *** Нет правила для сборки цели «/kernel-src/samples/bpf/bpf_load.c», требуемой для «build». Останов.
Вот так - всё равно облом
См.:
Код: Выделить всё
[olej@xenix hello_world]$ ls -l /kernel-src/samples/bpf/bpf_*
-rw-r--r-- 1 olej olej 6432 июл 5 20:29 /kernel-src/samples/bpf/bpf_insn.h
Вот так: нет там никакого bpf_load.c
Berkeley Packet Filter (BPF)
Добавлено: 24 июл 2023, 01:05
Olej
Olej писал(а): ↑24 июл 2023, 01:04
Вот так: нет там никакого bpf_load.c
Проделал то же в Mint:
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/eBPF$ lsb_release -a
No LSB modules are available.
Distributor ID: Linuxmint
Description: Linux Mint 21.2
Release: 21.2
Codename: victoria
Здесь инструментарий BPF у меня установлен из прежних работ, из пакетной системы:
Код: Выделить всё
olej@R420:~$ pkg-config --list-all | grep libbpf
libbpf libbpf - BPF library
olej@R420:~$ pkg-config --cflags --libs libbpf
-lbpf
Код: Выделить всё
olej@R420:~$ pkg-config --list-all | grep bcc
libbcc libbcc - BCC Program library
olej@R420:~$ pkg-config --cflags --libs libbcc
-I/usr/include/bcc/compat -lbcc
И остаётся доустановить исходники ядра, как они хотят...
https://kernel.ubuntu.com/git/ubuntu-st ... jammy.git/
Код: Выделить всё
olej@R420:/tmp$ git clone --depth 1 git://kernel.ubuntu.com/ubuntu-stable/ubuntu-stable-jammy.git
Клонирование в «ubuntu-stable-jammy»...
fatal: ошибка внешнего репозитория: **REPOSITORY RELOCATED** Updated URL: https://git.launchpad.net/~ubuntu-kernel-stable/+git/jammy Local path: /ubuntu-stable/ubuntu-stable-jammy.git
Исходники Ubuntu Jammy я так и не добыл ... Не стал разбираться и взял из того же источника:
https://cdn.kernel.org/pub/linux/kernel/v5.x/
Код: Выделить всё
[olej@xenix tmp]$ time wget -c https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.76.tar.gz
--2023-07-23 19:46:18-- https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.76.tar.gz
Распознаётся cdn.kernel.org (cdn.kernel.org)… 151.101.1.176, 151.101.65.176, 151.101.129.176, ...
Подключение к cdn.kernel.org (cdn.kernel.org)|151.101.1.176|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 200 OK
Длина: 195417619 (186M) [application/x-gzip]
Сохранение в: «linux-5.15.76.tar.gz»
linux-5.15.76.tar.gz 100%[==================================================================>] 186,36M 3,77MB/s за 51s
2023-07-23 19:47:15 (3,69 MB/s) - «linux-5.15.76.tar.gz» сохранён [195417619/195417619]
real 0m56,522s
user 0m2,210s
sys 0m2,864s
Всё то же самое с разархивированием...
Код: Выделить всё
root@R420:/# du -hs kernel-src
1,2G kernel-src
Berkeley Packet Filter (BPF)
Добавлено: 24 июл 2023, 01:23
Olej
Olej писал(а): ↑24 июл 2023, 01:04
Вот так - всё равно облом
Смотрим:
Код: Выделить всё
root@R420:/kernel-src/samples/bpf# pwd
/kernel-src/samples/bpf
Код: Выделить всё
root@R420:/kernel-src/samples/bpf# ls bpf_*
bpf_insn.h
Всё та же песня и всё тот же облом будем...
См. GIT репозиторий
https://github.com/bpftools/linux-obser ... ree/master:
Код: Выделить всё
olej@R420:~/Загрузки/ISO$ wget -c https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.9.tar.gz
--2023-07-23 20:37:50-- https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.9.tar.gz
Распознаётся cdn.kernel.org (cdn.kernel.org)… 146.75.121.176, 2a04:4e42:41::432
Подключение к cdn.kernel.org (cdn.kernel.org)|146.75.121.176|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 200 OK
Длина: 162639371 (155M) [application/x-gzip]
Сохранение в: ‘linux-5.0.9.tar.gz’
linux-5.0.9.tar.gz 100%[===============================================================================================>] 155,10M 3,55MB/s за 42s
2023-07-23 20:38:37 (3,71 MB/s) - ‘linux-5.0.9.tar.gz’ сохранён [162639371/162639371]
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/eBPF/linux-5.0.9.tar.gz/samples/bpf$ pwd
/home/olej/2023/own.BOOKs/eBPF/linux-5.0.9.tar.gz/samples/bpf
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/eBPF/linux-5.0.9.tar.gz/samples/bpf$ ls bpf_*
bpf_insn.h bpf_load.c bpf_load.h
Вот где собака порылась
Berkeley Packet Filter (BPF)
Добавлено: 24 июл 2023, 01:35
Olej
Olej писал(а): ↑24 июл 2023, 01:23
Вот где собака порылась
Авторы кодов примеров к книге
не сильно заморачиваются версиями ядра на которых они отрабатывают код
...
Note on Kernel version: make sure to have a recent kernel to run the examples, a version >=5.0.0 will do the job.
Копирую 2 недостающих файла bpf_load.c и bpf_load.h (это исходники, это не страшно) в свой /kernel-src/samples/bpf ...
Код
https://github.com/bpftools/linux-obser ... ello_world - глава 2 ...
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/eBPF$ mv linux-observability-with-bpf ~
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/eBPF$ cd ~/linux-observability-with-bpf/code/chapter-2/hello_world
Код: Выделить всё
olej@R420:~/linux-observability-with-bpf/code/chapter-2/hello_world$ make bpfload
clang -O2 -target bpf -c bpf_program.c -I/kernel-src/tools/testing/selftests/bpf -o bpf_program.o
clang -o monitor-exec -lelf -I/kernel-src/samples/bpf -I/kernel-src/tools/lib -I/kernel-src/tools/perf -I/kernel-src/tools/include -L/usr/local/lib64 -lbpf \
/kernel-src/samples/bpf/bpf_load.c loader.c
Вот теперь всё собралось:
Код: Выделить всё
olej@R420:~/linux-observability-with-bpf/code/chapter-2/hello_world$ ls -l
итого 52
-rw-rw-r-- 1 olej olej 410 июл 23 15:09 bpf_program.c
-rw-rw-r-- 1 olej olej 936 июл 23 20:46 bpf_program.o
-rw-rw-r-- 1 olej olej 233 июл 23 15:09 loader.c
-rw-rw-r-- 1 olej olej 1706 июл 23 15:09 Makefile
-rwxrwxr-x 1 olej olej 31480 июл 23 20:46 monitor-exec
-rw-rw-r-- 1 olej olej 1834 июл 23 15:09 README.md
Код виртуальной машины BPF:
Код: Выделить всё
olej@R420:~/linux-observability-with-bpf/code/chapter-2/hello_world$ file bpf_program.o
bpf_program.o: ELF 64-bit LSB relocatable, eBPF, version 1 (SYSV), not stripped
Код позьзовательского пространства, загружающий код виртуальной машины BPF в ядро:
Код: Выделить всё
olej@R420:~/linux-observability-with-bpf/code/chapter-2/hello_world$ file monitor-exec
monitor-exec: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=8c6a9bb6ee56939171512d0e09573630e195db1a, for GNU/Linux 3.2.0, not stripped
Berkeley Packet Filter (BPF)
Добавлено: 24 июл 2023, 01:37
Olej
Olej писал(а): ↑24 июл 2023, 01:35
Вот теперь всё собралось:
Теперь с этим кодом можно работать:
Код: Выделить всё
olej@R420:~/linux-observability-with-bpf/code/chapter-2/hello_world$ sudo ./monitor-exec
[sudo] пароль для olej:
<...>-226149 [027] d...1 39135.422354: bpf_trace_printk: Hello, BPF World!
<...>-226156 [007] d...1 39138.656579: bpf_trace_printk: Hello, BPF World!
^C
Это реакция на запуск в другом терминале ... одной или двух простеньких команд...
Вот теперь с кодами из этого руководства
можно работать