Согласно FHS-3.0 , /tmp
для временных файлов и /run
для переменных данных во время выполнения. Данные в /run
должны быть удалены при следующей загрузке, что не требуется /tmp
, но программы не должны предполагать, что данные /tmp
будут доступны при следующем запуске программы. Все это похоже на меня.
Итак, в чем разница между этими двумя? По какому критерию программа должна решить, помещать /tmp
или вводить временные данные /run
?
Согласно FHS:
Программы могут иметь подкаталог
/run
; это рекомендуется для программ, которые используют более одного файла времени выполнения.
Это указывает на то, что различие между «системными программами» и «обычными программами» не является критерием, равно как и время жизни программы (например, длительный или кратковременный процесс).
Хотя нижеприведенное обоснование не приводится в FHS, оно /run
было введено для преодоления проблемы, которая /var
была установлена слишком поздно, так что для того, чтобы сделать ее /var/run
доступной достаточно рано, потребовались грязные приемы . Тем не менее, сейчас, когда /run
его представили и дали описание в FHS, нет четкой причины иметь и то, /run
и другое /tmp
.
источник
Ответы:
Нет причин иметь оба / 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.Оригинальная информация от Lennart Poettering
Обратите внимание, что в приведенном ниже контрольном списке Poettering указано, что
/tmp
это будет полезно для «маленьких файлов», тогда как/run
следует использовать только для «коммуникационных примитивов». Я не думаю, что это различие также верно. Автор плаката для/run
isudev
, и я уверен, что/run/udev
включает в себя внутренние базы данных. Если у вас есть/run
каталог, я не думаю, что кто-то захочет следовать заявленному различию и создать еще один каталог, чтобы загромождать/tmp
. Так что на практике мы просто используем в/run
наше время....
...
...
...
Мы отошли от устаревшегоЯ неправильно понял/tmp
сокета, используемого системой X Window, как описано выше.tmpfiles.d/x11.conf
. Похоже, что это зависит от сотрудничества :). Я предполагаю, что код был проверен, так что отказ в обслуживании - худшее, что может произойти.источник
/tmp
(«единственными API для его использования должны быть mkstemp (), mkdtemp () (и друзья) для полной безопасности»)./var/run
это общесистемная система (например, для связи с локальной базой данных),/tmp/
теперь она часто создается для каждого пользователя . Исторически также квота / tmp была установлена иначе. И ответ пропускает, что семантическое различие использования также важно.Каталоги
/tmp
и/usr/tmp
(позже/var/tmp
) раньше были свалкой для всего и всех. Единственным механизмом защиты файлов в этих каталогах является залипающий бит, который ограничивает удаление или переименование файлов там их владельцам. Как отметил Марсельм в комментарии, в принципе нет ничего, что мешало бы кому-либо создавать файлы с именами, которые используются службами (такими какnginx.pid
илиsshd.pid
). (На практике сценарии запуска могут сначала удалить такие поддельные файлы.)/run
был создан для непостоянных данных времени выполнения долгоживущих сервисов, таких как блокировки, сокеты, pid-файлы и тому подобное. Так как он недоступен для записи для общественности, он защищает данные времени выполнения службы от беспорядка/tmp
и заданий, которые там очищаются. В самом деле: Два дистрибутива, которые я запускаю (без каламбура), имеют разрешения 755/run
, в то время как/tmp
и/var/tmp
(и/dev/shm
в этом отношении) имеют разрешения 1777.источник
/tmp
- Также, чтобы обеспечить безопасную гавань для упомянутых данных от различных заданий по очистке, которые растоптаны повсюду/tmp
./run
и проверить сложные (хорошо ...) структуру каталогов , вызванныхudev
, иudisk
т.д. Я не являюсь экспертом по этому конкретному вопросу, но я предполагаю , что загрузочные скрипты (которые работают в качестве суперпользователя) установить все./tmp/nginx.pid
но он уже существует из-за неправильной работы программы./run/
предотвращает это, требуя привилегий для записи./tmp
это место для создания временных файлов и каталогов. Он не пригоден для хранения «общеизвестных имен» (т. Е. Имен, о которых может знать другой процесс без необходимости каким-либо образом передавать ему имя), потому что никто не владеет пространством имен; каждый может создавать файлы там. Как таковой, вы обычно используете его, когда у вас есть утилита, которой нужен файл (т.е. не труба или что-то подобное) в качестве ввода или вывода, где любое (случайно сгенерированное) имя будет работать, пока вы передаете имя.Исторически, некоторые вещи (например, X) нарушали этот принцип и помещали известные имена (например
.X11-unix
) в/tmp
. Это, конечно, глючит и позволяет любому пользователю делать DoS сервис, которому это нужно, просто гоняя, чтобы сначала создать файл с нужным именем. Такие вещи принадлежат/run
(или эквивалентно,/var/run
если вы не подписаны на ревизионизм Freedesktop.org). Конечно, еще лучше было бы исправить их, чтобы они не использовали известные имена в глобальном пространстве имен, а вместо этого передавали путь.источник
.socket
файлы ... но это не поможет ни для целых каталогов, ни для вновь установленных служб/run/
Сам по себе был принят FHS, я не вижу, как это имеет отношение к fd.o. Если на самом деле мы не хотели жаловаться, то это неопределенные усилия по развитию, которые способствовали обоим./run
, в него, оно может предпочесть избежать загромождения общего/tmp
каталога еще большим количеством файлов.Согласно стандарту иерархии файловой системы,
/run
для переменных данных времени выполнения, т.е. информации о работающей системе с момента перезагрузки/tmp
это общее место для временных файлов.Таким образом, все, что касается статуса демона, зарегистрированных пользователей, подключенных съемных устройств и т. Д., Будет входить в
/run
то время, когда будут создаваться временные файлы, созданные программой/tmp
.Изменить: как указано @JdeBP в комментарии ниже,
источник
/tmp
«старые» файлы; без таких механизмов, предназначенных для/run
. Отсюда и драконовский предел того, что программы могут ожидать от срока службы чего-либо введенного/tmp
. В то время как программы могут ожидать, что файлы будут жить дольше в/run
постоянно работающей системе, они также должны привести себя в порядок.