/ Dev / null benzeri bir "karadelik" dizini nasıl oluşturabilirim?


81

Bir " /dev/null" dizini (veya "karadelik" dizini) oluşturmak istiyorum, böylece üzerine yazılmış dosyalar gerçekten yazılmaz, ancak kaybolurlar.

Büyük geçici dosyaları bir dizine yazan bir uygulamam var. Dosyaların adı üzerinde hiçbir kontrolüm yok ve bu dosyaların içeriğini gerçekten umursamıyorum. Bu dosyaları periyodik olarak kesen bir komut dosyası yazabilirim, ancak dosyalar çok çabuk yazılır ve diskimi doldururlar. Daha akıllıca bir şey arıyorum. Uygulamanın bu dosyaları yazdığını "düşünmesini" istiyorum, aslında yazılar henüz diğer tarafa atılıyor.

Ayrıca bu eski ilgili konuya bakın.



kendime aynı soruyu sordum ve oluşturamadığım dizin için aynı adı kullandım.
ixtmixilix

Yanıtlar:


48

Bu, tanıdığım hiçbir unix için kullanıma hazır değil, ancak FUSE ile hemen hemen her şeyi yapabilirsiniz . Her dosyanın var olduğu ve davrandığı bir dosya sistemi olan en az bir nullfs uygulaması vardır /dev/null(bu şimdiye kadar gördüğüm tek uygulama değil).

¹ ile karıştırılmamalıdır değil * BSD nullfs benzer olduğunu bindfs .


Fantastic - Bunu SO üzerine
Phil Lello

1
bu programda derleme hatalarıyla sonuçlanan insanlara bir not: g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`benim için çalıştı.
ixtmixilix 3'13

Beni diğer uygulamalara yönlendirebilir misiniz? Çünkü hiçbirini bulamıyorum
Freedo,

@Freedo Birçok insanın bunu bir öğrenme alıştırması olarak yaptığından ve bakımsız kalmasına izin verdiğinden şüpheleniyorum. Artık web üzerinde olmayabilirler.
Gilles,

7

Başka bir yaklaşım LD_PRELOAD sarmalayıcısı olacaktır; temel olarak libc.so 'dan önce yüklenen ve hedef dosyada yer alan ve "/ dev / null" yerine geçen dosya yolunu kontrol eden ve "/ dev / null" yerine geçen "open" komutunu kullanan küçük bir paylaşılan kütüphanedir.

Bunun (a) tamamen kullanıcı alanında olması avantajı vardır - çekirdek kesmek gerekmez; ve (b) yalnızca tek hatalı başvuru uygulamasını etkilemek.

Basit bir örnek http://www.noah.org/wiki/LD_PRELOAD_notes adresindedir , ancak sizin durumunuzda "açık" ve "creat" sistem çağrılarına müdahale etmek isteyeceksiniz.


3
... uygulamanın sistem tarafından doğrudan int 0x80/ syscall/ sysenter/ başka bir şekilde değil, libc üzerinden yapıldığını varsayarsak .
Ruslan

1

Program bu günlükleri kapatmanıza izin vermeyecek kadar aptalsa, günlük dosyasını açtıktan sonra da hataları kontrol etmiyor olabilir mi? Bazı sahte salt okunur dosya sistemlerini kurmayı denerdim (örn mount -o loop.


bu yaklaşım maalesef çalışmıyor. Bu dosyaya yazamazsa uygulama ölür.
dogbane

1

Dosyaları bir komut dosyasıyla düzenli aralıklarla kaldırmanın yeterince hızlı olmadığını söylüyorsunuz. Uygulamanız yazma işlemini tamamlayıp kapattığında, geçici bir dosyayı silen bir tetikleyici ile yaşayabilir misiniz? Öyleyse, "inotify" API'sini kullanabilirsiniz.

(Bkz. Http://en.wikipedia.org/wiki/Inotify ve https://github.com/rvoicilas/inotify-tools/wiki/ )


1
Birçok sistemde, bir işlemin açık olduğu bir dosyayı silmek, dizin girişini kaldırır, ancak dosyayı kullanan son işlem tarafından kapatılana kadar dosyanın kendisi diskte kalır. İşlemler dosya yazabilir ve daha sonra başından başlayıp tekrar okuyabilir ve böylece işletim sistemi verileri çöpe alamaz.
interferans

0

linux çekirdeğindeki ramfs örneğine dayanan bir çekirdek modülü yarattım, temelde nullfsvfs adlı bir karadelik dosya sistemi. FUSE sistemi uygulamasının verileri kullanıcıdan çekirdek alanına kopyalaması gerekir ve çekirdek modül olarak düz bir uygulamaya kıyasla oldukça yavaştır. Görmek:

https://github.com/abbbi/nullfsvfs


-8

Sadece bu dizine bağlan /dev/null

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

/dev/null, bir dizin olmak zorunda değildir. Program yazmaya çalışırsa ~/.logs/log1.dump, yine de içine gider /dev/null.
Bunu Google Chrome’un önbelleği için yapıyorum çünkü bir süre sonra Chrome’un başlaması birkaç dakika alacak kadar büyüyor.


3
Bu işe yaramaz, çünkü sembolik bağlantılar dosya değil dosyadır. Denemek echo hello > ~/.logs/log1.dumpverir ~/.logs/log1.dump: Not a directory. Ancak echo hello > ~/.logsçalışır çünkü .logs bir dosyadır.
dogbane

2
Bizimle dalga geçiyor olmalısın. $ ln -s /dev/null dev-null; touch dev-null/zzzbana verirtouch: cannot touch 'dev-null/zzz': Not a directory
alex

1
Dediğim gibi, Chrome için çalışıyor. Önbelleğe yazmasını engeller. Eğer istemcinin programının çökmesine neden olursa, o zaman açıkça dosya işaretçilerinin NULL olup olmadığını kontrol etmez.
jonescb

6
Muhtemelen, dosyayı açarken bir hata olursa Chrome'un yazıyı atladığı anlamına gelir. Aynı efekti döküm dosyasından veya yazdığı
dizinden

Doğru, dizinin izinlerini değiştirmek muhtemelen daha mantıklı olur.
jonescb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.