Czy w systemie Linux istnieje katalog równoważny / dev / null?

84

Podczas konfigurowania aplikacji często można użyć /dev/nulljako pliku konfiguracyjnego, jeśli aplikacja ma czytać pusty plik. Ale jeśli aplikacja odczyta listę plików z katalogu, nie można użyć tej sztuczki. Musisz odczytać pusty katalog.

Zastanawiałem się: czy Linux ma domyślny pusty katalog, którego można użyć do takich celów? Wiem, że OpenSSH używał / var / empty przez jakiś czas i oczywiście mogę sam stworzyć pusty katalog, ale może FHS określił do tego standardowy katalog?

roelvanmeer
źródło
8
W moim systemie /var/emptynie jest pusty, ale zawiera folder o nazwie sshd, więc prawdopodobnie nie chcesz go używać.
knub
12
Po prostu: szczególny aspekt /dev/nullnie dotyczy zarówno czytania, jak i pisania. Dane zapisane po /dev/nullprostu znikają. Odpowiednikiem katalogu byłoby miejsce, w którym mv yourfile /dev/emptyspowodowałoby to usunięcie pliku.
Wildcard,
4
@Wildcard Zakładam, że masz na myśli mv yourfile /dev/empty/. Jeśli tak mv yourfile /dev/empty, próbujesz zastąpić specjalny katalog.
Rhymoid,
6
@Jules Nie, nie jest. Nie możesz nic zainicjować za pomocą /dev/nulli ddponieważ dddostanie EOF, zanim zostanie nawet napisany jeden bajt. Myślę, że myślisz o tym /dev/zero, co jest często używane do wypełnienia czegoś lub wygenerowania określonej liczby zer.
Micheal Johnson
2
@MichealJohnson masz rację, mój błąd, pomyliłem /dev/nullsię /dev/zero.
Jules

Odpowiedzi:

66

FHS nie zapewnia „standard” pusty katalog.

Systemy Linux często udostępniają katalog /var/empty, ale ten katalog nie jest zdefiniowany w FHS i może nie być pusty. Zamiast tego niektóre demony utworzą tutaj swoje własne puste katalogi. Na przykład openssh używa pustego katalogu /var/empty/sshddo rozdzielenia uprawnień.

Jeśli twoja potrzeba pustego katalogu jest przejściowa, możesz sam stworzyć pusty katalog jako podkatalog /runlub /tmp. Jeśli robisz to poza programem, możesz mktemp -ddo tego użyć lub użyć mkdtemp(3)funkcji C w swoim programie. Chociaż jeśli zawsze potrzebujesz, aby obecny był pusty katalog, rozważ utworzenie go poniżej, /var/emptytak jak robi to openssh.

W tym przypadku użycie katalogu poniżej /tmpjest prawdopodobnie najlepszym rozwiązaniem, choć w praktyce nie ma większego znaczenia, gdzie go umieścisz.

Michael Hampton
źródło
5
Nie polecam tworzenia podkatalogów poniżej /var/empty, ponieważ wszelkie programy, które go używają (takie jak OpenSSH w domyślnej konfiguracji ) mogą oczekiwać, że będą faktycznie puste. ( /var/empty/sshdWygląda na to, że jest to dziwny RedHat-ism; /var/run/sshdzamiast tego używa Debian .)
Ilmari Karonen,
3
@IlmariKaronen Fragment kodu, który podłączyłeś, nie obsługuje twojego twierdzenia, że ​​OpenSSH oczekuje, /var/emptyże będzie pusty. Czy jest jeszcze coś takiego?
Michael Hampton
2
@IlmariKaronen Hm, ten dokument jest nieaktualny. Odnosi się do, /var/emptyale kod faktycznie używa /var/empty/sshd. Spróbuj ponownie. :)
Michael Hampton
1
@IlmariKaronen Hmm. Teraz myślę, że masz rację, po tym, jak faktycznie spojrzałem na źródło, które wywołuje funkcję chroot (). Wydaje mi się to niesamowite, że w openssh miałaby tak oczywistą głupotę, że Red Hat musiałby utrzymać korektę w dół.
Michael Hampton
2
Nie rozumiem, jak to jest „głupia wada” - posiadanie gwarantowanego pustego katalogu root w standardowej lokalizacji, do użytku jako więzienie chroot, wydaje mi się idealnym pomysłem. Oczywiście RedHat musiał go zniszczyć dla wszystkich, tworząc pod nim podkatalogi. W rezultacie moim zaleceniem dla przenośnego kodu nie byłoby /var/emptydo niczego używać , ponieważ nie możesz być pewien jego semantyki w danym systemie. Tworzenie własnego pustego katalogu np. Pod /var/run, podobnie jak Debian, wydaje się bardziej sensowne.
Ilmari Karonen
37

Możesz użyć mktemp -ddo utworzenia nowego pustego katalogu tymczasowego z bezpiecznymi uprawnieniami, domyślnie w /tmp/. Narzędzie wyświetli ścieżkę nowego katalogu STDOUT, więc jest przydatne w powłoce.

W każdym razie jest bardziej przenośny niż systemowy plik jednostkowy.

oleje
źródło
Tak, możesz, ale to niepraktyczne, jeśli ten katalog musi zostać określony w pliku konfiguracyjnym. Chciałbyś do tego stałego katalogu.
roelvanmeer
22

To pytanie w Uniksie zawiera sugestie dotyczące utworzenia katalogu „blackhole”, w tym systemu plików FUSE nullfs .

200_sukces
źródło
1
Nie wiem, dlaczego odpowiedź mktemp / mkdtemp jest tak wysoko oceniana, gdy jest to idealna odpowiedź. nullfs jest odpowiednikiem / dev / null.
chx
11

Dla usług systemd zapewnia opcję PrivateTmptworzenia prywatnych /tmpi /var/tmpkatalogów, które nie są współużytkowane przez procesy poza przestrzenią nazw dla tej usługi i które powinny być puste (początkowo).

[Service]
ExecStart=...
PrivateTmp=yes 
HBruijn
źródło
7
Program może tworzyć inne pliki tymczasowe, więc nie można zakładać /tmp, że będzie pusty tylko dlatego, że został nazwany przestrzenią nazw.
Michael Hampton