数年前にラズパイに搭載していたハードディスクがありました。ラズパイ発売当初の頃、今となってはかなり昔の話になります。ラズパイの使い方は今も変わらないと思いますが、SD あるいは micro SD にシステムを入れて立ち上げ利用します。
その当時、たまたま手持ちの SD 類が低品質だったのか、ラズパイとの相性の問題なのかは今でも納得できないでいますが、使い始めてこれからと思う所まで作業を進めた頃に必ずシステムが飛んでしまい、操作や定義した内容が成果として残らないことが多々ありました。
そのようなこともあり、ラズパイの初期利用の頃からOSの raspbian を最初のboot パーティションを除きハードディスクのパーティションに移して運用していました。それ以降はずっと安定してラズパイを利用していたのですが、ある時1台のラズパイが不安定になり、原因がラズパイのハード本体か、ハードディスクか、SD のブートなのかと疑い、多分ハードディスクだろうとの結論になりました。
当時ハードディスクの確認方法に、どのようなものがあるのか、調べたものの時間もなく『不良』と張り紙して捨てずに残しておきました。
そのハードディスクを見付けて、そう言えば保留で放置していたなと思い出して、調べてみることにしました。
$ sudo fdisk /dev/sdb
fdisk (util-linux 2.31.1) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。
コマンド (m でヘルプ): p
ディスク /dev/sdb: 931.5 GiB, 1000204886016 バイト, 1953525168 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 33553920 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xab9fb81c
デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
/dev/sdb1 2048 2099199 2097152 1G b W95 FAT32
/dev/sdb2 2099200 44042239 41943040 20G 83 Linux
/dev/sdb3 44042240 48236543 4194304 2G 82 Linux スワップ / Solaris
/dev/sdb4 48236544 1953525167 1905288624 908.5G 5 拡張領域
/dev/sdb5 48238592 635441151 587202560 280G 83 Linux
/dev/sdb6 635443200 1222645759 587202560 280G 83 Linux
/dev/sdb7 1222647808 1953525167 730877360 348.5G 83 Linux
コマンド (m でヘルプ): q
$ sudo blkid
--
途中省略
--
/dev/sdb1: UUID="7C91-A3DA" TYPE="vfat" PARTUUID="ab9fb81c-01"
/dev/sdb2: UUID="83670319-849c-459b-84aa-fe7f3f776145" TYPE="ext4" PARTUUID="ab9fb81c-02"
/dev/sdb3: UUID="c3a4d72a-7866-4ffe-a864-5a3f24fb889f" TYPE="swap" PARTUUID="ab9fb81c-03"
/dev/sdb5: LABEL="home" UUID="35786e95-ea9a-4975-aa39-c10ba1d47e3f" TYPE="ext4" PARTUUID="ab9fb81c-05"
/dev/sdb6: LABEL="data" UUID="217555fc-a5d3-4cd8-9702-06f1b5c77f6d" TYPE="ext4" PARTUUID="ab9fb81c-06"
/dev/sdb7: LABEL="bkup" UUID="8aec4e2f-e576-4b73-9aa1-38b905c68dc1" TYPE="ext4" PARTUUID="ab9fb81c-07"
$ sudo fsck /dev/sdb1
fsck from util-linux 2.31.1
fsck.fat 4.1 (2017-01-24)
/dev/sdb1: 0 files, 1/261629 clusters
$ sudo fsck /dev/sdb2
fsck from util-linux 2.31.1
e2fsck 1.44.1 (24-Mar-2018)
/dev/sdb2: clean, 15/1310720 files, 285254/5242880 blocks
$ sudo fsck /dev/sdb5
fsck from util-linux 2.31.1
e2fsck 1.44.1 (24-Mar-2018)
home: clean, 953/18350080 files, 1202987/73400320 blocks
$ sudo fsck /dev/sdb6
fsck from util-linux 2.31.1
e2fsck 1.44.1 (24-Mar-2018)
data: clean, 703/18350080 files, 1345817/73400320 blocks
$ sudo fsck /dev/sdb7
fsck from util-linux 2.31.1
e2fsck 1.44.1 (24-Mar-2018)
bkup: clean, 11/22847488 files, 1483745/91359670 blocks
前述のように、一般的なパラメータ無しで fsck コマンドを実行しても何のエラーも表示されません。しかし、システムを稼働させるとシステムダウンを起こすほどの不安定な動きをします。
昔は、色々な物が手作りのようで、低レベルフォーマットの話も聞いたことがありますが、時代は変わり、現在は一般利用者が利用できるレベルでもないようです。調べるとディスクドライブ全域にスペースを書き込む方法については見つかりました。
昔の記事の中には、使えるものがメーカーで異なっていたとか、ガードが掛からずスーパーブロックまで消去されてしまい大問題になったらしいた記事等もありました。
なお、Linux システムで、 /dev/sdb ドライブに ‘0’ を充填するコマンドは次のコマンドです。
# dd if=/dev/zero of=/dev/sdb bs=1M
ディスクの修復等をキーワードで検索すると、『Linuxでディスクのエラーや不良セクタのチェックと修正をする方法』を見付けました。
その記事では、 fdisk えふでぃすく | hdparm えいちでぃーぱーむ | badblocks ばっどぶろっくす | e2fsck いーつーえふえすしーけー | fsck えふえすしーけー について記述されていました。
私が使ったことのない初めて知るようなコマンドも説明してくれています。 hdparm は昔何かの講習会で聞いたような気もしますが、すでに記憶からは飛んでいました。
ハードディスクの情報を取得
その中で、ハードディスクのモデルを表示するコマンドを見付けましたが、試してみると残念ながら再現しませんでした。コマンドが変わったのか、ディスクの情報の持たせ方が変わったのか、詳細は分かりませんが時代の変化なのかもしれません。
$ sudo hdparm -i /dev/sdb1 |fgrep Model
Model=Hitachi HDS5C3020ALA632, FwRev=ML6OA5C0, SerialNo=ZZZZZZZZZZZZZZ
前述が説明のサンプルですが、実際の結果が次になります。
$ sudo hdparm -i /dev/sdb |fgrep Model
HDIO_GET_IDENTITY failed: Invalid argument
hdparm のオプションを -I に変えて実行すると、色々な情報が表示されるので、何かが変わったのでしょうね。
$ sudo hdparm -I /dev/sdb
/dev/sdb:
ATA device, with non-removable media
Model Number: ST1000LM024 HN-M101MBB
Serial Number: S30EJ9GF304434
Firmware Revision: 2BA30001
Transport: Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0
Standards:
Used: unknown (minor revision code 0x0028)
Supported: 8 7 6 5
Likely used: 8
Configuration:
Logical max current
cylinders 16383 16383
heads 16 16
sectors/track 63 63
--
CHS current addressable sectors: 16514064
LBA user addressable sectors: 268435455
LBA48 user addressable sectors: 1953525168
Logical Sector size: 512 bytes
Physical Sector size: 4096 bytes
Logical Sector-0 offset: 0 bytes
device size with M = 1024*1024: 953869 MBytes
device size with M = 1000*1000: 1000204 MBytes (1000 GB)
cache/buffer size = 16384 KBytes
Form Factor: 2.5 inch
Nominal Media Rotation Rate: 5400
Capabilities:
LBA, IORDY(can be disabled)
Queue depth: 32
Standby timer values: spec'd by Standard, no device specific minimum
R/W multiple sector transfer: Max = 16 Current = ?
Advanced power management level: disabled
Recommended acoustic management value: 254, current value: 0
DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
Cycle time: min=120ns recommended=120ns
PIO: pio0 pio1 pio2 pio3 pio4
Cycle time: no flow control=120ns IORDY flow control=120ns
Commands/features:
Enabled Supported:
* SMART feature set
Security Mode feature set
* Power Management feature set
* Write cache
* Look-ahead
* Host Protected Area feature set
* WRITE_BUFFER command
* READ_BUFFER command
* NOP cmd
* DOWNLOAD_MICROCODE
Advanced Power Management feature set
Power-Up In Standby feature set
* SET_FEATURES required to spinup after power up
SET_MAX security extension
Automatic Acoustic Management feature set
* 48-bit Address feature set
* Device Configuration Overlay feature set
* Mandatory FLUSH_CACHE
* FLUSH_CACHE_EXT
* SMART error logging
* SMART self-test
* General Purpose Logging feature set
* 64-bit World wide name
* IDLE_IMMEDIATE with UNLOAD
* WRITE_UNCORRECTABLE_EXT command
* {READ,WRITE}_DMA_EXT_GPL commands
* Segmented DOWNLOAD_MICROCODE
* Gen1 signaling speed (1.5Gb/s)
* Gen2 signaling speed (3.0Gb/s)
* Gen3 signaling speed (6.0Gb/s)
* Native Command Queueing (NCQ)
* Phy event counters
* Idle-Unload when NCQ is active
* NCQ priority information
DMA Setup Auto-Activate optimization
Device-initiated interface power management
* Software settings preservation
* SMART Command Transport (SCT) feature set
* SCT Read/Write Long (AC1), obsolete
* SCT Write Same (AC2)
* SCT Error Recovery Control (AC3)
* SCT Features Control (AC4)
* SCT Data Tables (AC5)
Security:
Master password revision code = 65534
supported
not enabled
not locked
not frozen
not expired: security count
supported: enhanced erase
194min for SECURITY ERASE UNIT. 194min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 50004cf20ca73d80
NAA : 5
IEEE OUI : 0004cf
Unique ID : 20ca73d80
Checksum: correct
説明されていた hdparm のパラメータを変更した結果が次です。
$ sudo hdparm -I /dev/sdb |fgrep Model
Model Number: ST1000LM024 HN-M101MBB
不良セクタを調べる方法も説明されていて、せっかくなのでそれを試してみました。不良箇所が多くて時間がかかったのか、1TB 2.5インチディスクの実行に丸1日以上かかりました。212箇所の不良ブロックでした。
$ sudo badblocks -v -s /dev/sdb | tee /tmp/badblocks.txt
Checking blocks 0 to 976762583
Checking for bad blocks (read-only test): 6154392 done, 6:03 elapsed. (0/0/0 errors)
6154393 done, 6:37 elapsed. (1/0/0 errors)
6154394 done, 7:12 elapsed. (2/0/0 errors)
6154395 done, 7:45 elapsed. (3/0/0 errors)
6250116 done, 8:59 elapsed. (4/0/0 errors)
6250117 done, 9:34 elapsed. (5/0/0 errors)
6250118 done, 10:08 elapsed. (6/0/0 errors)
--
途中省略
--
329269885one, 6:23:07 elapsed. (205/0/0 errors)
329269886one, 6:23:42 elapsed. (206/0/0 errors)
329269887one, 6:24:17 elapsed. (207/0/0 errors)
329370036one, 6:25:04 elapsed. (208/0/0 errors)
329370037one, 6:25:38 elapsed. (209/0/0 errors)
329370038one, 6:26:12 elapsed. (210/0/0 errors)
329370039one, 6:26:46 elapsed. (211/0/0 errors)
done
Pass completed, 212 bad blocks found. (212/0/0 errors)
前述の方法で収集した情報を利用して、不良セクタをマークするとのこと試してみます。ただ良く理解できていないのは、説明されている例では、パーティションを対象に操作しています。
でもディスクドライブに対して不良セクタを除く必要があるようにも思うのですが…、それとスーパーブロックと呼ばれる領域は、各ファイルの中に作られるものでしょうか。
だとするとディスクドライブ全体に操作すること自体が間違いなのかとも思います。知識不足から釈然としませんが、その出力から次の結果となりました。
$ sudo e2fsck -l /tmp/badblocks.txt /dev/sdb
e2fsck 1.44.1 (24-Mar-2018)
ext2fs_open2: Bad magic number in super-block
e2fsck: Superblock invalid, trying backup blocks...
e2fsck: Bad magic number in super-block while trying to open /dev/sdb
The superblock could not be read or does not describe a valid ext2/ext3/ext4
ファイルシステム. If the device is valid and it really contains an ext2/ext3/ext4
ファイルシステム (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193
or
e2fsck -b 32768
Found a dos partition table in /dev/sdb
ディスクドライブに対しての操作ですが、そもそも e2fsck 自体が、ext2 ext3 等のファイルに対するチェックや修復のコマンドなので、私の操作そのものが誤りなのでしょうね。
$ sudo e2fsck -b 32768 /dev/sdb
e2fsck 1.44.1 (24-Mar-2018)
e2fsck: Bad magic number in super-block while trying to open /dev/sdb
The superblock could not be read or does not describe a valid ext2/ext3/ext4
ファイルシステム. If the device is valid and it really contains an ext2/ext3/ext4
ファイルシステム (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193
or
e2fsck -b 32768
Found a dos partition table in /dev/sdb
同様のメッセージが繰り返されるだけでした。パラメータを少し変えたりしながら試しましたが、同じメッセージが出されるだけでした。
そこで、ディスクドライブの全域に ‘0’ を書き込んでみることにしました。時間が掛かるのは当然としても想像していたよりは早く完了しました。
$ sudo dd if=/dev/zero of=/dev/sdb bs=1M
dd: '/dev/sdb' の書き込みエラー: デバイスに空き領域がありません
953870+0 レコード入力
953869+0 レコード出力
1000204886016 bytes (1.0 TB, 932 GiB) copied, 32963.1 s, 30.3 MB/s
当然ですが、定義してあったパーティションの情報は消去されています。
$ sudo fdisk /dev/sdb
fdisk (util-linux 2.31.1) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。
デバイスには認識可能なパーティション情報が含まれていません。
新しい DOS ディスクラベルを作成しました。識別子は 0x53cc047d です。
コマンド (m でヘルプ): p
ディスク /dev/sdb: 931.5 GiB, 1000204886016 バイト, 1953525168 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 33553920 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x53cc047d
コマンド (m でヘルプ): q
次に、不良セクタを再び調べると、完了するまでの時間も短く、エラーしたメッセージは1つもありませんでした。実行時間が短いのは、リトライでの繰り返しが無くなっての短縮かと思われます。
$ sudo badblocks -v -s /dev/sdb | tee /tmp/badblocks.txt
Checking blocks 0 to 976762583
Checking for bad blocks (read-only test): done
Pass completed, 0 bad blocks found. (0/0/0 errors)
これで、色々なパーティションを作成してまともに利用できるのかは不明ですが、もう少し検証してみたいと考えています。
badblocks の修復説明サイト
別な情報を検索していると、badblocks の修復について説明しているサイトを見付けました。
ここの説明を見ると mkfs でファイルを作成する時や、 fsck でファイルをチェックする時に、badblocks で収集した不良セクタの情報を適用できるように説明されています。