FreeBSDのcamcontrolコマンドで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
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が効いているか確認のため、再起動して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を無効にするには、-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
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)