Яка різниця між / tmp та / run?


42

Згідно з FHS-3.0 , /tmpпризначений для тимчасових файлів і /runпризначений для змінних даних часу виконання. Дані в /runповинні бути видалені при наступному завантаженні, що не потрібно /tmp, але все ж програми не повинні припускати, що дані в /tmpньому будуть доступні при наступному запуску програми. Все це здається мені досить схожим.

Отже, у чому різниця між ними? За яким критерієм програма повинна вирішувати, чи вводити тимчасові дані в /tmpабо в них /run?

За даними FHS:

Програми можуть мати підкаталог /run; це рекомендується для програм, які використовують більше одного файлу запуску.

Це вказує на те, що відмінність між "системними програмами" та "звичайними програмами" не є критерієм, а також не є тривалістю роботи програми (наприклад, тривалий та короткочасний процес).

Хоча наступне обгрунтування не надається в FHS, /runбуло введено для подолання проблеми, яка /varбула встановлена ​​занадто пізно, щоб брудні хитрощі були /var/runдоступні досить рано. Однак зараз, коли /runвін був представлений і з огляду на його опис у FHS, очевидно, що немає чіткої причини мати і те, /runі інше /tmp.


11
/ tmp - стандартне місце * nix для тимчасових даних. / run - це стандартне розташування для тимчасових даних Poettering.
Марк

Відстала сумісність - це завжди причина ...
Бакуріу

Відповіді:


16

Немає причин мати / 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

Зауважимо, контрольний список Поеттерінга нижче стверджував, що /tmpвін буде корисним для "невеликих файлів", тоді як його /runслід використовувати лише для "примітивів зв'язку". Я також не думаю, що це відмінність правдиве. Хлопчик, що /runзаймається плакатами, є udev, і я впевнений, що він /run/udevвключає внутрішні бази даних. Після того, як у вас є /runкаталог, я не думаю, що хтось хоче слідувати заявленому розрізненню і створити інший каталог, щоб захаращувати /tmp. Тому на практиці ми просто використовуємо /runсьогодні.

Використання спільно використовуваних просторів загальних імен [like / tmp] для цілей спілкування завжди було проблематичним, оскільки для встановлення зв’язку потрібні стабільні імена, але стабільні імена відкривають двері для DoS-атак. Це можна виправити частково, встановивши захищені каталоги на додаток для певних служб під час раннього завантаження (як це робимо для X11), але це усуває проблему лише частково, оскільки це працює лише правильно, якщо за кожною установкою пакета йде перезавантаження.

...

Ще одна функція Fedora (для Fedora 17) змінила семантику / tmp для багатьох системних служб, щоб зробити їх більш безпечними, виділивши / tmp простори імен різних служб

...

Оскільки / tmp більше не є спільним простором імен, воно, як правило, не підходить як місце для примітивів для зв'язку.

...

[/ run] гарантовано є tmpfs і, отже, автоматично змивається під черевиками. Поза цим не робиться автоматична очистка.

...

Ось приблизне керівництво про те, як ми пропонуємо вам (розробнику додатків Linux) вибрати потрібний каталог для використання:

  1. Вам потрібне місце, щоб розмістити ваш сокет (або інший примітивний зв’язок), і ваш код працює привілейовано: використовуйте підкаталог під / запуском. (Або під / var / run для додаткової сумісності.)
  2. Вам потрібне місце, щоб поставити ваш сокет (або інший примітивний зв’язок), і ваш код працює непривілейовано: використовуйте підкаталог під $ XDG_RUNTIME_DIR.
  3. Вам потрібне місце, щоб розмістити великі завантаження та завантаження та непривілейовано: використовувати $ XDG_DOWNLOAD_DIR.
  4. Вам потрібно розмістити кеш-файли, які мають бути стійкими та працювати непривілейовано: використовуйте $ XDG_CACHE_HOME.
  5. Нічого з вищезазначеного не застосовується, і вам потрібно розмістити невеликий файл, який не потребує стійкості: використовуйте $ TMPDIR із резервним ввімкненням на / tmp. І використовувати mkstemp (), і mkdtemp () і нічого домашнього.
  6. В іншому випадку використовуйте $ TMPDIR із резервним відключенням на / var / tmp. Також використовуйте mkstemp () / mkdtemp ().

