hdparm의 --read-sector 옵션에서 이진 입력 파일 생성

hdparm의 --read-sector 옵션에서 이진 입력 파일 생성

저는 현재 죽어가는 하드 드라이브에서 매우 큰 파일(클릭 소리)을 구출하려고 합니다. 읽기 실패의 원인은 다음과 같습니다.불량 섹터가 거의 없음.
검색할 수 있는 백업이 너무 오래되었기 때문에 첫 번째 계획은 거기에서 파일을 가져오는 것이었습니다.~ 일지라도데이터가 손상되었습니다.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(단지 바이트로는 할 수 없었습니다.hdparmpack()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진수 코드를 이진 데이터로 변환합니다.

관련 정보