目次


Linux の 101 試験対策

ハード・ディスクのレイアウト

ハード・ディスク・パーティションの構成を計画する

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: Linux の 101 試験対策

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:Linux の 101 試験対策

このシリーズの続きに乞うご期待。

概要

このチュートリアルでは、Linux システムにおけるディスク・パーティションのレイアウトを設計する方法を学びます。このチュートリアルで説明する内容は以下のとおりです。

  • ファイルシステムおよびスワップ領域を個々のパーティションまたはディスクに割り当てる方法
  • システムの用途に合わせて設計を調整する方法
  • システムがブート可能であることを確実にする方法
  • 論理ボリューム・マネージャー (LVM) の基本機能

ファイルシステムの概要

Linux ファイルシステムに保管されるファイルは、ディスクやその他のブロック・ストレージ・デバイス上でディレクトリーという形式で整理されます。他の多くのシステムと同じく、Linux システムでのディレクトリーには、他のディレクトリーを含めることができます。ディレクトリーに含められたディレクトリーは、サブディレクトリーと呼ばれます。Microsoft Windows などのシステムでは、ドライブ名 (A:、C: など) ごとにファイルシステムを分けるという概念ですが、Linux ファイルシステムはそれとは異なり、/ ディレクトリーをルート・ディレクトリーとする単一のツリーです。

このチュートリアルは、LPIC-1 Linux Server Professional Certification 101 試験の主題 102 の 102.1 の試験対策となります。この項目の重要度は 2 です。

注:このチュートリアルでは主にレイアウトの計画について取り上げます。実装手順については、主題 104 に対応するチュートリアル (連載のロードマップで説明) を参照してください。

前提条件

この連載のチュートリアルを最大限に活用するには、Linux の基礎知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。

マウントによる拡張

ファイルシステムがたった 1 つの大きなツリーだとしたら、なぜディスク・レイアウトが重要になるのか不思議に思うかもしれませんが、実際には、ハード・ディスク・パーティション、CD-ROM、あるいはフロッピー・ディスクなどといったブロック・デバイスのそれぞれにファイルシステムがあります。ファイルシステムを 1 つのツリーとして表すために、ツリー内のポイント (マウント・ポイント) に、さまざまなデバイス上のファイルシステムをマウントするというわけです。

通常、カーネルはある特定のハード・ディスクのパーティション上にあるファイルシステムを / としてマウントすることによって、このマウント・プロセスを開始します。ユーザーは他のハード・ディスクのパーティションを /boot、/tmp、または /home としてマウントすることができます。また、例えばフロッピー・ドライブ上のファイルシステムを /mnt/floppy としてマウントすることや、CD-ROM 上のファイルシステムを /media/cdrom1 としてマウントすることもできます。さらに、NFS のような、ネットワークで接続したファイルシステムを使用して、他のシステムからのファイルをマウントすることも可能です。ファイルのマウントには他にも種類がありますが、以上の説明で、このプロセスの概念はつかめるはずです。マウント・プロセスは、実際にはあるデバイス上のファイルシステムをマウントするわけですが、一般的には「デバイスをマウントする」と略して表現されます。これは、「デバイス上のファイルシステムをマウントする」という意味として理解されています。

ここで、例えばルート・ファイルシステム (/) をマウントした直後に、CD-ROM (/dev/sr0) をマウント・ポイント /media/cdrom にマウントする場合を考えてみてください。このマウント・ポイントに CD-ROM をマウントするには、このマウント・ポイントがあらかじめ存在していなければなりません。既存の /media/cdrom に CD-ROM をマウントすると、CD-ROM 上のファイルとサブディレクトリーはこのマウント・ポイント内およびその配下にあるファイルとサブディレクトリーになります。それによって、/media/cdrom 内にあったファイルまたはサブディレクトリーは表示されなくなりますが、これらの既存のファイルおよびサブディレクトリーは、マウント・ポイント /media/cdrom が含まれていたブロック・デバイス上に残っています。そのため、CD-ROM がアンマウントされると、元のファイルとサブディレクトリーが再び表示されることになってしまいます。このような問題が起こらないようにするため、マウント・ポイントとして使用する目的のディレクトリーには他のファイルを置かないでください。

表 1 に、FHS (Filesystem Hierarchy Standard) で規定されている / 配下のディレクトリーを記載します (FHS についての詳細は、「参考文献」を参照してください)。

表 1. FHS で規定された / 配下のディレクトリー
ディレクトリー説明
bin必須のコマンド・バイナリー
bootブート・ローダーの静的ファイル
devデバイス・ファイル
etcホスト固有のシステム構成
lib必須の共有ライブラリーおよびカーネル・モジュール
media取り外し可能なメディアのマウント・ポイント
mntファイルシステムを一時的にマウントするためのマウント・ポイント
optアドオン・アプリケーションのソフトウェア・パッケージ
sbin必須のシステム・バイナリー
srvこのシステムが提供するサービスのためのデータ
tmp一時ファイル
usr2 次階層
var可変データ

パーティション

通常、1 番目の SCSI ドライブは /dev/sda となります。古いバージョンの Linux システムでの 1 番目の IDE ハード・ディスクは /dev/hda です。シリアル転送方式にした IDE ドライブ (SATA) の登場により、PATA/SATA 混合時のシステムでは 1 番目の PATA ドライブに /dev/hda を使用し、1 番目の SATA ドライブに /dev/sda を使用することもあります。新しいバージョンのシステムでは、すべての IDE ドライブが /dev/sda、/dev/sdb という形の名前になります。IDE ドライブの名前は、(最初は USB ドライブをサポートしていた) ホットプラグ・システムに対応することで変更されるようになりました。ホットプラグでは、新しいデバイスを接続すると同時に使用することができます。今では、デバイスがシステムに統合されるのか、あるいは USB や Firewire (IEEE 1394)、あるいは別の接続タイプによって、デバイスが実行中のシステムに接続されるのかに関わらず、すべてのデバイスにホットプラグが使用されています。

MBR パーティション

従来から、ハード・ディスクは 512 バイトのセクターにフォーマットされます。ディスク・プラッター上の、ヘッドを動かさずに読み取り可能なセクターはすべてトラックの構成要素となります。ディスクには通常、複数のプラッターがあります。プラッター上にあり、ヘッドを動かさずに読み取り可能なトラックの集合は、シリンダーと呼ばれます。ハード・ディスクのジオメトリーはシリンダーの数、シリンダーあたりのトラック (ヘッド) 数、およびトラックあたりのセクター数で表現されます。この記事を執筆している時点で、ハード・ディスクのメーカー各社は、セクターが 4K のディスクを導入するようになっています。ファイルシステムが以前と同じく 512 バイトのセクターを前提としていると、パーティションが 4K の境界にあるセクターで開始しない場合、パフォーマンスが劣化します。

PC システムの DOS オペレーティング・システムで使用されていたシリンダー、ヘッド、セクターにはサイズに制限があったため、より容量の大きいハード・ディスクをサポートできるように BIOS によるジオメトリー値の変換が使用されるようになりました。けれども結局のところ、いずれの方法も十分ではありませんでした。そこで、ディスク・ドライブ技術における最近の開発によってもたらされたのが、論理ブロック・アドレッシング (LBA) という手法です。この手法により、CHS (シリンダー、ヘッド、セクター) ジオメトリー測定値はそれほど重要でなくなりました。最近のディスクに関して報告されるジオメトリーは、実際の物理セクター・レイアウトとほとんど、あるいはまったく関係ありません。現在使用されている大容量ディスクに対応するために拡張された LBA は、最大 48 ビット分のセクター数を確保することから、LBA48 として知られています。そして今では大容量ドライブ用に、マスター・ブート・レコード (MBR) フォーマットの代わりに GUID (Globally Unique IDentifier) パーティション・テーブル (GPT) と呼ばれる新たなフォーマットが使用されています。GPT ドライブはデフォルトで最大 128 パーティションをサポートしています。

