저는 현재 죽어가는 하드 드라이브에서 매우 큰 파일(클릭 소리)을 구출하려고 합니다. 읽기 실패의 원인은 다음과 같습니다.불량 섹터가 거의 없음.
검색할 수 있는 백업이 너무 오래되었기 때문에 첫 번째 계획은 거기에서 파일을 가져오는 것이었습니다.~ 일지라도데이터가 손상되었습니다.PhotoRec
이는 성공적으로 복원되었으므로 해당 작업에 이상적인 것으로 입증되었습니다.모두문서. ( testdisk
오류가 감지된 파일만 잘라내기 때문에 이것은 엄청난 실패입니다.)
(부분적으로 손상된) 파일을 전체 대상 HDD로 검색한 후 수행할 다음 단계는 다음과 같습니다.
hdparm --read-sector <device>
출력을 사용 하고 이진 데이터 파일을 만듭니다.- 와 같은 16진수 편집기를 사용하세요
Okteta
.
실제로 원시 읽기 루틴 hdparm
(나는v9.43) ( --read-sector
)할 수 있다잘못된 실린더에 있는 (여러) 불량 섹터의 데이터를 읽는 것에 대해 확신하지만 나에게 실제 정보만 제공합니다.ASCII 코드문서. 나는 무엇을 할 수 있는지 모른다곧장위의 두 번째 단계를 수행하려면 출력을 이진 파일로 가져옵니다. 또한 출력 파일의 모든 단어는바이트 스왑(리눅스에서는 x86-32;v9.45에서 수정됨, 보다이 오래된 항목버그 추적기에서).
hdparm
다행스럽게도 v9.43 및 이전 버전에서 ' 옵션 을 사용하여 작동하게 하는 방법이 있습니다. 이 --verbose
옵션을 사용하면 (라인에서 incoming_data
) 읽은 대로 16진수 값을 정확하게 출력할 수 있습니다.옳은바이트 순서!
이것은 5000부터 시작하여 50개 섹터를 읽으면서 지금까지 알아낸 것입니다.
i=0
while [[ $((i++)) -lt 50 ]]; do
sudo hdparm --verbose --read-sector $((5000+i)) /dev/sdb 2>&1 |
grep 'incoming_data' | cut -f2- -d: | sed 's/^ //' |
tee -a ascdata1_nl
done
tr '\n' ' ' < ascdata1_nl > ascdata1
경고: 첫 번째 파일에는 ascdata1_nl
여전히 다음이 포함되어 있습니다.새로운 팀수치. 루프가 완료되면 개행 문자를 공백으로 변환한 후 ascdata1
원하는 값이 포함됩니다 . 이제 .bin 파일을 바이트 단위로 작성합니다.
while read -d ' ' hexbyte; do printf "\x$hexbyte" | tee -a bindata.bin; done < ascdata1
결과는 파일에서 (잘못된) 0으로 지정된 영역을 대체하는 데 사용할 수 있는 실제 바이너리 파일이 됩니다(예: "Okteta" 사용).
짧은 답변:효과가있다그런 식으로.
그런데 그 과정이 좀 너무 복잡한(?) 것 같아요.
"hex" 덤프에서 바이너리를 얻는 더 쉬운 방법이 있습니까 --read-sector
?
- 를 사용하면 /가 잘 작동하므로 의 옵션을 생략할 수 있다고
perl
확신합니다 .--verbose
(단지 바이트로는 할 수 없었습니다.hdparm
pack()
unpack()
오른쪽) dd conv=swab
:나도dd
이 옵션을 시도해 보았지만 안타깝게도 니블만 교체하고a6b8 d6b7
(쓸모 없게) 됩니다6a8b 6d7b
.
답변1
GNU sed가 있다고 가정하면 다음을 시도해 볼 수 있습니다(실제로 테스트되지 않음):
hdparm --read-sector $SECTOR /dev/sdb | \
sed -r -e "0,/succeeded/d" -e 's/(\S\S)(\S\S)/\2\1/g' | \
xxd -r -p >> bindata.bin
이 sed
호출은 해당 줄 앞의 모든 항목을 제거한 succeeded
다음 출력을 바이트 교환합니다. 이 xxd -r -p
호출은 순수 16진수 코드를 이진 데이터로 변환합니다.