Чи є еквівалент каталогу / dev / null в Linux?


84

Під час налаштування програми ви часто можете використовувати /dev/nullяк конфігураційний файл, якщо ви хочете, щоб програма читала порожній файл. Але якщо програма читає список файлів із каталогу, ви не можете скористатися цим фокусом. Вам потрібно буде дати йому порожній каталог для читання.

Мені було цікаво: чи має Linux порожній каталог за замовчуванням, який можна використовувати для таких цілей? Я знаю, що OpenSSH деякий час використовував / var / empty, і я, звичайно, сам можу створити порожній dir, але, можливо, FHS вказав для цього стандартний каталог?


8
У моїй системі /var/emptyне порожньо, але містить папку, яку називають sshd, тому ви, ймовірно, не хочете цим користуватися.
кнб

12
Тільки момент: особливий аспект /dev/nullне стільки для читання, скільки для письма. Дані, записані /dev/nullпросто, зникають. Отже, еквівалент каталогів був би місцем, де виникла mv yourfile /dev/emptyб ваш файл.
Wildcard

4
@Wildcard Я припускаю, що ти маєш на увазі mv yourfile /dev/empty/. Якщо це зробити mv yourfile /dev/empty, ви намагаєтеся замінити спеціальний каталог.
Римоїд

6
@Jules Ні, це не так. Ви нічого не можете ініціалізувати /dev/nullі ddтому dd, що отримаєте EOF, перш ніж буде записано єдиний байт. Я думаю, ти думаєш про те /dev/zero, яке часто використовується для заповнення чи створення певної кількості нулів.
Мішель Джонсон

2
@MichealJohnson ви праві, моя помилка, я б заплутався /dev/nullв /dev/zero.
Жуль

Відповіді:


66

FHS не дає «стандартний» порожній каталог.

Загально для систем Linux надається каталог /var/empty, але цей каталог не визначений в FHS і може фактично не бути порожнім. Натомість певні демони створюватимуть тут власні порожні каталоги. Наприклад, openssh використовує порожній каталог /var/empty/sshdдля розділення привілеїв.

Якщо ваша потреба у порожньому каталозі є тимчасовою, ви можете створити порожній каталог самостійно, як підкаталог /runабо /tmp. Якщо ви робите це за межами програми, ви можете використовувати mktemp -dдля цього або використовувати функцію mkdtemp(3)C всередині програми. Хоча якщо вам завжди потрібен порожній каталог, спробуйте створити його під /var/emptyвідкритим, як це робиться.

Для цього випадку використання, /tmpмабуть, найкраще підходить створення каталогу , хоча на практиці це не дуже важливо, де ви його помістите.


5
Я б не рекомендував створювати підкаталоги під /var/empty, оскільки будь-які програми, які використовують його (як OpenSSH у конфігурації за замовчуванням ), можуть очікувати, що він фактично порожній. (Ця /var/empty/sshdштука здається дивним RedHat-ism; Debian використовує /var/run/sshdзамість цього.)
Ілмарі Каронен

3
@IlmariKaronen Біт коду, який ви зв'язали, не підтримує ваше твердження, що OpenSSH очікує, що /var/emptyвін буде порожнім. Чи є десь ще десь це можна шукати?
Майкл Хемптон

2
@IlmariKaronen Гм, цей документ застарів. Він посилається на, /var/emptyале код фактично використовує /var/empty/sshd. Спробуйте ще раз. :)
Майкл Хемптон

1
@IlmariKaronen Хм. Тепер я думаю, що ти маєш рацію, після того, як насправді подивився на джерело, яке викликає chroot (). Мені здається дивовижним, що в opensh був би такий очевидно дурний недолік, що Red Hat повинен був би підтримувати корекцію вниз за течією.
Майкл Хемптон

2
Я не бачу, як це "дурний недолік" - мати гарантовано порожній каталог, що належить корінцю, у стандартному місці, для використання у в'язниці chroot, здається мені ідеально хорошою ідеєю. Звичайно, RedHat повинен був піти і зруйнувати його для всіх, створивши під ним підкаталоги. Як результат, моєю рекомендацією щодо портативного коду було б не користуватися /var/emptyні для чого, оскільки ви не можете бути впевнені в його семантиці в будь-якій даній системі. Створення власного порожнього каталогу, наприклад, під /var/run, як це робить Debian, здається більш розумним.
Ільмарі Каронен

37

Ви можете використовувати mktemp -dдля створення нового порожнього тимчасового каталогу із захищеними дозволами за замовчуванням у /tmp/. Утиліта виведе шлях до нового каталогу STDOUT, тому він корисний у оболонці.

Це все-таки більш портативно, ніж файл системного блоку.


Так, можна, але це недоцільно, якщо цей каталог потрібно вказати у файлі конфігурації. Ви хотіли б для цього постійного режисера.
roelvanmeer


11

Для служб systemd надає можливість PrivateTmpстворювати приватні /tmpта /var/tmpкаталоги, які не поділяються процесами за межами простору імен для цієї послуги і які повинні бути порожніми (спочатку).

[Service]
ExecStart=...
PrivateTmp=yes 

7
Програма може створити інші тимчасові файли, тому ви не можете припустити, що /tmpвони будуть порожніми лише тому, що вони були пропущені іменами.
Майкл Хемптон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.