Berkeley Packet Filter (BPF)

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Berkeley Packet Filter (BPF)

Непрочитанное сообщение Olej » 24 июл 2023, 00:41

Olej писал(а):
23 июл 2023, 11:46
Глава 2..Запуск.программ.BPF
Написание программ BPF
Но я любые рассказки без программного кода не воспринимаю... :oops:
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».  Останов.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Berkeley Packet Filter (BPF)

Непрочитанное сообщение Olej » 24 июл 2023, 00:48

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... Куда загружен код соответствующей версии кода ядра :!:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Berkeley Packet Filter (BPF)

Непрочитанное сообщение Olej » 24 июл 2023, 00:53

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:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Berkeley Packet Filter (BPF)

Непрочитанное сообщение Olej » 24 июл 2023, 00:56

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 

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Berkeley Packet Filter (BPF)

Непрочитанное сообщение Olej » 24 июл 2023, 00:59

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Berkeley Packet Filter (BPF)

Непрочитанное сообщение Olej » 24 июл 2023, 01:04

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 :!: :cry:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Berkeley Packet Filter (BPF)

Непрочитанное сообщение Olej » 24 июл 2023, 01:05

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Berkeley Packet Filter (BPF)

Непрочитанное сообщение Olej » 24 июл 2023, 01:23

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:

Код: Выделить всё

$ uname -r
5.0.9-301.fc30.x86_64

Код: Выделить всё

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
Вот где собака порылась :!: :-o

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Berkeley Packet Filter (BPF)

Непрочитанное сообщение Olej » 24 июл 2023, 01:35

Olej писал(а):
24 июл 2023, 01:23
Вот где собака порылась
Авторы кодов примеров к книге не сильно заморачиваются версиями ядра на которых они отрабатывают код :cry: ...
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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Berkeley Packet Filter (BPF)

Непрочитанное сообщение Olej » 24 июл 2023, 01:37

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
Это реакция на запуск в другом терминале ... одной или двух простеньких команд...

Вот теперь с кодами из этого руководства можно работать :!:

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей