LINUX.ORG.RU

systemd юниты && install dirs

 ,


0

1

Привет. У меня как бы не проблема, скорее замешательство. Для софта у нас есть стандартная планировка в /usr{,/local} (bin, etc, lib, …). Все договорились, вроде соблюдают, системы сборки с –prefix, пакетные менеджеры для /usr/local вроде stow. Стоит забить на эти договорённости и начнётся windows like вакханалия. Т.е. все должны учитывать –prefix и устанавливать относительно него.

Решил осилить systemd, читаю man systemd

… Applications should place their unit files in the directory returned by pkg-config systemd –variable=systemduserunitdir. Global configuration is done in the directory reported by pkg-config systemd –variable=systemduserconfdir. …

Что-то можно устанавливать и относительно префикса (/usr/local/lib/systemd/system), но как бы акцент делается на pkg-config. Вот начитаюсь я таких доков (или другой говнокодер) и сделаю установку юнитов в pkg-config systemd –variable=systemduserunitdir, конечный юзер устанавливал через префикс для stow (/usr/local/stow), но бесполезно - система потихоньку зарастает шлаком. И такую смуту вносит systemd, который претендуют быть пупом земли, да он должен максимально стимулировать установку через /usr/{,local/}lib/systemd вместо таких странных рекомендаций.

Ответ на: комментарий от bass

Только наоборот. В рамках отдельно взятого дистрибутива prefix всегда константа, а ТС хочет, чтобы systemd угадывало префикс, с которым он собирает свою программу.

intelfx ★★★★★ ()
Ответ на: комментарий от bass

Может объяснил плохо, уточню. systemd должен читать юниты из стандартных мест, например /usr/{,local/}lib/systemd, а свои мейк файлы я должен писать примерно так:

prefix ::= /usr/local/stow/soft-1.0.0
exec_prefix ::= $(prefix)
bindir ::= $(exec_prefix)/bin
libdir :: = $(exec_prefix)/lib

install:
         install -t $(DESTDIR)$(bindir) soft_bin
         install -t $(DESTDIR)$(libdir)/systemd/... soft_systemd_unit

Юзер задаёт prefix и всё в системе аккуратно, нигде не гадится. Удаляет просто

/usr/local/stow # stow -D soft-1.0.0

Но системд стимулирует сломать устоявшиеся правила и писать makefile так:

systemd_path ::= $(shell pkg-config systemd --variable=systemdsystemunitdir)
install:
         install -t $(systemd_path) soft_systemd_unit

Ты потом ничего не вычистишь через stow -D soft-1.0.0, разводя в системе помойку.

pavlick ★★ ()
Ответ на: комментарий от pavlick

Ты путаешь задачи.

Установка в префикс нужна для изолированной установки приложения. Установка systemd-юнита нужна для того чтобы указать системе где именно твоё приложение самоизолировалось.

Поэтому systemd-юнит живёт не в префиксе, а снаружи, по системному пути. При этом при изолированной разработке приложения его просто не надо устанавливать.

alpha ★★★★★ ()
Ответ на: комментарий от alpha

Подозреваю, что ты не слышал про менеджер stow, там идея такая - ставим в софтину в свой «загончик» в /usr/local/stow, запускаем stow, он делает симлинки в /usr/local (как-будто мы установили в /usr/local), в результате - легко снести.

Вообще это моё дело какой префикс, все должны соблюдать эти договорённости, даже в gnu coding standard прописано.

pavlick ★★ ()
Последнее исправление: pavlick (всего исправлений: 1)
Ответ на: комментарий от pavlick

ставим в софтину в свой «загончик» в /usr/local/stow, запускаем stow, он делает симлинки в /usr/local (как-будто мы установили в /usr/local), в результате - легко снести.

Трешак какой.

И это не отменяет моего ответа. systemd-юнит - это интеграция с системой, поэтому он лежит не в «загончиках», а по системному пути.

alpha ★★★★★ ()
Ответ на: комментарий от alpha

Stow очень крут, ты просто не распробовал, если сам собираешь из исходников, то незаменим, иначе помойка в системе.

Мой ответ тоже не отменён systemd должен искать юниты либо в /usr/lib, либо /usr/local/lib, какой префикс выберет конечный юзер (local или нет, поставит через stow и сделает симлинки в local) это его дело, systemd найдёт в обоих случаях.

pavlick ★★ ()
Последнее исправление: pavlick (всего исправлений: 1)
Ответ на: комментарий от pavlick

если сам собираешь из исходников

То совершенно незачем делать это от root и лезть в системные каталоги.

systemd должен искать юниты либо в /usr/lib, либо /usr/local/lib

Он там и ищет

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Unit%20File%20Load%20Path