ハード・ディスク上の領域はパーティションに分割 (セグメント化) されます。パーティションが重なり合うことはできません。パーティションに割り当てられていない領域は空き領域と呼ばれます。パーティションには、/dev/hda1、/dev/hda2、/dev/hda3、/dev/sda1 といった名前が付けられます。IDE ドライブのホットプラグをサポートしないシステムでは、IDE ドライブのパーティションは 63 に制限されます。ホットプラグ対応の SCSI ドライブ、USB ドライブ、IDE ドライブで使用できるパーティションは 15 です。パーティションは、以前はシリンダー単位の整数として割り当てられていました (基準となるシリンダーの概念は正確ではなかった可能性もあります)。今でも、新しいパーティションの割り当てをシリンダー境界に従って行うことを指定する、parted-c オプションなど、シリンダー割り当ての名残があります。

MBR ディスク上でパーティション情報を表示するには、fdisk コマンドか parted コマンドのいずれかを用いることができます。どちらのコマンドも、インタラクティブな動作をさせることや、コマンドライン上でパラメーターを渡すことが可能であり、例えば、プログラムのバージョン情報を表示するには -v パラメーターを指定します。パーティションを表示または割り当てる際の単位としては、いくつかの異なる単位をサポートしています。リスト 1 には、MBR フォーマットのディスク上のパーティションを表示するために、パラメーターを指定して fdisk を実行する例と、parted を実行してインタラクティブに単位をセクターに指定する例を示してあります。パーティション・テーブルを表示または操作するには、root ユーザーであるか、または以下のように sudo を使って root 権限を取得する必要があります。

注: これらのパーティショニング・ツールは、いずれも、ユーザーが変更した内容をディスクに書き込むことを選択するまでは、メモリー内に変更内容を保持します。確信が持てないときは、ツールを終了してください。何を実行することになるのかわかっていない場合や、実行内容に誤りがある場合には、お使いのディスクやシステムが使えなくなる可能性があります。

リスト 1. fdisk または parted を使って MBR パーティションを表示する
[ian@atticf20 ~]$ fdisk -v
fdisk from util-linux 2.26.2
[ian@atticf20 ~]$ fdisk -l /dev/sdb
fdisk: cannot open /dev/sdb: Permission denied
[ian@atticf20 ~]$ sudo fdisk -l /dev/sdb
[sudo] password for ian: 
Disk /dev/sdb: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000404d6

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sdb1              63    401624    401562 196.1M 83 Linux
/dev/sdb2          401625 252786687 252385063 120.4G 83 Linux
/dev/sdb3       252786688 375631871 122845184  58.6G 83 Linux
/dev/sdb4       375647895 488392064 112744170  53.8G 83 Linux
[ian@atticf20 ~]$ sudo parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help u
  unit UNIT                                set the default unit to UNIT

	UNIT is one of: s, B, kB, MB, GB, TB, compact, cyl, chs, %, kiB, MiB,
        GiB, TiB
(parted) u s
(parted) p         
Model: ATA HDT722525DLA380 (scsi)
Disk /dev/sdb: 488397168s
Sector size (logical/physical): 512B/512B
Partition Table     : msdos
Disk Flags: 

Number  Start       End         Size        Type     File system  Flags
 1      63s         401624s     401562s     primary  ext3
 2      401625s     252786687s  252385063s  primary  ext4
 3      252786688s  375631871s  122845184s  primary  ext3
 4      375647895s  488392064s  112744170s  primary  ext4

(parted) q

セクターのサイズが論理的にも物理的にも指定されていることに注意してください。2009年後半以降、ハード・ディスク・メーカーは、ディスク上のセクターをより大きなものへと移行し始めました。大きなセクターにすると、パフォーマンスが向上するとともに、エラー回復率も向上します。こうした大きな 4 K セクターを採用するディスクは、IDEMA (International Disk Drive Equipment and Materials Association: 国際ディスクドライブ協会) によって Advanced Format と呼ばれるようになりました。詳しくは「参考文献」を参照してください。ほとんどのオペレーティング・システムは、512 バイトのセクターを想定しているため、Advanced Format のディスクは 512 バイト・セクターのエミュレーション機能を提供しています。4096 の倍数である論理セクター (セクター 0、8、16 など) からパーティションが始まっていれば、パフォーマンスは全般的に向上します。

parted または fdisk のいずれかを使用すると、Linux システムでの公称ジオメトリーを参照することができます。古い Linux システムでも /proc ファイルシステムの /proc/ide/hda/geometry などのファイル (このファイルは、新しいシステムには存在しない場合があります) にジオメトリーがレポートされています。

2 つの異なるパーティショニング・プログラムが、公称ディスク・ジオメトリーをそれぞれに異なって理解すると、一方のパーティショニング・プログラムが作成したパーティションに対し、もう一方のパーティショニング・プログラムがエラー、または問題の可能性を報告する場合があります。このような問題は、システム間の BIOS 機能が異なる場合はなおさらのこと、ディスクがあるシステムから別のシステムに移動されたときにも起こることがあります。

fdisk-u=cylinders オプションを指定すると、シリンダー単位で表示することができます。また、対話モードで u サブコマンドを使用することによって、セクター単位とシリンダー単位を切り替えることもできます。fdisk コマンドの最新バージョンでは、シリンダー単位は現在、非推奨となっていることが示されます。一方、parted コマンドは、数種類の単位をサポートします。リスト 2 に示されているのは、リスト 1 で使用したディスクと同じディクスについて、fdiskparted を使って表示したシリンダーのパーティション情報です。 parted では単位として chs (シリンダー、ヘッド、セクター) を指定して、さらに詳しい情報を表示しています。この例では、fdisk を対話形式で使用しているとともに、コマンドライン上で parted のサブコマンドのストリングを入力する方法を示しています。

リスト 2. fdisk または parted を使って MBR ディスクのジオメトリーを表示する
[ian@atticf20 ~]$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.26.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): u
Changing display/entry units to cylinders (DEPRECATED!).

Command (m for help): p
Disk /dev/sdb: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Geometry: 255 heads, 63 sectors/track, 30401 cylinders
Units: cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000404d6

Device     Boot Start   End Cylinders   Size Id Type
/dev/sdb1           1    25        25 196.1M 83 Linux
/dev/sdb2          26 15736     15711 120.4G 83 Linux
/dev/sdb3       15736 23383      7647  58.6G 83 Linux
/dev/sdb4       23384 30401      7019  53.8G 83 Linux

Command (m for help): q

[ian@atticf20 ~]$ sudo parted  /dev/sdb u cyl p u chs p
Model: ATA HDT722525DLA380 (scsi)
Disk /dev/sdb: 30401cyl
Sector size (logical/physical): 512B/512B
BIOS cylinder,head,sector geometry: 30401,255,63.  Each cylinder is 8225kB.
Partition Table   : msdos
Disk Flags: 

Number  Start     End       Size      Type     File system  Flags
 1      0cyl      24cyl     24cyl     primary  ext3
 2      25cyl     15735cyl  15710cyl  primary  ext4
 3      15735cyl  23382cyl  7646cyl   primary  ext3
 4      23383cyl  30400cyl  7018cyl   primary  ext4

Model: ATA HDT722525DLA380 (scsi)
Disk /dev/sdb: 30401,80,62
Sector size (logical/physical): 512B/512B
BIOS cylinder,head,sector geometry: 30401,255,63.  Each cylinder is 8225kB.
Partition Table   : msdos
Disk Flags: 

