Идиоматическое расположение файловых сокетов в системах Debian

13

Я пишу демон-процесс для системы Debian, в Cкоторой используется Unix Domain Socket .

Если рабочим каталогом процесса демона является корневой каталог, существует ли идиоматический каталог для размещения сокета в файловой системе?

recursion.ninja
источник
Почему бы вам просто не позволить этому быть настраиваемым?
BatchyX
3
@BatchyX Ну, какое-то значение по умолчанию (вместо того, чтобы заставлять каждого администратора принимать решение самостоятельно) может быть хорошим. :)
CVn

Ответы:

17

Они обычно находятся в /tmpподкаталоге или в его подкаталоге. Обратите внимание, что все /tmpобъекты, подлежащие удалению при отключении, не обязательно стираются, просто имейте в виду, что это возможно , поэтому, если вы используете это, проверьте, нужно ли вам каждый раз создавать свой подкаталог. Вы захотите использовать подкаталог, если хотите ограничить доступ через разрешения, так /tmpкак он доступен для чтения всем.

/runи /var/run(которые могут быть символически связаны друг с другом) используются аналогичным образом, но они обычно монтируются как файловые системы tmpfs - это означает, что они создаются при загрузке и хранятся в памяти , а не на диске (поэтому не используйте это как место для выгрузки обильные данные). Для сокета времени выполнения это, вероятно, хороший выбор.

Обратите внимание, что /runи все другие каталоги, упомянутые здесь, кроме /tmp , доступны для записи только пользователю root. Для системного процесса это нормально, но если приложение может запускаться непривилегированным пользователем, вы либо захотите использовать /tmpили создать где-нибудь постоянный каталог и установить для него разрешения, либо использовать местоположение в $ HOME пользователя.

Можно создать каталог в /usr/share(или /usr/local/share) во время установки. Каталоги и содержимое там потенциально не загружаются через ботинки, как в /tmpили /run. Однако, как отмечает Джорданм в комментариях, это /usrможет быть смонтировано только для чтения, и руководящие принципы иерархии файловой системы linux отражают это . Конечно, он не может быть доступен только для чтения, когда ваше приложение установлено, поэтому, если вам удобно создавать сокет там, вы можете оставить его и использовать его позже (вы все равно сможете писать в сокет, даже если файл только для чтения).

Если вам требуется постоянное место в загрузочных загрузках, которое не будет монтироваться только для чтения, /etcэто вполне безопасная ставка, поскольку она часто используется для общесистемных и повторных конфигураций. OTOH, возможно иметь системы, где устройство, лежащее в основе всей корневой файловой системы, доступно только для чтения (например, встроенные системы), с / tmp и / run на другом устройстве (возможно: tmpfs в памяти). Таким образом, две наиболее надежные стратегии выглядят так:

  • Установите сокет в постоянное место, когда приложение установлено.

  • Создайте каталог в /runили /var/runво время выполнения и поместите сокет туда.

  • Делайте то же самое только в /tmp.

Преимущество первого состоит в том, что независимо от того, что, после установки приложения, у вас будет сокет для использования. Преимущество второго в том, что оно может быть более благоприятным для нормального программирования. Преимущество третьего состоит в том, что он не требует привилегий суперпользователя. Должно быть легко переключаться с одной реализации на другую, если вы передумаете позже.

Наконец, как показывал BatchyX , вы должны по крайней мере предложить вариант конфигурации для этого, выбрав вариант по умолчанию.

лютик золотистый
источник
2
/runили /var/runтакже часто используется для корневых процессов.
BatchyX
Правильно. Это даже больше, чем /tmp. Я буду править , что в.
Златовласка
/usrможет быть установлен только для чтения. Файлы никогда не должны создаваться там во время выполнения. Другие предложения хороши.
Иордания
1
Спасибо всем за ваш вклад, обсуждение было очень информативным. Я решил сделать местоположение по умолчанию, /tmp/.APPNAME/.APPSOCKпотому что демону не нужны постоянные данные.
recursion.ninja
1
Другое ключевое отличие между /tmpand /run, заключается в том, что только root имеет права на запись /run.
BatchyX