Eu gostaria de criar um /dev/null
diretório " " (ou um diretório "blackhole") para que os arquivos gravados nele não sejam realmente escritos, mas simplesmente desapareçam.
Eu tenho um aplicativo que grava grandes arquivos temporários em um diretório. Não tenho controle sobre o nome dos arquivos e realmente não me importo com o conteúdo desses arquivos. Eu poderia escrever um script que periodicamente limpe esses arquivos, mas os arquivos são gravados muito rapidamente e preenchem meu disco. Estou procurando por algo mais inteligente. Quero que o aplicativo "pense" que está gravando esses arquivos, quando, de fato, as gravações estão sendo descartadas no outro extremo.
Veja também este tópico relacionado antigo.
filesystems
directory
io-redirection
dogbane
fonte
fonte
Respostas:
Isso não é suportado pronto para uso em nenhum unix que eu conheça, mas você pode fazer praticamente qualquer coisa com o FUSE . Há pelo menos uma implementação do nullfs¹ , um sistema de arquivos em que todos os arquivos existem e se comportam como
/dev/null
(essa não é a única implementação que eu já vi).¹ Não deve ser confundido com o * BSD nullfs , que é análogo ao bindfs .
fonte
g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`
trabalharam para mim.Outra abordagem seria um wrapper LD_PRELOAD; basicamente uma pequena biblioteca compartilhada que é carregada antes da libc.so, e intercepta chamadas para "abrir" com algo que verifique o caminho do arquivo em potencial e substitua "/ dev / null" se estiver no diretório de destino.
Isso tem a vantagem de estar (a) inteiramente no espaço do usuário - não é necessário hackear o kernel; e (b) afetando apenas o pedido único incorreto.
Um exemplo simples está em http://www.noah.org/wiki/LD_PRELOAD_notes , mas no seu caso você deseja interceptar as chamadas do sistema "aberto" e "criativo".
fonte
int 0x80
/syscall
/sysenter
/ qualquer outra coisa.Se o programa é tão estúpido para não permitir que você desative esses logs, talvez ele também não verifique se há erros após abrir um arquivo de log? Eu tentaria montar algum sistema de arquivos somente leitura fictício (por exemplo, usando
mount -o loop
.)fonte
Você diz que remover os arquivos periodicamente com um script não é rápido o suficiente. Você poderia conviver com um gatilho que exclui um arquivo temporário a qualquer momento que seu aplicativo termina de gravá-lo e o fecha? Nesse caso, você pode fazer uso da API "inotify".
(Consulte http://en.wikipedia.org/wiki/Inotify e https://github.com/rvoicilas/inotify-tools/wiki/ )
fonte
Eu criei um módulo do kernel baseado no exemplo ramfs no kernel linux, é basicamente um sistema de arquivos blackhole chamado nullfsvfs. A implementação do sistema FUSE precisa copiar dados do usuário para o kernelspace e é bastante lenta, em comparação com uma implementação direta como módulo do kernel. Vejo:
https://github.com/abbbi/nullfsvfs
fonte
Basta ligar o diretório para
/dev/null
/dev/null
, não precisa ser um diretório. Se o programa tentar gravar~/.logs/log1.dump
, ele continuará direto para/dev/null
.Faço isso no cache do Google Chrome, porque depois de um tempo fica tão grande que o Chrome leva alguns minutos para iniciar.
fonte
echo hello > ~/.logs/log1.dump
dá~/.logs/log1.dump: Not a directory
. No entanto,echo hello > ~/.logs
funciona porque .logs é um arquivo.$ ln -s /dev/null dev-null; touch dev-null/zzz
dá-me #touch: cannot touch 'dev-null/zzz': Not a directory