저는 두 개의 하드 드라이브에 몇 개의 GB 파일을 저장합니다. 몇 년 동안 오프라인 저장을 한 후(안타깝게도 이상적인 조건과는 거리가 멀음) 비트가 손상된 일부 파일(두 개의 복사본이 다름)을 자주 받아서 파일을 복원하고 싶습니다. 문제는 파일이 너무 커서 동일한 파일의 일부 저장 장치에서 특정 비트가 손상되고 다른 저장 장치에서는 다른 비트가 손상되어 두 디스크 모두 손상되지 않은 문서를 포함하지 않는다는 것입니다.
따라서 전체 파일의 MD5 체크섬을 계산하는 대신 각 1KB 블록의 체크섬을 계산하고 싶습니다. 이러한 작은 블록을 사용하면 두 개의 하드 드라이브에서 동일한 1KB 블록이 손상될 가능성이 크게 줄어듭니다.
이것이 어떻게 달성될 수 있습니까? 어렵지 않을 거라 확신하지만, 다른 방법을 시도하는 데 한 시간 넘게 걸렸고 계속 실패했습니다.
답변1
광학 미디어(현재 BD-R이지만 CD-R 및 DVD-R에서도 동일한 방법을 사용함)의 비트롯과 비슷한 문제가 있습니다.
라는 프로그램이 있습니다.par2
복구 데이터(Reed-Solomon 코드 사용)를 생성하여 특정 수의 오류를 감지할 수 있을 뿐만 아니라 수정할 수도 있습니다. 블록 크기와 중복성 비율(필요한 추가 디스크 공간의 양이기도 함)을 구성할 수 있습니다. 예를 들어, 1,000개의 블록과 10% 중복성을 사용하는 경우 100개의 중복 블록을 저장하기 위해 디스크 공간의 10%를 추가로 사용하여 총 1100개가 됩니다. 하지만 그 대가로 파일을 완전히 복구할 수 있습니다.어느손상되지 않은 블록 1000개. 따라서 100개 이하의 블록에 비트로트가 포함되어 있으면 파일을 복구할 수 있습니다.
par2의 단점은 복구 데이터를 계산하는 데 시간이 오래 걸리고, 생성되는 데이터가 많을수록 시간이 오래 걸린다는 것입니다(10% 생성보다 20% 생성이 더 오래 걸립니다).
또 다른 유사한 도구는지피크, 개인적으로는 사용하지 않았지만.
답변2
여기에서 완전한 솔루션을 제공하지는 않겠지만, 여러분이 자신만의 솔루션을 구축하는 데 도움을 드릴 수 있기를 바랍니다. 개인적으로 나는 더 나은 도구가 있다고 생각 rsync
하지만 이것은 귀하의 질문 기준을 충족하지 않는 것 같습니다.
split
원본 데이터뿐만 아니라 분할 데이터도 저장할 수 있어야 하기 때문에 실제로는 사용하지 않을 것입니다 . 대신 dd
. 이와 같은 것이 도움이 될 수 있습니다.
file=/path/to/file
blocksize=1024 # Bytes per block
numbytes=$(stat -c '%s' "$file")
numblocks=$((numbytes / blocksize))
[[ $((numblocks * blocksize)) -lt $numbytes ]] && : $((numblocks++))
blockno=0
while [[ $blockno -lt $numblocks ]]
do
md5sum=$(dd bs=$blocksize count=1 skip=$blockno if="$file" 2>/dev/null | md5sum)
# Do something with the $md5sum for block $blockno
# Here we write to stdout
echo "$blockno $md5sum"
: $((blockno++))
done