Поднимем Devuan на вершину Distrowatch! Просто перейдите по ссылке один раз в день.
Не знаете где спросить? Спрашивайте тут
zyx
Сообщения: 2 Зарегистрирован: Чт июл 16, 2026 7:15 pm
Поблагодарили: 1 раз
Сообщение
zyx » Чт июл 16, 2026 7:32 pm
Yggdrasil
zyx
Приветствую всех.
Отцы, подскажите плизз как поднять Yggdrasil на Devuan sysvinit?
Дефолтная установка пакета даёт неудобоваримый /usr/lib/systemd/system/yggdrasil.service
Заранее благодарен.
zyx
root:#
Site Admin
Сообщения: 2135 Зарегистрирован: Вт ноя 08, 2022 3:27 pm
Благодарил (а): 60 раз
Поблагодарили: 28 раз
Сообщение
root:# » Пт июл 17, 2026 8:30 pm
zyx писал(а): Чт июл 16, 2026 7:32 pm Приветствую всех.
Привет!
На Devuan (sysvinit) пакет yggdrasil при установке ставит только systemd-сервис, который не работает, потому что systemd нет. Нужно вручную сделать init-скрипт для sysvinit
Код: Выделить всё
#!/bin/sh
### BEGIN INIT INFO
# Provides: yggdrasil
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Yggdrasil network daemon
# Description: Yggdrasil is an IPv6 peer-to-peer mesh network.
### END INIT INFO
PATH=/sbin:/usr/sbin:/bin:/usr/bin
NAME=yggdrasil
DAEMON=/usr/bin/yggdrasil
CONFFILE=/etc/yggdrasil.conf
PIDFILE=/var/run/$NAME.pid
LOGFILE=/var/log/$NAME.log
USER=_yggdrasil
GROUP=_yggdrasil
[ -x "$DAEMON" ] || exit 0
# Если каталог /var/run не tmpfs (Devuan чаще с tmpfs), /run или /var/run
# PID-файл должен лежать на tmpfs, поэтому /var/run подходит.
[ -d /var/run ] || mkdir -p /var/run
start() {
echo -n "Starting $NAME: "
start-stop-daemon --start --background --make-pidfile \
--pidfile "$PIDFILE" \
--chuid "$USER:$GROUP" \
--exec "$DAEMON" -- -useconffile "$CONFFILE" \
>> "$LOGFILE" 2>&1
echo "done."
}
stop() {
echo -n "Stopping $NAME: "
start-stop-daemon --stop --pidfile "$PIDFILE" --retry 5
rm -f "$PIDFILE"
echo "done."
}
status() {
if [ -f "$PIDFILE" ] && kill -0 $(cat "$PIDFILE") 2>/dev/null; then
echo "$NAME is running (pid $(cat $PIDFILE))"
else
echo "$NAME is not running"
return 1
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit 0
root:#
zyx
Сообщения: 2 Зарегистрирован: Чт июл 16, 2026 7:15 pm
Поблагодарили: 1 раз
Сообщение
zyx » Пт июл 24, 2026 10:49 am
Не помогло.
Заработал такой вариант. Проверено на Excalibur.
Код: Выделить всё
#!/bin/sh
### BEGIN INIT INFO
# Provides: yggdrasil
# Required-Start: $network $remote_fs
# Required-Stop: $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: yggdrasil daemon
### END INIT INFO
NAME="yggdrasil"
DAEMON="/usr/sbin/yggdrasil"
CONFIG="/etc/yggdrasil/yggdrasil.conf"
USER="yggdrasil"
GROUP="yggdrasil"
# где будет PID
PIDDIR="/var/run/yggdrasil"
PIDFILE="$PIDDIR/yggdrasil.pid"
# paths (аналог RuntimeDirectory/ReadWritePaths)
RUNDIRS="/var/run/yggdrasil /run/yggdrasil"
# capabilities из unit (нужно, чтобы setcap/capsh/ld обвязка была доступна)
# В SysV проще всего дать бинарнику capability один раз командой setcap.
# Если уже сделано — убери эти строки.
CAPS="cap_net_admin,cap_net_bind_service+ep"
case "$1" in
start)
echo "Starting $NAME..."
# Права/каталоги
for d in $RUNDIRS; do
[ -d "$d" ] || mkdir -p "$d" 2>/dev/null
chown -R "$USER":"$GROUP" "$d" 2>/dev/null
done
# modprobe tun (ExecStartPre)
/sbin/modprobe tun 2>/dev/null || true
# Убедимся, что у бинарника есть capabilities (если нет — попытка дать)
if command -v setcap >/dev/null 2>&1; then
setcap "$CAPS" "$DAEMON" 2>/dev/null || true
fi
# запуск
# SysV обычно нужно background'ить процесс.
start-stop-daemon --start --quiet \
--chuid "$USER":"$GROUP" \
--make-pidfile --pidfile "$PIDFILE" \
--background --exec "$DAEMON" -- \
-useconffile "$CONFIG"
# проверка
if [ -f "$PIDFILE" ]; then
echo "$NAME started (pid $(cat "$PIDFILE" 2>/dev/null))."
else
echo "Failed to start $NAME (pidfile not created)."
exit 1
fi
;;
stop)
echo "Stopping $NAME..."
if [ -f "$PIDFILE" ]; then
pid="$(cat "$PIDFILE" 2>/dev/null)"
if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
# в systemd ExecReload=HUP, но stop = по умолчанию мягко, потом жёстко
# здесь: сначала TERM, затем KILL
kill -TERM "$pid" 2>/dev/null || true
# TimeoutStopSec=5
i=0
while kill -0 "$pid" 2>/dev/null; do
i=$((i+1))
[ "$i" -ge 5 ] && break
sleep 1
done
kill -KILL "$pid" 2>/dev/null || true
fi
rm -f "$PIDFILE" 2>/dev/null
else
# если pidfile нет — попробуем убить по имени (бережно)
pkill -u "$USER" -x "$DAEMON" 2>/dev/null || true
fi
echo "$NAME stopped."
;;
restart)
"$0" stop
"$0" start
;;
status)
if [ -f "$PIDFILE" ]; then
pid="$(cat "$PIDFILE" 2>/dev/null)"
if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
echo "$NAME is running (pid $pid)."
exit 0
fi
fi
echo "$NAME is not running."
exit 3
;;
reload)
# systemd ExecReload=kill -HUP $MAINPID
if [ -f "$PIDFILE" ]; then
pid="$(cat "$PIDFILE" 2>/dev/null)"
if [ -n "$pid" ] && kill -HUP "$pid" 2>/dev/null; then
echo "Reloaded $NAME."
exit 0
fi
fi
echo "Cannot reload $NAME (pidfile missing or process dead)."
exit 1
;;
*)
echo "Usage: $0 {start|stop|restart|status|reload}"
exit 2
;;
esac
exit 0
zyx