모든 Linux 배포판에서 파일이 로컬 파티션에서 NFS 파티션으로 전송될 때 md5sum 또는 sha1 검사를 수행하는 방법이 있습니까?
예:
NFS 마운트 드라이브가 있고 로컬 드라이브에 매우 큰 파일이 있습니다. md5 검사를 수행하는 동안 파일을 NFS 마운트 드라이브로 전송하고 싶습니다. 파일을 원격 드라이브에 복사한 후 md5를 하는 스크립트를 많이 찾아봤는데 100GB가 넘는 아주 큰 파일이기 때문에 파일이 이미 복사되어 있다는 점을 활용할 수 있는 방법이 없을지 궁금합니다. 전송 시 빨간색으로 복사됩니다.
답변1
나는 이 작업을 수행할 수 있는 표준 Linux 유틸리티를 모릅니다. 파일이 메모리 기반 캐시에 맞는 경우 먼저 md5sum을 수행한 다음 복사(복사하면 메모리에서 데이터를 가져옴)하는 것이 그다지 비효율적이지 않습니다.
다음 조합을 사용할 수 있습니다.
cat filename | tee remote_output_name | md5sum
저장된 md5 에 대해 직접 md5sum
인쇄된 합계를 확인 하도록 수정할 수 있습니다. 이는 디스크에서 파일을 한 번만 읽습니다.
check.md5
당신 이
cd dir_with_big_files
md5sum * > check.md5
, 다음 Python 프로그램은 한 번에 64Mb를 읽고 쓰면서 단일 파일을 복사하고 검사합니다. /usr/local/bin/chkcopy로 저장하고 chmod +x /usr/local/chkcopy
사용하십시오.chkcopy file_name check.md5 destination_filename_or_dir
#! /usr/bin/env python
import sys, os, hashlib
m = hashlib.md5()
file_name = sys.argv[1]
md5_name = sys.argv[2]
out_name = sys.argv[3]
if os.path.isdir(out_name):
out_name = os.path.join(out_name, file_name)
BUF_SIZE = 64 * (1024 ** 2)
with open(file_name, 'rb') as ifp:
with open(out_name, 'wb') as ofp:
buf = ifp.read(BUF_SIZE)
while buf:
m.update(buf)
ofp.write(buf)
buf = ifp.read(BUF_SIZE)
with open(md5_name) as fp:
for line in fp:
md5, fn = line.rstrip().split(' ', 1)
if fn == file_name:
assert m.hexdigest() == md5
break
else:
print('no md5 found for ' + file_name)
답변2
dd
확장된 기능을 갖춘 잘 알려진 분기가 있습니다.dcfldd
나는 수년 동안 그것을 사용하고 있거나 dd
다음과 같은 패치 버전을 사용해 왔습니다.dc3dd
다소 비슷한 기능을 가지고 있습니다.
두 도구 모두 복사 프로세스 중에 해싱을 수행할 수 있습니다(원하는 경우 여러 해시 유형을 동시에 사용할 수도 있음). 해시 값은 블록 및/또는 전체 데이터 스트림에서 계산될 수 있습니다.
일부 배포판(예: debian)은 리포지토리에 직접 패키지를 제공하고, Fedora 패키지는 외부에서 사용할 수 있습니다.인증서 저장소예를 들어.
8MiB 청크로 파일을 복사하고 전체 데이터의 MD5sum을 계산하여 STDERR로 인쇄하려면 다음을 수행하세요.
dcfldd if=/path/to/input bs=8M hash=md5 of=/path/to/outputfile
8MiB 청크로 파일을 복사하려면 전체 데이터의 SHA256 해시와 각 64MiB 청크의 SHA256sum을 계산합니다.
dcfldd if=/path/to/input bs=8M hash=SHA256 hashwindow=64M of=/path/to/outputfile
인수를 통해 파일을 지정하여 계산된 해시 값의 출력 파일을 제공할 수도 있습니다 hashlog
. 여러 해시를 계산할 때 별도의 출력을 md5log=FILE1.log sha256log=FILE2.log
다음과 같이 지정할 수 있습니다 .
답변3
확장 되어 체크섬과 함께 제공되는 외부 프로그램( crcsum
) 을 사용할 수 있습니다 .cp
mv