hdparmの --read-sector オプションでバイナリ入力ファイルを生成する

hdparmの --read-sector オプションでバイナリ入力ファイルを生成する

私は現在、死んでいるハードドライブから非常に大きなファイル(クリック音)を救出しようとしています。読み取り失敗の原因は次のとおりです。不良セクタがほとんどない
検索できるバックアップが古すぎるため、最初の計画はそこからファイルをインポートすることでした。〜でもデータが破損しています。PhotoRecこれは正常に復元され、その作業に理想的であることが証明されています。みんな文書。 (testdiskエラーが検出されたファイルのみが切り捨てられるため、これは途方もない失敗です

  • hdparm --read-sector <device>出力を使用してバイナリデータファイルを作成します。
  • などの16進エディタを使用してくださいOkteta

実際に生の読み取りルーチンhdparm(私はv9.43)(--read-sectorできる間違ったシリンダ内の(複数の)不良セクタからデータを読み取ることは確信していますが、私には実際の情報のみを提供します。ASCIIコード文書。何ができるのか分からないまっすぐ上記の2番目のステップを実行するには、出力をバイナリファイルにインポートします。また、出力ファイルのすべての単語はバイトスワップ(Linuxでは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

結果は、ファイル内の(無効な)ゼロで指定された領域を置き換えるために使用できる実際のバイナリファイルになります(たとえば、「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進コードをバイナリデータに変換します。

おすすめ記事