web-dev-qa-db-ja.com

hdparmを使用して保留中のセクターを修正する方法は?

SMARTは、サーバーのHDDの保留中のセクターを1つ示しています。 hdparmを使用してディスクを「簡単に」不良セクターに強制的に再配置することを推奨する多くの記事を読みましたが、それを使用する正しい方法を見つけることができません。

私の "smartctl"からの情報:

Error 95 occurred at disk power-on lifetime: 20184 hours (841 days + 0 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 d7 55 dd 02  Error: UNC at LBA = 0x02dd55d7 = 48059863

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  c8 00 08 d6 55 dd e2 00  18d+05:13:42.421  READ DMA
  27 00 00 00 00 00 e0 00  18d+05:13:42.392  READ NATIVE MAX ADDRESS EXT
  ec 00 00 00 00 00 a0 02  18d+05:13:42.378  IDENTIFY DEVICE
  ef 03 46 00 00 00 a0 02  18d+05:13:42.355  SET FEATURES [Set transfer mode]
  27 00 00 00 00 00 e0 00  18d+05:13:42.327  READ NATIVE MAX ADDRESS EXT

 SMART Self-test log structure revision number 1
 Num  Test_Description    Status                  Remaining  LifeTime(hours)        LBA_of_first_error
 # 1  Extended offline    Completed: read failure       90%     20194         48059863
 # 2  Short offline       Completed without error       00%     15161         -

その「悪いLBA」(4805986)を手にして、hdparmをどのように使用しますか?パラメータ「--read-sector」および「--write-sector」に必要なアドレスのタイプは何ですか?

コマンドhdparm --read-sector 48095863/dev/sdaを発行すると、データの読み取りとダンプが行われます。このコマンドが正しかった場合、I/Oエラーが発生するはずです。

代わりに、データをダンプします。

$ ./hdparm --read-sector 48059863 /dev/sda

/dev/sda:
reading sector 48059863: succeeded
4b50 5d1b 7563 a932 618d 1f81 4514 2343
8a16 3342 5e36 2591 3b4e 762a 4dd7 037f
6a32 6996 816f 573f eee1 bc24 eed4 206e
(...)
7
Nino

何らかの理由でこれらの不良セクターをクリアしようとする場合で、ドライブの既存の内容を気にしない場合は、以下のシェルスニペットが役立つ場合があります。とにかく保証期間を過ぎた古いSeagate Barracudaドライブでこれをテストしました。他のドライブモデルや製造元では正しく機能しない可能性がありますが、スクリプトを作成する必要がある場合は正しいパスに移動するはずです。それはドライブにあるコンテンツを破壊します

Badblocks、hdparm Secure Erase(SE)( https://wiki.archlinux.org/index.php/Securely_wipe_disk )、または実際にこのために設計されたその他のツールを実行することをお勧めします。またはメーカーが提供するSeaToolsなどのツール(32ビットLinuxの「エンタープライズ」バージョンがあり、それをググる)。

これを行う前に、問題のドライブが完全に未使用/マウント解除されていることを確認してください。また、ループ中は言い訳はありません。それはハックです、あなたはそれをより良くすることができます...

baddrive=/dev/sdb
badsect=1
while true; do
  echo Testing from LBA $badsect
  smartctl -t select,${badsect}-max ${baddrive} 2>&1 >> /dev/null

  echo "Waiting for test to stop (each dot is 5 sec)"
  while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print substr($4,1,9)}')" != "Completed" ]; do
    echo -n .
    sleep 5
  done
  echo

  badsect=$(smartctl -l selective ${baddrive} | awk '/# 1  Selective offline   Completed: read failure/ {print $10}')
  [ $badsect = "-" ] && exit 0

  echo Attempting to fix sector $badsect on $baddrive
  hdparm --repair-sector ${badsect} --yes-i-know-what-i-am-doing $baddrive
  echo Continuning test
done

「セルフテスト」方式を使用する利点の1つは、ロードがドライブファームウェアによって処理されるため、接続先のPCがddまたはbadblockの場合のようにロードされないことです。

注:すみません、間違えました、正しいwhile条件は次のとおりです:

while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print $4}')" = "Self_test_in_progess" ]; do

そして、スクリプトの終了条件は次のようになります。

[ $badsect = "-" ] || [ "$badsect" = "" ] && exit 0
7
Glenn

そのセクターは不良ではないため、エラーなしで読み取られた可能性がありますが、他の動作が原因で他のツールがセクターの読み取りに失敗します。 (実際には読めないセクターに到達する先読み?)

私はいくつかの不良セクターを見つけました。 "hdparm --read-sector"で読み取れない唯一のセクターを修復すると、他の「不良」セクターはddなどで突然読み取れなくなります。そして興味深いことに、「dmesg」出力を見ると、hdparmで読み取れないものだけが報告されます。

例えば。 36589320から36589327、および36589344から36589351のセクターはddで読み取れませんでしたが、hdparm --read-sectorで読み取れないのは36589326と36589345だけでした。次に、それらの2でhdparm --write-sectorを使用したところ、16セクターすべてが再び読み取り可能になりました。

Dmesgの出力の一部を次に示します。

[30152036.527940] end_request: I/O error, dev sda, sector 36589326
[30152077.363710] end_request: I/O error, dev sda, sector 36589345

そしてディスク情報:

# smartctl -i /dev/sda
...
=== START OF INFORMATION SECTION ===
Device Model:     Toshiba MK2002TSKB
...
Firmware Version: MT2A
User Capacity:    2,000,398,934,016 bytes [2.00 TB]
Sector Size:      512 bytes logical/physical
...

そして、どうやらこのディスクのファームウェアは、再割り当てされたセクターを適切に記録しないか、実際には再割り当てされなかったが、破損しているだけです(回復不能なECCエラーのように、表面はまだ機能しています。電子回路の欠陥ではなくビットの腐敗が原因であるなど、悪いメディア):

# smartctl -A /dev/sda | egrep "Reallocated|Pending|Uncorrectable"
  5 Reallocated_Sector_Ct   0x0033   100   100   050    Pre-fail  Always       -       0
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0

# smartctl -l error /dev/sda
...
SMART Error Log Version: 1
No Errors Logged

注意してください、私は--read-sectorと--write-sectorを実行しました。書き込みだけでなく、セクターを適切に再割り当てするには、読み取りが必要になる場合があります。あなたが最初に読まなければ、それはセクターが悪いことを知らないかもしれません。

4
Peter