Apakah ada direktori yang setara dengan / dev / null di Linux?


84

Saat mengkonfigurasi aplikasi, Anda dapat sering menggunakan /dev/nullfile konfigurasi jika Anda ingin aplikasi membaca file kosong. Tetapi, jika aplikasi membaca daftar file dari direktori, Anda tidak dapat menggunakan trik ini. Anda harus memberikannya direktori kosong untuk dibaca.

Saya bertanya-tanya: apakah Linux memiliki direktori kosong default yang dapat digunakan untuk tujuan seperti itu? Saya tahu OpenSSH menggunakan / var / empty untuk sementara waktu, dan saya tentu saja dapat membuat direktori kosong sendiri, tetapi mungkin FHS telah menentukan direktori standar untuk ini?


8
Di sistem saya, /var/emptytidak kosong, tetapi berisi folder bernama sshd, jadi Anda mungkin tidak ingin menggunakannya.
Knub

12
Hanya satu titik: Aspek khusus dari /dev/nulltidak begitu banyak untuk membaca seperti untuk menulis. Data yang ditulis /dev/nullhanya menghilang. Jadi, direktori yang setara akan menjadi tempat di mana mv yourfile /dev/emptyhasil akan menghapus file Anda.
Wildcard

4
@ Kartu Memori Saya kira maksud Anda mv yourfile /dev/empty/. Jika ya mv yourfile /dev/empty, Anda mencoba mengganti direktori khusus.
Rhymoid

6
@ Jules Tidak, tidak. Anda tidak dapat menginisialisasi apa pun dengan /dev/nulldan ddkarena ddakan mendapatkan EOF sebelum bahkan dituliskan satu byte. Saya pikir Anda sedang memikirkan /dev/zero, yang sering digunakan untuk mengisi sesuatu dengan atau menghasilkan angka nol tertentu.
Micheal Johnson

2
@MichealJohnson Anda benar, kesalahan saya, saya bingung /dev/nulldengan /dev/zero.
Jules

Jawaban:


66

The FHS tidak memberikan "standar" direktori kosong.

Adalah umum bagi sistem Linux untuk menyediakan direktori /var/empty, tetapi direktori ini tidak didefinisikan dalam FHS dan mungkin sebenarnya tidak kosong. Sebaliknya, daemon tertentu akan membuat direktori kosongnya sendiri di sini. Sebagai contoh, openssh menggunakan direktori kosong /var/empty/sshduntuk pemisahan hak istimewa.

Jika kebutuhan Anda untuk direktori kosong sementara, Anda dapat membuat direktori kosong sendiri, sebagai subdirektori dari /runatau /tmp. Jika Anda melakukan ini di luar program, Anda dapat menggunakan mktemp -dini, atau menggunakan mkdtemp(3)fungsi C di dalam program Anda. Meskipun jika Anda selalu memerlukan direktori kosong untuk hadir, pertimbangkan /var/emptyuntuk membuatnya di bawah seperti yang dilakukan openssh.

Untuk kasus penggunaan ini, membuat direktori di bawah /tmpmungkin yang paling cocok, meskipun dalam praktiknya tidak masalah di mana Anda meletakkannya.


5
Saya tidak akan merekomendasikan membuat subdirektori di bawah /var/empty, karena setiap program yang menggunakannya (seperti OpenSSH dalam konfigurasi default -nya ) mungkin mengharapkannya menjadi benar-benar kosong. ( /var/empty/sshdMasalahnya tampaknya RedHat-isme yang aneh; /var/run/sshdSebaliknya , Debian menggunakan .)
Ilmari Karonen

3
@IlmariKaronen Bit kode yang Anda tautkan tidak mendukung pernyataan Anda bahwa OpenSSH berharap /var/emptymenjadi kosong. Apakah ada tempat lain yang bisa dicari orang ini?
Michael Hampton

2
@IlmariKaronen Hm, dokumen itu kedaluwarsa. Ini mengacu pada /var/emptytetapi kode yang digunakan /var/empty/sshd. Coba lagi. :)
Michael Hampton

1
@IlmariKaronen Hmm. Sekarang saya pikir Anda benar, setelah benar-benar melihat sumber yang melakukan panggilan chroot (). Saya merasa luar biasa bahwa akan ada cacat yang jelas bodoh di openssh, bahwa Red Hat harus mempertahankan koreksi hilir untuk.
Michael Hampton

2
Saya tidak melihat bagaimana itu "cacat bodoh" - memiliki direktori root milik kosong yang dijamin di lokasi standar, untuk digunakan sebagai penjara chroot, sepertinya ide yang sangat bagus bagi saya. Tentu saja, RedHat harus pergi dan merusaknya untuk semua orang, dengan membuat subdirektori di bawahnya. Akibatnya, rekomendasi saya untuk kode portabel tidak boleh digunakan /var/emptyuntuk apa pun, karena Anda tidak dapat memastikan semantiknya pada sistem yang diberikan. Membuat direktori kosong Anda sendiri misalnya di bawah /var/run, seperti yang dilakukan Debian, tampaknya lebih masuk akal.
Ilmari Karonen

37

Anda dapat menggunakan mktemp -duntuk membuat direktori sementara kosong baru dengan izin aman, secara default di /tmp/. Utilitas akan menampilkan jalur direktori baru STDOUT, sehingga berguna dalam shell.

Ini lebih portabel daripada file unit systemd.


Ya, Anda bisa, tetapi itu tidak praktis jika direktori tersebut harus ditentukan dalam file konfigurasi. Anda ingin dir permanen untuk itu.
roelvanmeer


11

Untuk layanan, systemd menyediakan opsi PrivateTmpuntuk membuat direktori pribadi /tmpdan /var/tmpyang tidak dibagi oleh proses di luar ruang nama untuk layanan itu dan yang harusnya kosong (awalnya).

[Service]
ExecStart=...
PrivateTmp=yes 

7
Program mungkin membuat file-file sementara lainnya, jadi Anda tidak bisa berasumsi /tmpakan kosong hanya karena sudah di-namespace.
Michael Hampton
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.