среда, 17 августа 2016 г.

nDPI, DKMS и здоровый сон сисадмина

DKMS (Dynamic Kernel Module Support) — шикарное решение, если требуемый модуль для ядра нельзя поставить и обновлять штатными средствами, но зато есть его исходники. Не требуется следить за обновлениями ядра и оперативно пересобирать нужный модуль или вовсе блокировать обновления ядра, чтобы ничего не отвалилось после очередного обновления.

Сначала устанавливаем dkms и другие необходимые пакеты:

$ sudo apt-get install dkms build-essential autoconf automake autogen libpcap-dev libtool xtables-addons-dkms pkg-config xtables-addons-source
Скачиваем исходники nDPI:
$ wget https://github.com/vel21ripn/nDPI/archive/netfilter.zip
Распаковываем скачанный архив в /usr/src:
$ sudo unzip netfilter.zip -d /usr/src
Переименовываем распакованную папку в ndpi-x.y.z, где x.y.z — версия модуля:
$ sudo mv /usr/src/nDPI-netfilter /usr/src/ndpi-1.7.0
Создаем файл dkms.conf в этой папке:
$ sudo tee /usr/src/ndpi-1.7.0/dkms.conf << EOF
# Версия модуля 
PACKAGE_VERSION="1.7.0"
# Название модуля в /usr/src
PACKAGE_NAME="ndpi"
# Папка для компиляции
BDIR="\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build"
# Аргументы для make 
ARGS="-C \${kernel_source_dir} SUBDIRS=\${BDIR} M=\${BDIR}/ndpi-netfilter/src"
# После компиляции созданный модуль перемещается туда, где DKMS может его найти
MAKE[0]="make \${ARGS} modules ; find \${BDIR} -name '*.ko' -exec mv -v {} \${BDIR} \;"
CLEAN="make \${ARGS} clean"
# Название модуля ядра
BUILT_MODULE_NAME[0]="xt_ndpi"
# Папка, где обычно устанавливается модуль в ядре
DEST_MODULE_LOCATION[0]="/extra/"
# Не пересобирать initrd ядра
REMAKE_INITRD="no"
# Установка модуля после компиляции
AUTOINSTALL="yes"
EOF
Теперь компилируем и устанавливаем библиотеку nDPI
$ cd /usr/src/ndpi-1.7.0
$ sudo ./autogen.sh
$ sudo sh -c './configure && make'
$ cd /usr/src/ndpi-1.7.0/ndpi-netfilter
$ sudo make install
После чего в DKMS добавляем запись о нашем модуле:
$ sudo dkms add -m ndpi -v 1.7.0
Собираем модуль из исходников:
$ sudo dkms build -m ndpi -v 1.7.0
Собранный модуль устанавливаем папке /dkms/:
$ sudo dkms install -m ndpi -v 1.7.0