Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

make modules_install with kernel headers of different version #158

Closed
omikhaylov opened this issue Feb 20, 2023 · 10 comments
Closed

make modules_install with kernel headers of different version #158

omikhaylov opened this issue Feb 20, 2023 · 10 comments
Labels

Comments

@omikhaylov
Copy link

I need to create an installation archive using Docker container. I have exact headers I need to use for compilation process and make KERNEL_DIR=$KERNEL_DIR seem to work well. But I can't execute make modules_install DESTDIR=/root/out:

root@54786fbb33f1:~/ndpi-netfilter/ndpi-netfilter# make modules_install DESTDIR=/root/out
make -C src modules_install
make[1]: Entering directory '/root/ndpi-netfilter/ndpi-netfilter/src'
grep: /lib/modules/5.10.0-8-amd64/build/source/include/linux/skbuff.h: No such file or directory
make -C /lib/modules/5.10.0-8-amd64/build M=$PWD modules_install;
make[2]: Entering directory '/root/ndpi-netfilter/ndpi-netfilter/src'
make[2]: *** /lib/modules/5.10.0-8-amd64/build: No such file or directory.  Stop.
make[2]: Leaving directory '/root/ndpi-netfilter/ndpi-netfilter/src'
Makefile:49: recipe for target 'modules_install' failed
make[1]: *** [modules_install] Error 2
make[1]: Leaving directory '/root/ndpi-netfilter/ndpi-netfilter/src'
Makefile:6: recipe for target 'modules_install' failed
make: *** [modules_install] Error 2

So probably I would not be able to create neither installation archive, nor .deb package in such container for my target (correct me if I am wrong). Could you tell what is the prefered way of creating package in Docker?

@vel21ripn
Copy link
Owner

I use the following commands to install kernel modules:

WD=`pwd`
KSRC="${WD}/linux-X.XX"
KOBJ="${WD}/obj-X.XX"
PKGDIR=/tmp/kernel-X.XX
( cd $KSRC ; make modules_install O=$KOBJ INSTALL_MOD_PATH=$PKGDIR )
(cd nDPI/ndpi-netfilter; make -C src KERNEL_DIR=$KOBJ modules_install O=$KOBJ INSTALL_MOD_PATH=$PKGDIR )

@omikhaylov
Copy link
Author

Суть в том, что нужно собрать некий установочный архив со всеми необходимыми файлами (установочный скрипт там отдельно будет написан), при чем так чтобы он собирался на абстрактной системе в докере. Докер используется только в процессе самой сборки.
Обычно для подобного хватало пакетов с заголовками (linux-headers-<версия>.deb).
На сколько понимаю, предлагается качать на докер полные исходники нужного ядра и компилировать их во временные папки. Получается что только linux-headers тут не обойтись?

@omikhaylov
Copy link
Author

omikhaylov commented Feb 21, 2023

Если указать KERNEL_DIR, разваливается на depmod. Является ли depmod необходимым в случае если нужно собрать архив или пакет?

root@48140a1a212e:~/ndpi-netfilter/ndpi-netfilter# make modules_install INSTALL_MOD_PATH=/root/out KERNEL_DIR=$KERNEL_DIR
make -C src modules_install
make[1]: Entering directory '/root/ndpi-netfilter/ndpi-netfilter/src'
grep: /lib/modules/4.9.0-11-amd64/build//source/include/linux/skbuff.h: No such file or directory
make -C /lib/modules/4.9.0-11-amd64/build/ M=$PWD modules_install
make[2]: Entering directory '/usr/src/linux-headers-4.9.0-11-amd64'
INSTALL /root/ndpi-netfilter/ndpi-netfilter/src/xt_ndpi.ko
DEPMOD 4.9.0-11-amd64
make[2]: Leaving directory '/usr/src/linux-headers-4.9.0-11-amd64'
depmod -a;
/bin/sh: 1: depmod: not found
Makefile:49: recipe for target 'modules_install' failed
make[1]: *** [modules_install] Error 127
make[1]: Leaving directory '/root/ndpi-netfilter/ndpi-netfilter/src'
Makefile:6: recipe for target 'modules_install' failed
make: *** [modules_install] Error 2

Оффтоп: кажется в ndpi-netfilter/src/Makefile:16 условие не верно.
Ищется таргет в виде 'modules_install', который находится (по крайней мере у меня) в /lib/modules/4.9.0-11-amd64/build, либо в /lib/modules/4.9.0-11-amd64/source. Соответственно если я передам в KERNEL_DIR /lib/modules/4.9.0-11-amd64/, таргет не найдется. А если передам /lib/modules/4.9.0-11-amd64/build/, не найдется skbuff.h.

@vel21ripn
Copy link
Owner

На отсутствие skbuff.h можно не обращать внимание. Я исправлю это в ближайшем коммите.
Для сборки модуля в виде отдельного пакета depmod не нужен.
Для сборки модуля нужны не только kernel-headers, но и конфиг ядра.

@omikhaylov
Copy link
Author

omikhaylov commented Feb 22, 2023

Может в таком случае лучше сделать некую опцию, позволяющую не выполнять depmod -a в modules_install для сборок пакетов?

