Yocto SYSTEMD_SERVICE для установки параметризованного сервиса ("@.service")

Мне нужно настроить WireGuard для запуска VPN при загрузке на устройстве Embedded Linux.

Мой рецепт устанавливает /etc/wireguard/wg0.conf очень похоже на примеры, найденные в Интернете.

Затем я пытаюсь включить службу на SystemD, как это на моем wireguard.bb:

SYSTEMD_SERVICE = "wg-quick@wg0.service"
SYSTEMD_AUTO_ENABLE = "enable"

Но bitbake выдает мне ошибку:

ERROR: Function failed: SYSTEMD_SERVICE_my-conf value wg-quick@wg0.service does not exist

Я проверил временный каталог и файл wg0.conf появляется в правильных местах, но кажется, что битбэйки SYSTEMD_SERVICE не знает, как расширить "wg0" после @ знак.

Если я попробую без имени интерфейса (wg0):

SYSTEMD_SERVICE = "wg-quick@.service"

Битбэйк доволен и дорабатывает мой рецепт, но это не то, что systemd ожидает. Запускать сервис без интерфейса не имеет смысла...


Затем я попробовал другой подход, отделил сам пакет "wireguard" от конфигурации (пакет "wireguard-conf") и добавил DEPENDS а также RDEPENDS на "телеграфе".

Это стало еще хуже, так как мой wireguard-conf.bb В рецепте отсутствует файл "wg-quick@.service" (он происходит из зависимости "wireguard").


Что ж,

Я не знаю, как правильно это исправить, и любые предложения будут высоко оценены.


Дополнительная информация

Я использую Yocto 2.0.3 в этом проекте (без надежды на его обновление).

Благодаря комментариям @TomasNovotny мне удалось сравнить мой "systemd.bbclas" с Github и заметить изменение в systemd_populate_packages() кажется, это решает проблему.

1 ответ

Решение

Он работает в более новом OpenEmbedded (похоже на krogoth, версия 2.1, выпущенная в апреле 2016 г.) и вводится этим коммитом. Это работает для меня в роко (версия 2.4 выпущена в октябре 2017 года). Согласно комментарию j4x, он не работает в jethro (версия 2.0, ноябрь 2015 г.).

Для более старых (и в настоящее время не поддерживаемых OpenEmbeddeds) вы можете попытаться сделать бэкпорт патча или обработать символические ссылки для включения службы в do_install(),

Также обратите внимание, что SYSTEMD_SERVICE_${PN} переменная зависит от пакета, поэтому _${PN} необходимо добавить суффикс ( см. руководство).

Я также безуспешно пытался включить OpenVPN в моем профиле (в Yocto rocko). Наконец, я заставил его работать, предоставив расширение рецептов OpenVPN вместо пользовательского. Так чтоopenvpn_%.bbappend файл выглядит так:

inherit systemd
SYSTEMD_SERVICE_${PN} = "openvpn@clientprofile.service"
SYSTEMD_AUTO_ENABLE = "enable"

do_install_append() {
    install -d ${D}${sysconfdir}/openvpn/
    ln -sf /data/etc/openvpn/clientprofile.conf ${D}${sysconfdir}/openvpn/clientprofile.conf
}

Как видите, я использую символическую ссылку на свой профиль вместо обычного файла. Вы можете установить обычный файл профиля OpenVPN вместо создания символической ссылки, и он также отлично работает.

Другие вопросы по тегам