
파일이 로컬 파티션에서 NFS 파티션으로 전송되는 동안 Linux 배포판에서 md5sum 또는 sha1 검사를 수행하는 방법이 있습니까?
예:
NFS 마운트 드라이브가 있고 로컬 드라이브에 매우 큰 파일이 있습니다. 해당 파일을 NFS 마운트 드라이브로 전송하는 동시에 md5 검사를 수행하고 싶습니다. 파일을 원격 드라이브에 복사한 후 md5를 수행하는 스크립트를 많이 찾았지만 100GB 이상의 매우 큰 파일이므로 파일이 이미 복사되고 있다는 사실을 활용할 수 있는 방법이 있는지 알고 싶습니다. 전송 중에는 빨간색입니다.
답변1
나는 이 작업을 수행할 수 있는 표준 Linux 유틸리티를 알지 못합니다. 파일이 메모리 기반 캐시에 적합하다면 먼저 md5sum을 수행한 다음 복사하는 것이 그렇게 비효율적이지는 않습니다(복사본은 메모리에서 데이터를 가져옵니다).
다음 조합을 사용할 수 있습니다.
cat filename | tee remote_output_name | md5sum
md5sum
저장된 md5와 비교 하여 인쇄된 합계를 직접 확인하도록 수정할 수도 있습니다 . 디스크에서 파일을 한 번만 읽습니다.
당신 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
다소 비슷한 기능을 가지고 있습니다.
두 도구 모두 복사 중에 해싱을 수행할 수 있습니다(원하는 경우 여러 해시 유형을 동시에 사용해도 가능). 해시는 청크 및/또는 전체 데이터 스트림에 대해 계산될 수 있습니다.
데비안과 같은 일부 배포판은 저장소에 패키지를 직접 제공하고, 페도라용 패키지는 외부를 통해 사용할 수 있습니다.인증서 저장소예를 들어.
8MiB 청크로 파일을 복사하고 STDERR에 인쇄되는 전체 데이터의 MD5sum을 계산하려면 다음을 수행하세요.
dcfldd if=/path/to/input bs=8M hash=md5 of=/path/to/outputfile
전체 데이터의 SHA256 해시와 각 64MiB 블록에 대한 SHA256sum을 계산하여 8MiB 단위로 파일을 복사하려면 다음을 수행하세요.
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