SAS ディスクのセクタサイズ変更方法

中古の SAS ディスクを買ってきたところ、どうも RAID カードで認識しない。
なので、LSI LogicBroadcom の SAS カードに直接接続してみたところ、
Unsupported sector size 520.
と言われてしまい、物理的には認識しているものの、Linux 上からは操作ができない状態であった。
再フォーマットすれば、通常のディスクとして利用可能だったため、その方法をメモしておく。

■ディスク挿入時のログ

Sep 21 06:15:00 m4gz kernel: scsi 6:0:126:0: Direct-Access     NETAPP   X422_HCBFE600A10 NA02 PQ: 0 ANSI: 6
Sep 21 06:15:00 m4gz kernel: scsi 6:0:126:0: SSP: handle(0x0037), sas_addr(0x5000cca02f1288bd), phy(7), device_name(0x5000cca02f1288bf)
Sep 21 06:15:00 m4gz kernel: scsi 6:0:126:0: enclosure logical id (0x500605b009228770), slot(0)
Sep 21 06:15:00 m4gz kernel: scsi 6:0:126:0: qdepth(254), tagged(1), simple(0), ordered(0), scsi_level(7), cmd_que(1)
Sep 21 06:15:00 m4gz kernel: sd 6:0:126:0: Attached scsi generic sg1 type 0
Sep 21 06:15:00 m4gz kernel: sd 6:0:126:0: [sdb] Unsupported sector size 520.
Sep 21 06:15:00 m4gz kernel: sd 6:0:126:0: [sdb] 0 512-byte logical blocks: (0 B/0 B)
Sep 21 06:15:00 m4gz kernel: sd 6:0:126:0: [sdb] 4160-byte physical blocks
Sep 21 06:15:00 m4gz kernel: sd 6:0:126:0: [sdb] Write Protect is off
Sep 21 06:15:00 m4gz kernel: sd 6:0:126:0: [sdb] Write cache: disabled, read cache: enabled, supports DPO and FUA
Sep 21 06:15:00 m4gz kernel: sd 6:0:126:0: [sdb] Unsupported sector size 520.
Sep 21 06:15:00 m4gz kernel: sd 6:0:126:0: [sdb] Attached SCSI disk
Sep 21 06:15:15 m4gz kernel: scsi 6:0:127:0: Direct-Access     NETAPP   X422_TAL13600A10 NA01 PQ: 0 ANSI: 3
Sep 21 06:15:15 m4gz kernel: scsi 6:0:127:0: SSP: handle(0x0038), sas_addr(0x50000397283bad09), phy(6), device_name(0x50000397283bad09)
Sep 21 06:15:15 m4gz kernel: scsi 6:0:127:0: enclosure logical id (0x500605b009228770), slot(1)
Sep 21 06:15:15 m4gz kernel: scsi 6:0:127:0: qdepth(254), tagged(1), simple(0), ordered(0), scsi_level(4), cmd_que(1)
Sep 21 06:15:15 m4gz kernel: sd 6:0:127:0: Attached scsi generic sg2 type 0
Sep 21 06:15:15 m4gz kernel: sd 6:0:127:0: [sdc] Unsupported sector size 520.
Sep 21 06:15:15 m4gz kernel: sd 6:0:127:0: [sdc] 0 512-byte logical blocks: (0 B/0 B)
Sep 21 06:15:15 m4gz kernel: sd 6:0:127:0: [sdc] 520-byte physical blocks
Sep 21 06:15:15 m4gz kernel: sd 6:0:127:0: [sdc] Write Protect is off
Sep 21 06:15:15 m4gz kernel: sd 6:0:127:0: [sdc] Write cache: disabled, read cache: enabled, supports DPO and FUA
Sep 21 06:15:15 m4gz kernel: sd 6:0:127:0: [sdc] Unsupported sector size 520.
Sep 21 06:15:15 m4gz kernel: sd 6:0:127:0: [sdc] Attached SCSI disk
Sep 21 06:15:30 m4gz kernel: scsi 6:0:128:0: Direct-Access     NETAPP   X422_STBTE600A10 NA02 PQ: 0 ANSI: 6
Sep 21 06:15:30 m4gz kernel: scsi 6:0:128:0: SSP: handle(0x0039), sas_addr(0x5000c50097e6be71), phy(5), device_name(0x5000c50097e6be70)
Sep 21 06:15:30 m4gz kernel: scsi 6:0:128:0: enclosure logical id (0x500605b009228770), slot(2)
Sep 21 06:15:30 m4gz kernel: scsi 6:0:128:0: qdepth(254), tagged(1), simple(0), ordered(0), scsi_level(7), cmd_que(1)
Sep 21 06:15:30 m4gz kernel: sd 6:0:128:0: Attached scsi generic sg3 type 0
Sep 21 06:15:30 m4gz kernel: sd 6:0:128:0: [sdd] Unsupported sector size 520.
Sep 21 06:15:30 m4gz kernel: sd 6:0:128:0: [sdd] 0 512-byte logical blocks: (0 B/0 B)
Sep 21 06:15:30 m4gz kernel: sd 6:0:128:0: [sdd] 4160-byte physical blocks
Sep 21 06:15:30 m4gz kernel: sd 6:0:128:0: [sdd] Write Protect is off
Sep 21 06:15:30 m4gz kernel: sd 6:0:128:0: [sdd] Write cache: disabled, read cache: enabled, supports DPO and FUA
Sep 21 06:15:30 m4gz kernel: sd 6:0:128:0: [sdd] Unsupported sector size 520.
Sep 21 06:15:30 m4gz kernel: sd 6:0:128:0: [sdd] Attached SCSI disk
Sep 21 06:15:45 m4gz kernel: scsi 6:0:129:0: Direct-Access     NETAPP   X422_TA14E600A10 NA02 PQ: 0 ANSI: 6
Sep 21 06:15:45 m4gz kernel: scsi 6:0:129:0: SSP: handle(0x0043), sas_addr(0x50000398f8209df1), phy(4), device_name(0x50000398f8209df3)
Sep 21 06:15:45 m4gz kernel: scsi 6:0:129:0: enclosure logical id (0x500605b009228770), slot(3)
Sep 21 06:15:45 m4gz kernel: scsi 6:0:129:0: qdepth(254), tagged(1), simple(0), ordered(0), scsi_level(7), cmd_que(1)
Sep 21 06:15:45 m4gz kernel: sd 6:0:129:0: Attached scsi generic sg4 type 0
Sep 21 06:15:45 m4gz kernel: sd 6:0:129:0: [sde] Unsupported sector size 520.
Sep 21 06:15:45 m4gz kernel: sd 6:0:129:0: [sde] 0 512-byte logical blocks: (0 B/0 B)
Sep 21 06:15:45 m4gz kernel: sd 6:0:129:0: [sde] 4160-byte physical blocks
Sep 21 06:15:45 m4gz kernel: sd 6:0:129:0: [sde] Write Protect is off
Sep 21 06:15:45 m4gz kernel: sd 6:0:129:0: [sde] Write cache: disabled, read cache: enabled, supports DPO and FUA
Sep 21 06:15:45 m4gz kernel: sd 6:0:129:0: [sde] Unsupported sector size 520.
Sep 21 06:15:45 m4gz kernel: sd 6:0:129:0: [sde] Attached SCSI disk

