私は現在、死んでいるハードドライブから非常に大きなファイル(クリック音)を救出しようとしています。読み取り失敗の原因は次のとおりです。不良セクタがほとんどない。
検索できるバックアップが古すぎるため、最初の計画はそこからファイルをインポートすることでした。〜でもデータが破損しています。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
(単なるバイトではできませんでした。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進コードをバイナリデータに変換します。