Number  Start       End           Type     File system  Flags
 1      0,1,0       24,254,62     primary  ext3
 2      25,0,0      15735,62,6    primary  ext4
 3      15735,62,7  23382,0,41    primary  ext3
 4      23383,0,0   30400,254,62  primary  ext4

parted の出力と fdisk の出力とでは、単位にシリンダーを使用した場合に示される開始シリンダーと終了シリンダーに明らかな違いがあることに注意してください。これは、parted ではシリンダーを 0 からカウントする一方、fdisk では 1 からカウントするためです。parted で chs 情報を表示した結果からわかるように、2 つのシリンダーがシリンダー境界から始まっておらず (ヘッドが 0 ではありません)、また 2 つのシリンダーがシリンダー境界で終わっていません (セクターが 62 ではありません)。

GPT パーティション

GUID (Globally Unique IDentifier) パーティション・テーブル (GPT) でフォーマットされたディスクには、MBR ディスクにあるようなジオメトリーの概念がありません。これらのディスクには、gdisk (GPT fdisk) コマンドか parted コマンドを使用します。MBR フォーマットのディスクで gdisk コマンドを使用すると、メモリー内でディスクが GPT フォーマットに変換されます。これを書き込んで、ディスクを変換することも可能ですが、この処理は極めてリスクが高いので、試す前にきちんとしたバックアップを取るようにしてください。

注: GPT は、幾通りもの設計方法があるなかで、BIOS ベースのシステムで使用するようには設計されておらず、GPT ディスクからブートするために UEFI ベースの (Unified Extensible Firmware Interface) システムで使用するように設計されています。パーティションを計画する際には、このことを念頭に置くようにしてください。

In リスト 3 では、-l オプションを指定して parted を実行することで、2 つの GPT ディスクを持つシステムの全ディスクの情報を表示しています。GPT ディスクの 1 つ (/dev/sda) は、Lenovo が Windows 8 をインストールした状態ではじめから提供しているソリッド・ステート・ドライブ (SSD) です。もう 1 つの GPT ディスク (/dev/sdb) は、Ubuntu 15.04 がインストールされた 16 GB の USB フラッシュ・ドライブです。

リスト 3. parted または gdisk を使って GPT パーティションを表示する
ian@yoga-u15:~$ sudo parted -l
Model: ATA SAMSUNG MZMTD512 (scsi)
Disk /dev/sda: 512GB
Sector size (logical/physical): 512B/512B
Partition Table  : gpt
Disk Flags: 

Number  Start   End     Size    File system  Name                          Flags
 1      1049kB  1050MB  1049MB  ntfs         Basic data partition          hidden, diag
 2      1050MB  1322MB  273MB   fat32        EFI system partition          boot, hidden, esp
 3      1322MB  2371MB  1049MB  fat32        Basic data partition          hidden
 4      2371MB  2505MB  134MB                Microsoft reserved partition  msftres
 5      2505MB  470GB   467GB   ntfs         Basic data partition          msftdata
 6      470GB   497GB   26.8GB  ntfs         Basic data partition          msftdata
 7      497GB   512GB   15.5GB  ntfs         Basic data partition          hidden, diag


Model:  USB DISK 2.0 (scsi)
Disk /dev/sdb: 32.1GB
Sector size (logical/physical): 512B/512B
Partition Table  : gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  316MB   315MB                         bios_grub
 2      316MB   4510MB  4194MB  linux-swap(v1)
 3      4510MB  32.1GB  27.6GB  ext4

ian@yoga-u15:~$ sudo gdisk -l /dev/sdb
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sdb: 62685184 sectors, 29.9 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): FEE4E37D-AE90-43A1-A6A7-97ADA4618384
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 62685150
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          616447   300.0 MiB   EF02  
   2          616448         8808447   3.9 GiB     8200  
   3         8808448        62683135   25.7 GiB    8300

MBR パーティションのタイプ

MBR 用にフォーマットされた IDE ドライブのパーティションには、基本 (primary)、論理 (logical)、拡張 (extended) という 3 つのタイプがあります。パーティション・テーブルが配置されるのは、ディスクのマスター・ブート・レコード (MBR) です。MBR はディスク上の 1 番目のセクターなので、パーティション・テーブルがこのセクターで占める部分はそれほど大きくありません。そのため、ディスク上の基本パーティションの数は 4 に制限されます。これより多くのパーティションが必要になることは珍しくありませんが、その場合には、基本パーティションの 1 つが拡張パーティションに変更されることになります。拡張パーティションは 1 つまたは複数の論理パーティション用のコンテナーです。このように、MBR レイアウトを使用して 1 つのドライブ上に 4 つを上回る数のパーティションを作成することができます。

MBR レイアウトでは、サポートされるディスク容量にも制限があり、最大容量は約 2 TB に制限されます。新しい GUID パーティション・テーブル (GPT) レイアウトでは、この容量の制限が解消されており、パーティションの数に対する制限もかなり緩和されています。GPT レイアウトを使用してフォーマットしたディスクは、最大で 128 の基本パーティションにデフォルトで対応しており、拡張パーティションや論理パーティションは使用しません。MBR の内部構造や GPT の仕組みについての詳しい情報は、「MBR、EBR、GPT、LVM の内部構造」を参照してください。

拡張パーティションは、1 つ以上 (通常は複数) の論理パーティションのコンテナーに過ぎません。このパーティション方式は、元々 MS DOS と PC DOS で使用されていたもので、この方式により、PC ディスクが DOS、Windows、または Linux システムで使用できるようになります。拡張パーティションは 1 つだけ使うことができ、その拡張パーティション内の領域は連続した領域になっていなければなりません。データが保管されるのは拡張パーティション内の論理パーティションなので、拡張パーティションのなかに論理パーティションを作成してからでないと、データを拡張パーティションに保管することはできません。

Linux では基本パーティションまたは拡張パーティションに 1 から 4 までの番号を付けます。従って、dev/sda が /dev/sda1、/dev/sda2、/dev/sda3、/dev/sda4 という 4 つの基本パーティションを持つこともあれば、最大 3 つの基本パーティションと 1 つの拡張パーティションを持つこともあります。/dev/sda1 という 1 つの基本パーティションと /dev/sda2 という拡張パーティションを持つのが、よくあるレイアウトです。論理パーティションが定義される場合には 5 の番号から付けられるため、/dev/sda 上の 1 番目の論理パーティションは /dev/sda5 となります。これは、ディスク上に基本パーティションがなく、1 つの拡張パーティション (/dev/sda1) のみがある場合でも変わりません。つまり、IDE ドライブに 5 つ以上のパーティションが必要な場合には、拡張パーティションまでのパーティションの番号が 1 つなくなるということです。ホットプラグ対応のカーネルの場合、IDE ドライブ上で使用できる理論上の最大パーティション数は現在 15 となっていますが、最後のいくつかのパーティションについては、作成できることもあれば、作成できないこともあります。ドライブ上で 12 を超えるパーティションを使用しようと計画している場合には、すべてが機能することを慎重に確認してください。

parted コマンド p を、基本パーティション、拡張パーティション、論理パーティションが設定された Fedora 22 システムの内部ドライブに対して実行した場合の出力をリスト 4 に記載します。ファイルシステムのタイプの違いに注意して、GPT のリストをはじめとするこれまでのリストと、リスト 4 を比較してください。

リスト 4. MBR パーティション・タイプの例
[ian@atticf20 ~]$ sudo parted /dev/sda p
Model: ATA WDC WD6401AALS-0 (scsi)
Disk /dev/sda: 640GB
Sector size (logical/physical): 512B/512B
Partition Table  : msdos
Disk Flags: 

Number  Start   End     Size    Type      File system     Flags
 1      32.3kB  1045MB  1045MB  primary   ext3
 2      1045MB  11.5GB  10.5GB  primary   linux-swap(v1)
 4      11.5GB  640GB   629GB   extended
 5      11.5GB  85.7GB  74.2GB  logical   ext4            boot
 6      85.7GB  159GB   73.4GB  logical   ext4
 7      159GB   233GB   74.1GB  logical   ext4
 8      233GB   307GB   74.1GB  logical   ext3
 9      307GB   381GB   73.9GB  logical   ext3
10      381GB   470GB   89.1GB  logical   ext4
11      470GB   552GB   82.2GB  logical   ext4
12      552GB   640GB   87.7GB  logical   ext4

論理ボリューム・マネージャー (LVM)

さまざまなタイプのパーティションについて理解したところで、各種パーティションに対して適切なサイズを計画しなかった場合はどうなるのだろうと思っている読者もいるのではないでしょうか。パーティションを拡張したり、縮小したりするにはどのようにすればよいのでしょう?あるいは、大容量のファイルシステムが 1 つのディスクには収まらない領域を必要とする場合はどうなるのでしょう?そこで登場するのが、論理ボリューム・マネージャー (LVM) です。

LVM を使用すると、ディスク領域の管理を抽象化することができるため、1 つのファイルシステムが複数のディスクやパーティションにまたがることが可能になり、ファイルシステムに必要な領域を追加したり、必要ない領域を削除したりすることができます。LVM の最新バージョンである lvm2 は初期バージョンである lvm (今では lvm1 と呼ばれることもあります) と後方互換性があります。

LVM はディスク領域を管理する際に以下のものを使用します。

  • 物理ボリューム (PV)
  • ボリューム・グループ (VG)
  • 論理ボリューム (LV)

物理ボリューム (PV) は、1 つのドライブ上のドライブ全体もしくは 1 パーティションのことです。LVM ではパーティションを定義しなくても、ドライブ全体を使用することができますが、通常これはあまり望ましいことではありません。このことについては後ほど、「MBR、EBR、GPT、LVM の内部構造」セクションで説明します。

ボリューム・グループ (VG) は、1 つ以上の PV の集まりです。たとえ PV の集まりが複数のパーティションや複数のディスクにまたがっている場合でも、VG の領域は、それがあたかも 1 つの大容量ディスクであるかのように管理されます。VG を構成する各 PV は異なるサイズにすることも、異なる種類のディスクにすることも可能です。これについては、この後すぐに説明します。

論理ボリューム (LV) は、ext4 や XFS といった特定のタイプのファイルシステムでフォーマットされて Linux ファイルシステムの一部としてマウントされた領域の一単位です。この点で、GPR や MBR などの物理パーティションと似ています。LV は完全に 1 つの VG 内に収容されます。

PV は、仮想ドライブに似た VG と呼ばれる抽象グループに集められる物理領域の一単位であると考えてください。VG や仮想ドライブは、LV にパーティション化されてファイルシステムで使用されます。

VG の内部では、エクステントの観点で領域を管理します。デフォルトのエクステントのサイズは 4 MB であり、通常はこのサイズで妥当です。これよりも大きなエクステント・サイズを使用する場合には、VG 内のすべての PV で同じエクステント・サイズを使用しなければならないことに注意してください。LV を割り当てたり、LV のサイズを変更したりする際には、その割り当てる単位がエクステント・サイズになります。従ってデフォルトで LV は 4 MB の倍数のサイズになり、4 MB 単位で拡張したり、縮小したりしなければなりません。

LVM パズルの最後のピースは、デバイス・マッパーです。Linux カーネルの一部であるデバイス・マッパーは、LVM やソフトウェア RAID などの仮想デバイスの全体的な基盤を提供します。

LVM を操作するためのコマンドは、通常 lvm2 パッケージの中にあります。これらのコマンドはコマンドラインから実行することも、lvm コマンドを実行することで各種 LVM コマンドを実行するためのシェルを起動して、そのシェルから実行することでもできます。リスト 5lvm コマンドと、それによって起動されるシェルから実行できる各種コマンドを示します。他のパーティショニング・ツールと同様に、root 権限がないと、使用できる機能が限られてしまいます。

