web-dev-qa-db-ja.com

1つのコマンドでハードディスク上の不良ブロックを修正できますか?

ハードディスクのエラーの修正に取り組んでいます。手動で修正することは可能ですが、数時間かかる場合があります。

このコマンドを入力した後Sudo badblocks -b 512 /dev/sda、何百もの結果が得られました。手動で修正することは避けたいです。

私のエラーの詳細は here で見つけることができます

エラーを修正するために使用できるツールはありますか?または、シェルスクリプトの記述を手伝っていただけませんか。

7
Aziz Al-ghannam

まあ、いくつかのケースがあります:

  1. このディスクはRAIDアレイの一部です。良い。次のようにmdで配列を「修復」してください:echo 'repair' > /sys/block/md0/md/sync_action。データを失うことなく問題を解決しました。 (これはあなたには当てはまらないと思いますが、実際にそれを変更することを検討する必要があります。)
  2. ディスク上のデータを気にする必要はありません(または何もありません)。ディスク全体をゼロにするには、ddを使用するだけです。
  3. 不良ブロックは、ディスクの空き領域の一部です。たとえば、cat /dev/zero > tempfileを使用して、空き領域をゼロで埋めます。これをrootとして実行します(root専用にスペースが予約されています)。おそらくシングルユーザーモードで実行してください(スペース不足による障害はありません)。スペースが足りなくなったら、ファイル(rm tempfile)を削除します。
  4. 不良ブロックは、ディスク上のデータ(ファイル)またはメタデータ(ファイルシステム構造)の一部です。データが失われました。 fsck -fc(ファイルシステムをマウント解除して実行、またはルートファイルシステムの場合、初期ブート中に読み取り専用で最悪の場合)により、どのファイルかがわかります。バックアップから交換してください。

アンマウントファイルシステムでonlyを実行する必要があるbadblocks -nによって、再マップが強制される可能性もあります。データは失われません(すでに失われている不良ブロックにあったもの以外)。

Badblocksの出力(これはは安全ではないであり、サイレント破損が発生します)に基づいてスクリプトを作成する場合は、かなり簡単です。 badblocks出力の各行には、ブロックサイズ(例では512)に基づいてブロック番号が表示されます。 ddのbsには同じブロックサイズを使用します。ブロック番号はddのseekです。 countは1(行にい​​くつかの不良ブロックがある場合はそれ以上)です。 ofは、badblockを実行したパーティション(またはディスク)です。良いif/dev/zeroです。

10
derobert

e2fsck -c -cはブロックサイズ保険で同じことをしているようです。

1
kmchen

シングルユーザーモードに入り、fsck -yvf /dev/sda

まるでfsckが必要なようです。

0
Nikhil Mulley

インターネットでスクリプトソリューションを見たことがあるため、1つのコマンドでこれを実行できるかどうかはわかりません。

以下のスクリプトは、不良セクターを検出し、不良ブロックの結果をテキストファイルに入れます。次に、テキストファイルのサイズがゼロと異なる場合、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
0
Junior M