Но юзеры тут ни при чём.

alpha ★★★★★ ()

Я просто искренне удивлён - как такой ключевой элемент системы может пропагандировать такое? Например, это противоречит gnu coding standard. Хз, теперь каждая установка софта из исходников будет напрягать - говнокодер там или нет, ставит как положено или начитался мануалов системд.

pavlick ★★ ()
Ответ на: комментарий от alpha

То совершенно незачем делать это от root и лезть в системные каталоги.

устанавливать тоже как юзер будешь? В норме установка требует рутовских прав, да тупо сделать ldconfig.

Он там и ищет

Я ещё в первом посте сказал что да, но акцент заюзать pkg-config, такое вообще нельзя советовать.

pavlick ★★ ()
Последнее исправление: pavlick (всего исправлений: 2)
Ответ на: комментарий от pavlick

устанавливать тоже как юзер будешь?

мсье не в курсе, что приложения, не требующие рутовых прав для работы можно ставить в хомяк пользователю? а если приложение - демон, работающий на непривелигированном порту, то его еще и через юзерский crontab можно запускать, сюрприз. То есть права рута не нужны вообще от слова совсем.

не, к systemd можно много претензий предъявить, но это явно не тот случай...

Как ты вообще представляешь что он должен угадывать где расположены unit-файлы в бесконечном множестве префиксов? не проще ли тогда пропатчить stow, чтобы он делал нужные симлинки(я так понял как stow делает сейчас для бинарников, библиотек и прочего в /usr/local)?

Ты же не жалуешься, что бинарь поставленный в /usr/local/vasya/bin по умолчанию не виден в дефолтном PATH?

Pinkbyte ★★★★★ ()
Последнее исправление: Pinkbyte (всего исправлений: 6)
Ответ на: комментарий от Pinkbyte

А я хочу в /usr/local для всех юзеров, мне нужно прекратить это из-за странных доков Потеринга? Да и что это меняет, могу сделать хозяином директории в /usr/local/stow юзера, если ошибки, значит поделка какого-то говнокодера, который забил на стандарты. Такую же ошибку получишь и ты, когда будешь ставить в хомяка, софтина захочет записать куда-нибудь через pkg-config, кто-то перелогинется в рута и поставит.

Как ты вообще представляешь что он должен угадывать где расположены unit-файлы в бесконечном множестве префиксов? не проще ли тогда пропатчить stow, чтобы он делал нужные симлинки(я так понял как stow делает сейчас для бинарников, библиотек и прочего в /usr/local)?

Блин, ну сто раз писал - systemd ищет в /usr/lib и /usr/local/lib, если префикс указывает туда, то системд спокойно находит, если в какое-то другое место, то нет, сам ставил черт знает куда, сам думай что с этим делать.

ЗЫ: опять же, установка юзером не сделат ldconfig, mandb, … . Сам потом руками будешь всё делать, если установка вообще не упадёт где-нибудь в середине.

pavlick ★★ ()
Последнее исправление: pavlick (всего исправлений: 2)
Ответ на: комментарий от Pinkbyte

Как ты вообще представляешь что он должен угадывать где расположены unit-файлы в бесконечном множестве префиксов? не проще ли тогда пропатчить stow, чтобы он делал нужные симлинки(я так понял как stow делает сейчас для бинарников, библиотек и прочего в /usr/local)?

stow и так справится, он сделает зеркальную копию загончика в /usr/local, в том числе и юнитов.

Да дело и не в stow вообще, и говнософт я вычислю и не дам нагадить где попало (тупо не буду ставить). Обидно, что на отлаженную систему установочных директорий кладётся центральным компонентом (системд проник почти во все щели, а он пишет такие доки). Мне винда не нужна.

pavlick ★★ ()
Последнее исправление: pavlick (всего исправлений: 2)
Ответ на: комментарий от pavlick

Обидно, что на отлаженную систему установочных директорий кладётся центральным компонентом

Из man systemd.unit:

/usr/local/lib/systemd/system	System units installed by the administrator
/usr/lib/systemd/system	System units installed by the distribution package manager

Я хз что тебя не устраивает... Если апстрим какого-то пакета неправильно берет путь для установки unit-файла - это проблемы этого апстрима, а не systemd.

Pinkbyte ★★★★★ ()
Ответ на: комментарий от Pinkbyte

Ну я ведь тоже справку цитирую man systemd

The systemd system manager reads unit configuration from various directories. Packages that want to install unit files shall place them in the directory returned by pkg-config systemd --variable=systemdsystemunitdir. Other directories checked are /usr/local/lib/systemd/system and /usr/lib/systemd/system.

