====== FreeBSDのcamcontrolでHPAを設定する ======
FreeBSDのcamcontrolコマンドでHPAを設定してる事例を見かけなかったので書いてみる。
===== HPAの状態を確認 =====
//camcontrol hpa デバイスID// とすると、デバイスのHPAの状態を確認できる。デバイスIDはda0とかada1とか。
# camcontrol hpa ada1
pass1: 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: 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: 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: 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: 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: 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)