リスト 5. lvm コマンドとそのサブコマンド
[[ian@atticf20 ~]$ lvm
  WARNING: Running as a non-root user. Functionality might be unavailable.
lvm> help
  /run/lvm/lvmetad.socket: connect failed: Permission denied
  WARNING: Failed to connect to lvmetad. Falling back to internal scanning.
  Available lvm commands:
  Use 'lvm help <command>' for more information
   
  devtypes        Display recognised built-in block device types
  dumpconfig      Dump configuration
  formats         List available metadata formats
  help            Display help for commands
  lvchange        Change the attributes of logical volume(s)
  lvconvert       Change logical volume layout
  lvcreate        Create a logical volume
  lvdisplay       Display information about a logical volume
  lvextend        Add space to a logical volume
  lvmchange       With the device mapper, this is obsolete and does nothing.
  lvmdiskscan     List devices that can be used as physical volumes
  lvmsadc         Collect activity data
  lvmsar          Create activity report
  lvreduce        Reduce the size of a logical volume
  lvremove        Remove logical volume(s) from the system
  lvrename        Rename a logical volume
  lvresize        Resize a logical volume
  lvs             Display information about logical volumes
  lvscan          List all logical volumes in all volume groups
  pvchange        Change attributes of physical volume(s)
  pvresize        Resize physical volume(s)
  pvck            Check the consistency of physical volume(s)
  pvcreate        Initialize physical volume(s) for use by LVM
  pvdata          Display the on-disk metadata for physical volume(s)
  pvdisplay       Display various attributes of physical volume(s)
  pvmove          Move extents from one physical volume to another
  pvremove        Remove LVM label(s) from physical volume(s)
  pvs             Display information about physical volumes
  pvscan          List all physical volumes
  segtypes        List available segment types
  tags            List tags defined on this host
  vgcfgbackup     Backup volume group configuration(s)
  vgcfgrestore    Restore volume group configuration
  vgchange        Change volume group attributes
  vgck            Check the consistency of volume group(s)
  vgconvert       Change volume group metadata format
  vgcreate        Create a volume group
  vgdisplay       Display volume group information
  vgexport        Unregister volume group(s) from the system
  vgextend        Add physical volumes to a volume group
  vgimport        Register exported volume group with system
  vgmerge         Merge volume groups
  vgmknodes       Create the special files for volume group devices in /dev
  vgreduce        Remove physical volume(s) from a volume group
  vgremove        Remove volume group(s)
  vgrename        Rename a volume group
  vgs             Display information about volume groups
  vgscan          Search for all volume groups
  vgsplit         Move physical volumes into a new or existing volume group
  version         Display software and driver version information
lvm> quit
  Exiting.

実際に動作している LVM の簡単な例を示すために、リスト 6 に USB ドライブ上の 2 つの PV を示します。ここでは pvscan コマンドを使用することで、システム上の PV を表示しています。

リスト 6. PV を表示する
[ian@atticf20 ~]$ sudo pvscan
  PV /dev/sde8         lvm2 [137.58 GiB]
  PV /dev/sde7         lvm2 [137.06 GiB]
  Total: 2 [274.64 GiB] / in use: 0 [0   ] / in no VG: 2 [274.64 GiB]

ここで、vgcreate コマンドを使用して、これらの 2 つの PV から 1 つの VG を作成し、続いてlvcreate コマンドを使用して、いずれの PV よりもサイズの大きい LV を作成します。最後に新しい LV を ext4 でフォーマットし、/mnt/lvdemo にマウントしました。これらをリスト 7 に示します。

リスト 7. VG と LV を作成する
[ian@atticf20 ~]$ sudo vgcreate demo-vg /dev/sde7 /dev/sde8
  Volume group "demo-vg" successfully created
[ian@atticf20 ~]$ sudo lvcreate -L 200G -n demo-lv demo-vg
  Logical volume "demo-lv" created.
[ian@atticf20 ~]$ sudo lvscan
  ACTIVE            '/dev/demo-vg/demo-lv' [200.00 GiB] inherit
[ian@atticf20 ~]$ sudo mkfs -t ext4 /dev/demo-vg/demo-lv
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 52428800 4k blocks and 13107200 inodes
Filesystem UUID: d8589116-f58f-4e09-ac70-77543afd49da
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done     

[ian@atticf20 ~]$ sudo mkdir /mnt/lvdemo
[ian@atticf20 ~]$ sudo mount /dev/demo-vg/demo-lv /mnt/lvdemo
[ian@atticf20 ~]$ sudo df -h /mnt/lvdemo/
Filesystem                     Size  Used Avail Use% Mounted on
/dev/mapper/demo--vg-demo--lv  197G   60M  187G   1% /mnt/lvdemo

注:

  • mkfsmount などのファイルシステム・コマンドで LV にアクセスする際には、/dev/<VG 名>/<LV 名> のように名前を指定します。
  • LV を作成すると、リスト 7 の lvscan コマンドの出力に示されるように、その LV はデフォルトで即座にアクティブになります。リムーバブル・ドライブ上に LV を作成した場合、そのドライブをシステムから取り外すには、ドライブ上にマウントされているファイルシステムをすべてアンマウントした後、lvchange コマンドを使用して、そのドライブをアクティブでない状態にしてから取り外す必要があります。

MBR、EBR、GPT、LVM の内部構造

ディスク領域を割り当てる方法は理解するのが難しいかもしれないので、その説明をする前にちょっと回り道をして、MBR、EBR、GPT、LVM の各パーティション・テーブルの内部構造について説明することで、ディスク領域の割り当ての概念を理解する助けになるようにします。
注: ここで説明する詳細な内容は LPI 試験には必要ないので、時間がない方や内部構造にあまり興味がない方は、このセクションを読み飛ばして「ディスク領域の割り当て」まで進んでいただいて構いません。

マスター・ブート・レコード (MBR)

マスター・ブート・レコード (MBR) は、ハード・ディスク上の先頭のセクターにあります。MBR にはブートストラップ・コードと、場合によってはそれ以外の情報が含まれており、それに続いて 64 バイトのパーティション・テーブルと 2 バイトのブート・シグニチャーがあります。64 バイトのパーティション・テーブルは、オフセット 446 (1BEh) を先頭に 4 つの 16 バイトのエントリーで構成されています。表 2 にその 16 バイトの各エントリーのレイアウトを示します。

表 2. パーティション・テーブルのエントリーのフォーマット
オフセット (hex) 長さ説明
0h1ステータス。80h の場合、アクティブな (つまりブート可能な) パーティションであることを示します。
1h3パーティション内の先頭の絶対セクターの CHS (シリンダー、ヘッド、セクター) アドレス。
4h1パーティション・タイプ。
5h3パーティション内の末尾の絶対セクターの CHS (シリンダー、ヘッド、セクター) アドレス。
8h4パーティション内の先頭の絶対セクターの論理ブロック・アドレス (LBA)。
Ch4パーティション内のセクターの総数。

L実際の例を見てみましょう。root ユーザーは dd コマンドを使用して、ディスクから直接セクターを読み取ることができます。リスト 8 に示すのは、/dev/sda 上の MBR の先頭 510 バイトのダンプ出力から、tail コマンドによってレコードの最後の 64 バイトのみを選択し、16 進で表示した結果です。

リスト 8. /dev/sda 上のパーティション・テーブルを表示する
[root@atticf20 ~]# dd if=/dev/sda bs=510 count=1 2>/dev/null|tail -c 64 |hexdump -C
00000000  00 01 01 00 83 fe 3f 7e  3f 00 00 00 80 21 1f 00  |......?~?....!..|
00000010  00 00 01 7f 82 fe ff ff  bf 21 1f 00 3b 8b 38 01  |.........!..;.8.|
00000020  00 fe ff ff 83 fe ff ff  00 70 85 4a 00 10 00 00  |.........p.J....|
00000030  00 fe ff ff 05 fe ff ff  37 ad 57 01 8a c1 2d 49  |........7.W...-I|
00000040

上記レコードには、ブート可能なパーティションであることを示す 80h というステータスがないことに注目してください。パーティション・タイプは、83h (Linux)、82h (Linux スワップ)、05h (拡張) となっているので、ディスクには 3 つの基本パーティションと 1 つの拡張パーティションがあります。CHS の値は、先頭のパーティションを除くすべてのパーティションで、LBA を使用するディスクの標準的な値である feffff になっています。各パーティションの先頭セクターの LBA と、それぞれのパーティションに含まれる総セクター数は、32 ビットのリトル・エンディアンの整数として解釈されるので、80 21 1f 00 は 001f2180h (10 進で 2040192) を表しています。つまり、先頭のパーティションはセクター 63 (3fh) で始まり、2040192 セクター分の領域を持つことになるため、fdisk を実行すると、末尾のセクターとして 63+2040192-1=2040254 が示されるはずです。

この例では、最後の行 (パーティション・タイプ 05h) が拡張パーティションを表しており、このパーティションはセクター 0157ad37h (10 進で 22523191) で始まっています。この数字は、論理パーティションを調べるときにだけ必要となります。

注:

  • MBR のパーティション・テーブルには、拡張パーティションのコンテナーを表すレコード以外に、論理パーティションに関する情報は含まれていません。この後まもなく、論理パーティションに関する情報を調べる方法を説明します。
  • ディスクで使用しているのが LBA の値ではなく、CHS の値である場合は、CHS の値を絶対セクターに変換するための演算を追加で行う必要があります。CHS の計算は、絶対セクターを調べるために別の演算を使用すること以外は、ここまで概説したのと基本的に同じなので、この簡単な紹介の中では説明しません。
リスト 9. /dev/sda に対して fdisk を実行したときの出力
[ian@atticf20 ~]$ sudo fdisk -l /dev/sda
Disk /dev/sda: 596.2 GiB, 640135028736 bytes, 1250263728 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00064a1a

Device     Boot      Start        End    Sectors   Size Id Type
/dev/sda1               63    2040254    2040192 996.2M 83 Linux
/dev/sda2          2040255   22523129   20482875   9.8G 82 Linux swap / Solaris
/dev/sda3       1250258944 1250263039       4096     2M 83 Linux
/dev/sda4         22523191 1250258624 1227735434 585.4G  5 Extended
/dev/sda5  *      22523193  167397299  144874107  69.1G 83 Linux
/dev/sda6        167397363  310761359  143363997  68.4G 83 Linux
/dev/sda7        310761423  455442749  144681327    69G 83 Linux
/dev/sda8        455442813  600092009  144649197    69G 83 Linux
/dev/sda9        600092073  744436034  144343962  68.8G 83 Linux
/dev/sda10       744436098  918439935  174003838    83G 83 Linux
/dev/sda11       918441984 1079044095  160602112  76.6G 83 Linux
/dev/sda12      1079053983 1250258624  171204642  81.7G 83 Linux

Partition table entries are not in disk order.

実際に /dev/sda1 は 2040254 で終わっています。

パーティション・テーブルのエントリーは、実際のディスク上の順番で並んでいるわけではないことを示す警告が表示されていることに注意してください。この警告が表示されているのは、/dev/sda3 は上記ポイントを説明するためにディスクの末尾に追加された小さな基本パーティションであるからです。これはエラーではありませんが、fdisk プログラムをはじめとするいくつかのツールには、実際の順番通りにパーティション・テーブルを作り直すオプションが用意されています。

拡張ブート・レコード (EBR)

拡張パーティションについてさらに詳しく見ていく前に、gparted コマンドによるグラフィカルな出力を少しだけ見てみましょう。gparted コマンドによって、パーティション・レイアウトをグラフィカルに表現した図表が表示され、そこには拡張パーティションが持つコンテナーの性質も示されます。

図 1 に、/dev/sda に対して gparted コマンドを実行すると表示される画面を示します。前述したように、ディスクには 3 つの基本パーティション (/dev/sda1、/dev/sda2、/dev/sda4) と、(画面での表示順が最後になっている) 1 つの拡張パーティション (/dev/sda3) があります。拡張パーティションには、/dev/sda5 から /dev/sda12 までの論理パーティションが含まれています。この画像の上部でパーティションを図で表している部分では、拡張パーティションは、論理パーティションを包含する (水色の) フレームとして示されています。図 2 には、LVM パーティションを含む USB ドライブのパーティションを示します。これらのパーティションは LVM としてフラグが付けられており、図 1 の /dev/sda5 にはブート・フラグがセットされていることに注意してください。

図 1. gparted を使用して、複数のパーティション・タイプで構成される /dev/sda のパーティションを表示する
gparted を使用して、複数のパーティション・タイプで構成される /dev/sda のパーティションを表示した画面のスクリーン・キャプチャー
gparted を使用して、複数のパーティション・タイプで構成される /dev/sda のパーティションを表示した画面のスクリーン・キャプチャー
図 2. gparted を使用して、複数のパーティション・タイプで構成される /dev/sde のパーティションを表示する
gparted を使用して、複数のパーティション・タイプで構成される /dev/sde のパーティションを表示した画面のスクリーン・キャプチャー
gparted を使用して、複数のパーティション・タイプで構成される /dev/sde のパーティションを表示した画面のスクリーン・キャプチャー

前述のように、MBR には論理パーティション用のパーティション・テーブルのエントリーが含まれることはありません。MBR では、システムの残りの部分を 1 つの特別なパーティションのようなものと見なすコンテナーを定義します。論理パーティションが定義されるのは、このコンテナーの中においてです。ではこのコンテナーはどのように動作するのでしょう?

1 つの拡張パーティション内の論理パーティションの数にハード・リミットはないため、論理パーティションを定義する固定サイズのパーティション・テーブルはありません。代わりに、論理パーティションごとに拡張ブート・レコード (EBR) があります。MBR と同じく、EBR は長さが 512 バイトで、オフセット 446 (1BEh) にあるパーティション・テーブルを使用します。EBR パーティション・テーブルの中では 2 つのエントリーのみが使用されます。1 番目のエントリーは、現在の論理パーティションのオフセットとサイズを定義します。2 番目のエントリーは、次の論理パーティションのオフセットと総セクター数を定義します。この単方向チェーンの最後の論理パーティションでは、2 番目のエントリーにはゼロが入ります。

リトル・エンディアンの 16 進数を 10 進数に変換する作業を楽にするために、ある EBR を基準にした 2 つの論理パーティションのエントリーを表示するための bash による簡単な関数を作成します。そして、フォーマット指定されたストリングを表示する hexdump コマンドの機能を利用して、各論理パーティションの先頭セクターの LBA と総セクター数を 16 進ではなく 10 進で表示するようにします。リスト 10showebr 関数を示します。この関数定義を皆さんの Bash ターミナル・セッションに貼り付けて試してみてください。

リスト 10. EBR を表示するための関数
showebr () 
{ 
    dd if=$1 skip=$2 bs=512 count=1 2> /dev/null | tail -c 66 | 
     hexdump -n 32 -e '"%07.7_ax  " 8/1 "%2.2x " 2/4 " %12d" "\n"'
}

1 番目の論理パーティションの EBR は拡張パーティションの先頭セクターなので、新しく作成したshowebr 関数とリスト 8 の MBR 内にあったセクター・オフセット 0157AD37h (10 進で 22523191) を使用して、この先頭セクターを表示してみます。

リスト 11 にその出力を示します。

リスト 11. /dev/sda 上の 1 番目の論理パーティションの EBR
[root@atticf20 ~]# showebr /dev/sda 22523191
0000000  80 fe ff ff 83 fe ff ff            2    144874107
0000010  00 fe ff ff 05 fe ff ff    144874109    143364060

この EBR のパーティション・テーブルの 1 番目のエントリー (/dev/sda5) には、この EBR からのオフセットが 2 のセクターで始まって 144874107 個のセクターを含むことから 22523191 + 2 + 144874107 -1 = 167397299 セクターで終わる論理パーティション (/dev/sda5) が示されています。2 番目のエントリー (/dev/sda6) には、拡張パーティション内の「1 番目」の論理パーティションの EBR からのオフセットが 144874109 のセクター (つまり、22523191 + 144874109 = 167397300 セクター) で始まる、次の論理パーティションの EBR が示されており、その総セクター数は「次の」論理パーティションの EBR の先頭から、その論理パーティションの最後までのセクター数 (つまり、143364060) になっていることから、末尾のセクターは 167397300 + 143364060 -1 = 310761359 セクターになります。

リスト 12 に /dev/sda 上の拡張パーティションと論理パーティションに関するパーティション情報を示します。/dev/sda6 の総セクター数は 143363997 であり、今見たばかりの 143364060 より 63 セクター小さくなっています。/dev/sda6 の先頭セクターも、今計算したばかりの 167397300 ではなく、167397363 になっており、63 セクター分、シフトしています。この後、EBR チェーンを見ていくと、63 セクターの違いは「次の EBR」に見られるオフセットであることがすぐにわかります。

リスト 12. /dev/sda 上の拡張パーティションと論理パーティション
Device     Boot      Start        End    Sectors   Size Id Type
/dev/sda4         22523191 1250258624 1227735434 585.4G  5 Extended
/dev/sda5  *      22523193  167397299  144874107  69.1G 83 Linux
/dev/sda6        167397363  310761359  143363997  68.4G 83 Linux
/dev/sda7        310761423  455442749  144681327    69G 83 Linux
/dev/sda8        455442813  600092009  144649197    69G 83 Linux
/dev/sda9        600092073  744436034  144343962  68.8G 83 Linux
/dev/sda10       744436098  918439935  174003838    83G 83 Linux
/dev/sda11       918441984 1079044095  160602112  76.6G 83 Linux
/dev/sda12      1079053983 1250258624  171204642  81.7G 83 Linux

今学んだことを showebr 関数とインライン・シェル演算と併せて用いると、リスト 13 に示すように /dev/sda の全 EBR チェーンを調べることができます。

リスト 13. /dev/sda 上の論理パーティションのチェーンを調べる
[root@atticf20 ~]# showebr /dev/sda 22523191
0000000  80 fe ff ff 83 fe ff ff            2    144874107
0000010  00 fe ff ff 05 fe ff ff    144874109    143364060
[root@atticf20 ~]# showebr /dev/sda $(( 22523191 + 144874109 ))
0000000  00 fe ff ff 83 fe ff ff           63    143363997
0000010  00 fe ff ff 05 fe ff ff    288238169    144681390
[root@atticf20 ~]# showebr /dev/sda $(( 22523191 + 288238169 ))
0000000  00 fe ff ff 83 fe ff ff           63    144681327
0000010  00 fe ff ff 05 fe ff ff    432919559    144649260
[root@atticf20 ~]# showebr /dev/sda $(( 22523191 + 432919559 ))
0000000  00 fe ff ff 83 fe ff ff           63    144649197
0000010  00 fe ff ff 05 fe ff ff    577568819    144344025
[root@atticf20 ~]# showebr /dev/sda $(( 22523191 + 577568819 ))
0000000  00 fe ff ff 83 fe ff ff           63    144343962
0000010  00 fe ff ff 05 fe ff ff    721912844    174003901
[root@atticf20 ~]# showebr /dev/sda $(( 22523191 + 721912844 ))
0000000  00 fe ff ff 83 fe ff ff           63    174003838
0000010  00 fe ff ff 05 fe ff ff    895916745    160604160
[root@atticf20 ~]# showebr /dev/sda $(( 22523191 + 895916745 )) #/dev/sda11
0000000  00 fe ff ff 83 fe ff ff         2048    160602112
0000010  00 fe ff ff 05 fe ff ff   1056530729    171204705
[root@atticf20 ~]# showebr /dev/sda $(( 22523191 + 1056530729 ))
0000000  00 fe ff ff 83 fe ff ff           63    171204642
0000010  00 00 00 00 00 00 00 00            0            0

これで、/dev/sda6 には実際に、前述の違いを表す 63 セクターのオフセットがあることがわかります。この例では、他の大部分のパーティションにも 63 セクターのオフセットがあります。こうしたことは、ほとんどの Windows システムと Linux システムに以前からあることでした。Advanced Format ディスクと、これまでよりも大きいサイズのセクターが登場したこと、さらにはパーティション・アラインメントがパフォーマンスにとってより重要となるソリッド・ステート・ドライブ (SSD) が登場したことで、今ではパーティションを特定の境界にアラインできるようになっています。/dev/sda11 のオフセットは 2048 セクターであることに注意してください。

図 1 を見て、/dev/sda11 と /dev/sda12 の間に小さなギャップがあることにお気づきの方もいるかもしれません。ここまでで理解したことを活用すれば、/dev/sda11 に関して、拡張パーティションの先頭セクターと EBR からの値を用いてギャップのサイズを計算することができるはずです。

GUID パーティション・テーブル (GPT)

先ほど、MBR レイアウトでは、セクター・サイズが 512 バイトのディスクの最大容量が 2 TB に制限されることを説明しましたが、2 TB を超える容量のディスクが登場するのに伴い、GUID (Globally Unique IDentifier) パーティション・テーブル (GPT) と呼ばれる新しいレイアウトが設計されました。このフォーマットは容量の小さなディスクで使用することもできますが、大容量のディスクには不可欠なフォーマットです。この GPT レイアウトでディスクをフォーマットすると、通常の MBR の場所にはいわゆる「保護 (Protective) MBR」が配置されるため、GPT に対応していないオペレーティング・システムやユーティリティーでは、認識できないパーティション・タイプ (EEh) として、ディスク全体を把握することになり、その見かけのサイズは、ディスク全体のサイズ、もしくは MBR がそのディスクのセクター・サイズに対してサポートする最大サイズのいずれかになります。

最近の Linux ディストリビューションには GPT でディスクをフォーマットしたり、GPT ディスクからブートしたりするためのツールが含まれています。こうしたツールには、(fdisk に似ている) gdiskpartedgpartedgrub2、そして最新バージョンの grub などがあります。

また最近の Linux システムでも、従来の PC BIOS または新しい EFI (Extensible Firmware Interface: 拡張ファームウェア・インターフェース) のいずれかを使用した、GPT パーティションからのブートをサポートしています。Windows の場合、最近の 64 ビット版の Windows では EFI を使用した、GPT パーティションからのブートをサポートしており、Windows 8 でもこのサポートが必須となっています。

GPT パーティションには、GPT ヘッダーと GPT パーティション配列が含まれています。GPT パーティション配列には少なくとも 128 のエントリーが含まれるため、GPT ディスクは最低限 128 の基本パーティションをサポートすることができます。GPT ヘッダーは GPT パーティションの先頭セクターにあり、その次のセクターに GPT パーティション配列が続きます。GPT ヘッダーと GPT パーティション配列はパーティションの最後で繰り返されます。さらなる保護のために、GPT ヘッダーには GPT パーティション配列の 32 ビット CRC も含まれています。

リスト 14 に、Windows 8.1 を搭載したノート PC 上で、SSD プライマリー・ディスク (/dev/sda) に対して gdisk コマンドを実行したときの出力と、ここまでの例で使用した Ubuntu 15.04 システム用に必要なパーティションが含まれた 32 GB USB フラッシュ・ドライブ (/dev/sdb) に対して gdisk コマンドを実行したときの出力を示します。EFI システム・パーティション (/dev/sda2) は、UEFI ブート・ローダーがブート対象ファイルを探す場所であることに注意してください。

リスト 14. /dev/sdc に対する gdisk コマンドの出力
ian@yoga-u15:~$ sudo gdisk -l /dev/sda 
GPT fdisk (gdisk) version 0.8.10

The protective MBR's 0xEE partition is oversized! Auto-repairing.

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 1000215216 sectors, 476.9 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 2D3D303D-0161-4AB2-A713-41DD1A88A647
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 1000215182
Partitions will be aligned on 2048-sector boundaries
Total free space is 2669 sectors (1.3 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2050047   1000.0 MiB  2700  Basic data partition
   2         2050048         2582527   260.0 MiB   EF00  EFI system partition
   3         2582528         4630527   1000.0 MiB  ED01  Basic data partition
   4         4630528         4892671   128.0 MiB   0C01  Microsoft reserved ...
   5         4892672       917575679   435.2 GiB   0700  Basic data partition
   6       917575680       970004479   25.0 GiB    0700  Basic data partition
   7       970004480      1000214527   14.4 GiB    2700  Basic data partition
ian@yoga-u15:~$ sudo gdisk -l /dev/sdb
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sdb: 62685184 sectors, 29.9 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): FEE4E37D-AE90-43A1-A6A7-97ADA4618384
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 62685150
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          616447   300.0 MiB   EF02  
   2          616448         8808447   3.9 GiB     8200  
   3         8808448        62683135   25.7 GiB    8300

GPT については、チュートリアル「Make the most of large drives with GPT and Linux」に詳しい情報が記されています (「参考文献」を参照)。

LVM

先ほど、LVM は最初にディスクにパーティションを作成しなくても、ディスク全体を利用することができると説明しましたが、GPT が保護 MBR を使用するのと同じ理由から、LVM ネイティブの機能を使用してディスク全体を PV として定義せずに、最初にディスクにパーティションを作成しておいてから、そのパーティションに PV を作成する方が良いでしょう。そうすることで、LVM に対応していないオペレーティング・システムでも、そのディスクのことをフォーマットされていないとみなすのではなく、認識できないパーティションでフォーマットされていると判断するようになるはずです。

LVM で使用される抽象化層の管理には、明らかに元の MBR パーティション・テーブルよりもかなり多くの情報が必要になります。PV にパーティションを作成することをお勧めする以外には、LVM が使用するディスク上のデータ構造について、この記事で詳しく説明することはしません。

ディスク領域の割り当て

前述のとおり、Linux ファイルシステムは / をルートに持つ 1 つの大きなツリーです。皆さんは、少なくとも Filesystem Hierarchy Standard にファイルシステムの情報が記述されていることを望んでいることと思います。それには、表 1 に戻って、これらの情報が記載されたリストを参照するか、「参考文献」を参照してください。フロッピー・ディスクや CD-ROM 上のデータをマウントしなければならない理由は至って明白ですが、ハード・ディスクに保管されたデータの区分を考慮しなければならない理由については、それほど明白ではないかもしれません。ファイルシステムを区分する正当な理由には、例えば以下のものがあります。

  • ブート・ファイル。一部のファイルは、ブート時に BIOS、UEFI、またはブート・ローダーにアクセス可能でなければなりません。
  • 複数のハード・ディスク。通常、各ハード・ディスクは 1 つ以上のパーティションに分割され、それぞれのパーティションのファイルシステムは、ファイルシステム・ツリーのいずれかの場所にマウントする必要があります。
  • 共有可能ファイル。複数のシステム・イメージが、静的ファイル (例えば実行可能プログラム・ファイルなど) を共有する場合があります。また、ユーザーが同じホーム・ディレクトリーとメール・システムを使用して、ネットワーク上のどのマシンにもログインできるようにするため、ユーザーのホーム・ディレクトリーやメール・スプール・ファイルなどの動的ファイルを共有する場合もあります。
  • オーバーフローの可能性。あるファイルシステムがその容量の 100 パーセントを使い果たす可能性がある場合、通常はシステムを実行するために必要なファイルから、そのファイルを分離することが得策となります。
  • クォータ。クォータは、ユーザーまたはグループがファイルシステムで使用できる容量を制限します。
  • 読み取り専用マウント。ジャーナリング・ファイルシステムが登場する以前は、システム・クラッシュ後にファイルシステムのリカバリーをするには大抵、長い時間がかかりました。そのため、ほとんど変更されることのないファイルシステム (例えば、実行可能プログラムのディレクトリーなど) については、システム・クラッシュ後のチェックにかかる時間を短くするために、読み取り専用でマウントすることができます。

ここまでで取り上げてきたファイルシステムの使用法に加え、ディスク上のスワップ領域の割り当てについても考慮しなければなりません。Linux システムの場合、スワップ領域は通常 1 つ、場合によっては複数の専用パーティションとなります。

最後に、BIOS ではなく UEFI ファームウェアを備えたシステムに必要なパーティションについて検討することと、GPT フォーマットのディスクと MBR フォーマットのディスクのどちらを使用するべきかを検討することが必要かもしれません。

適切な選択

例えば、1 つ以上のハード・ディスクを搭載したシステムをセットアップし、ハード・ディスクからブートすることを計画しているとします (このチュートリアルでは、LAN 経由でブートするディスクレス・ワークステーションのセットアップや、ライブ CD または DVD の Linux システムを使用する際の考慮事項については取り上げません)。パーティションのサイズは後からでも変更できますが、それには通常、ある程度の作業が必要になってきます。そのため、前もって適切な選択を行うことが重要です。それでは早速、適切な選択を行うための手順に取り掛かりましょう。

最初に考慮しなければならないことは、システムを確実にブートできるようにすることです。一部の古いバージョンのシステムには、BIOS はディスクの先頭の 1024 シリンダー内に完全に収まっているパーティションからでないとブートできないという制約があります。そのようなシステムを使用している場合には、最終的に /boot としてマウントされるパーティションを作成し、そこに、システムをブートするために必要なファイルを保持する必要があります。これらのファイルのロードが完了すると、Linux システムがディスク操作を引き継ぐため、システムのその後の操作が 1024 のシリンダー制約によって影響されることはありません。/boot としてパーティションを作成する必要がある場合、通常は約 100 メガバイト (MB) もあれば十分です。

次の考慮事項として考えられるのは、必要なスワップ領域の容量です。現在のメモリーの相場では、スワップ領域は非常に遅い予備メモリーとなります。かつての一般的な経験則は、実際の RAM の容量に相当するスワップ領域を作成することでした。現在は、RAM を使い果たすことなく複数の大きなプログラムを使用できるように、ワークステーションには実際の RAM と同等、またはその 2 倍のスワップ領域を構成することをお勧めします。スワップ領域と RAM との切り替えに時間がかかるとしても、おそらく常に作業しているのは 1 つ、または 2 つのパーティションのなかでだけです。

大きなスワップ領域は、メモリーの容量が非常に少ないシステムにもお勧めできます。サーバーには、RAM の約半分のスワップ領域を使用するようにしてください (ただし、これ以外の値を推奨しているアプリケーションを実行している場合は別です)。いずれにしても、サーバーのメモリー使用率をモニターして、必要に応じて実際の RAM を追加するか、ワークロードを追加サーバーの間で分散できるようにしなければなりません。過度のスワップ処理が、サーバーに功を奏すことはめったにありません。スワップ用ファイルを使用することも可能ですが、専用パーティションのほうがパフォーマンスには優れています。

ここで、パーソナル・ワークステーションを使用するか、サーバーを使用するかを選択しなければなりません。パーソナル・ワークステーションを使用すると、サーバーを使用する場合に比べ、必要な容量を予測するのが遥かに難しくなりがちです。私が (特に Linux 初心者に) お勧めする方法は、標準ディレクトリー (/usr、/opt、/var など) の大部分を 1 つの大きなパーティションに割り当てることです。特に、これから何がインストールされることになるのかはっきりしていない Linux 初心者にとっては、この方法が役に立ちます。グラフィカル・デスクトップと、そこそこの数の開発ツールを実行しているワークステーションには、おそらく 5 GB 以上のディスク領域に加え、ユーザー用の領域が必要となるはずです。サイズの大きい開発ツールには、単独で数ギガバイトを要する場合もあります。私は通常、オペレーティング・システムあたり 40 GB から 60 GB を割り当て、ディスクの残りは空けたままにして、他のディストリビューションをロードできるようにしています。32 GB USB フラッシュ・ドライブは、基本的な Ubuntu 15.04 グラフィカル・ワークステーションを追加のツールなしでインストールするのに 3.9 GB を使用します。

サーバーのワークロードは、ワークステーションに比べて安定したものとなるはずであるため、特定のファイルシステムの領域が使い果たされると、より深刻な結果となりがちです。そのため一般的には、複数のディスクに分散した複数のパーティションを作成することになります。場合によっては、これらのパーティションにハードウェア RAID やソフトウェア RAID、あるいは論理ボリューム・グループを使用することもあります。

さらに、それぞれのファイルシステムでのワークロードについて検討し、ファイルシステムを複数のシステムで共有させるか、または 1 つのシステムにだけ使用させるかについても決定しなければなりません。システムに最適な割り当ては、経験、キャパシティ計画ツール、ワークロードの増加予測を兼ね合わせて検討することで判断できます。

ワークステーションとサーバーのどちらを構成しているかに関わらず、各システムに固有のファイルはローカル・ドライブに置かれます。一般的にこれらのファイルシステムには、システム・パラメーター・ファイルの /etc、ブート時に必要なファイルの /boot、ブートまたはシステム・リカバリーに必要なファイルの /sbin、root ユーザーのホーム・ディレクトリーの /root、ロック・ファイルの /var/lock、実行されているシステムの情報の /var/run、システム・ログ・ファイルの /var/log があります。ユーザーのホーム・ディレクトリーの /home や、usr、/opt、/var/mail、または /var/spool/news などといったその他のファイルシステムは、インストールの必要とユーザーの選択に応じて、別個のパーティションまたはネットワークにマウントされたパーティションに置かれます。

これにて、ハード・ディスクのレイアウトへの入門チュートリアルは終わりです。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=1017166
ArticleTitle=Linux の 101 試験対策: ハード・ディスクのレイアウト
publish-date=10152015