nasneの外付けハードディスクの最大容量について考える

nasneに2TBのハードディスクを使うことにしたとサラっと流しましたが、容量を2TBにしたのはちゃんと下調べしたからだったりします。まあ漠然と「2TBが上限」という情報を見て選んだだけなんですが、後で調べたら3TBや4TBのハードディスクを繋いでトラブルが発生しているのを見かけたので、nasneの外付けハードディスク(の最大容量)について書いてみようかなと。ちなみにSI接頭辞と2進接頭辞が入り乱れるのでご注意を。
まず結論から言えば「nasneは単一パーティションFAT32フォーマットのMBRディスクにしか対応していない」です。「MBRディスクに」というところがポイントで、そこから導き出されるのはつまり「32bitセクタアドレスまでしか対応しない」ということ。どんなに頑張っても2の32乗セクタ=4294967296セクタ、1セクタも普通は512バイト*1なので4294967296×512B=2TiBが限界ということです。俗に言う「2.2TBの壁」ですね。
周辺機器メーカー各社のフォーマットツールが揃ってMBRで2TiB超えのパーティションが作成出来てしまう事自体、そもそもがイレギュラーです。おそらくクラスタ数ベースで容量を計算しているために、FAT32の理論上の最大値である8TiBまではパーティションが作成出来てしまうのでしょうが、MBRディスクなので、セクタアドレスは2TiB相当までしか使えませんし、パーティションサイズも32bitなので上位ビットが切り捨てられて、3TBのディスクだと約746GiB、4TBのディスクでは約1677GiB、として計算されてしまいます。MBRであってもパーティションテーブルのパーティションサイズを無視したうえで、セクタアドレスを64bitでアクセスしてくれるOSがあれば問題無いんでしょうが、そんなOSあるんでしょうかね? 少なくともnasneに使われているLinuxの2.6系カーネルで、そんな処理をしているとはちょっと思えません。
でも、nasneはこのディスクを一応は正しい容量で認識するんですよねぇ……。それも含めた挙動からすると、メニュー画面での容量表示はディスクに記録されている空きクラスタ*2ベースで計算していて、実際のアクセスに際してはMBRパーティションテーブル内のパーティションサイズから計算した容量が採用されている、と考えるとぴったり。パーティションサイズからすれば、3TBディスクなら約27%使用=約73%空きで、4TBディスクなら約45%使用=約55%空きで、それぞれ容量不足のエラーが出るはずです。実際、3TBで空き73%でエラーになったという例も見つけたので、おそらくこれで当たりですね。
ということで、どんなに頑張っても3TBや4TBのドライブそのままでは正常に動作しないですし、将来的な対応も期待できないので、おとなしく2TBのドライブにしておくのがオススメです。
最後にちょっとでも容量を増やしたいという人への情報。nasneの外付けドライブは2TiB(約2.199TB)までの単一パーティションなら正常に動作するはずなので、3TBのドライブを買ってきて2.199TBのパーティション1個にフォーマットし直してnasneに接続すれば、2TBのドライブ(1.82TiB)より約184GiBほど多く使うことが出来るはずです。たった184GiBと侮ることなかれ、30分番組ならDRモードでも4.5GiBなので40回分、3倍モードなら2GiBなので実に92回分の差が付きます。まあその代償として、0.8TBほど容量を遊ばせることになりますが……。なお、こちらでは未確認なので、試す場合は自己責任、AT YOUR OWN RISKでお願いします。うまく行かなくても責任は取りませんし取れませんので悪しからず。

*1:4Kネイティブ(4Kn)セクタについては続編で書いてますのでそちらも参照のこと。

*2:フォーマット時に計算され、使用で減算され、開放で加算される数値なので32bitアドレスの影響をほぼ受けません。