ハンドブック:AMD64/ブロック/ディスク
パーティションテーブル
Linuxシステムを入れるために、(btrfs RAIDを作成した場合のように)生の、パーティショニングをしていないディスクを使うことも理論上は可能です。しかし実際にはそんなことはめったにせず、ディスク全体のブロックデバイスをより小さく扱いやすいブロックデバイスに分けて使います。amd64システムでは、この分けられたブロックデバイスのことをパーティションと呼びます。現在主流なパーティショニング技術は、MBRとGPTの2つがあります。
MBR
MBR (Master Boot Record)構成は、パーティションの識別子として、32ビットで、開始セクタとパーティションのセクタ数を使い、3種類のパーティションタイプ(プライマリ、拡張、論理)を持っています。プライマリパーティションは、ディスク先頭のとても小さい領域(ふつうは512バイト)にあるMBRの中に、その情報が格納されます。この小ささのために、たった4つのプライマリパーティションしか使うことができません(例えば/dev/sda1から/dev/sda4まで)。
より多くのパーティションを使うために、プライマリパーティションのうちのひとつを拡張パーティションとしてマークすることができます。拡張パーティションは複数の論理パーティションを格納することができます(パーティションの中にパーティションが存在することになります)。
まだほとんどのマザーボードメーカーがサポートしてはいるものの、パーティションテーブルは既に過去のものと考えられます。2010年以前のハードウェアを扱っているのでない限り、GUID パーティションテーブル を使ってディスクをパーティショニングする方が良いでしょう。MBR を使って作業を続ける必要がある読者は以下のことを認識しておいてください:
- 2010年以降のほとんどのマザーボードは MBR を過去の(サポートはされているが理想的でない)ブートモードとみなします。
- 32ビットの識別子を使用しているため、マスターブートレコードのパーティショニングテーブルは2TiBを超えるサイズのディスクを扱えません。
- 拡張パーティションを作成しない限り、MBR は最大で4つまでのパーティションしかサポートしません。
- MBR のセットアップでは MBR のバックアップは一切提供されないので、アプリケーションやユーザーが MBR を上書きしてしまうとすべてのパーティション情報が失われます。
ハンドブックの著者たちは、可能であればいつでも、Gentoo をインストールするためには GPT を使うことを提案します。
GPT
GPT (GUID Partition Table)構成は、パーティションの識別子として64ビットの値を使います。パーティション情報を格納する領域はMBRの512バイトよりもずっと大きいため、パーティション数の制限はないようなものです。さらに、パーティションサイズの上限ももっと大きく設定されています(およそ8ZiB、そう、ゼタバイトです)。
オペレーティングシステムとファームウェアの間のソフトウェアインターフェースが(BIOSではなく)UEFIならば、MBRでは互換性の問題が発生するので、GPTはほぼ必須となります。
GPTはまたチェックサムと冗長性も備えています。具体的にはヘッダやパーティションテーブルのエラーを検出するCRC32チェックサムや、ディスクの末尾にバックアップのGPTを持っています。もしディスク先頭にあるプライマリGPTに損害があっても、バックアップのGPTを使って回復できます。
GPTとMBRのどちらにすべきか
上の記述から、GPTが常に推奨されるアプローチだと思われたかもしれません。ただし、いくつか注意点があります。
BIOSベースのコンピュータでGPTを使うことはできますが、Microsoft Windowsとデュアルブートを組むことはできません。Microsoft WindowsはGPTパーティションラベルを検出すると、UEFIモードで起動しようとするからです。
BIOS/CSM/レガシーモードでブートするように設定されたマザーボードファームウェアでは、GPTディスクからブートする際に問題が発生するかもしれません。その場合には、保護MBRパーティションにブートフラグもしくはアクティブフラグと呼ばれるフラグを付加することで、この問題を回避できるかもしれません。fdiskに-t dos
オプションを付けると、強制的にMBRフォーマットとしてパーティションテーブルを読み込みます。
fdiskを起動して、aキーを使ってフラグを立ててください。1を押して最初のパーティションを選択し、wキーを押してディスクに変更を反映させ、fdiskアプリケーションを終了してください。
user $
fdisk -t dos /dev/sda
Welcome to fdisk (util-linux 2.24.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): a Partition number (1-4): 1 Command (m for help): w
UEFIを使う
オペレーティングシステムを起動するのに(BIOSではなく)UEFIを使うシステムにGentooをインストールするときは、EFIシステムパーティションを作成することが重要です。この手順については後述のpartedの説明でも述べます。
ESPはFAT系列のファイルシステム(Linuxシステムではvfatと表示することもあります)である必要があります。UEFI specification では、UEFIファームウェアは FAT12、16、32 を認識すると書かれている一方で、ESP には FAT32 を推奨しています。ESP を FAT32 としてフォーマットしておきましょう:
root #
mkfs.fat -F 32 /dev/sda2
ESPがFAT系列のファイルシステムを使っていないと、UEFIファームウェアはブートローダー (かLinuxカーネル) を見つけられず、おそらくシステムをブートすることができません!
高度なストレージ
btrfs RAID
上で述べた通り、btrfsは複数のデバイスを跨いでファイルシステムを作成することができます。このようにして作成されたbtrfsファイルシステムは、raid0、raid1、raid10、raid5、raid6モードで動作することができます。RAIDモードの5と6はかなり改善されましたが、まだ不安定と考えられています。複数のデバイスからなるファイルシステムを作成した後でも、新しいデバイスを作成したり、古いデバイスを消去したりといったことがわずかなコマンドでできます。他のファイルシステムでは初心者には難しいことでも、btrfsファイルシステムではかなり改善されています。
ext4ファイルシステムはbtrfsファイルシステムに変換できます。これはGentooを安定かつよくテストされたファイルシステムにインストールしたい場合に有益です。また実験的にbtrfsを使う時のように、新しいファイルシステムを徐々に学ぶときにも役立つでしょう。
LVM
amd64インストールCDは Logical Volume Manager (LVM) サポートを提供しています。LVMのパーティション構造は、ストレージのより柔軟な管理を可能にします。この後の説明では「ふつう」のパーティションに焦点を当てていますが、LVMが好ましい場合は、それがサポートされていることを知っておいて損はないでしょう。詳細は LVM の記事をご覧ください。興味を持たれた方へ: 本ガイドはLVMをサポートしていないことにご注意ください。
デフォルトのパーティション構成
これよりこのハンドブックでは、シンプルな例として以下のパーティション構造を使います。
パーティション | ファイルシステム | サイズ | 説明 |
---|---|---|---|
/dev/sda1 | (ブートローダ) | 2M | BIOSブートパーティション |
/dev/sda2 | ext2 (またはUEFIを使うならfat32) | 128M | ブート/EFIシステムパーティション |
/dev/sda3 | (swap) | 512M もしくはそれ以上 | スワップパーティション |
/dev/sda4 | ext4 | 残りのディスク | ルートパーティション |
もし、これで十分かつGPTを使う場合は、すぐに標準: ディスクの分割にpartedを使うに進みましょう。MBRにまだ興味があり(まぁ、そういうこともあるでしょう)、かつ上の例のレイアウトを使う場合は別の選択肢: ディスクの分割にfdiskを使うに進んでください。
fdiskとpartedは共にパーティショニングのためのユーティリティです。fdiskは有名で、安定した、MBRパーティションレイアウトのためのツールです。一方、partedはGPTパーティションをサポートした、最初のLinuxブロックデバイスの管理ツールの一つでした。fdiskのユーザーインタフェースが好きな人は、partedの代わりにgdisk (GPT fdisk)を使うこともできます。
パーティションの生成方法に進む前に、以降の数セッションでパーティション構造がどのように生成されるのかについて、その詳細を述べ、いくつかの共通した落とし穴について触れておきます。
パーティション構成の設計
パーティション数とサイズ
パーティションの個数は環境に大きく依存します。例えば、多数のユーザがいる場合、セキュリティを向上し、バックアップを容易にするために/home/を分離することを推奨します。もしGentooがメールサーバとして動作する場合は、 /var/ を分離し、すべてのメールを /var/ に保存すべきでしょう。適切なファイルシステムの選択は、パフォーマンスを最大限向上します。ゲームサーバでは、ほとんどのゲームは/opt/にインストールされているので、/opt/を分離すべきでしょう。理由は/home/ディレクトリと同様にセキュリティとバックアップです。多くの場合、 /usr/ は大きく確保すべきです。/usr/には大部分のアプリケーションが配置されるだけでなく、既におよそ650MiBを使用しているGentoo ebuildリポジトリが、ほとんどの場合この場所に置かれるからです(既定の場所は/var/db/repos/gentooです)。このディスクスペース推定量は、既定では/var/cache/以下に保存されるbinpkgs/ディレクトリやdistfiles/ディレクトリを除外しています。
In most situations on Gentoo, /usr and /var should be kept relatively large in size. /usr hosts the majority of applications available on the system and the Linux kernel sources (under /usr/src). By default, /var hosts the Gentoo ebuild repository (located at /var/db/repos/gentoo) which, depending on the file system, generally consumes around 650 MiB of disk space. This space estimate excludes the /var/cache/distfiles and /var/cache/binpkgs directories, which will gradually fill with source files and (optionally) binary packages respectively as they are added to the system.
これらは管理者がやりたいことに大きく依存します。パーティションやボリュームを分離することには下記の利点があります。
- それぞれのパーティションまたはボリュームに対して、最も性能が高いファイルシステムを選択できます
- ゾンビプロセスがパーティションまたはボリュームに継続的に書き込みをした場合でも、システム全体の空き領域を使い切ることはありません
- 必要ならば、複数のチェックを並行して実行することで、ファイルシステムチェックの時間を短縮できます (複数のパーティションよりも複数のディスクの方が効果があります)
- リードのみ、
nosuid
(setuidビット無効)、noexec
(実行ビット無効)等のマウントオプションによって、セキュリティが向上します
しかし、複数パーティションにはデメリットもあります。もし適切に設定されない場合、あるパーティションが空き領域をたくさん持ち、別のパーティションにはまったく空き領域がなくなるといったことが起こり得ます。特に/usr/と/var/いった重要なマウントポイントに対して、しばしば管理者は他のブートスクリプトが動作する前にパーティションをマウントするために、initrmfsを使用しなければならなくなるでしょう。これはいつも成り立つというわけではありません。結果はよく変わるのです。
また、 SCSIやSATAでは仕様上の制約により、GPTラベルを使用しない限りは 15個までしかパーティションを作れません。
スワップ領域について
スワップパーティションについて完璧なパーティションサイズというものはありません。スワップ領域の目的は、メインメモリ(RAM)が逼迫した際、カーネルにディスク領域を提供するためにあります。スワップ領域があれば、カーネルは最近最も使われていないメモリ領域をディスクに書き出し(スワップもしくはページアウト)、メモリを開放します。もちろん、もし急にメモリが必要になった場合は、これらのページはメモリに戻す(ページイン)必要があります。これには多少なりとも時間が必要です。(メインメモリと比較してディスクはとても遅いためです)
システムがメモリを大量に消費するアプリケーションを実行しないとき、またシステムが多くの空きメモリを持っているときは、それほど大きいスワップ領域は必要ではありません。しかし、スワップ領域はハイバネーションのときに全メモリを保存するためにも使われます。そのためハイバネーションが必要な場合は、より大きい、最低でもインストールされている全メモリと同程度のサイズのスワップ領域が必要です。
BIOS ブートパーティションとは
BIOS ブートパーティションはとても小さい(1-2 MB)パーティションで、GRUB2 などのブートローダが、与えられた領域(MBR では数百バイト)に収まらず、他の場所に置くこともできないようなデータを置くためのパーティションです。
このパーティションは常に必要ではありませんが、ディスク使用量も大したことはありませんし、パーティショニングの違いに応じて膨大な量のドキュメントを書くことの困難さを考慮して、BIOS ブートパーティションを作成することを推奨します。
正確に言うと、BIOS ブートパーティションが必要なのは、GPT パーティションレイアウトを GRUB2 と併用し、PC/BIOS モードで起動する場合です。EFI/UEFI モードで起動する場合には必要ありません。
デフォルト: ディスクの分割にpartedを使う
この章では、説明中で先に示したパーティションレイアウトの例を使います。
パーティション | 説明 |
---|---|
/dev/sda1 | BIOS ブートパーティション |
/dev/sda2 | ブートパーティション |
/dev/sda3 | スワップパーティション |
/dev/sda4 | ルートパーティション |
パーティションレイアウトはお好みで変更してください。
parted で現在のパーティションレイアウトを表示する
partedはディスクを分割するためのシンプルなインタフェースを持ち、2TB以上の巨大なパーティションをサポートします。partedを起動しましょう(上の例の/dev/sdaを対象とします)。partedに最適なパーティションのアライメントを決めさせるとよいでしょう。
root #
parted -a optimal /dev/sda
GNU Parted 2.3 Using /dev/sda Welcome to GNU Parted! Type 'help' to view a list of commands.
アライメントとは、パーティションがディスク上のよく知られた境界から始まることを示し、OSレベルのディスク操作(ディスクからページを集める)が最低限のディスク領域を使えることを保証します。アライメントされていないパーティションでは、OSが1ページのみを必要としていたとしても、2ページにアクセスしなければなりません。
partedがサポートするすべてのオプションを表示するためには、 help とタイプし、リターンキーを押してください。
GPTラベルを適用する
x86もしくはamd64アーキテクチャ上のほとんどのディスクは、msdosラベルを使います。partedを使用してディスクにGPTラベルをつけるためには、mklabel gptを使います。
パーティションタイプを変更すると、ディスクのすべてのパーティションを消去します。ディスク上のすべてのデータは失われます。
(parted)
mklabel gpt
MBRレイアウトのディスクを作成する場合は、mklabel msdosを使います。
partedですべてのパーティションを削除する
もし、まだパーティションの全消去を実行してない場合(例えば、mklabelをした場合や、新しくフォーマットされたディスクの場合)は、最初にすべての既存パーティションを削除しましょう。現在のパーティションを確認するためにprintとタイプし、rm <N>とします。ここで<N>
は、消去するパーティションの番号を示します。
(parted)
rm 2
同様に、使用しない他のパーティションを消去します。ここで失敗は許されません。partedは変更を即座に反映します。(一方fdiskは、変更を保存、もしくはfdiskを終了する前に、それまでの変更を無効にすることができます)
パーティションを作成する
では、parted を使って次の設定でパーティションを作成していきましょう:
- 使用するパーティションタイプ。これは通常はprimaryとなります。もしmsdosパーティションラベルを使う場合、プライマリパーティションは最大4つまでであることに留意してください。
- パーティションの開始位置。これはMB、GB、…で指定できます。
- パーティションの終了位置。これはMB、GB、…で指定できます。
最初に、これから使うサイズの単位がメガバイトであることを指定しましょう。(実際、メガバイトは標準的な記述ではMiBと表記されます。しかしこの文書では、もっともよく使われるMBを使います)
(parted)
unit mib
まず、2MBのパーティションを作成します。このパーティションはGRUB2ブートローダが使用します。mkpartコマンドを使い、1MBから始まり、3MBで終わるパーティション(2MBのサイズ)を作成します。
(parted)
mkpart primary 1 3
(parted)
name 1 grub
(parted)
set 1 bios_grub on
(parted)
print
Model: Virtio Block Device (virtblk) Disk /dev/sda: 20480MiB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 1.00MiB 3.00MiB 2.00MiB grub bios_grub
同じやり方でブートパーティション(128MB)、スワップパーティション(この例では512MB)、残りのディスクすべてを占めるルートパーティションを作成します。(このパーティションの終わりは-1で指定します。ディスクの最終端の1MB前で、これは取りうる最大のパーティションです)
(parted)
mkpart primary 3 131
(parted)
name 2 boot
(parted)
mkpart primary 131 643
(parted)
name 3 swap
(parted)
mkpart primary 643 -1
(parted)
name 4 rootfs
(BIOSの代わりに)UEFIインタフェースを使う場合、ブートパーティションをEFIシステムパーティションとして設定しなければなりません。partedでは、パーティションにbootオプションを付けることで自動的に設定されます。
(parted)
set 2 boot on
最終的に、パーティション構成は以下のようになるでしょう。
(parted)
print
Model: Virtio Block Device (virtblk) Disk /dev/sda: 20480MiB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 1.00MiB 3.00MiB 2.00MiB grub bios_grub 2 3.00MiB 131MiB 128MiB boot boot 3 131MiB 643MiB 512MiB swap 4 643MiB 20479MiB 19836MiB rootfs
UEFIインストールでは、bootフラグおよびespフラグはブートパーティションに現われます。
quitでpartedを終了します。
別の選択肢: ディスクの分割にfdiskを使う
最近の fdisk は GPT に対応しているはずなのですが、まだいくつかの問題があることが分かっています。以降の説明ではパーティションレイアウトに MBR が使われていると仮定しています。
以降の部分では、fdisk を使って例の通りにパーティションレイアウトを作成する方法を説明します。パーティションレイアウトの例は先にも示した通りです:
パーティション | 説明 |
---|---|
/dev/sda1 | BIOS ブートパーティション |
/dev/sda2 | ブートパーティション |
/dev/sda3 | スワップパーティション |
/dev/sda4 | ルートパーティション |
パーティションレイアウトはお好みで変更してください。
現在のパーティションレイアウトを表示する
fdiskは、ディスクをパーティション分割するためのポピュラーでパワフルなツールです。ディスク(我々の例では/dev/sda)に対してfdiskを起動しましょう。
root #
fdisk /dev/sda
GPTサポートを有効にするためには、
-t gpt
を追加します。fdiskの最近の開発でデフォルトの動作がMBRから変わる場合、fdiskの出力を注意深く確認することをお勧めします。これ以降、この手順書ではMBRレイアウトを前提とします。pキーを使えば、現在のディスクのパーティション構成を表示できます。
Command (m for help):
p
Disk /dev/sda: 240 heads, 63 sectors, 2184 cylinders Units = cylinders of 15120 * 512 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 14 105808+ 83 Linux /dev/sda2 15 49 264600 82 Linux swap /dev/sda3 50 70 158760 83 Linux /dev/sda4 71 2184 15981840 5 Extended /dev/sda5 71 209 1050808+ 83 Linux /dev/sda6 210 348 1050808+ 83 Linux /dev/sda7 349 626 2101648+ 83 Linux /dev/sda8 627 904 2101648+ 83 Linux /dev/sda9 905 2184 9676768+ 83 Linux
このディスクは7つのLinuxファイルシステム ("Linux" と書かれているパーティションに対応します) と1つのswapパーティション ("Linux swap" と書かれているパーティション) で構成されているようです。
fdisk ですべてのパーティションを削除する
まずは既存のパーティションを全て削除しましょう。パーティションを削除するには d と入力します。例えば /dev/sda1 を削除するにはこのようにします:
Command (m for help):
d
Partition number (1-4): 1
これで指定したパーティションの削除が予約されました。パーティションの一覧 (p) にはもう現れませんが、変更を保存するまで実際の消去は行われないので、間違えて操作してしまった場合は中止することができます。すぐに q を入力して Enter を押せば、パーティションは削除されません。
p でパーティションの一覧を表示して d とパーティション番号を入力する、という作業を繰り返すと、パーティションテーブルは空っぽになります。
Command (m for help):
p
Disk /dev/sda: 30.0 GB, 30005821440 bytes 240 heads, 63 sectors/track, 3876 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes Device Boot Start End Blocks Id System
さて、メモリ内のパーティションテーブルが空になり、パーティションを作る準備ができました。
BIOS ブートパーティションを作成する
まずはとても小さな BIOS ブートパーティションを作成します。新規パーティションを作るので n を入力し、p で基本パーティションを選択、1 で最初の基本パーティションを選択しましょう。開始セクタについて聞かれたら、2048 (ブートローダーのために必要です) になっていることを確認して Enter を押しましょう。終了セクタの指定では、2MB のパーティションを作るので +2M と入力します:
セクタ2048から開始するというのは、ブートローダーがこのパーティションを使ってくれない時のための安全装置です。
Command (m for help):
n
Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First sector (64-10486533532, default 64): 2048 Last sector, +sectors +size{M,K,G} (4096-10486533532, default 10486533532): +2M
パーティションを UEFI 用にマークする場合:
Command (m for help):
t
Selected partition 1 Hex code (type L to list codes): 4 Changed system type of partition 1 to 4 (BIOS boot)
UEFIでMBRパーティションレイアウトを使うのはお勧めしません。UEFI対応のシステムを使うなら、GPTレイアウトにすべきです。
ブートパーティションを作成する
今度は小さなブートパーティションを作成します。新規パーティションを作るので n を入力し、p で基本パーティションを選択、2 で2番目の基本パーティションを選択しましょう。開始セクタはデフォルトのままでいいので、そのまま Enter を押します。終了セクタの指定では、128MB のパーティションを作るので +128M と入力します:
Command (m for help):
n
Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First sector (5198-10486533532, default 5198): (Hit enter) Last sector, +sectors +size{M,K,G} (4096-10486533532, default 10486533532): +128M
ここで p を押すと、次のようなパーティション一覧が表示されるはずです:
Command (m for help):
p
Disk /dev/sda: 30.0 GB, 30005821440 bytes 240 heads, 63 sectors/track, 3876 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes Device Boot Start End Blocks Id System /dev/sda1 1 3 5198+ ef EFI (FAT-12/16/32) /dev/sda2 3 14 105808+ 83 Linux
パーティションのブート可能フラグを設定するために a を押して 2 を選んでください。もう一度 p を入力してみると、"Boot" 列に * 印がついていますね。
スワップパーティションを作成する
スワップパーティションを作成したいので、新規パーティション作成の n を入力し、p で基本パーティションを選択し、 3 で3番目の基本パーティションを選択しましょう。開始セクタの指定ではそのまま Enter を押します。終了セクタの指定では、512MB のパーティションを作るので +512M (もしくはお好みのswap領域のサイズ) と入力します。
ここまでできたら、パーティションタイプを設定するために t と入力し、今作成したパーティション 3 を選択、そしてパーティションタイプ "Linux Swap" を意味する "82" を入力します。
ルートパーティションを作成する
最後に、ルートパーティションを作成します。n で新規パーティション作成、 p で基本パーティションを選択、4番目の基本パーティションを作成するために 4 を入力、最初のセクタはそのまま Enter を押します。最後のセクタを聞かれたら、ディスクの空き領域全てをこのパーティションに割り当てたいのでそのまま Enter を押しましょう。これが終わったら、 p で次のようなパーティションテーブルが表示されるはずです:
Command (m for help):
p
Disk /dev/sda: 30.0 GB, 30005821440 bytes 240 heads, 63 sectors/track, 3876 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes Device Boot Start End Blocks Id System /dev/sda1 1 3 5198+ ef EFI (FAT-12/16/32) /dev/sda2 * 3 14 105808+ 83 Linux /dev/sda3 15 81 506520 82 Linux swap /dev/sda4 82 3876 28690200 83 Linux
パーティションのレイアウトを保存する
このパーティションレイアウトを保存して fdisk を終了するために、w を入力します。
Command (m for help):
w
パーティションが作成できたら、今度はそこにファイルシステムを置きます。