とりあえず 4 本挿入したときのログ。
Advanced Format なディスクも買ってきたので、physical blocks が面白い表示になってる。

■無視して fdisk や badblocks や cat してみる
結果、全部エラー。cat しても何も帰ってこない。
fdisk: cannot open /dev/sdb: No such file or directory
badblocks: invalid starting block (0): must be less than 0
/var/log/messages には、Unsupported sector size 520. の出力。

■そもそもセクタサイズが 520 byte とは?
調べてみると、エンタープライズストレージに使われているディスクは、セクタサイズが 520 byte や 524 byte, 528 byte になっている場合があるそうだ。
今回買ってきたディスクは、NetApp にて使用されていたディスクである。
NetApp のドキュメントによると、

  • FCAL, SAS BCS のディスクは 520 byte per sector.
  • ATA, SATA, BSAS BCS のディスクは 512 byte per sector.
  • SSD BCS のディスクは 512 byte per sector.

とのこと。
BSAS とは、Bridged SAS と言い SATA ディスクを SAS に変換するモジュールがついたディスクとのこと。詳しくはこちらのドキュメント参照。
BCS については、こちらのドキュメントに書いてあった。
Checksum のことらしい。

  • BCS:Block Checksum
  • ZCS:Zone Checksum
  • AZCS:Advanced Zone Checksum

