====== 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)