Bagaimana saya bisa membuat direktori "blackhole" / dev / null-like?

81

Saya ingin membuat /dev/nulldirektori " " (atau direktori "lubang hitam") sehingga setiap file yang ditulis padanya tidak benar-benar ditulis, tetapi hilang begitu saja.

Saya memiliki aplikasi yang menulis file sementara besar ke direktori. Saya tidak memiliki kendali atas nama file dan saya tidak begitu peduli dengan isi file-file ini. Saya bisa menulis skrip yang secara berkala meng-clobbers file-file ini, tetapi file-file tersebut ditulis dengan sangat cepat dan mengisi disk saya. Saya mencari sesuatu yang lebih pintar. Saya ingin aplikasi untuk "berpikir" bahwa itu sedang menulis file-file ini, padahal sebenarnya, penulisan hanya dibuang di ujung yang lain.

Lihat juga utas terkait yang lama ini .

dogbane
sumber
Kedengarannya seperti FUSE mungkin menjadi opsi: kerneltrap.org/mailarchive/linux-kernel/2008/2/15/868564/thread
Stefan Lasiewski
saya hanya bertanya pada diri sendiri pertanyaan yang sama, dan menggunakan nama yang sama untuk direktori yang saya gagal buat.
ixtmixilix

Jawaban:

48

Ini tidak didukung di luar kotak pada unix mana pun yang saya tahu, tetapi Anda dapat melakukan hampir semua hal dengan FUSE . Setidaknya ada satu implementasi nullfs¹ , sistem file tempat setiap file ada dan berperilaku seperti /dev/null(ini bukan satu-satunya implementasi yang pernah saya lihat).

¹ Jangan bingung dengan * BSD nullfs , yang analog dengan bindfs .

Gilles
sumber
Fantastis - Saya menggunakan ini sebagai bagian dari jawaban pada SO
Phil Lello
1
catatan untuk orang-orang yang berakhir dengan kompilasi kesalahan pada program itu: g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`berfungsi untuk saya.
ixtmixilix
Bisakah Anda mengarahkan saya ke implementasi lain? Karena saya tidak dapat menemukan
Freedo
@Freedo Saya menduga banyak orang telah melakukannya sebagai latihan pembelajaran dan membiarkannya tidak terawat. Mereka mungkin tidak ada di web lagi.
Gilles
7

Pendekatan lain adalah pembungkus LD_PRELOAD; pada dasarnya sebuah pustaka bersama kecil yang dimuat sebelum libc.so, dan memotong panggilan untuk "membuka" dengan sesuatu yang memeriksa jalur file prospektif dan menggantinya "/ dev / null" jika akan berada di direktori target.

Ini memiliki keuntungan karena (a) sepenuhnya berada di ruang pengguna - tidak diperlukan peretasan kernel; dan (b) hanya memengaruhi aplikasi satu kesalahan.

Contoh sederhana ada di http://www.noah.org/wiki/LD_PRELOAD_notes , tetapi dalam kasus Anda, Anda akan ingin mencegat panggilan sistem "terbuka" & "creat".

Martin Kealey
sumber
3
... dengan asumsi aplikasi melakukan panggilan sistem melalui libc, tidak secara langsung melalui int 0x80/ syscall/ sysenter/ apa pun.
Ruslan
1

Jika program ini sangat bodoh untuk tidak membiarkan Anda mematikan log-log itu, mungkin juga tidak memeriksa kesalahan setelah membuka file log? Saya akan mencoba memasang beberapa sistem file read-only dummy (mis mount -o loop. Menggunakan .)

alex
sumber
sayangnya pendekatan ini tidak berhasil. Aplikasi mati jika tidak dapat menulis ke file ini.
dogbane
1

Anda mengatakan bahwa menghapus file secara berkala dengan skrip tidak cukup cepat. Bisakah Anda hidup dengan pemicu yang menghapus file sementara kapan saja aplikasi Anda selesai menulis dan menutupnya? Jika demikian, Anda dapat menggunakan API "tidak sah".

(Lihat http://en.wikipedia.org/wiki/Inotify dan https://github.com/rvoicilas/inotify-tools/wiki/ )

Elliot Nelson
sumber
1
Pada banyak sistem, menghapus file yang prosesnya terbuka menghapus entri direktori, tetapi file itu sendiri tetap pada disk sampai ditutup oleh proses terakhir menggunakannya. Proses mungkin menulis file dan kemudian mencari ke awal dan membacanya kembali, sehingga OS tidak bisa begitu saja membuang data.
interfect
0

Saya telah membuat modul kernel berdasarkan contoh ramfs di kernel linux, itu pada dasarnya adalah sistem file blackhole yang disebut nullfsvfs. Implementasi sistem FUSE perlu menyalin data dari pengguna ke ruang kernel dan cukup lambat, dibandingkan dengan implementasi langsung sebagai modul kernel. Lihat:

https://github.com/abbbi/nullfsvfs

michael
sumber
-8

Cukup symlink direktori itu ke /dev/null

rm -rf ~/.logs
ln -s /dev/null ~/.logs

/dev/null, tidak harus berupa direktori. Jika program mencoba menulis ~/.logs/log1.dump, itu masih masuk ke dalam /dev/null.
Saya melakukan ini untuk cache Google Chrome karena setelah beberapa saat menjadi begitu besar sehingga Chrome akan memakan waktu beberapa menit untuk memulai.

jonescb
sumber
3
Ini tidak akan berhasil karena symlink adalah file, bukan direktori. Mencoba echo hello > ~/.logs/log1.dumpmemberi ~/.logs/log1.dump: Not a directory. Namun, echo hello > ~/.logsberfungsi karena .log adalah file.
dogbane
2
Anda pasti bercanda kami. $ ln -s /dev/null dev-null; touch dev-null/zzzmemberi sayatouch: cannot touch 'dev-null/zzz': Not a directory
alex
1
Seperti yang saya katakan, ini berfungsi untuk Chrome. Ini mencegahnya menulis ke cache. Jika itu menyebabkan program si penanya lumpuh, maka jelas itu tidak memeriksa apakah file pointer NULL.
jonescb
6
Itu mungkin berarti Chrome berhenti menulis jika ada kesalahan saat membuka file. Anda dapat mencapai efek yang sama dengan menghapus izin menulis dari file dump atau direktori tempat penulisan.
KeithB
Benar, mengubah izin direktori mungkin akan lebih masuk akal.
jonescb