2TBより大きいパーティション扱う(Linux)+HDDのアライメントについて
最近はHDDだと、2TBの製品もだいぶ安くなったので人によってはRAID5やRAID6と組み合わせて、4TBや6TBの容量のパーティションを作成する機会も増えてきたかと思います。
私のメインPCも2TB * 3なRAID5を導入したので、そのときに行った手順のログです。
// 気がついたらHDDのアライメントについての記事になってしまいました。。
やること
- kernelの GPTを有効にする
- partedの導入
- partedでパーティションを作成する
- 備考
GPTを有効にする
カーネルのGPTのコンフィグを有効にします。自前でカーネルのコンフィグを変更してたら行ってください。
下記を有効にします。
File System -> Partition type -> Advanced partition selection -> EFI GUID Partition support
また、上記付近にある"PC BIOS (MSDOS partition tables) support"は消さないように注意です。既存のパーティションをマウントできなくなります。
partedでパーティションを作成する
partedでパーティションを作成します。下記が手順になります。
$sudo parted /dev/[ブロックデバイス] >mklabel gpt >mkpart p [ファイルシステム名] 1M -1 >q
- mklabel gpt
GPTの作成を行います。これは、MBRにかわるパーティション管理領域形式です。
- mkpart p [ファイルシステム名] 1M -1
- p:プライマリパーティションの作成を指定しています。なお、GPTにはプライマリパーティションのみとなります。これは、パーティションが128個作成可能なためです。
- [ファイルシステム名]:作成するファイルシステムを指定します。ext4,ext3などです。なお、ファイルシステムを指定してもファイルシステムの作成は行われません(mkpartfsというコマンドを使用するとパーティションの作成とファイルシステムの作成を同時に行えますが、注意があるので、備考欄を見てください)
- 1M:パーティション開始位置の指定です。1Mとしているのはアライメント警告を回避するためです(後述のHDDのアライメントをご覧ください)
- -1:ディスクの終端を意味します。
備考
- GPT(GUID Partition Table)について
2TB以上の容量を認識するためにはMBRではなく、GPTでテーブルを作成する必要があります。GPTはIntelの提唱するEFIのサブセットです。
- MBRで2TBまでの理由
MBRではディスクの総セクタ数を4バイト(32ビット)で表しているので、単純に計算すると、下記になります!ちなみに、開始セクタ位置も4バイトです。
512Bytes/セクタ * 2^32セクタ * ( 1 / (1024 *1024 * 1024 * 1024))T = 2TB
- fdiskを使用しない理由
GPTに対応していないためです。GPT対応のfdiskもあったりします。
- mkpartfsについて
このコマンドは、パーティションの作成と一緒にファイルシステムの作成も行うコマンドです。ただし、manの注意書きにもありますが、このコマンドは使わないことを推奨されています。理由はext2progs等の公式の外部ツールを用いてファイルシステムを作成していないためです。
- 第一パーティション開始位置のアライメント
最近のHDDは物理1セクタ4KB(従来は512バイト)になっていて、それをHDD内で論理1セクタ512バイト(1物理セクタ=8論理セクタ)に置き換えて互換性を実現しています。
HDDの第一パーティションは懐かしのCHSで位置を表していた頃の名残で1シリンダ目からという制限がMSDOSの時代からありました(WindowsVistaでこの歴史がソフトウェアレベルでは終わりました。Vistaは第1パーティションを1MBで始めます)。これだけだと、あぁそうなんだって感じなのですが、シリンダの単位に問題がありました。
1シリンダ = 63LBA(LBA=512バイト)
なのですが、これ8で割れないんですよね。なので、書き込み時、読み込み時に2つ分の物理セクタにアクセスすることになります。どういうことかというと、4KBは8*512バイトで構成されています。ここで1パーティション目を63LBAで開始すると、
C0:[8+8+...+8+7] C1:[1+8+....] )
というように、C1の先頭512バイト分だけ余分に別の物理セクタから調達してくる必要が出てきます。で、さらにここでファイルシステムのブロックファイルは4KBです。なのでHDDへのアクセスは4KBで8論理LBA単位です。
先ほど63LBAでパーティションを切ったので、8の倍数分(4KB)アクセスされると毎回2物理LBAの領域を書き換える必要があります。つまり、データの読み書きを行う度に余分なセクタへのアクセスが発生することになり、IOのパフォーマンスに影響します(特にランダムアクセス)。
この問題を避けるために、HDDでは1シリンダ目のアライメントとして、無効な論理セクタ領域を割り当てて、物理セクタがはみ出ないようにしています。1シリンダ目の問題をパスすれば後はLBA単位で考えればいいのでアライメントの問題は回避できます。
無効[1] C0[7+8+8+...+8] C1[8+8+8+...]
で、1シリンダ目からパーティションを作る場合はこれで平気なんですが、1MBから作るとどうなるの?って問題になります。8で割り切れないのを回避するためにアライメントしているので、逆に8の倍数で切られると半端が出てしまうということです。
ただ、この辺はメーカやHDDのモデルごとに事情が変わってくるので、一概に1MBはだめってことにならないです。またWindowsが1MBでやり始めたのでメーカは追従してくると考えるととりあえず1MBでいいと考えるのが妥当です。
- Performance測定
時間見つけて、どの程度性能差が出るのか調べてみます。(2TBのディスクやRAIDカードで)
後書き
GPTのコンフィグを有効にしていないことに気がつくのに2週間かかりました。。。