目次

FreeBSDのcamcontrolでHPAを設定する

FreeBSDのcamcontrolコマンドでHPAを設定してる事例を見かけなかったので書いてみる。

HPAの状態を確認

camcontrol hpa デバイスID とすると、デバイスのHPAの状態を確認できる。デバイスIDはda0とかada1とか。

# camcontrol hpa ada1
pass1: <INTEL SSDSC2BB480G4 D2012370> ACS-2 ATA SATA 3.x device
pass1: 600.000MB/s transfers (SATA 3.x, UDMA6, PIO 512bytes)

Feature                      Support  Enabled   Value
Host Protected Area (HPA)      yes      no      937703088/937703088
HPA - Security                 no

HPAを設定する

camcontrol hpa デバイスID -s セクタ数 -P とすると、デバイスのHPAを設定することができる。デバイスの容量は-sで指定したセクタ数に制限され、-Pでその設定を永続化(電源を切っても有効な状態)にする。manを見る限り-Pなしでもコマンドの実行は成功しそうだが、イマイチ使い処が分からないので-sと-Pは基本セットで使うと考えていいだろう。

# camcontrol hpa ada1 -s 900000000 -P
pass1: <INTEL SSDSC2BB480G4 D2012370> ACS-2 ATA SATA 3.x device
pass1: 600.000MB/s transfers (SATA 3.x, UDMA6, PIO 512bytes)

You are about to configure HPA to limit the user accessible
sectors to 900000000 persistently on the device:
pass1,ada1: <INTEL SSDSC2BB480G4 D2012370> ACS-2 ATA SATA 3.x device

Are you SURE you want to configure HPA? (yes/no) yes

Feature                      Support  Enabled   Value
Host Protected Area (HPA)      yes      yes     900000000/937703088
HPA - Security                 no

HPAの設定が効いてるか確認

本当にHPAが効いているか確認のため、再起動してdmesgのデバイス情報を見てみる。

$ dmesg | grep ada1
ada1 at ahcich1 bus 0 scbus1 target 0 lun 0
ada1: <INTEL SSDSC2BB480G4 D2012370> ACS-2 ATA SATA 3.x device
ada1: Serial Number CVWL4221021M480QGN
ada1: 600.000MB/s transfers (SATA 3.x, UDMA6, PIO 512bytes)
ada1: Command Queueing enabled
ada1: 439453MB (900000000 512 byte sectors) ←HPAが効いてる
GEOM: ada1: the secondary GPT header is not in the last LBA.

HPAを無効化する

HPAを無効にするには、-sオプションにデバイスの最大セクタ数を与える。なんてことはない、デバイス全部をユーザー領域に指定するというだけ。

# camcontrol hpa ada5 -s 937703088 -P
pass6: <INTEL SSDSC2BB480G4 D2012370> ACS-2 ATA SATA 3.x device
pass6: 600.000MB/s transfers (SATA 3.x, UDMA6, PIO 512bytes)

You are about to configure HPA to limit the user accessible
sectors to 937703088 persistently on the device:
pass6,ada5: <INTEL SSDSC2BB480G4 D2012370> ACS-2 ATA SATA 3.x device

Are you SURE you want to configure HPA? (yes/no) yes

Feature                      Support  Enabled   Value
Host Protected Area (HPA)      yes      no      937703088/937703088
HPA - Security                 no

おまけ:GPTの修復

HPAを弄ったデバイスを初期化せずに使うケースは殆どないと思うが(何か気持ち悪いし)、HPAを狭める方向、つまり実際に使える容量が増える方向にHPAを設定した場合、既存のGPTに不整合が生じる。総セクタ数もそうだし、HPAで最終セクタが変動することで、デバイス末尾のパーティションテーブルもなかった事になってしまう。や、HPAを広げる方向でも勿論おかしくなるけど、その場合既存のデータを破壊する可能性もあるわけで、末尾のGPTを気にしてる場合じゃないと思うの。

HPAを狭めた直後のgpart showの図。CORRUPTになってるし、実際の総セクタ数も増えてない。

$ gpart show ada1
=>       40  853816920  ada1  GPT  (429G) [CORRUPT]
         40   80741376        - free -  (39G)
   80741416  671088640     6  freebsd-zfs  (320G)
  751830056   83886080     7  freebsd-zfs  (40G)
  835716136   18100824        - free -  (8.6G)

そこでおもむろにgpart recovery。

# gpart recover ada1
ada1 recovered

GPTの整合性が取れた。

$ gpart show ada1
=>       40  899999920  ada1  GPT  (429G)
         40   80741376        - free -  (39G)
   80741416  671088640     6  freebsd-zfs  (320G)
  751830056   83886080     7  freebsd-zfs  (40G)
  835716136   64283824        - free -  (31G)