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 вместо создания символической ссылки, и он также отлично работает.