Зауважте, що зазначені вище правила запропоновані лише нами. Ці правила враховують усе, що ми знаємо про цю тему, і уникаємо проблем із поточними та майбутніми дистрибутивами, наскільки ми їх бачимо. Будь ласка, подумайте над оновленням своїх проектів відповідно до цих правил і пам’ятайте про них, якщо ви пишете новий код.

Одне, що ми хотіли б підкреслити, це те, що / tmp та / var / tmp найчастіше - це насправді не є правильним вибором для вашої використання. Існує дійсне використання цих каталогів, але досить часто інший каталог насправді може бути кращим місцем. Отже, будьте обережні, розгляньте інші варіанти, але якщо ви все-таки переходите до / tmp або / var / tmp, то принаймні обов'язково використовуйте mkstemp () / mkdtemp ().

Ми начебто відходимо від застарілого /tmpрозетки, використовуваного віконною системою X, як описано вище. Я неправильно прочитав tmpfiles.d/x11.conf. Схоже, це покладається на співпрацю :). Я припускаю, що код перевіряли, таким чином, що відмова в обслуговуванні є найгіршим, що може статися.


8
Ця відповідь є всілякою неправильною.
Р ..

@R .., хочете розширити це?
Wildcard

Так, я вже відповів. (Розпочав як коментар, але я зрозумів, що це більше відповідь.)
R ..

Я думаю, що головна слабкість моєї нинішньої відповіді, на яку я думаю, що ви працювали над тим, полягає в тому, що, якщо технічно , правильне керування XDG_RUNTIME_DIR потрібно переносити на будь-який * nix ("повернутися до каталогу заміни з подібними можливостями"), дуже незрозуміло, що це означає на практиці. Для портативних корисних програм краще використовувати чітко визначений стандарт для /tmp("єдині API для його використання повинні бути mkstemp (), mkdtemp () (та друзі), щоб бути повністю безпечними").
sourcejedi

Відповідь пропускається також поширений випадок: /var/runзагальносистемна система (наприклад, для спілкування з локальною базою даних), /tmp/тепер часто створюється для кожного користувача . Історично також було встановлено, що квота / tmp була встановлена ​​іншою. І у відповіді пропущено те, що важливе значення має також смислове відмінність використання.
Джакомо Катенацці

23

Довідники /tmpі /usr/tmp(пізніше /var/tmp) раніше були демпінгом для всіх і всіх. Єдиним механізмом захисту файлів у цих каталогах є клейкий біт, який обмежує видалення або перейменування файлів їх власникам. Як зазначив marcelm у коментарі, в принципі немає нічого, що заважає комусь створювати файли з іменами, які використовуються службами (наприклад, nginx.pidабо sshd.pid). (Насправді, сценарії запуску можуть спочатку видалити такі помилкові файли.)

/runбула створена для нестабільних даних часу виконання довготривалих служб, таких як блокування, сокети, під-файли тощо. Оскільки це не є доступним для публіки, воно захищає дані про виконання служб від безладу /tmpта робочих місць, які там прибираються. Дійсно: два розподілу , які я біжу (НЕ каламбур) мають права 755 на /run, в той час як /tmpі /var/tmp/dev/shmце важливо) мати дозвіл 1777.


3
він просто є для того, щоб відокремити дані часу виконання служби від безладу/tmp - Також, щоб забезпечити безпечну гавань для даних даних від різних робіт з очищення, які топтаються протягом усього часу /tmp.
Satō Katsura

Дякуємо за інформацію про дозволи. Однак, згідно з FHS, "Програми можуть мати підкаталог / run; це рекомендується програмам, які використовують більше одного файлу часу виконання". - це, здається, суперечить як критерію "служби довгого життя", так і неможливості програм створювати свої підкаталоги через обмежені дозволи.
Дірк Геррман

@DirkHerrmann Ні, це не так. Подивіться /run, щоб переглянути складні (добре ...) структуру каталогів , викликаних udev, і udiskт.д. Я не є експертом з цього конкретного питання, але я припускаю , що завантажувальні скрипти (які працюють в якості суперкористувача) встановити все.
контрмоде

2
"/ run технічно не потрібен, він просто є для того, щоб відокремити дані часу виконання служби від безладу в / tmp." - Добре також, що непривілейовані процеси не можуть використовувати присідання імен, які системні служби хочуть використовувати. Ніби не підходить, якщо nginx хоче використовувати, /tmp/nginx.pidале він уже існує через деяку недоброзичливу програму. /run/запобігає цьому, вимагаючи привілеїв для запису.
marcelm

