ハードドライブのエラーを修正しようとしています。手動で変更することもできますが、数時間かかることがあります。
このコマンドを入力するとsudo badblocks -b 512 /dev/sda
何百もの結果が表示されるので、手動で修正するのを避けたいと思います。
私のエラーの詳細を見ることができます。ここ
それでは、エラーを修正するために使用できるツールはありますか?それとも私のためにシェルスクリプトを書くことができますか?
答え1
まあ、いくつかの状況があります:
- ディスクはRAIDアレイの一部です。わかりましたmdが次のように配列を「修正」するようにします
echo 'repair' > /sys/block/md0/md/sync_action
。問題は解決され、データは失われませんでした。 (あなたの場合はそうではないようですが、変更することを本当に考慮する必要があります。) - ディスク上のデータ(またはデータ)にはまったく興味がありません。 ddを使用してディスク全体をゼロにします。
- 不良ブロックはディスクで使用可能な領域の一部です。たとえば、空き
cat /dev/zero > tempfile
領域をゼロで埋めます。 rootとしてこれを行います(rootに対してのみスペース予約)。おそらくシングルユーザーモードになるでしょう(したがって、スペース不足による中断はありません)。スペースが足りなくなったら、ファイル(rm tempfile
)を削除してください。 - 不良ブロックは、ディスク上のデータ(ファイル)またはメタデータ(ファイルシステム構造)の一部です。データが失われました。
fsck -fc
(最悪の場合はファイルシステムをマウントせずに実行するか、ルートファイルシステムの場合は初期起動中に読み取り専用モードで実行します)どのファイルが存在するかを知らせます。バックアップから交換してください。
また、badblocks -n
これが必ず行われる必要があるかもしれません。ただに完了しましたインストールされていませんファイルシステムは強制的に再マップされます。データが失われてはいけません(すでに失われた不良ブロックのデータを除く)。
不良ブロックに基づいて出力したい場合(ここでは安全ではない、これは静かな損傷を引き起こす可能性があります)これはかなり簡単です。 badblocks出力の各行は、ブロックサイズ(例では512)に基づいてブロック番号を提供します。 ddに同じブロックサイズを使用してくださいbs
。ブロック番号はあなたのseek
ddです。値count
は1(または複数の不良ブロックが連続している場合はより高い)です。of
不良ブロックを実行しているパーティション(またはディスク)。良いことif
です/dev/zero
。
答え2
e2fsck -c -c
ブロックサイズ保険を使って同じことをするようです。
答え3
シングルユーザーモードに入り、次の操作を行います。fsck -yvf /dev/sda
結局のところ、fsckが必要なようです。
答え4
インターネット上でいくつかのスクリプトソリューションを見たことがあるので、単一のコマンドを使用してこれを実行できるかどうかはわかりません。
以下のスクリプトは不良セクタを探し、不良ブロックの結果をテキストファイルに入れ、テキストファイルサイズがゼロでない場合e2fsck不良セクタが表示されます(したがって、オペレーティングシステムは表示されたセクタを使用しません)。
#!/bin/sh
target=/tmp/bad-blocks.txt
for disc in `fdisk -l | grep '^/' | awk '{ print $1 }'`; do
badblocks -v $disc > $target
if [ -s $target ]; then
echo "badblock(s) found on $disc"
e2fsck -l $target $disc
else
echo "no badblocks on $disc"
fi
done