해시를 사용하여 디렉터리 트리를 매니페스트 파일과 비교하는 diff -r과 같은 도구가 있습니까?

해시를 사용하여 디렉터리 트리를 매니페스트 파일과 비교하는 diff -r과 같은 도구가 있습니까?

내 상황은 다음과 같습니다. 동일한 데이터 세트를 포함해야 하는 두 개의 냉장 보관 아카이브 볼륨이 있습니다. 이러한 볼륨에는 자주 액세스하지 않는 백업이 포함되어 있습니다. 결국에는 bitrot이 둘 중 하나 또는 둘 다에 도달하여 그 안에 포함된 데이터를 미묘하게 손상시킬까 봐 걱정됩니다. 두 볼륨을 검색하고 두 볼륨 사이에서 변경되거나 사라진 파일을 찾을 수 있다는 것을 알고 있지만 diff -r어느 볼륨에 "양호한" 복사본이 있는지에 대한 유용한 정보는 없습니다. 이것은 USB 디스크이므로 ZFS와 같은 것으로 변환하는 것은 번거로운 것 같습니다.

내가 원하는 것은 디렉터리 트리를 반복적으로 탐색하고 파일 내용의 해시와 함께 경로와 파일 이름이 포함된 매니페스트 파일을 작성하는 도구입니다. 각 볼륨에 데이터를 쓴 후 즉시 이 도구를 실행하고 결과 매니페스트 파일을 일종의 개정 제어 하에 있는 웜 스토리지에 저장했습니다.

이 파일에서 나는 정확히 다음과 같이 작동하는 것을 실행할 수 있기를 원합니다 diff -r. 즉, 파일이 추가되었는지, 제거되었는지 또는 내용이 변경되었는지 알려주는 것입니다. 한 볼륨을 다른 볼륨과 비교하는 대신 한 볼륨을 알려진 양호한 매니페스트 파일과 비교합니다. 이 방법을 사용하면 앞으로 몇 달/1년 동안 디스크에서 읽는 데이터가 원래 디스크에 저장한 데이터와 동일한지 여부를 알 수 있습니다.

나는 이와 같은 것이 이미 존재한다고 생각해야 할 것입니다. 다음을 사용하여 매니페스트 파일과 비슷한 것을 얻을 수 있습니다.

find /mnt/my-volume -type f -exec md5sum {} + > manifest.txt

하지만 지금까지 나는 이 파일을 구문 분석하고 각 해시를 재귀적으로 확인하는 좋은 방법을 찾지 못했습니다. 또한 다소 덜 중요한 점은 빈 디렉토리가 나타나거나 사라지는지 알려주지 않는다는 것입니다. (왜 그것이 중요할지 생각할 수 없지만, 그런 일이 발생했다는 것을 아는 것이 좋을 것입니다.)

제가 이 작업을 수행하는 데 올바른 방향으로 가고 있습니까? 아니면 이러한 유형의 작업을 수행할 수 있는 더 적절한 도구가 있습니까?

답변1

맞습니다. 그러한 도구는 이미 존재합니다. 귀하의 게시물에 'linux'라는 태그가 붙은 것을 볼 수 있지만 아마도 BSD 지향 솔루션이 도움이 될 것입니다.

FreeBSD의 mtree(8) 유틸리티당신이 요구하는 것을 정확하게 할 수 있습니다.

가정하다:

$ find .
.
./c
./c/file3
./b
./b/file2
./a
./a/file1

모든 파일의 sha256 해시를 포함하여 해당 파일 계층의 매니페스트를 생성하려면 다음을 수행합니다.

$ mtree -c -K sha256 > /tmp/manifest.txt
$ cat /tmp/manifest.txt
#          user: diego
#       machine: myhost.example.com
#          tree: /data/home/diego/foo
#          date: Wed Mar 28 10:31:17 2018

# .
/set type=file uid=1001 gid=1001 mode=0710 nlink=1 flags=uarch
.               type=dir nlink=5 time=1522257963.738221000

# ./a
/set type=file uid=1001 gid=1001 mode=0600 nlink=1 flags=uarch
a               type=dir mode=0710 nlink=2 time=1522257932.680802000
    file1       size=29 time=1522257932.682389000 \
                sha256digest=6b4114c4f12e63c0ca44073de5ca0a2b39fedaceaa533af3dfdc89f00039c973
# ./a
..


# ./b
b               type=dir mode=0710 nlink=2 time=1522257937.929131000
    file2       size=29 time=1522257937.930666000 \
                sha256digest=9f7a0a49475bb6f98e609a4e057f0bc702c5e4706be5bd656a676fd8d15da7ef
# ./b
..


# ./c
c               type=dir mode=0710 nlink=2 time=1522257942.064315000
    file3       size=29 time=1522257942.065882000 \
                sha256digest=bd617f47217ef0605d3aff036778d10bf18cb2f415c45e8e362e2c091df19491
# ./c
..

그런 다음 매니페스트를 mtree에 연결하여 매니페스트에 대한 파일 계층 구조를 확인할 수 있습니다.

$ mtree < /tmp/manifest.txt || echo fail

파일을 추가, 삭제, 이름 변경 또는 수정하면 확인이 실패하게 됩니다.

$ touch foo
$ mtree < /tmp/manifest.txt || echo fail
.:      modification time (Wed Mar 28 10:34:56 2018, Wed Mar 28 10:37:01 2018)
extra: foo
fail
$ rm foo; touch b/file2; mtree < /tmp/manifest.txt || echo fail
.:      modification time (Wed Mar 28 10:34:56 2018, Wed Mar 28 10:39:39 2018)
b/file2: 
        modification time (Wed Mar 28 10:25:37 2018, Wed Mar 28 10:39:39 2018)
fail
$ mv c/file3 c/FILE3; rm a/file1; date >> b/file2; mtree < /tmp/manifest.txt || echo fail
.:      modification time (Wed Mar 28 10:34:56 2018, Wed Mar 28 10:39:39 2018)
c:      modification time (Wed Mar 28 10:25:42 2018, Wed Mar 28 10:41:59 2018)
extra: c/FILE3
b/file2:
        size (29, 58)
        modification time (Wed Mar 28 10:25:37 2018, Wed Mar 28 10:47:31 2018)
        sha256digest (0x9f7a0a49475bb6f98e609a4e057f0bc702c5e4706be5bd656a676fd8d15da7ef, 0x569c17bd1a1ca2447fd8167f103531bf3a7b7b4268f0f68b18506e586e7eea94)
a:      modification time (Wed Mar 28 10:25:32 2018, Wed Mar 28 10:41:59 2018)
./a/file1 missing
./c/file3 missing
fail

답변2

md5sum -c manifest.txt에 저장된 경로를 존중합니다 manifest.txt. 프로그램 은 명령줄 에 지정된 검색 위치를 포함하여 찾은 파일의 전체 경로를 find대체합니다 . 즉, 파일의 경우 명령과 동일한 경로를 대체합니다.{}find./a/b/c/d/e./a/b/c/d/efind ./a -type f -exec md5sum {} \;

가능한 문제는 절대 경로이므로 더 적절한 '매니페스트 생성 명령'은 다음과 같습니다.

cd /mnt/my-volume; find  -type f -exec md5sum {} + > manifest.txt

sed그러나 항상 mainfest.txt 내부 에서 경로를 수정할 수 있습니다.

관련 정보