Как собрать ядро ​​​​Linux для поддержки опции сокета SO_ATTACH_BPF?

Я хочу создать приложение, которое поддерживает eBPF на CentOS 7 (версия ядра 3.10.0):

if(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, sizeof(prog_f)) {
    ......
}

Итак, я загружаю версию 4.0.5, делаю следующие настройки:

CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y

Затем перейдите по этой ссылке, чтобы собрать и установить ядро ​​4.0.5.

После выполнения make modules_install install я обнаружил, что в <asm-generic/socket.h> по-прежнему нет SO_ATTACH_BPF, поэтому приведенный выше код не может быть успешно скомпилирован.

Как собрать ядро ​​​​Linux для поддержки опции сокета SO_ATTACH_BPF?


person Nan Xiao    schedule 09.06.2015    source источник


Ответы (2)


В моей установке, основанной на Fedora 21, я использую шаги, очень похожие на те, на которые вы ссылались, для компиляции и установки последнего ядра. В качестве дополнительного шага я сделаю следующее из дерева сборки ядра, чтобы установить заголовочные файлы ядра в /usr/local/include:

sudo make INSTALL_HDR_PATH=/usr/local headers_install

Это приведет к тому, что как стандартные заголовочные файлы ядра останутся установленными в /usr/include/{linux,asm,asm-generic,...}, так и новые заголовочные файлы ядра будут установлены в /usr/local/include/{linux,asm,asm-generic,...}. Во время компиляции тестовой программы, в зависимости от используемой вами системы сборки, вам может понадобиться префикс gcc/clang с префиксом -I/usr/local/include.

person Brenden Blanco    schedule 09.06.2015
comment
Спасибо за Ваш ответ! Можно ли полностью заменить все старые заголовочные файлы ядра новым ядром? Я использую команду make headers_install, вывод CHK include/generated/uapi/linux/version.h INSTALL usr/include/linux/ (411 файлов) . Он устанавливает все файлы в каталоге /usr/include/linux. - person Nan Xiao; 10.06.2015
comment
Вы можете использовать /usr в качестве аргумента INSTALL_HDR_PATH. Лучшее объяснение того, как использовать headers_install, находится здесь: lxr.free-electrons .com/source/Документация/kbuild/. Однако я считаю, что пример /usr/include неверен, так как в моих экспериментах это создавало /usr/include/include. - person Brenden Blanco; 11.06.2015
comment
Однако имейте в виду, что на этот вопрос есть противоречивые ответы, и некоторые сообщают о проблемах при использовании /usr в качестве аргумента. linuxquestions.org/questions/linux -новичок-8/ - person Brenden Blanco; 11.06.2015

Ваше только что установленное ядро ​​​​поддерживает SO_ATTACH_BPF, но ваш текущий пакет libc сейчас не об этом (как вы упомянули, родное ядро ​​дистрибутива 3.10.0 не поддерживает данную опцию).

Вам также необходимо обновить пакет libc для использования новых функций ядра в программах пользовательского пространства.

person Tsyvarev    schedule 09.06.2015
comment
<asm-generic/socket.h> находится в libc? не файлы заголовков ядра? - person Nan Xiao; 09.06.2015
comment
libc имеет собственную копию включаемых файлов, совместно используемую ядром и пользователем. В ядре такие файлы располагаются под include/uapi/ и arch/<arch>/include/uapi/. - person Tsyvarev; 09.06.2015
comment
Моя libc версия 2.17. Как узнать, какой libc поддерживает SO_ATTACH_BPF? - person Nan Xiao; 09.06.2015
comment
Текущий glibc, который используется большинством дистрибутивов Linux, похоже, не поддерживает эту опцию (см. репозиторий sourceware.org/git/?p=glibc.git). Вы можете попробовать libc других производителей. Например, этот gitlab.com/bminor/musl/tree/ поддерживает нужный вам вариант. - person Tsyvarev; 09.06.2015