Есть ли в Linux эквивалент каталога / dev / null?

84

При настройке приложения вы часто можете использовать его /dev/nullкак файл конфигурации, если хотите, чтобы приложение считывало пустой файл. Но, если приложение читает список файлов из каталога, вы не можете использовать этот трюк. Вы должны дать ему пустой каталог для чтения.

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

roelvanmeer
источник
8
В моей системе /var/emptyон не пустой, но содержит папку с именем sshd, так что вы, вероятно, не хотите использовать это.
Кн
12
Одно замечание: особый аспект /dev/nullне столько для чтения, сколько для письма. Данные, записанные в /dev/nullпросто исчезают. Таким образом, эквивалент каталога будет местом, в котором mv yourfile /dev/emptyбудет удален ваш файл.
Wildcard
4
@ Дикая карта, я полагаю, ты имеешь в виду mv yourfile /dev/empty/. Если вы это сделаете mv yourfile /dev/empty, вы пытаетесь заменить специальный каталог.
Рифмоид
6
@ Джулс Нет, это не так. Вы не можете ничего инициализировать с /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в openssh.

В этом случае /tmpлучше всего подойдет создание каталога в папке , хотя на практике не имеет большого значения, куда вы его поместите.

Майкл Хэмптон
источник
5
Я бы не рекомендовал создавать подкаталоги в них /var/empty, поскольку любые программы, которые его используют (например, OpenSSH в его конфигурации по умолчанию ), могут ожидать, что он будет фактически пустым. ( /var/empty/sshdПохоже, что это странный RedHat-ism; /var/run/sshdвместо этого используется Debian .)
Ilmari Karonen
3
@IlmariKaronen Кусок кода, который вы связали, не поддерживает ваше утверждение о том, что OpenSSH ожидает /var/emptyпустой. Есть ли где-то еще, кто-то может искать это?
Майкл Хэмптон
2
@IlmariKaronen Хм, этот документ устарел. Это относится к, /var/emptyно код на самом деле использует /var/empty/sshd. Попробуйте еще раз. :)
Майкл Хэмптон
1
@IlmariKaronen Хм. Теперь я думаю, что вы правы, после того, как посмотрите на источник, который вызывает chroot (). Я нахожу удивительным, что в openssh будет такой явно глупый недостаток, что Red Hat придется поддерживать нисходящую коррекцию для.
Майкл Хэмптон
2
Я не понимаю, как это "глупый недостаток" - наличие гарантированного пустого корневого каталога в стандартном месте для использования в качестве изолированной тюрьмы кажется мне очень хорошей идеей. Конечно, RedHat должен был пойти и разрушить его для всех, создав под него подкаталоги. В результате моя рекомендация для переносимого кода была бы не использовать /var/emptyни для чего, поскольку вы не можете быть уверены в его семантике в любой конкретной системе. Создание собственной пустой директории, например /var/run, в Debian, кажется более разумным.
Илмари Каронен
37

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

В любом случае, он более переносим, ​​чем системный файл.

oals
источник
Да, вы могли бы, но это нецелесообразно, если этот каталог должен быть указан в файле конфигурации. Вы хотели бы постоянный режиссер для этого.
roelvanmeer
22

В этом вопросе Unix есть несколько предложений по созданию каталога «blackhole», включая файловую систему FUSE nullfs .

200_success
источник
1
Я не знаю, почему за mktemp / mkdtemp так сильно проголосовали, когда это идеальный ответ. nullfs является эквивалентом / dev / null.
chx
11

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

[Service]
ExecStart=...
PrivateTmp=yes 
HBruijn
источник
7
Программа может создавать другие временные файлы, поэтому вы не можете предполагать, что /tmpони будут пустыми только потому, что они были пространством имен.
Майкл Хэмптон