520 bps ディスクの場合、8 セクタのセットを使用して、4 KB のデータと 64 バイトのチェックサム情報を格納する。
[ Data 512-byte | Checksum 8-byte ] のセクタが 8 個となるので、ディスク本来の容量がストレージシステムで使えるらしい。
512 bps ディスクの場合、 9 つのセクタからなる 8 つの 512 バイトセクタのセットを使用して 4 KB のデータを格納し、9 つ目のセクタに 64 バイトのチェックサム情報を格納する。
9 つ目のセクタは、残りの 448 バイトは使用されないこととなる。
その為、実質約 10% ほど、実効容量が減るとのこと。

■一般的なディスクのセクタ構造

Description 512-byte sector 4096-byte sector
Gap, sync, address mark 15 bytes
User data 512 bytes 4096 bytes
Error-correcting code 50 bytes 100 bytes
Total 577 bytes 4211 bytes
Efficiency 88.7% 97.3%

■520 byte のうち、8 byte はどこから出てきている?
そもそも、NetApp 以外も 520 byte 以上のディスクを採用しているところを見ると、何か規格があるに違いない。
ディスクのセクタについて調べた結果、T10-PI というものにたどり着いた。
そのドキュメントを読む限り、どうも SAS のディスクは User data のサイズが可変であるようだ。
User data 部はデフォルトだと 512 byte だが、8 byte の拡張が可能になっているらしい。
その拡張された領域に、Data Integrity Field (DIF) を作成し、HBA 側でデータ整合性チェックができるようになるそうだ。
User data 部のサイズ変更は、本来の意味での Low Level Format を実施することで変更可能とのこと。

■Linux にて Low Level Format するためのツール
Red Hat Enterprise Linux 系(CentOS 等)の場合、sg3_utils パッケージをインストールすればツールがインストールされる。

■512 byte per sector に Low Level Format してみる
・フォーマット対象デバイスの特定
本来は sg_scan や sginfo 等のコマンドを駆使して特定するが【ディスク挿入時のログ】により、sg1 から sg4 であることがわかっている。
なお、sg_scan や sginfo の出力結果は、次のようになる。

# sg_scan
/dev/sg0: scsi0 channel=0 id=0 lun=0 [em]
/dev/sg1: scsi6 channel=0 id=126 lun=0
/dev/sg2: scsi6 channel=0 id=127 lun=0
/dev/sg3: scsi6 channel=0 id=128 lun=0
/dev/sg4: scsi6 channel=0 id=129 lun=0
# sginfo /dev/sg1
INQUIRY response (cmd: 0x12)
----------------------------
Device Type                        0
Vendor:                    NETAPP
Product:                   X422_HCBFE600A10
Revision level:            NA02
# sg_format -v --format --size=512 /dev/sg1
    inquiry cdb: 12 00 00 00 24 00
    NETAPP    X422_HCBFE600A10  NA02   peripheral_type: disk [0x0]
      PROTECT=1
      << supports protection information>>
    mode sense (10) cdb: 5a 00 01 00 00 00 00 00 fc 00
    mode sense (10): pass-through requested 252 bytes but got 28 bytes
Mode Sense (block descriptor) data, prior to changes:
  Number of blocks=1172123568 [0x45dd2fb0]
  Block size=520 [0x208]
    mode select (10) cdb: 55 11 00 00 00 00 00 00 1c 00

A FORMAT will commence in 10 seconds
    ALL data on /dev/sg1 will be DESTROYED
        Press control-C to abort
