프로그램이 성공적으로 썼다고 생각하지만 디스크에는 아무 것도 쓰지 않도록 속이는 것이 가능합니까?

프로그램이 성공적으로 썼다고 생각하지만 디스크에는 아무 것도 쓰지 않도록 속이는 것이 가능합니까?

파일 중복을 제거할 수 있는 타사 소프트웨어가 있지만 파일을 디스크에 복사했지만 이미 디스크에 파일이 있고 심볼릭 링크만 원하기 때문에 원격 서버에서 가져오지 않은 것으로 생각하고 싶습니다.

/x 폴더를 일종의 쓰기 가능한 가짜 파일 시스템으로 만드는 방법이 있습니까? 어쩌면 퓨즈 같은 걸까요?

작성하는 소프트웨어/스크립트를 실행할 수 있는 임의의 폴더를 열고 싶습니다. 그러면 성공적인 쓰기가 반환되지만 실제로는 아무것도 쓰지 않습니다.

그게 가능합니까? 예제 실행은 touch file제대로 실행되어야 하지만 아무 것도 기록되지 않습니다.

답변1

FUSE 파일 시스템(사용자 공간의 파일 시스템)을 사용하면 libfuse 라이브러리를 사용하여 프로그램을 작성하여 대부분의 파일 작업을 구현할 수 있습니다. 프로그램을 디렉토리에 효과적으로 마운트하면 해당 디렉토리에서 수행하는 모든 작업이 커널을 통해 응답을 제공하는 프로그램으로 전달됩니다. 요구 사항에 맞게 쉽게 수정할 수 있는 예제 프로그램이 포함된 여러 Perl 및 Python 패키지가 있습니다.

fuse-python특히, 제가 사용하는 Fedora 25의 경우 샘플 프로그램을 제공하는 rpm이 있습니다.xmp.py이는 "단순히" 마운트 지점에서 수행된 모든 작업을 처음에 지정한 실제 디렉터리에 복사합니다.

예를 들어 (루트가 아닌 일반 사용자로) 실행하면

mkdir -p /tmp/myfs/under /tmp/myfs/write
xmp.py /tmp/myfs/write -o root=/tmp/myfs/under

그러면 마운트 지점 아래의 파일에 수행한 모든 작업이 /tmp/myfs/write실제 중복 "루트" 디렉터리에도 표시됩니다 /tmp/myfs/under. 예를 들어

echo abc >/tmp/myfs/write/file1

file1실제 디렉토리에 생성되었습니다. 물론 ls /tmp/myfs/*/file1파일이 두 가지 모두에 나타나면 xmp.py실제 디렉터리도 표시됩니다.

-rw-r--r-- 1  4 Aug  1 18:43 /tmp/myfs/under/file1
-rw-r--r-- 1  4 Aug  1 18:43 /tmp/myfs/write/file1

Python 예제 코드를 보면 코드가 매우 짧다는 것을 알 수 있습니다. 시스템 호출의 구현을 볼 수 있습니다.write() 여기:

    def write(self, buf, offset):
        self.file.seek(offset)
        self.file.write(buf)
        return len(buf)

파일에 대한 실제 쓰기를 억제하려면 간단히 세 번째 줄을 주석 처리하면 됩니다.

    def write(self, buf, offset):
        self.file.seek(offset)
        # self.file.write(buf)
        return len(buf)

멜트다운 파일 시스템 제거

fusermount -u /tmp/myfs/write

그런 다음 새 파일을 실행 xmp.py하면 이제 파일에 쓸 때 성공한 것처럼 보이지만 기본 실제 디렉터리에는 데이터가 기록되지 않습니다. 프로그램에서 허위 문제가 발생할 수 있으므로 디렉토리 생성 등과 같은 다른 파일 작업을 삭제하지 않는 것이 좋습니다.

xmp.py저는 시스템에 설치한 패키지에 제공된 것을 사용했습니다 . Github 코드에 대한 링크는 보기 전용입니다. 귀하의 시스템에 적합한 패키지를 찾아 사용한다면 이 실험을 반복하는 데 아무런 문제가 없을 것입니다. FUSE에는 여러 Python 라이브러리가 있습니다. 위의 샘플 코드를 사용하여 이 버전을 설치하세요.


귀하의 로그인은 그룹에 있어야 합니다퓨즈이 프로그램을 사용할 수 있습니다. 명령의 출력에 이 목록이 표시되어야 합니다 id. 그룹이 존재하지 않으면 그룹을 추가하고 sudo usermod -a -G fuse $USER(여기서 $USER는 로그인 이름) 다시 로그인하십시오.

Ubuntu에서는 패키지가 python-fuse. 예제 xmp.py는 변경되지 않았습니다. 파일이 생성되지만 기록되지는 않습니다 Invalid argument. 이는 이번 버전과 libfuse 버전의 비호환으로 인해 발생하는 것으로 보입니다. xmp.py추가 디버그 옵션을 실행 하면 -o debug오류가 표시됩니다.

AttributeError: 'XmpFile' object has no attribute 'direct_io'
AttributeError: 'XmpFile' object has no attribute 'keep_cache'

xmp.pyclass XmpFile이 문제를 해결하기 위해 다른 방법을 시도할 수도 있지만 저는 , function 에 추가하고 def __init__해당 줄 뒤에 다음 두 줄을 추가하여 self.fd = self.file.fileno()누락된 속성을 추가했습니다 .

self.direct_io = None
self.keep_cache = None

탭이 아닌 공백만 사용하여 줄이 정확히 동일하게 들여쓰기되어 있는지 확인하세요.

관련 정보