[Перевод] Операция «B.A.T.M.A.N.»: добавление модулей ядра в Yocto на Intel Edison

Недавно меня спросили о том, как добавить поддержку batman-adv в Yocto. В результате завязалась переписка, которая стала основой для этого поста. Итак, как же это сделать? Давайте разбираться вместе.

d5dbb445310f4a4786038a99d81dab4c.jpg

Способ первый: не надо изобретать велосипед


Прежде чем что-то делать самому, не помешает проверить, не сделал ли уже то же самое кто-то ещё. Стоит пройтись по существующим репозиториям, например, заглянуть сюда. Мне удалось найти здесь необходимый libnl, но не B.A.T.M.A.N. (сейчас, правда, он уже там есть, но мне, всё же, хочется продолжить рассказ). В такой ситуации вполне можно обратиться с вежливой просьбой к тому, кто занимается репозиторием, например, в нашем случае, к пользователю с ником AlexT. Суть просьбы заключается в добавлении пакетов «kernel-module-batman-adv» и «batctl» в репозиторий opkg. Если удача будет на вашей стороне, то AlexT это сделает, но нужно учесть, что он занимается данным репозиторием на добровольной основе в свободное время. Пакеты можно устанавливать командой вида «opkg install ».

Способ второй: компиляция на целевом устройстве


Этот подход немного сложнее, он требует достаточно свободного места в rootfs Intel Edison. При его применении нужно загрузить и скомпилировать необходимый код уровня ядра на целевом устройстве.

Способ третий: сборка в среде Yocto


Для того чтобы этим способом воспользоваться, вам понадобится:

  • Главный компьютер, на котором установлена Linux x64. Например – Ubuntu 12.04 (мне доводилось слышать о проблемах с Yocto в Ubuntu 14.04, возможно, сейчас они уже решены), Fedora 20 и так далее.
  • Как минимум 50 Гб свободного места на диске (это если вы хотите скомпилировать полный образ Yocto).


Настройка Yocto


Загрузите «Yocto complete image» отсюда. После загрузки выполните такие команды:

  • tar xvf edison-src*.tgz
  • cd edison-src
  • device-software/setup.sh
  • source poky/oe-init-build-env


Сборка kernel-modules-batman-adv


Здесь путь к успеху лежит через следующие шаги:

  • Выполните команду bitbake -c menuconfig virtual/kernel. Она откроет новое окно, в котором будет запущено средство конфигурирование ядра для Edison.
  • Настройте B.A.T.M.A.N. Для этого, в сессии menuconfig, установите параметры B.A.T.M.A.N., которые вы хотели бы видеть в категории Networking Support > Networking Options > BATMAN.
  • cp build/tmp/work/edison-poky-linux/linux-yocto/<your current kernel>/linux-edison-standard-build/.config device-software/meta-edison/recipes-kernel/linux/files/defconfig
  • bitbake -c compile_kernelmodules virtual/kernel
  • Если вам нужны полные модули tarball, тогда нужна команда bitbake -c deploy virtual/kernel. Tarball можно будет найти по адресу build/tmp/deploy/images/edison
  • В противном случае нужна следующая команда на целевом устройстве: opkg install build/tmp/deploy/ipk/edison/kernel-module-batman-adv_<version>.ipk


Я изменил следующие параметры конфигурации:

< # CONFIG_BATMAN_ADV не установлен
---
> CONFIG_BATMAN_ADV=m
> CONFIG_BATMAN_ADV_BLA=y
> CONFIG_BATMAN_ADV_DAT=y
> CONFIG_BATMAN_ADV_NC=y
> # CONFIG_BATMAN_ADV_DEBUG не установлен


Установка batctl


Для того чтобы использовать B.A.T.M.A.N., нужно установить и batctl. Подходящие рецепты для системы сборки BitBake можно найти в Интернете. Например, я использовал этот, внеся в него некоторые изменения. Вот как выглядит то, что я делал:

mkdir -p device-software/meta-edison-distro/recipes-support/batman/

cat > device-software/meta-edison-distro/recipes-support/batman/batctl_2014.4.0.bb <<EOF

DESCRIPTION = "Control application for B.A.T.M.A.N. routing protocol kernel module for multi-hop ad-hoc mesh networks."
HOMEPAGE = "http://www.open-mesh.net/"
SECTION = "console/network"
PRIORITY = "optional"

LICENSE = "GPLv2+"
LIC_FILES_CHKSUM = "file://../license-destdir/${PN}/generic_GPLv2;md5=801f80980d171dd6425610833a22dbe6"