Зачем писать про pkg-config? Чтобы какой-нибудь идиот заюзал в мейкфайле? Как минимум - нужно основательно причесать доки системд, а в шапке man systemd.unit вообще нет ни одного упоминания про /usr/local/lib, не кажется странным? Какие-то двоечники доки писали.

pavlick ★★ ()
Ответ на: комментарий от pavlick

Зачем писать про pkg-config?

Потому что то что ставится дистрибутивным пакетным менеджером должно идти туда.

Чтобы какой-нибудь идиот заюзал в мейкфайле?

Поверь - идиотизма в мэйкфайлах различных апстримов я навидался преизрядно. Отломанная поддержка установки в кастомный prefix - это самое меньшее, что я видел.

Как минимум - нужно основательно причесать доки системд, а в шапке man systemd.unit вообще нет ни одного упоминания про /usr/local/lib, не кажется странным? Какие-то двоечники доки писали.

Ну это уже не ко мне, я к разработке systemd имею отношения примерно никакого. Пили им enhancement на этот счет, если тебя это действительно волнует.

Pinkbyte ★★★★★ ()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от pavlick

Так ты цитируешь справку для системных компонентов, а сам используешь какое-то левое ПО. И хочешь, чтобы у тебя systemd телепатически догадался, что это твоё ПО гадит под себя раскладывает всяких хлам неизвестно куда.

dhameoelin ★★★★★ ()

Ребят, чего-то мы вообще друг друга не понимаем. Я не требую от системд искать юниты по любому префиксу (например, поставил софтину с –prefix=/tmp/whatever-1.0.0), достаточно искать в общепринятых /usr и /usr/local (он и сейчас умеет). Но системд справка - полный хлам, который учит плохому. Вот я сейчас начну новый проект и буду делать как Лёня советует в таком стиле makefile

  systemd_path ::= $(shell pkg-config systemd --variable=systemdsystemunitdir)

и потом на вашей системе моя софтина будет гадить, хотя вам хотелось бы легко её снести в случае необходимости, но не выйдет, будете искать остатки руками по всей /usr. Ну здорово.

Всем спасибо.

pavlick ★★ ()
Ответ на: комментарий от pavlick

если сам собираешь из исходников, то незаменим, иначе помойка в системе.

Сам собираю из исходников. Делаю так:

$ cd app-src/
$ mkdir ~/app
$ make DESTDIR=$HOME/app install

Помойки в системе не наблюдаю.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Сам собираю из исходников. Делаю так:

$ ./configure –prefix=$HOME/app много лучше же, пути ведь могут быть «вкомпилированны».

Помойки в системе не наблюдаю.

Скоро будет, вот только подрастёт systemd поколение, которое читает такие доки.

pavlick ★★ ()
Ответ на: комментарий от pavlick

Скоро будет, вот только подрастёт systemd поколение, которое читает такие доки.

Встречайте, они уже здесь https://pagure.io/freeipa/issue/6602. Человек приходит с правильным вопросом - почему софтина гадит за пределами prefix?

$ ./configure --prefix=/tmp/freeipa
$ make
$ make install
Making install in dnssec
make[2]: Entering directory '/home/heimes/redhat/freeipa/daemons/dnssec'
make[3]: Entering directory '/home/heimes/redhat/freeipa/daemons/dnssec'
make[3]: Nothing to be done for 'install-exec-am'.
...
 /usr/bin/mkdir -p '/usr/lib/systemd/system'
 /usr/bin/install -c -m 644 ipa-dnskeysyncd.service ipa-ods-exporter.service ipa-ods-exporter.socket '/usr/lib/systemd/system'
/usr/bin/install: cannot create regular file '/usr/lib/systemd/system/ipa-dnskeysyncd.service': Permission denied
/usr/bin/install: cannot create regular file '/usr/lib/systemd/system/ipa-ods-exporter.service': Permission denied
/usr/bin/install: cannot create regular file '/usr/lib/systemd/system/ipa-ods-exporter.socket': Permission denied
Makefile:470: recipe for target 'install-systemdsystemunitDATA' failed
make[3]: *** [install-systemdsystemunitDATA] Error 1
...
make: *** [install-recursive] Error 1

А ему в ответ какие-то наркоманы, которые про prefix впервые слышат:

If your use case is to simply install FreeIPA to a chosen directory, you can use the DESTDIR option as mentioned above.

I'm not sure what is the purpose of --prefix option for ./configure, but using DESTDIR seems to be a standard automake way to achieve the behavior you want.

И на этот баг благополучно забивают. Приехали … . Откуда Лёня взялся? Он всё разрушит …

pavlick ★★ ()
Последнее исправление: pavlick (всего исправлений: 2)