2011-01-03 6 views
2

특정 시점 이후에 블록 장치의 어떤 블록이 수정되었는지 추적 할 방법을 찾고 있습니다. 필자가 궁극적으로이 방법을 사용하려면 두 개의 2TB 디스크를 동기화 상태로 유지해야합니다. 하나는 한 달에 한 번 온라인 (USB를 통해 연결됨)으로 연결됩니다. 어떤 블록이 수정되었는지 알지 못하면 매회 전체 2TB를 처리해야합니다.블록 장치의 더티 블록 추적하기

최근의 GNU/Linux OS를 사용하고 있으며 C 및 Python 경험이 있습니다. 필자는 그 영역에 대한 경험이 전혀 없으므로 커널 레벨 코드 작성을 피하고자합니다. 나의 현재 이론은 디스크 플러시 (flush)가 수행 될 때 코드가 호출 될 수있는 어딘가에 후크가 있어야한다는 것이다.

아이디어가 있으십니까?

+0

rsync를 사용할 수 있습니까? – George

답변

2

a bug in the block layer을주의해서 사용하는 경우 Linux MD를 사용할 수 있어야합니다. 매달마다 USB 디스크를 기본적으로 누락 된 2 디스크 RAID 세트의 새 구성원으로 추가하고 변경된 블록의 동기화를 수행하게합니다. 쓰기 - 쓰기 비트 맵은이 점에 유익한 것처럼 보입니다. 따라서 주위에 비트 맵을 갖는 것을 잊지 마십시오.

# Creation 
mdadm -C /dev/md0 -l 1 -n 2 -e 1.0 -b internal /dev/sda missing 

# Addition of slave disk 
mdadm /dev/md0 -a /dev/thatusbthing 

a longer description of this setup도 참조하십시오. 옵션/잠재적 함정에 대한 자세한 설명이 나와 있습니다.

부록 :

rsync를이 (비교적 느린) 네트워크를 통해 파일을 전송하도록 설계되었습니다. 즉, 양측이 장치를 로컬로 스캔하고 롤링 체크섬을 계산 한 다음 변경된 청크를 전송합니다. 물론 변경 목록은 체크섬 계산에 의존합니다. (디스크에서 30 + MB/s의 읽기는 무조건 100MB 네트워크에서 10MB/s로 무조건 밀어 넣는 것보다 빠릅니다.)

MD 쓰기 - 의도 비트 맵에서는 스캔 단계가 필요하지 않습니다. 이 비트 맵을 통해 디스크가 마지막으로 동기화 된 이후에 어떤 블록이 변경되었는지 이미 알고 있습니다.

+0

커널 공간에서 (그리고 느리게 실행하면서) 일어나는 경우를 제외하고는 이것이 인스톨 된 rsync와 어떻게 다른지 잘 모르겠습니다. 알지 못하는 변경 사항을 기록하는 RAID 장치에 대한 추가 데이터가 있습니까? –

+0

코멘트 기능에 충분한 공간이 없기 때문에 지금 Addendum :의 질문을 편집했습니다. – user562374

+0

이 비트 맵이 쓸데없이 쓰다 보면, 가장 효율적인 방법이 될 것입니다. +1 –

1

포함 된 파일 시스템 메타 데이터를 사용하지 않고 변경 사항을 확인하는 유일한 방법은 블록 장치를 비교하는 것입니다. 델타 전송 알고리즘 rsyncrsync --inplace -B 4K /dev/sdX /dev/sdY과 함께 적용 할 수 있습니다. 블록 장치에 맞게 블록 크기를 조정하십시오. 이렇게하려면 4TB의 읽기가 필요하지만 블록 장치가 동일한 시스템에 있어야 할 필요는 없습니다. 당신은 많은 다른 사람 사이의 전송에서 압축을 가능하게 할 수 있습니다 options.

+0

ryync는 비정상 파일을 건너 뜁니다 (그래서/dev/sdX는 작동하지 않습니다). 그리고 내 버전'-B'는'4K'를 받아 들일 수 없지만 실제 번호가 필요합니다. – Wolph

2

drbd를 사용할 수 있습니다. 오버 헤드가 큰 것처럼 보이지만 한 대의 컴퓨터에서 두 대의 장치를 사용할 수 있습니다. 두 번째 장치 (USB에있는 장치)는 대부분 제거해야하며 "보조"상태로 설정해야합니다. 플러그를 꽂은 후에는 매우 빠르게 동기화되어야합니다. 이는 drbd가 로컬 변경 사항을 추적하기 때문입니다.

예, 단점이 있습니다. 원시 장치가 아닌 특수 형식을 사용해야하며 장치는 로컬로 변경된 섹터에 대한 비트 맵을 필요로하기 때문에 더 작아집니다.