RDEPENDS_${PN} = "kernel-module-batman-adv"
DEPENDS = "libnl"

SRC_URI = "http://downloads.open-mesh.net/batman/stable/sources/batctl/batctl-${PV}.tar.gz\
     file://patch.patch"
SRC_URI[md5sum] = "f3a14565699313258ee6ba3de783eb0a"
SRC_URI[sha256sum] = "77509ed70232ebc0b73e2fa9471ae13b12d6547d167dda0a82f7a7fad7252c36"

EXTRA_OEMAKE = 'STAGING_INC="${STAGING_INC}"'

do_compile() {
  oe_runmake
}

do_install() {
  install -d ${D}${bindir}
  install -m 0755 batctl ${D}${bindir}
}
EOF


Так как libnl изменил входящий в него путь установки, мне нужно пропатчить Makefile batctl. Делается это так:

mkdir -p device-software/meta-edison-distro/recipes-support/batman/files
cat > device-software/meta-edison-distro/recipes-support/batman/files/patch.patch <<EOF

--- a/Makefile  2015-02-27 09:10:45.768409932 +0100
+++ b/Makefile  2015-02-27 09:11:32.710554513 +0100
@@ -29,7 +29,7 @@
MANPAGE = man/batctl.8

 # batctl flags and options
-CFLAGS += -Wall -W -std=gnu99 -fno-strict-aliasing -MD -MP
+CFLAGS += -Wall -W -std=gnu99 -fno-strict-aliasing -MD -MP –I${STAGING_INC}/libnl3
CPPFLAGS += -D_GNU_SOURCE
LDLIBS += -lm
EOF


После всех этих манипуляций для сборки batctl с помощью bitbake нужна такая команда:

bitbake batctl


После завершения сборки готовый пакет можно найти по адресу build/tmp/deploy/ipk/core2-32/batctl_2014.4.0-r0_core2-32.ipk. Его можно установить при помощи «opkg install» на Intel Edison с установленным Yocto Linux

Тестирование на Intel Edison после установки

root@edison:~/ # modprobe batman-adv


Если вы хотите, чтобы модуль загружался автоматически, вероятно, вам стоит включить его в /etc/modules-load.d/

root@edison:~/ # modinfo batman-adv
filename:       /lib/modules/3.10.17-poky-edison+/kernel/net/batman-adv/batman-adv.ko
version:        2013.2.0
description:    B.A.T.M.A.N. advanced
author:         Marek Lindner <lindner_marek@yahoo.de>, Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
license:        GPL
srcversion:     66711903985B5CAAE0DAF30
depends:       
intree:         Y
vermagic:       3.10.17-poky-edison+ SMP preempt mod_unload ATOM


С использованием USB Ethernet-адаптера:

root@edison:~/ # batctl if add enp0s17u1
root@edison:~/ # batctl if
enp0s17u1: active
root@edison:~/ # batctl s
     tx: 6
     tx_bytes: 468
     tx_dropped: 0
     rx: 1
     rx_bytes: 42
     forward: 0
     forward_bytes: 0
     mgmt_tx: 60
     mgmt_tx_bytes: 2428
     mgmt_rx: 0
     mgmt_rx_bytes: 0
     tt_request_tx: 0
     tt_request_rx: 0
     tt_response_tx: 0
     tt_response_rx: 0
     tt_roam_adv_tx: 0
     tt_roam_adv_rx: 0
     dat_get_tx: 0
     dat_get_rx: 0
     dat_put_tx: 0
     dat_put_rx: 0
     dat_cached_reply_tx: 0
     nc_code: 0
     nc_code_bytes: 0
     nc_recode: 0
     nc_recode_bytes: 0
     nc_buffer: 0
     nc_decode: 0
     nc_decode_bytes: 0
     nc_decode_failed: 0
     nc_sniffed: 0

# ifconfig bat0
bat0      Link encap:Ethernet  HWaddr 52:78:97:51:ba:9d  
          inet6 addr: fe80::5078:97ff:fe51:ba9d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST DYNAMIC  MTU:1500  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:42 (42.0 B)  TX bytes:468 (468.0 B)


Итоги


Рассмотренный подход позволяет встраивать модули в ядро Yocto Linux на Intel Edison. Используя его, вы можете включить в ядро то, что вам нужно, и не зависеть от репозиториев. Если же ваша цель – именно B.A.T.M.A.N. Advanced, значит, ваш Intel Edison готов к работе в MESH-сети.

© Habrahabr.ru