@k0ste
Copy link

k0ste commented Feb 22, 2023

@omikhaylov рецепт для сборки пакета можете посмотреть в AUR

@omikhaylov
Copy link
Author

@omikhaylov рецепт для сборки пакета можете посмотреть в AUR

Спасибо, глянул.
На сколько понимаю, тут файлы просто копируются в нужные папки. Решение немного частное получается. Хочется быть уверенным в том, что все нужные файлы будут раскиданы по нужным директориям после обновления проекта (допустим появятся какие-то еще бинарники).
К сожалению не слишком хорошо представляю структуру проекта. Тут все файлы, который автор предлагает к установке? К примеру не вижу тут результатов выполнения make из корня проекта (ndpiReader, ndpi_network_list_compile и др.).

Потихоньку начал разбираться что там на самом деле происходит, но пока далеко не все очевидно выглядит.
Сделал пару изменений мейках:

diff --git a/ndpi-netfilter/ipt/Makefile b/ndpi-netfilter/ipt/Makefile
index 99881dd2547bac3a9b58ecbe58f862fc11b95f10..e13ba9d152c682df8c8f672b773382f584b327f9 100644
--- a/ndpi-netfilter/ipt/Makefile
+++ b/ndpi-netfilter/ipt/Makefile
@@ -6,7 +6,15 @@ CFLAGS = -fPIC -I../.. -I${NDPI_SRC}/include -I${NDPI_SRC}/lib -I../src -I../lib
 
 all:  libxt_ndpi.so
 install:  libxt_ndpi.so
-	if [ -n "$(DESTDIR)$(XTBL)" -a -d "$(DESTDIR)$(XTBL)" ]; then install -v libxt_ndpi.so $(DESTDIR)$(XTBL); ln -fs libxt_ndpi.so $(DESTDIR)$(XTBL)/libxt_NDPI.so ; else echo "No pkg-config --variable=xtlibdir xtables"; fi
+ifndef XTBL
+$(error No pkg-config --variable=xtlibdir xtables)
+endif
+	if [ ! -d $(DESTDIR)$(XTBL) ]; then \
+	echo "$(DESTDIR)$(XTBL): directory nonexistent. Creating..."; \
+	mkdir -p $(DESTDIR)$(XTBL); \
+	fi
+	install -v libxt_ndpi.so ${DESTDIR}${XTBL}; \
+	ln -fs libxt_ndpi.so ${DESTDIR}${XTBL}/libxt_NDPI.so
 
 lib%.so: lib%.o
 	$(CC) -shared -o $@ $^;
diff --git a/ndpi-netfilter/src/Makefile b/ndpi-netfilter/src/Makefile
index 744d9a3135227b7ba904d7a9035057a85838445e..6c6389b8b188171403082c367d974608bd38afa2 100644
--- a/ndpi-netfilter/src/Makefile
+++ b/ndpi-netfilter/src/Makefile
@@ -1,4 +1,3 @@
-
 NDPI_SRC := ../../src
 NDPI_PRO := ${NDPI_SRC}/lib/protocols
 
@@ -47,7 +46,7 @@ modules:
 
 modules_install:
 	make -C ${KERNEL_DIR} M=$$PWD $@;
-	depmod -a;
+	if [ -z ${INSTALL_MOD_PATH} ]; then depmod -a; fi
 clean:
 	make -C ${KERNEL_DIR} M=$$PWD $@;
 	rm -rf modules.order

После этого кажется все файлы раскидываются по нужным поддиректориям в абстрактной папке (DESTDIR). Последовательность команд для этого делал примерно следующую:

DESTDIR=$(pwd)/$OUTPUT
mkdir -p $OUTPUT
./autogen.sh && ./configure
make install DESTDIR=$DESTDIR
make -C src/lib ndpi_network_list.c.inc
make -C ndpi-netfilter/ KERNEL_DIR=$KERNEL_DIR
make -C ndpi-netfilter/ KERNEL_DIR=$KERNEL_DIR INSTALL_MOD_PATH=$DESTDIR modules_install
make -C ndpi-netfilter/ DESTDIR=$DESTDIR install

Осталось из полученного сделать пакет для Debian. Я правильно понимаю, что здесь в проекте папка packages для этого не актуальна?

@k0ste
Copy link

k0ste commented Feb 28, 2023

На сколько понимаю, тут файлы просто копируются в нужные папки. Решение немного частное получается.

Решение на самом деле общее, ведь make install делает тоже самое

Хочется быть уверенным в том, что все нужные файлы будут раскиданы по нужным директориям после обновления проекта (допустим появятся какие-то еще бинарники).

Безусловно, но модуль работает в пространстве ядра и управляется через расширение iptables, не думаю что тут возможны "какие-то еще бинарники"

В любом случае, если вы принесёте изменения в проект, которые можно будет использовать в других сборках (make install) - это будет благо, я в свою очередь смогу принести это в AUR 🚀

@omikhaylov
Copy link
Author

Сделал маленький pull request не мейки: #159
С этими изменениями мне показалось что собираться немного удобнее.

@vel21ripn
Copy link
Owner

Применил

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants