2TBより大きいパーティション扱う(Linux)+HDDのアライメントについて

最近はHDDだと、2TBの製品もだいぶ安くなったので人によってはRAID5やRAID6と組み合わせて、4TBや6TBの容量のパーティションを作成する機会も増えてきたかと思います。

私のメインPCも2TB * 3なRAID5を導入したので、そのときに行った手順のログです。

// 気がついたらHDDのアライメントについての記事になってしまいました。。

やること

  1. kernelの GPTを有効にする
  2. partedの導入
  3. partedでパーティションを作成する
  4. 備考

GPTを有効にする

カーネルのGPTのコンフィグを有効にします。自前でカーネルのコンフィグを変更してたら行ってください。
下記を有効にします。

File System -> Partition type -> Advanced partition selection -> EFI GUID Partition support

また、上記付近にある"PC BIOS (MSDOS partition tables) support"は消さないように注意です。既存のパーティションをマウントできなくなります。

partedの導入

partedとはディスクのパーティション作成及びパーティションのリサイズを行うためのプログラムです。

$sudo emerge parted

partedでパーティションを作成する

partedでパーティションを作成します。下記が手順になります。

$sudo parted /dev/[ブロックデバイス]
>mklabel gpt
>mkpart p [ファイルシステム名] 1M -1
>q
  • mklabel gpt

GPTの作成を行います。これは、MBRにかわるパーティション管理領域形式です。

備考

  • 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週間かかりました。。。