Немає причин мати / 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-сокет.
Зауважимо, контрольний список Поеттерінга нижче стверджував, що /tmpвін буде корисним для "невеликих файлів", тоді як його /runслід використовувати лише для "примітивів зв'язку". Я також не думаю, що це відмінність правдиве. Хлопчик, що /runзаймається плакатами, є udev, і я впевнений, що він /run/udevвключає внутрішні бази даних. Після того, як у вас є /runкаталог, я не думаю, що хтось хоче слідувати заявленому розрізненню і створити інший каталог, щоб захаращувати /tmp. Тому на практиці ми просто використовуємо /runсьогодні.
Використання спільно використовуваних просторів загальних імен [like / tmp] для цілей спілкування завжди було проблематичним, оскільки для встановлення зв’язку потрібні стабільні імена, але стабільні імена відкривають двері для DoS-атак. Це можна виправити частково, встановивши захищені каталоги на додаток для певних служб під час раннього завантаження (як це робимо для X11), але це усуває проблему лише частково, оскільки це працює лише правильно, якщо за кожною установкою пакета йде перезавантаження.
...
Ще одна функція Fedora (для Fedora 17) змінила семантику / tmp для багатьох системних служб, щоб зробити їх більш безпечними, виділивши / tmp простори імен різних служб
...
Оскільки / tmp більше не є спільним простором імен, воно, як правило, не підходить як місце для примітивів для зв'язку.
...
[/ run] гарантовано є tmpfs і, отже, автоматично змивається під черевиками. Поза цим не робиться автоматична очистка.
...
Ось приблизне керівництво про те, як ми пропонуємо вам (розробнику додатків Linux) вибрати потрібний каталог для використання:
- Вам потрібне місце, щоб розмістити ваш сокет (або інший примітивний зв’язок), і ваш код працює привілейовано: використовуйте підкаталог під / запуском. (Або під / 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, як описано вище. Я неправильно прочитав tmpfiles.d/x11.conf. Схоже, це покладається на співпрацю :). Я припускаю, що код перевіряли, таким чином, що відмова в обслуговуванні є найгіршим, що може статися.