배경 / 컨텍스트 :
현재 가상 디스크 이미지를 disk2s1 파티션에 쓰는 동안 케이블 연결이 끊어진 USB에서 데이터를 복구하기 위해 GNU ddrescue 1.18.1을 실행하고 있습니다. 처음에 두 번째 파티션 (disk2s2)을 복구하고 있으며 세 번째 단계 (Splitting)에 도달했습니다. 이미지를 네트워크 저장소에 배치하고 있습니다.
질문:
이 단계가 반복되는 것을 알았습니다. 현재 상태 정보를 고려할 때 발생할 수있는 루프 수를 계산하는 방법이 있습니까 (두 개의 오류 만 표시됨)?
상태:
업데이트 / 편집 :
그래서 ddrescue 도구를 사용하여 완료를위한 루프 / 시간을 어떻게 평가할 수 있는지에 여전히 관심이 많습니다. 의견에 따라 현재 실행중인 disk2s1 파티션의 로그 파일 평가를 추가하고 있습니다 (disk2s2는 14.5 시간 후에 완료되었으며 약 6 시간 동안 한 번의 사용자 중단이 발생했습니다).
완료된 파티션 로그
방금 완료 한 파티션의 경우 로그 검사 결과입니다.
참조 (ddrescue 알고리즘 노트) :
4 알고리즘
GNU ddrescue는 dd의 파생물이 아니며 한 장치에서 다른 장치로 데이터를 복사하는 데 사용할 수 있다는 점을 제외하고는 어떤 식 으로든 dd와 관련이 없습니다. 가장 큰 차이점은 ddrescue는 정교한 알고리즘을 사용하여 고장난 드라이브에서 데이터를 복사하여 가능한 한 적은 추가 손상을 입히는 것입니다.
Ddrescue는 진행중인 구조의 상태를 효율적으로 관리하고 좋은 부품을 먼저 구출하여 나중에 불량 (또는 느린) 영역 내에서 읽기 예약을 시도합니다. 이는 고장난 드라이브에서 최종적으로 복구 될 수있는 데이터의 양을 최대화합니다.
표준 dd 유틸리티는 고장난 드라이브에서 데이터를 저장하는 데 사용할 수 있지만, 데이터가 순차적으로 읽히므로 오류가 드라이브 시작 부분에있는 경우 아무 것도 구하지 않고 드라이브가 마모 될 수 있습니다.
다른 프로그램은 데이터를 순차적으로 읽지 만 오류를 발견하면 작은 크기의 읽기로 전환합니다. 이것은 오류 영역에서 더 많은 시간을 보내고 표면, 헤드 및 드라이브 메커니즘을 가능한 한 빨리 벗어나지 않고 손상시키는 것을 의미하기 때문에 나쁜 생각입니다. 이 동작은 남아있는 양호한 데이터를 구할 가능성을 줄입니다.
ddrescue의 알고리즘은 다음과 같습니다 (사용자는 언제든지 프로세스를 중단 할 수 있지만 불량 드라이브는 커널이 포기할 때까지 ddrescue를 오랫동안 차단할 수 있음에 유의하십시오).
1) 선택적으로 다중 부품 또는 이전에 중단 된 구조의 상태를 설명하는 로그 파일을 읽습니다. 로그 파일이 지정되지 않았거나 비어 있거나 존재하지 않으면 모든 복구 도메인을 시도하지 않은 것으로 표시하십시오.
2) (첫 번째 단계; 복사) 입력 파일의 시도되지 않은 부분을 읽고 실패한 블록을 트림되지 않은 것으로 표시하고 넘어갑니다. 느린 지역을 넘어서도 건너 뛰십시오. 건너 뛴 영역은 나중에 두 번의 추가 패스 (트리밍 전)에서 시도되어 모든 복구 도메인이 시도 될 때까지 각 패스 후 방향을 되돌립니다. 세 번째 패스는 건너 뛰기가 비활성화 된 스위핑 패스입니다. (목적은 큰 오류를 빠르게 구분하고 로그 파일을 작게 유지하며 트리밍을위한 좋은 시작점을 생성하는 것입니다). 시도하지 않은 영역 만 큰 블록에서 읽습니다. 트리밍, 분할 및 재 시도는 섹터별로 수행됩니다. 각 섹터는 최대 두 번 시도됩니다. 이 단계의 첫 번째 (보통 큰 블록 읽기의 일부이지만 때로는 단일 섹터 읽기의 경우), 두 번째 단계는 단일 섹터 읽기의 두 번째 단계입니다.
3) (두 번째 단계; 트리밍) 가장 작은 트리밍되지 않은 블록의 선단에서 불량 섹터가 발견 될 때까지 한 번에 하나의 섹터를 읽습니다. 그런 다음 불량 섹터가 발견 될 때까지 동일한 블록의 끝에서 한 번에 한 섹터 씩 뒤로 읽습니다. 트리밍되지 않은 각 블록에 대해 불량 섹터로 표시된 불량 섹터를 표시하고 해당 블록의 나머지 부분을 읽으려고하지 않고 비 분할로 표시합니다. 트리밍되지 않은 블록이 더 이상 없을 때까지 반복하십시오. (대량의 트리밍되지 않은 블록은 작은 블록을 연결하여 생성되므로 가장자리에서 좋은 데이터의 비율이 더 작습니다).
4) (Third phase; Splitting) 불량 섹터가 발견 될 때까지 가장 큰 비분 할 블록의 중심에서 한 번에 한 섹터 씩 전달합니다. 그런 다음 발견 된 불량 섹터가 처음 시도 된 것이 아닌 경우 불량 블록이 발견 될 때까지 동일한 블록의 중심에서 한 번에 한 섹터 씩 뒤로 읽습니다. 로그 파일이 '--logfile-size'보다 큰 경우 로그 파일의 항목 수가 '--logfile-size'아래로 떨어질 때까지 가장 큰 비분 할 블록을 순차적으로 읽으십시오. 남아있는 모든 비분 할 블록이 7 개 미만의 섹터를 가질 때까지 반복하십시오. 그런 다음 나머지 비분 할 블록을 순차적으로 읽습니다.
5) (4 단계; 재시도) 선택적으로 지정된 재시도 횟수에 도달 할 때까지 불량 섹터를 다시 읽으십시오. 모든 불량 섹터는 각 패스에서 한 번만 시도됩니다. Ddrescue는 불량 섹터를 복구 할 수 없는지 또는 일부 재시도 후에 결국 읽을 것인지 알 수 없습니다.
6) 선택적으로 나중에 사용하기 위해 로그 파일을 작성하십시오.
총 오류 크기 ( 'errsize')는 트리밍되지 않은, 분할되지 않은 섹터 및 불량 섹터 블록의 크기 합계입니다. 복사 단계에서 증가하며 트리밍, 분할 및 재시도 중에 감소 할 수 있습니다. ddrescue가 실패한 블록을 분할하여 더 작게 만들면 전체 오류 크기는 줄어들고 오류 수는 증가 할 수 있습니다.
로그 파일은 ddrescue가 완료되거나 중단 될 때뿐만 아니라 디스크에 주기적으로 저장됩니다. 따라서 충돌이 발생하면 약간의 복사만으로 구조를 다시 시작할 수 있습니다. 저장 간격은 로그 파일 크기에 따라 30 초에서 5 분까지 다양합니다 (큰 로그 파일은 더 긴 간격으로 저장 됨).
또한 동일한 로그 파일을 사용하여 입력 파일의 다른 영역을 복사하는 여러 명령과 다른 하위 집합에 대한 여러 복구 시도를 수행 할 수 있습니다. 이 예제를보십시오 :
디스크의 가장 중요한 부분을 먼저 구하십시오. ddrescue -i0 -s50MiB / dev / hdc hdimage 로그 파일 ddrescue -i0 -s1MiB -d -r3 / dev / hdc hdimage 로그 파일
그런 다음 주요 디스크 영역을 구출하십시오. ddrescue -i30GiB -s10GiB / dev / hdc hdimage 로그 파일 ddrescue -i230GiB -s5GiB / dev / hdc hdimage 로그 파일
이제 나머지를 구하십시오 (이미 수행 된 내용을 다시 복사하지 않음). ddrescue / dev / hdc hdimage 로그 파일 ddrescue -d -r3 / dev / hdc hdimage 로그 파일
ddrescuelog -t YourLog.txt
다른 터미널에서 시도해 볼 수 있습니까?
ddrescue
물리적 문제 만 복구하려고 시도 할 수 있으며 논리적 오류는 전혀 도움이되지 않습니다. 후자를 위해, fsck
또는 비슷하게 시도하십시오 .
ddrescue
디스크에 불량 블록이있는 경우에만 필요 합니다. 이는 "케이블 연결 해제"로 인한 것이 아닙니다. 케이블에 문제가있는 경우 다른 케이블을 사용해보십시오.