Saya ingin membuat /dev/null
direktori " " (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 .
filesystems
directory
io-redirection
dogbane
sumber
sumber
Jawaban:
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 .
sumber
g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`
berfungsi untuk saya.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".
sumber
int 0x80
/syscall
/sysenter
/ apa pun.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 .)sumber
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/ )
sumber
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
sumber
Cukup symlink direktori itu ke
/dev/null
/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.
sumber
echo hello > ~/.logs/log1.dump
memberi~/.logs/log1.dump: Not a directory
. Namun,echo hello > ~/.logs
berfungsi karena .log adalah file.$ ln -s /dev/null dev-null; touch dev-null/zzz
memberi sayatouch: cannot touch 'dev-null/zzz': Not a directory