현재 상태를 사용하여 GNU ddrescue(1.18.1)를 완료하는 주기/시간을 어떻게 예측할 수 있습니까?

현재 상태를 사용하여 GNU ddrescue(1.18.1)를 완료하는 주기/시간을 어떻게 예측할 수 있습니까?

배경/배경:

현재 USB에서 데이터를 복구하기 위해 GNU ddrescue 1.18.1을 실행하고 있는데 disk2s1 파티션에 가상 디스크 이미지를 쓰는 동안 USB 케이블이 연결 해제되었습니다. 처음에는 두 번째 파티션(disk2s2)을 복원하는 중이었고 세 번째 단계(분할)에 도달했음을 확인했습니다. 네트워크 저장소에 이미지를 배치하고 있습니다.

질문:

나는 이 단계가 주기적이라는 것을 알았습니다. 내 현재 상태 정보(두 개의 오류만 표시됨)를 고려하여 통과할 수 있는 루프 수를 계산할 수 있는 방법이 있습니까?

상태:

상태

업데이트/편집:

그래서 저는 ddrescue 도구를 사용하여 완료된 주기/시간을 추정하는 방법에 여전히 관심이 많습니다. 의견을 바탕으로 현재 실행 중인 disk2s1 파티션에 대한 로그 파일에 대한 평가를 추가합니다(disk2s2는 14.5시간 후에 완료되었으며 약 6시간 동안 한 명의 사용자가 중단되었습니다).

1부 로그

완료된 파티션 로그

방금 완료된 파티션에 대해 로그를 확인한 결과입니다.

사진 일지

참조(ddrescue 알고리즘 참고 사항):

4가지 알고리즘


GNU ddrescue는 dd의 파생물이 아니며 dd와도 관련이 없습니다. 단 둘 다 한 장치에서 다른 장치로 데이터를 복사하는 데 사용할 수 있습니다. 가장 큰 차이점은 ddrescue가 복잡한 알고리즘을 사용하여 고장난 드라이브에서 데이터를 복사하여 추가 손상을 최소화한다는 것입니다.

Ddrescue는 진행 중인 복구 상태를 효율적으로 관리하고 양호한 부품을 먼저 복구하려고 시도한 후 나중에 불량(또는 느린) 영역에서 읽기를 예약합니다. 이렇게 하면 고장난 드라이브에서 궁극적으로 복구할 수 있는 데이터의 양이 최대화됩니다.

표준 dd 유틸리티를 사용하면 고장난 드라이브의 데이터를 저장할 수 있지만 데이터를 순차적으로 읽어서 드라이브 시작 부분에 오류가 있는 경우 아무 것도 저장하지 않고 드라이브를 닳게 할 수 있습니다.

다른 프로그램은 데이터를 순차적으로 읽지만 오류가 발견되면 작은 읽기로 전환합니다. 이는 잘못된 영역에서 더 많은 시간을 소비하고 표면, 헤드 및 드라이브 메커니즘을 최대한 빨리 제거하는 대신 손상시키기 때문에 나쁜 생각입니다. 이 동작은 나머지 양호한 데이터를 복구할 가능성을 줄입니다.

ddrescue의 알고리즘은 다음과 같습니다(사용자는 언제든지 프로세스를 중단할 수 있지만 불량 드라이브는 커널이 포기할 때까지 오랫동안 ddrescue를 차단할 수 있다는 점에 유의하십시오).

1) (선택 사항) 멀티파트 또는 이전에 중단된 구조 상태를 설명하는 로그 파일을 읽습니다. 로그 파일이 지정되지 않거나, 비어 있거나, 존재하지 않는 경우 모든 복구 도메인은 시도되지 않은 것으로 표시됩니다.

2) (1단계; 복사) 입력 파일의 시도되지 않은 부분을 읽고 실패한 블록을 트리밍되지 않은 것으로 표시하고 건너뜁니다. 또한 느린 영역을 건너뜁니다. 건너뛴 영역은 나중에 두 번의 추가 패스(가지치기 전)에서 시도되며, 모든 구조 영역이 시도될 때까지 각 패스 후에 방향을 바꿉니다. 세 번째 패스는 스윕이며 점프를 비활성화합니다. (목적은 큰 오류의 범위를 신속하게 파악하고 로그 파일을 작게 유지하며 정리를 위한 좋은 시작점을 제공하는 것입니다.) 큰 청크의 시도되지 않은 영역만 읽습니다. 트리밍, 분할 및 재시도는 섹터별로 수행됩니다. 각 섹터에 대해 최대 2번의 시도가 이루어집니다. 이 단계의 첫 번째 시도(일반적으로 블록 읽기의 일부로, 때로는 단일 섹터 읽기로)와 다음 단계 중 두 번째는 단일 섹터 읽기로 이루어집니다.

