вторник, 5 марта 2013 г.

systemd vs. xl2tpd

Являясь счастливым обладателем интернета по протоколу L2TP, обнаружил в openSUSE 12.3 rc2 довольно не приятное поведение системы. При гарантированно рабочем конфигурационном файле для xl2tpd, этот самый xl2tpd не работал, выдавая лишь текст из трёх строк:

2013-03-04T19:24:40.572381+06:00 linux-wwu0 xl2tpd[5382]: xl2tpd[5382]: setsockopt recvref[22]: Protocol not available
2013-03-04T19:24:40.595657+06:00 linux-wwu0 xl2tpd[5382]: xl2tpd[5382]: Using l2tp kernel support.
2013-03-04T19:24:40.596264+06:00 linux-wwu0 xl2tpd[5382]: xl2tpd[5382]: open_controlfd: Unable to open /var/run/xl2tpd/l2tp-control for reading.
Запуск сервисом соответственно тоже не удавался:
2013-03-04T19:24:40.596660+06:00 linux-wwu0 systemd[1]: xl2tpd.service: main process exited, code=exited, status=1/FAILURE
2013-03-04T19:24:40.601560+06:00 linux-wwu0 systemd[1]: Unit xl2tpd.service entered failed state
 Ранее на openSUSE 12.1 с первыми двумя сообщениями xl2tpd благополучно работал и не нужен ему был никакой l2tp-control. Но не все обновления одинаково полезны и xl2tpd в том числе в сборке для openSUSE 12.3 получил поддержку xl2tpd-control причём поддержка в непосредственно в самом демоне появилась ещё в 2011-ом году, просто более свежая версия чем 1.2.7 для oS 12.1 не собиралась. В итоге для работы демона достаточно создать этот файлик, например, так:
sudo mkdir /var/run/xl2tpd
sudo touch /var/run/xl2tpd/l2tp-control
xl2tpd благополучно проработает до следующей перезагрузки и при попытке запуска выдаст такое же сообщение о невозможности собственного запуска что и ранее.

С версии 12.3 openSUSE окончательно переходит на использование systemd, который монтирует каталоги /run, /var/run, /var/lock, и /media в tmpfs. В примечании к релизу не рекомендуется сохранять файлы, которые должны выжить при перезагрузке в эти каталоги. Незадача заключается в том, что xl2tpd об этом не знает и продолжает искать l2tp-control где он и должен быть.
Для решения проблемы пользователи Fedora, например, используют наименее очевидный способ - дополнение скрипта инициализации /etc/init.d/xl2tpd командами на создание необходимого каталога и файла. Теоретически эта схема однажды должна поломаться, когда необходимости в соблюдении остаточной совместимости со скриптами SysV больше не будет. К тому же есть более подходящий способ - с помощью средств systemd: по правилам описанным в man tmpfiles необходимо поместить в /etc/tmpfiles.d/ файл xl2tpd.conf со следующим содержанием (комментарии для пояснения строк):

# Создать каталог /var/run/xl2tpd с правами по умолчанию, если его ещё не существует.

d /var/run/xl2tpd 755 root root - -
# Создать именованный канал с правами по умолчанию, если его ещё не существует.
p /var/run/xl2tpd/l2tp-control 600 root root - -
# Не удалять каталог /var/run/xl2tpd/ и его содержимое при чистке от временных файлов.
x /var/run/xl2tpd/

После чего xl2tpd без проблем работает с systemd.

2 комментария:

  1. Ответы
    1. Так и знал что кто-нибудь спросит. :) Сейчас вот как раз багрепорт сочиняю. Там ведь бюрократия: сначала багрепорт, потом исправления в собственном репке, потом запрос на принятие исправлений. Просто решил публикацию сделать, на случай если кто-то ещё наткнётся до обновления пакета.

      Удалить