btrfs는 스냅 샷을 효율적으로 비교할 수있는 방법이 있습니까?


21

다른 마운트 된 스냅 샷은 작동하지만 대부분의 경우 속도가 느려질 수 있습니다.

Diffing Snapshot에 대한 btrfs 관련 기능이 있습니까? (문서에서 찾을 수 없습니다)


파일 블록과 디렉토리를 비교하려면 변경 한 블록과 방법을 찾을 수 있지만 나중에 변경이 취소 된 경우를 고려해야합니다. 예를 들어 , 파일이 A포함 된 파일 을 스냅 샷에 a작성한 b후 나중에로 다시 변경 a하면 파일이 전혀 변경되지 않았습니다.
Cristian Ciupitu

뭔가 빠진 경우가 아니라면 이런 종류의 작업이 항상 수행되는 소스 코드 개정 제어와 완전히 유사한 것처럼 보입니다.
Catskul

btrfs 파일 시스템에서 rsync와 같은 것을 실행하는 또 다른 문제는 noatime 마운트 옵션을 사용하지 않으면 변경 여부를 확인하기 위해 모든 파일을 읽으면 파일이 효과적으로 수정되고 파일이 실제로 수정되지 않은 경우에도 다음 스냅 샷이 커진다는 것입니다 . 토론에 대해서는 lwn.net/Articles/499293 을 참조하십시오 .
Luca Citi

답변:


11

btrfs send / receive를 찾고 있는 것 같습니다 .Linux 3.6에 나타납니다. 이 send명령은 두 스냅 샷 간의 차이점에 대한 로그 파일을 작성하고 파일의 receive변경 사항을 적용합니다. 보내기 / 받기는 사용자 정의 파일 형식을 사용하므로 diff 또는 tar와 같이 파일이 정확하게 표시되지 않습니다.


좋은! 바로 내가 찾던 것입니다.
Catskul

2
이 출력을 구문 분석하는 앱의 예는 다음을 참조하십시오. github.com/sysnux/btrfs-snapshots-diff (나에 의해 아님)
Att Righ

10

나는 가지고 있지 않은 데비안 안정을 실행 btrfs send중이므로를 사용하는 솔루션을 찾았습니다 btrfs subvolume find-new.

snapshot1과 snapshot2가 있고 나중의 Snapshot 2에서 변경된 사항을 알고 싶은 경우 snapshot1이 작성되었으므로 아래 스크립트를 사용할 수 있습니다.

btrfs-diff oldsnapshot/ newsnapshot/

oldsnapshot / 이후에 newsnapshot /에서 변경된 모든 파일을 나열합니다.

#!/bin/bash
usage() { echo $@ >2; echo "Usage: $0 <older-snapshot> <newer-snapshot>" >2; exit 1; }

[ $# -eq 2 ] || usage "Incorrect invocation";
SNAPSHOT_OLD=$1;
SNAPSHOT_NEW=$2;

[ -d $SNAPSHOT_OLD ] || usage "$SNAPSHOT_OLD does not exist";
[ -d $SNAPSHOT_NEW ] || usage "$SNAPSHOT_NEW does not exist";

OLD_TRANSID=`btrfs subvolume find-new "$SNAPSHOT_OLD" 9999999`
OLD_TRANSID=${OLD_TRANSID#transid marker was }
[ -n "$OLD_TRANSID" -a "$OLD_TRANSID" -gt 0 ] || usage "Failed to find generation for $SNAPSHOT_NEW"

btrfs subvolume find-new "$SNAPSHOT_NEW" $OLD_TRANSID | sed '$d' | cut -f17- -d' ' | sort | uniq

설명 : 특정 '생성'스냅 샷 후에btrfs subvolume find-new 변경된 파일을 찾습니다 . 또한 현재 세대 번호를보고합니다.

경고

예를 들어 하위 볼륨 사례의 일일 스냅 샷을 작성하십시오.

mkdir test && cd test
btrfs subvolume create live
date >live/foo1
date >live/bar1
btrfs subvolume snapshot live/ snap1
date >live/foo2  # new file
date >>live/bar1 # modify file
rm live/foo1     # delete file
btrfs subvolume snapshot live/ snap2
date >live/foo3  # new file
mv live/bar{1,2} # rename file
rm live/foo2     # delete file

snap1과 snap2 사이에 무엇이 바뀌 었습니까?

$ btrfs-diff snap1/ snap2/
bar1
foo2

따라서 새 파일, 수정 된 파일을 볼 수 있지만 삭제는보고되지 않습니다 . 명령이 현재 존재하지 않는 파일이 아니라 존재하는 파일을보고하기 때문입니다.

snap2와 라이브 하위 볼륨간에 어떤 변화가 있습니까?

$ btrfs-diff snap2/ live/
foo3

이름이 바뀐 파일은보고되지 않습니다 . 데이터가 변경되지 않았습니다.

이름을 바꾼 파일에 데이터를 추가하면 어떻게됩니까?

date >>live/bar2
btrfs-diff snap2/ live/
bar2
foo3

알겠습니다. 하지만 새 파일을 만들어 봅시다

date >live/lala
btrfs-diff snap2/ live/
bar2
foo3

뭐라고! 라라 어 where 어? . 다른 파일을 추가하면가 lala나타납니다. 따라서이 동작은 약간 이상합니다. 아마도 위키가 말하는 이유는 다음과 같습니다.

새로 찾기 접근 방식에는 몇 가지 심각한 제한이 있으므로 보내기 / 받기와 같은 작업에는 실제로 사용할 수 없습니다.

그러나 (읽기 전용) 스냅 샷을 비교할 때가 아니라 라이브 하위 볼륨을 이전 상태와 비교할 때 문제가 발생합니다. 따라서 삭제 된 파일을 식별하지 않는 한 여전히 유용 할 수 있습니다.


이봐, 나는 당신의 도구를 조금 확장했습니다. 이 도구는 스냅 샷에서 발생한 모든 변경 사항의 스트림을 보여줍니다 (개별 링크를 선택할 수도 있음) github.com/talwrii/btrlog
Att Righ

1

이것은 스냅 샷 편의 도구에 의해 지원됩니다 snapper.

sudo snapper -c config diff 445..446

물론이를 위해서는 snapper스냅 샷에 사용해야합니다 .

이 스냅 샷 ID는을 사용하여 찾을 수 있습니다 snapper list -a. 불행히도 snapper 작성 당시에는 단일 구성에 대한 목록 스냅 샷을 지원하지 않았지만이 숫자는 하위 볼륨 이름에서 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.