18

/tmp- це місце для створення тимчасових файлів і каталогів. Це непридатне для зберігання "відомих імен" (тобто імен, про які можна було б знати інший процес, без того, щоб вам якось передавати ім'я), тому що ніхто не має права на простір імен; кожен може створити там файли. Як такий, ви зазвичай використовуєте його, коли у вас є утиліта, якій потрібен файл (тобто не труба чи такий) як вхід чи вихід, де будь-яке (випадково згенероване) ім'я працюватиме до тих пір, поки ви не передасте ім'я.

Історично деякі речі (як X) порушували цей принцип і вкладали відомі імена (як .X11-unix) /tmp. Це, звичайно, баггі і дозволяє будь-якому користувачеві DoS-сервісу, який повинен це зробити, просто перегонивши спочатку створити файл із потрібним ім'ям. Такі речі належать до /run(або рівнозначно, /var/runякщо ви не підписуєтесь на ревізіонізм Freedesktop.org). Звичайно, ще краще було б виправити їх не використовувати відомих імен у глобальному просторі імен, а натомість пройти навколо імені шляху.


Дякуємо ще за визначення в "тимчасових файлах". Хоча я не думаю, що "пройти навколо імені шляху" пояснює, як встановити точку координації. Тобто зазвичай ви використовуєте змінну середовища. Виглядає так, що існує досить мало розеток і труб (загалом для використання), щоб вони працювали. (Частково тому, що багато того, що буде працювати над тим самим гніздом dbus). Здається, що було б прикро встановлювати середовище, якщо програми не замовчували жорсткий код. Ви можете додати новий ключ до системних .socketфайлів ..., але це не допоможе ні для цілих каталогів, ні для щойно встановлених служб
sourcejedi

2
/run/Сам був прийнятий FHS, я не бачу, як це пов'язано з fd.o. Якщо тільки ми не хотіли скаржитися на невказані зусилля з розвитку, які сприяли обом.
sourcejedi

Я думаю, що початкова відповідь тут найкраща відповідь на запитання, як написано. Я думаю, що це було б вдосконалено далі, враховуючи: _Коли ​​програмне забезпечення має доступ до запису до виділеного каталогу, наприклад, під /run, воно може вирішити, щоб уникнути захаращення спільного /tmpкаталогу ще більше файлів.
sourcejedi

Що таке "fd.o"?
TRiG

7

Відповідно до стандарту ієрархії файлової системи,

  • /run призначений для змінних даних виконання, тобто інформації про працюючу систему після перезавантаження
  • /tmp є загальним місцем для тимчасових файлів.

Так що все, що стосується статусу демона, користувачів, які ввійшли в систему, встановлених знімних пристроїв тощо, буде входити, /runа тимчасові файли, створені програмою, заходять /tmp.

Редагувати: як вказав @JdeBP у коментарі нижче,

FHS дозволяє робити такі речі, як звичайне налаштування завдань cron, які регулярно очищають /tmp"старі" файли; без таких механізмів, призначених для /run. Звідси драконічний ліміт щодо того, які програми можна очікувати протягом життя всього, що вкладається /tmp. Хоча програми можуть розраховувати, що файли житимуть довше в /runсистемі, що постійно працює, але також очікується, що вони приберуться до них більше.


4
Одне, що не зазначено в цій чи будь-якій іншій відповіді, але зазначається у FHS, і яку ви могли б вдосконалити, відповідь: FHS дозволяє такі речі, як звичайні налаштування задач cron, які регулярно очищають /tmp"старі" файли; без таких механізмів, призначених для /run. Звідси драконічний ліміт щодо того, які програми можна очікувати протягом життя всього, що вкладається /tmp. Хоча програми можуть розраховувати, що файли житимуть довше в /runсистемі, що постійно працює, але також очікується, що вони приберуться до них більше.
JdeBP

1
Було б непогано мати каталог матеріалів, які зникали (або було дозволено видаляти деяким демоном сміття), як тільки процес загинув.
Омніфаріоз

1
@Omnifarious тепер ви можете отримати таку поведінку для системної служби, використовуючи RuntimeDirectory = :-).
sourcejedi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.