3) (두 번째 단계, 트리밍) 불량 섹터가 발견될 때까지 트리밍되지 않은 가장 작은 블록의 앞쪽 가장자리부터 시작하여 한 번에 한 섹터씩 앞으로 읽습니다. 그런 다음 불량 섹터가 발견될 때까지 동일한 블록의 뒤쪽 가장자리부터 한 섹터 뒤로 읽습니다. 트리밍되지 않은 각 블록에 대해 발견된 불량 섹터를 불량 섹터로 표시하고 나머지 블록을 읽으려고 시도하지 않고 분할되지 않은 것으로 표시합니다. 다듬어지지 않은 블록이 더 이상 없을 때까지 이 작업을 반복합니다. (가지치기되지 않은 큰 블록은 더 작은 블록과 연결되므로 해당 가장자리에는 좋은 데이터의 비율이 더 적습니다.)

4) (3단계; 분할) 불량 섹터가 발견될 때까지 가장 큰 비분할 블록의 중심부터 시작하여 한 번에 한 섹터씩 앞으로 읽습니다. 그런 다음 발견된 불량 섹터가 처음 시도된 것이 아닌 경우 불량 섹터가 발견될 때까지 동일한 블록의 중심부터 한 섹터 뒤로 읽습니다. 로그 파일이 "--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 로그 파일

답변1

이 질문은 10개월 전에 요청되었지만 여러 요인에 따라 복구 주기가 여전히 실행 중일 수 있으므로 답변이 관련성이 있을 수 있습니다. 말장난 의도는 없습니다.

그 이유는 시간 추정이 거의 불가능하지만 때로는 다음과 같이 대략적인 아이디어를 얻을 수 있기 때문입니다. 가장 확실한 이유 중 하나는 드라이브가 불량 섹터를 읽는 데 얼마나 오랜 시간이 걸릴지 예측할 수 없고 ddrescue가 각 섹터를 읽고 다시 시도할 것으로 예상하는 경우 시간이 오래 걸릴 수 있다는 것입니다. 예를 들어, 저는 현재 작은 500GB 드라이브에 대한 복구를 2주 넘게 진행 중이며 아마도 며칠 남았을 것입니다. 하지만 내 상황은 드라이브가 암호화되어 있고 무엇이든 성공적으로 읽으려면 파티션 테이블, 부팅 섹터 및 디스크의 기타 중요한 부분이 있는 모든 섹터를 가져와야 하기 때문에 상황이 더 복잡합니다. ddrescue 외에도 모든 불량 섹터가 나타날 가능성을 높이기 위해 다른 기술도 사용합니다. IOW, 귀하의 고유한 상황은 완료 시간을 결정하는 데 중요합니다.

"루프"를 추정하여 재시도 횟수를 의미하는 경우 이는 사용하는 매개변수에 따라 결정됩니다. "총 패스 수"를 의미하는 경우 여기에서 알고리즘을 읽으면 쉽게 확인할 수 있습니다. >man ddrescue</ 알고리즘: ddrescue가 데이터를 복구하는 방법

제공하신 스크린샷의 숫자에 대해 구체적으로 논의하겠습니다. 다른 상황에는 다른 요인이 적용될 수 있으므로 이 정보를 일반적인 지침으로 사용하십시오.

제공한 예에서 ddrescue의 실행 상태 화면을 확인하세요. 우리는 "errsize"를 통해 문제(구조 도메인)의 전체 "추정"을 얻습니다. 이는 "아직 읽혀지지 않은" 데이터의 양입니다. 예시에서는 345GB입니다. 오른쪽 하단 행은 "평균 이자율"입니다. 예시에서는 583kb/s

"평균 비율"이 안정적으로 유지된다면 이는 7일 남았다는 의미입니다. 345GB / (583kb * 60*60*24) = 7.18 하지만 문제는 583kb/s에 의존할 수 없다는 점입니다. 실제로 드라이브는 점점 더 어려운 영역을 읽고 더 많은 재시도를 하기 때문에 복구가 진행됨에 따라 속도가 느려집니다. 그래서 완료 시간이 기하급수적으로 늘어납니다. 이 모든 것은 드라이브 손상의 심각도에 따라 다릅니다.

제공하신 예에서는 "읽기 성공"이 10시간 이상 지났음을 보여줍니다. 즉, 실제로 10시간 넘게 드라이브에서 어떤 정보도 얻지 못했습니다. 이는 드라이브에 345GB의 데이터(또는 그 일부)가 있을 수 있음을 나타냅니다. 이것은 당신에게 매우 나쁜 소식입니다.

이에 비해 두 번째 500GB 드라이브에서는 디스크에 복사되는 동안 "SMART" 오류가 발생하기 시작했으며(로그 파일은 다른 드라이브에 있음) 전체 작업에 약 8~9시간이 걸렸습니다. 마지막 부분이 느려졌습니다. 하지만 아직은 견딜만해요. 위에서 언급했듯이 매우 불량한 드라이브는 2주 동안 500GB에서 실행되었으며 여전히 복구할 수 있는 부분이 4~5% 정도 남아 있습니다.

HTH 및 YMMV

관련 정보