/ dev / null과 같은 "blackhole"디렉토리를 어떻게 만들 수 있습니까?


81

" /dev/null"디렉토리 (또는 "블랙홀"디렉토리)를 작성하여 작성된 파일이 실제로 작성되지 않고 사라지 도록하고 싶습니다 .

큰 임시 파일을 디렉토리에 쓰는 응용 프로그램이 있습니다. 파일 이름을 제어 할 수 없으며 이러한 파일의 내용에 대해서는 신경 쓰지 않습니다. 이러한 파일을 주기적으로 클로버하는 스크립트를 작성할 수는 있지만 파일은 매우 빠르게 작성되어 디스크를 채 웁니다. 나는 영리한 것을 찾고 있습니다. 응용 프로그램이 이러한 파일을 작성하고 있다고 생각하고 실제로는 다른 쪽 끝에서 쓰기를 버리고 있습니다.

오래된 관련 스레드 도 참조하십시오 .



방금 나에게 같은 질문을하고 내가 만들지 못한 디렉토리에 동일한 이름을 사용했습니다.
ixtmixilix

답변:


48

이것은 내가 아는 유닉스에서 기본적으로 지원되지 않지만 FUSE로 거의 모든 것을 할 수 있습니다 . 모든 파일이 존재하고 다음과 같이 동작하는 파일 시스템 인 nullfs¹의 구현은 하나 이상 있습니다 /dev/null(이것이 내가 본 유일한 구현은 아닙니다).

¹ bindfs 와 유사한 * BSD nullfs 와 혼동하지 마십시오 .


환상적인-나는 이것을 SO
Phil Lello

1
해당 프로그램에서 컴파일 오류가 발생하는 사람들에게 메모 g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`하십시오.
ixtmixilix

다른 구현을 알려 주시겠습니까? 내가 찾을 수 없기 때문에
Freedo

@Freedo 나는 많은 사람들이 그것을 학습 연습으로 해왔고 그것을 유지하지 못하게했다고 생각합니다. 더 이상 웹에 없을 수도 있습니다.
Gilles

7

또 다른 방법은 LD_PRELOAD 래퍼입니다. 기본적으로 작은 공유 라이브러리는 libc.so 이전에로드되며, 예상 파일 경로를 검사하고 대상 디렉토리에있는 경우 "/ dev / null"을 대체하는 것으로 "open"호출을 가로 챕니다.

이것은 (a) 전적으로 사용자 공간에서 커널 해킹이 필요하지 않다는 이점이 있습니다. (b) 단일 잘못된 신청에만 영향을 미칩니다.

간단한 예는 http://www.noah.org/wiki/LD_PRELOAD_notes 에 있지만 "open"및 "creat"시스템 호출을 가로 채고 싶을 것입니다.


3
... 응용 프로그램이 int 0x80/ syscall/ sysenter/ what을 직접 통하지 않고 libc를 통해 시스템 호출을 수행한다고 가정합니다 .
Ruslan

1

프로그램이 로그를 끌 수 없도록 너무 어리석은 경우 로그 파일을 연 후 오류를 확인하지 않습니까? 더미 읽기 전용 파일 시스템을 마운트하려고합니다 (예 : mount -o loop.)


이 방법은 불행히도 작동하지 않습니다. 이 파일에 쓸 수 없으면 응용 프로그램이 종료됩니다.
dogbane

1

스크립트를 사용하여 파일을 주기적으로 제거하는 것만으로는 충분하지 않다고 말합니다. 응용 프로그램에서 쓰기를 마치고 닫을 때마다 임시 파일을 삭제하는 트리거로 살아갈 수 있습니까? 그렇다면 "inotify"API를 사용할 수 있습니다.

( http://en.wikipedia.org/wiki/Inotifyhttps://github.com/rvoicilas/inotify-tools/wiki/ 참조 )


1
많은 시스템에서 프로세스가 연 파일을 삭제하면 디렉토리 항목이 제거되지만 파일 자체는 마지막 프로세스에서 파일을 닫을 때까지 디스크에 남아 있습니다. 프로세스는 파일을 작성한 다음 처음부터 다시 찾아서 읽을 수 있으므로 OS는 데이터를 버릴 수 없습니다.
interfect

0

리눅스 커널의 ramfs 예제를 기반으로 커널 모듈을 만들었습니다. 기본적으로 nullfsvfs라는 블랙홀 파일 시스템입니다. FUSE 시스템 구현은 사용자에서 커널 공간으로 데이터를 복사해야하며 커널 모듈과 같은 간단한 구현에 비해 속도가 느립니다. 보다:

https://github.com/abbbi/nullfsvfs


-8

해당 디렉토리를 심볼릭 링크하십시오. /dev/null

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

/dev/null디렉토리 일 필요는 없습니다. 프로그램이에 쓰려고 시도 ~/.logs/log1.dump하면 여전히로 들어가게됩니다 /dev/null.
Chrome 캐시에 대해이 작업을 수행합니다. 시간이 너무 길어 Chrome을 시작하는 데 몇 분이 걸리기 때문입니다.


3
심볼릭 링크는 디렉토리가 아닌 파일이기 때문에 작동하지 않습니다. 노력 echo hello > ~/.logs/log1.dump하고 ~/.logs/log1.dump: Not a directory있습니다. 그러나 echo hello > ~/.logs.logs는 파일이기 때문에 작동합니다.
dogbane

2
당신은 우리를 농담해야합니다. $ ln -s /dev/null dev-null; touch dev-null/zzz제공touch: cannot touch 'dev-null/zzz': Not a directory
alex

1
내가 말했듯이 Chrome에서 작동합니다. 캐시에 쓰지 못하게합니다. 그것이 asker의 프로그램을 중단 시키면 파일 포인터가 NULL인지 확인하지 않습니다.
jonescb

6
파일을 여는 중 오류가 발생하면 Chrome에서 쓰기를 건너 뛰는 것일 수 있습니다. 덤프 파일 또는 해당 디렉토리의 쓰기 디렉토리에서 쓰기 권한을 제거하여 동일한 효과를 얻을 수 있습니다.
KeithB

사실, 디렉토리의 권한을 변경하는 것이 더 합리적 일 것입니다.
jonescb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.