A FORMAT will commence in 5 seconds
    ALL data on /dev/sg1 will be DESTROYED
        Press control-C to abort
    format cdb: 04 18 00 00 00 00

Format has started
Format in progress, 2.04% done
Format in progress, 4.10% done
Format in progress, 6.17% done
  ... snip ...
Format in progress, 94.72% done
Format in progress, 96.47% done
Format in progress, 98.27% done
FORMAT Complete

なお、全セクタの Write が発生するため、容量によってはとてつもない時間がかかる。
その為、sg_format に & を付けバックグラウンドで複数並列実行するのが良いと思う。
また、/dev/sdX 指定でも行ける場合もある。

# sg_format -v --format --size=512 /dev/sdb &
# sg_format -v --format --size=512 /dev/sdc &
# sg_format -v --format --size=512 /dev/sdd &
# sg_format -v --format --size=512 /dev/sde &

■セクタリサイズ後の再認識
ディスクの抜き差しを実施すれば、確実に再認識される。
しかしそれはダサいので、OS からコマンドで再認識させる方法を探った。
結果、sginfo にて /dev/sdX の形で読みだせばよさそうであった。

# sginfo /dev/sdb
INQUIRY response (cmd: 0x12)
----------------------------
Device Type                        0
Vendor:                    NETAPP
Product:                   X422_HCBFE600A10
Revision level:            NA02

その時、/var/log/messages には、次のような出力が発生する。

Sep 21 07:57:00 m4gz kernel: sd 6:0:126:0: [sdb] 1172123568 512-byte logical blocks: (600 GB/558 GiB)
Sep 21 07:57:00 m4gz kernel: sd 6:0:126:0: [sdb] 4096-byte physical blocks
Sep 21 07:57:00 m4gz kernel: sdb: detected capacity change from 0 to 600127266816
Sep 21 07:57:02 m4gz kernel: sd 6:0:127:0: [sdc] 1172123568 512-byte logical blocks: (600 GB/558 GiB)
Sep 21 07:57:02 m4gz kernel: sdc: detected capacity change from 0 to 600127266816
Sep 21 07:57:04 m4gz kernel: sd 6:0:128:0: [sdd] 1172123568 512-byte logical blocks: (600 GB/558 GiB)
Sep 21 07:57:04 m4gz kernel: sd 6:0:128:0: [sdd] 4096-byte physical blocks
Sep 21 07:57:04 m4gz kernel: sdd: detected capacity change from 0 to 600127266816
Sep 21 07:57:06 m4gz kernel: sd 6:0:129:0: [sde] 1172123568 512-byte logical blocks: (600 GB/558 GiB)
Sep 21 07:57:06 m4gz kernel: sd 6:0:129:0: [sde] 4096-byte physical blocks
Sep 21 07:57:06 m4gz kernel: sde: detected capacity change from 0 to 600127266816

Linux Kernel 上で 512 byte のセクタであると認識され、/dev/sdX の容量が見えてきた。
この作業によって、通常ディスクと同じように使えるようになった。
なお sdc は Advanced Format ではないため、physical blocks の出力が出ていない。

■お約束のディスクチェック

# badblocks -svw /dev/sdb -c 32768
Checking for bad blocks in read-write mode
From block 0 to 586061783
Testing with pattern 0xaa: done
Reading and comparing: done
Testing with pattern 0x55: done
Reading and comparing: done
Testing with pattern 0xff: done
Reading and comparing: done
Testing with pattern 0x00: done
Reading and comparing: done
Pass completed, 0 bad blocks found. (0/0/0 errors)

■その他参考にした情報
Wikipedia: Advanced Format
Wikipedia: Data Integrity Field
T10 Technical Committee document: 03-111r0 Data Integrity Field
Red Hat: What is DIF/DIX (also known as PI)? Does Red Hat support it?
Seagate: [Technology Paper] Safeguarding Data From Corruption
SNIA: Using Linux block integrity in building and testing storage systems
ARMS Corporation: Data Protectionとは?

カテゴリー: めも パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です