Нет причин иметь оба / run и / tmp
Я думаю ты прав. /tmp
по сути устарел сейчас у нас /run
. Если ваша программа в состоянии сделать это (что требует, чтобы она была установлена как привилегированная операция), то в настоящее время вы должны использовать подкаталог /run
. Это из соображений безопасности.
Например, демон печати CUPS не запускается от имени пользователя root, но обычно устанавливается из пакета ОС. Пакет устанавливается /usr/lib/tmpfiles.d/cups.conf
и systemd-tmpfiles
создает каталог, к которому он может получить доступ. Поскольку каталог находится в папке /run
, непривилегированное пользователь не может получить злонамеренное имя, в отличие от того, /tmp
которое доступно для записи всем пользователям.
«Непривилегированные программы», которые нельзя использовать /run
напрямую
Настоящее различие заключается в том, что ваша программа запускается произвольным непривилегированным пользователем под своим собственным идентификатором пользователя. Но вы все равно, как правило, не хотите использовать /tmp
, потому что к нему могут получить доступ другие непривилегированные пользователи. Вы бы предпочли использовать $XDG_RUNTIME_DIR
. Как правило, это реализуется как /run/user/$(id -u)
- так что это, оказывается, также подкаталог /run
. Расположение не гарантируется, хотя; программы всегда должны использовать переменную окружения.
/tmp
будет полезно только для специального сотрудничества между различными непривилегированными пользователями в системе. Такие специальные системы уязвимы для злонамеренного пользователя, отказывающегося сотрудничать и портящего вещи для всех :). Одним из примеров могут быть непривилегированные пользователи, решившие запустить версию talk
демона, используя сокет unix.
Обратите внимание, что в приведенном ниже контрольном списке Poettering указано, что /tmp
это будет полезно для «маленьких файлов», тогда как /run
следует использовать только для «коммуникационных примитивов». Я не думаю, что это различие также верно. Автор плаката для /run
is udev
, и я уверен, что /run/udev
включает в себя внутренние базы данных. Если у вас есть /run
каталог, я не думаю, что кто-то захочет следовать заявленному различию и создать еще один каталог, чтобы загромождать /tmp
. Так что на практике мы просто используем в /run
наше время.
Использование общедоступных общих пространств имен [like / tmp] для целей связи всегда было проблематичным, поскольку для установления связи нужны стабильные имена, но стабильные имена открывают двери для DoS-атак. Это может быть исправлено частично путем создания защищенных каталогов для приложений для определенных сервисов во время ранней загрузки (как мы делаем для X11), но это только частично устраняет проблему, поскольку это работает правильно, только если после каждой установки пакета происходит перезагрузка.
...
Другая функция Fedora (для Fedora 17) изменила семантику / tmp для многих системных сервисов, сделав их более безопасными, изолировав пространства имен / tmp различных сервисов
...
Поскольку / tmp больше не обязательно является общим пространством имен, он обычно не подходит в качестве места для примитивов связи.
...
[/ run] гарантированно будет tmpfs и, следовательно, автоматически сбрасывается при загрузке. Никакой автоматической очистки не производится.
...
Вот примерное руководство о том, как мы предлагаем вам (разработчику приложений для Linux) выбрать правильный каталог для использования:
- Вам нужно место для размещения вашего сокета (или другого коммуникационного примитива), и ваш код запускается с привилегиями: используйте подкаталог ниже / run. (Или под / var / run для дополнительной совместимости.)
- Вам нужно место для размещения вашего сокета (или другого коммуникационного примитива), и ваш код выполняется непривилегированным: используйте подкаталог под $ XDG_RUNTIME_DIR.
- Вам нужно место, где вы можете загружать и загружать большие файлы и запускать их без привилегий: используйте $ XDG_DOWNLOAD_DIR.
- Вам нужно место для размещения файлов кэша, которые должны быть постоянными и работать непривилегированно: используйте $ XDG_CACHE_HOME.
- Ничто из вышеперечисленного не применимо, и вам нужно поместить небольшой файл, который не нуждается в постоянстве: используйте $ TMPDIR с резервным вариантом на / tmp. И используйте mkstemp (), и mkdtemp () и ничего доморощенного.
- В противном случае используйте $ TMPDIR с откатом на / var / tmp. Также используйте mkstemp () / mkdtemp ().
Обратите внимание, что указанные выше правила предлагаются только нами. Эти правила учитывают все, что мы знаем об этой теме, и, насколько мы можем видеть, избегают проблем с текущими и будущими дистрибутивами. Пожалуйста, рассмотрите возможность обновления ваших проектов в соответствии с этими правилами и помните их, если вы пишете новый код.
Одна вещь, которую мы хотели бы подчеркнуть, это то, что / tmp и / var / tmp чаще всего не являются правильным выбором для вашего варианта использования. Существуют допустимые варианты использования этих каталогов, но нередко лучше использовать другой каталог. Поэтому будьте осторожны, рассмотрите другие варианты, но если вы все же выберете / tmp или / var / tmp, то, по крайней мере, обязательно используйте mkstemp () / mkdtemp ().
Мы отошли от устаревшего /tmp
сокета, используемого системой X Window, как описано выше. Я неправильно понял tmpfiles.d/x11.conf
. Похоже, что это зависит от сотрудничества :). Я предполагаю, что код был проверен, так что отказ в обслуживании - худшее, что может произойти.