Ошибка при установке Wireguard

Всё же без перекомпиляции ядра не обойтись. Сетевой стек в ядре wirenboard собран монолитно, поэтому даже досборка модуля не поможет.

Для сборки ядра использовалась система Debian 9.

Ядро было собрано так:

apt update && sudo apt install build-essential libncurses5-dev fakeroot lzop bc git gcc-arm-linux-gnueabihf
git clone https://github.com/wirenboard/linux
cd linux/
git submodule update --init --recursive
make mrproper
make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
KERNEL_FLAVOUR=wb6  scripts/package/wb/do_build_deb.sh

На этапе menuconfig были проверены и включены опции ядра, указанные в документации wireguard :Compilation from Source Code - WireGuard

CONFIG_NET for basic networking support
CONFIG_INET for basic IP support
CONFIG_NET_UDP_TUNNEL for sending and receiving UDP packets
CONFIG_CRYPTO_ALGAPI for crypto_xor
[*] Networking support (NET) -->
    Networking options -->
        [*] TCP/IP networking (INET)
        [*]   IP: Foo (IP protocols) over UDP (NET_FOU)
[*] Cryptographic API (CRYPTO) -->
    [*] Cryptographic algorithm manager (CRYPTO_MANAGER)

Далее для проверки, что ядро собрано корректно и сможет загрузиться deb пакет с ядром linux-image-wb6_4.9.22-wb2_armhf.deb был распакован.

Директория с модулями ядра сжата в архив, образ ядра и архив с модулями скопированы на флешку с файловой системой FAT32.

dpkg -x linux-image-wb6_4.9.22-wb2_armhf.deb  ./

Флешка подключена к контроллеру, смонтирована и директория с модулями 4.9.22-wb2 скопирована в /lib/modules/4.9.22-wb2

Файл с образом ядра vmlinuz-4.9.22-wb2 перименован в zImage и помещён в корень флешки.

Для проверки загрузки с флешки контроллер был подключен через usb провод к компьютеру и посредством putty и debug консоли введены команды в загрузчик: Отладочный порт — Wiren Board

load mmc ${mmcdev}:${mmcpart} ${loadaddr} /boot/uEnv.txt
run loadfdtandoverlays
usb start
fatls usb 0:1
fatload usb 0:1 $loadaddr /zImage
setenv optargs ${optargs} root=/dev/mmcblk${mmcdev}p${mmcpart} rootwait ro test1
run setbootargs
bootz ${loadaddr} - ${fdt_addr}

Учтите, что времени на ввод команд в загрузчике немного, порядка 15 секунд, по истечении времени процедура запуска начинается заново и команды нужно ввонить снова.

Для проверки, что всё же загружено собранное ядро я дописал в строку параметров ядра слово test1, хотя можно увидеть и по версии ядра и дате сборки.

В начале я пробовал на USB 3.0 флешке объёмом 32 Гигабайта и её не было видно.
После выполнения команд

usb start
usb tree

должно быть видно usb storage устройство, если нет, то пробуйте другую флешку.

В итоге я использовать USB 2.0 флешку на 2 Гб.

Система загрузилась с собранного ядра.
Удостовериться в этом можно введя команду

uname -a
Linux wirenboard **4.9.22-wb2** #1 SMP **Fri Oct 22 17:47:31 MSK 2021** armv7l GNU/Linux

И посмотрев вывод команды

cat /proc/cmdline
console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait ro test1

После успешной загрузки образ ядра был скопирован в /boot/zImage в памяти контроллера.

Собранные deb пакеты просто устанавливаться не хотели, пакетный менеджер ругался на версию. Возможно виной было, что я не поменял префикс при сборке ядра и он у меня -wb2, в любом случае ядро рабочее и далее для сборки внешних модулей нам нужны только заголовочные файлы собранного ядра.

Всё остальное выполняется на самом контроллере.

По аналогии с модулями ядра я распаковал пакет с заголовочными файлами ядра в /usr/src/

cd /
dpkg -x linux/linux-headers-wb6_4.9.22-wb2_armhf.deb ./

Находиться нужно в корне, потому что в deb пакете файлы находятся относительно корня.

Для успешной сборки модуля wireguard нам нужно пересобрать две подпрограммы из linux-headers собранного ядра. Т.к. ядро собиралось на системе с архитектурой x86_64, а не arm, то и эти программы собраны под x86_64.

Для этого на контроллере делаем:

apt update
apt install gcc
cd /usr/src/linux-headers-4.9.22-wb2/scripts/basic
gcc fixdep.c -o fixdep
cd /usr/src/linux-headers-4.9.22-wb2/scripts/mod
gcc modpost.c file2alias.c sumversion.c -o modpost

Для установки wireguard нужно подключить репозитория stretch-backorts, если его нет.

Теперь нам осталось только собрать wireguard.

apt update
apt install wireguard

Сейчас уже не помню подключал ли я руками репозитории Debian Stretch или они были подключены, но я ставил пакет с wireguard из репозитория.

Если установлен пакет wireguard-dkms

Можно собрать и руками:

cd /usr/src/wireguard-1.0.20210219
make
make install
1 лайк