Вопрос или проблема
Я работаю с одноплатными компьютерами Nvidia Tegra для кастомного приложения. Приложение использует GPU Nvidia, специфичный для этих плат. Система работает на aarch64 (arm64) Ubuntu 22.04 Linux.
Мне нужно использовать WireGuard на этих платах. Но я не могу заставить WireGuard работать с ядром Tegra. Я даже пробовал wireguard-dkms. Я бы предпочел использовать режим ядра из-за производительности.
Linux 00000273 5.15.122-tegra #1 SMP PREEMPT Thu Nov 30 10:30:37 PST 2023 aarch64 aarch64 aarch64 GNU/Linux
Я слышал, что у многих людей были проблемы с этим. У кого-то есть решение?
Мне было очень грустно увидеть этот вопрос без ответов, когда я сам начал работать над этой проблемой. Это была настоящая головоломка. Теперь у меня это работает, поэтому я поделюсь здесь, чтобы помочь другим и себе в будущем, когда я неизбежно столкнусь с этой же проблемой через несколько месяцев.
Сначала я обновил ядро до текущей версии с помощью sudo do-release-upgrade
, пока не стал на 5.10.65-tegra
. Затем я установил wireguard
и wireguard-tools
с помощью sudo apt install wireguard-tools wireguard
. Я подозреваю, что wireguard-tools
не был нужен, но я не готов его удалять, чтобы проверить, теперь когда все работает. На этом этапе проверка модуля ядра все еще выдавала ошибку:
>> sudo modprobe wireguard
modprobe: FATAL: Module wireguard not found in directory /lib/modules/5.10.65-tegra
Я склонировал wireguard-linux-compat
репозиторий. Если просто попытаться собрать это, запустив make
после cd
в wireguard-linux-compat/src
, вы получите бесполезную ошибку:
WireGuard has been merged into Linux >= 5.6 and therefore this compatibility module is no longer required.
поскольку ядро 5.10.65-tegra
находится после основной линии Linux 5.6, но модуль WireGuard отключен.
Замечательная вещь в директивах компилятора заключается в том, что их можно закомментировать. Я нашел проблемную ошибку с помощью grep, и она была в wireguard-linux-compat/src/compat/compat.h
, после чего просто закомментировал следующее:
/*
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
#error "WireGuard has been merged into Linux >= 5.6 and therefore this compatibility module is no longer required."
#endif
*/
После этого я смог выполнить make
, а затем sudo make install
и успешно установить модуль ядра. После этого sudo modprobe wireguard
возвращал без вывода или ошибок, и я смог успешно запустить интерфейс wireguard.
Я пробовал достаточно много способов, чтобы это заработало, так что не могу утверждать, что это обязательно сработает без модификации для вас, но это сработало для меня и, надеюсь, поможет следующему человеку, который столкнется с этой проблемой.
Недостаточно репутации, чтобы прокомментировать ответ SleepyOtter, но вот форк и обновленная версия wireguard-linux-compat
для любых несчастных душ, которые обнаружат, что оригинальный репозиторий не собирается для них. Несколько дополнительных изменений поверх ответа SleepyOtter для Linux 5.10.216-tegra
.
https://github.com/dustin-richards-was-here/wireguard-linux-compat
Ответ или решение
Установка WireGuard на платы Nvidia Tegra
Установка и настройка WireGuard на одноплатных компьютерах Nvidia Tegra может представлять определенные сложности, особенно если система работает на ядре, которое не поддерживает WireGuard по умолчанию. В этой статье мы подробно рассмотрим процесс установки, включая потенциальные проблемы и их решения.
Шаг 1: Обновление ядра
Первое, что нужно сделать, это убедиться, что ваше ядро обновлено до последней версии, оптимизированной для Tegra. В вашем случае рекомендуется выполнить следующее:
sudo do-release-upgrade
Убедитесь, что текущее ядро – это версия 5.10.65-tegra или выше. Это ядро уже включает в себя поддержку WireGuard, однако она может быть отключена по умолчанию.
Шаг 2: Установка WireGuard
После обновления ядра установите необходимые пакеты WireGuard:
sudo apt install wireguard-tools wireguard
Пакет wireguard-tools
предоставляет утилиты командной строки для управления WireGuard, хотя его можно не устанавливать для базовой работы модуля, но это может быть полезно для диагностики и настройки.
Шаг 3: Проверка модуля WireGuard
После установки возможно, что модуль WireGuard не будет загружаться:
sudo modprobe wireguard
Если вы получите сообщение об ошибке, такое как:
modprobe: FATAL: Module wireguard not found in directory /lib/modules/5.10.65-tegra
это означает, что модуль не доступен в ядре. В этом случае необходимо скомпилировать модуль WireGuard самостоятельно.
Шаг 4: Компиляция модуля WireGuard
-
Клонирование репозитория:
Скачайте совместимый модуль из репозиторияwireguard-linux-compat
. Это нужно сделать, так как поддержки нет в вашем ядре.git clone https://git.zx2c4.com/wireguard-linux-compat
-
Модификация кода:
Вызовите следующую команду для входа в директорию:cd wireguard-linux-compat/src
В файле
compat/compat.h
нужно закомментировать блок кода, связанный с ошибкой, если оно присутствует:/* #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) #error "WireGuard has been merged into Linux >= 5.6 and therefore this compatibility module is no longer required." #endif */
-
Сборка и установка:
Далее выполните команды для сборки и установки модуля:make sudo make install
Шаг 5: Проверка и запуск
После установки попробуйте снова загрузить модуль:
sudo modprobe wireguard
Если команда выполнится без ошибок, стоит проверить создание интерфейса WireGuard. Используйте утилиты WireGuard для настройки интерфейса согласно вашим требованиям.
Альтернативные решения
Если вам не удастся скомпилировать модуль самостоятельно, можно также использовать форк, который включает в себя необходимые изменения для работы с последними версиями ядра Tegra. Один из таких форков доступен по ссылке: wireguard-linux-compat от dustin-richards-was-here.
Заключение
Установка WireGuard на Nvidia Tegra может быть непростой задачей, но следуя указанным шагам, вы сможете успешно реализовать этот процесс. Если у вас возникнут какие-либо трудности, проверьте совместимость с вашим конкретным ядром и рассмотрите возможность обращения к сообществу для дополнительной помощи.
Эта инструкция будет полезна не только вам, но и другим пользователям, сталкивающимся с аналогичными проблемами.