102.1 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
102 Linuxのインストールとパッケージ管理 |
Objective: |
102.1 ハードディスクレイアウトの設計 |
Lesson: |
1 of 1 |
はじめに
このレッスンの目標は、disks、partitions、filesystems、volumes の関係を理解することです。
ディスク(最近のデバイスには “disks” がまったく含まれていないので、storage device と呼ぶことも多い)をデータの “物理的な容器” と考えてください。
ディスクをコンピューターで使用する前に、ディスクをパーティション化する必要があります。パーティションとは、物理ディスクを論理的なサブセットに仕切ったようなものです。パーティショニングは、ディスクに保存されている情報を “区画化” する方法であり、たとえば、オペレーティングシステムデータをユーザーデータから分離します。
すべてのディスクには少なくとも1つのパーティションが必要ですが、必要に応じて複数のパーティションを持つことができ、それらに関する情報はパーティションテーブルに格納されます。このテーブル(表)には、パーティションの最初と最後のセクターとそのタイプ、ならびにパーティションそれぞれの情報が含まれています。
それぞれのパーティションには、ファイルシステムが置かれます。ファイルシステムとは、データを実際にディスクに保存する方法を規定している仕組みです。その中には、ディレクトリの編成方法、ディレクトリ間の関係、各ファイルのデータはどこにあるかなどが含まれます。
パーティションは複数のディスクにまたがることはできません。ただし、Logical Volume Manager(LVM)を使用すると、異なるディスクの複数のパーティションを組み合わせて、ひとつの論理ボリュームとすることができます。
LVMでは、物理デバイスの制限を抽象化し、従来のパーティションよりもはるかに柔軟な方法で組み合わせたり分散したりできる、ディスクスペースの “プール” (ボリュームグループ)を作成し、その中から論理ボリュームを切り出して使用します。LVMは、データをより大きなデバイスに移行することなく、パーティションにスペースを追加する必要がある状況で役立ちます。
このレッスンでは、Linuxシステムのディスクパーティションスキームを設計し、必要に応じてファイルシステムとスワップスペースを、パーティションやディスクに割り当てる方法を学習します。
パーティションとファイルシステムを 作成 したり 管理 する方法については、他のレッスンで説明します。このレッスンでLVMの概要を説明しますが、詳細には踏み込みません。
マウントポイント
Linuxでファイルシステムにアクセスするには、ファイルシステムを マウント する必要があります。これは、ファイルシステムをシステムのディレクトリツリー内の マウントポイント と呼ばれるあるディレクトリに取り付けることを意味します。
マウントされると、ファイルシステムの内容が、マウントポイントの下に現れて利用できるようになります。たとえば、ユーザーの個人データ(ホームディレクトリ)を含むパーティションがあり、ディレクトリ /john
、/jack
、/carol
が含まれているとします。そのパーティションを /home
の下にマウントすると、それらのディレクトリの内容が /home/john
、/home/jack
、/home/carol
として利用可能になります。
ファイルシステムをマウントする前に、マウントポイントとなるディレクトリが存在している必要があります。例えば /mnt/userdata
ディレクトリが存在しない場合は、そこにパーティションをマウントすることはできません。逆にディレクトリが存在していてファイルを含んでいる場合は、ファイルシステムをアンマウントするまで、それらのファイルにはアクセスできません。ディレクトリの内容を一覧表示すると、ディレクトリの元の内容ではなく、マウントされたファイルシステムにあるファイルが表示されます。
ファイルシステムはどこにでもマウントできます。ただし、システム管理を容易にするために従うべき慣習があります。
伝統的に /mnt
には、取り外し可能な外部デバイスをマウントします。例えば、CD-ROMドライブ(/mnt/cdrom
)やフロッピーディスク(/mnt/floppy
)のように、一般的なデバイス用の アンカーポイント がその下に用意されています。
最近は(/mnt
ではなく)/media
がよく使われます。ユーザーによる取り外し可能なメディア(外部ディスク、USBフラッシュドライブ、メモリカードリーダ、光ディスクなど)をシステムに接続した場合の、デフォルトのマウントポイントになっています。
現在のほとんどのLinuxディストリビューションでは、リムーバブルデバイスを接続すると自動的に /media/USER/LABEL
以下にマウントされるようになっています。USER
はユーザー名で、LABEL
はデバイスを識別するボリューム名(ラベル)です。例えば、FlashDrive
というラベルのUSBフラッシュドライブをユーザー john
が接続すると、/media/john/FlashDrive/
以下にマウントされます。(デスクトップ環境によっては挙動が異なることがあります)。
とはいえ、ファイルシステムを 手動で マウントする必要がある場合は、/mnt
の下にマウントすることがお勧めです。Linuxでファイルシステムのマウントとアンマウントを制御するコマンドについては、別のレッスンで取り上げします。
データを分離する
Linuxでは、専用のパーティションに保持した方が良いディレクトリがいくつかあります。さまざまな理由があり、たとえば、ブートローダー関連のファイル(/boot
)を、専用の bootパーティション に置けば、ルートファイルシステムが破損した場合でもシステムを起動できます。
あるいは、ユーザー個人用のディレクトリ(/home
)を、別のパーティションに分けておけば、誤ってユーザーデータに触れるリスクなしに、システムを簡単に再インストールできます。またあるいは、Webやデータベースなどのサーバー用データ(通常は /var
の下)を別のパーティション(ないし別のディスク)に分けておけば、サーバー用にディスク領域を追加する必要がある場合のシステム管理が容易になります。
パフォーマンス上の理由から、あるディレクトリを別のパーティションに分けることもあります。たとえば、ルートファイルシステム(/
)を高速なSSDユニットに保持し、/home
や /var
などの大きな容量を必要とするディレクトリを安価なハードディスクに保持すれば、パフォーマンスとコストの最適化を図ることができます。
ブートパーティション( /boot
)
ブートパーティションには、ブートローダーがオペレーティングシステムをロードするために使用するファイルが含まれています。Linuxシステムのブートローダーは、通常はGRUB2であり、古いシステムではGRUB Legacyです。パーティションは通常 /boot
の下にマウントされ、ブートローダーが参照するファイルは /boot/grub
に保存されます。
ほとんどの場合、GRUBはルートパーティション(/
)をマウントして、その /boot
ディレクトリからファイルをロードできるため、技術的にはブートパーティションは必須ではありません。
しかし、安全性(ルートファイルシステムが破損してもシステムが起動できるようにするため)や、ルートパーティションにブートローダが理解できないファイルシステムを使用したい場合や、サポートされていない暗号化や圧縮方法を使用したい場合には、独立したブートパーティションが必要になることがあります。
ブートパーティションは通常、ディスク上の最初のパーティションです。歴史的に、オリジナルのIBM PC BIOSで扱える最大ディスク容量が528MB(MS-DOSでは504MB)であったことから生じた慣習です。
IBM PC BIOSでは、シリンダー、ヘッド、セクター の3つの値(CHS)でディスクをアドレス指定しており、それぞれの最大値が1024シリンダー、256ヘッド、63セクターであったことに起因します。後に、別のディスクアドレス指定スキーム(LBA Logical Block Addressing)が登場するまでは、BIOSはディスクの先頭から528MBまでの範囲しか読み込むことができなかったのです。つまり(LBAが登場する以前の)レガシーマシンとの互換性を保つには、ブートパーティションをディスクの先頭に置き、シリンダー1024(528 MB)の前で終了することが必要です。(訳注: LBAが登場したのは1994年ですから、概ね1995年よりも前に製造されたマシンのみが対象になります。昔は色々な制約があり今では必要が無い慣習が残っている、とだけ覚えておけば十分です。)
ブートパーティションには、カーネル-イメージと初期RAMディスク、およびブートローダーに必要なファイルのみが格納されます。大した容量は必要なく、概ね300MBから1GB程度を確保すれば十分でしょう。
EFIシステムパーティション(ESP)
UEIF(Unified Extensible Firmware Interface)を搭載したマシンでは、インストールしたオペレーティングシステムのブートローダーとカーネルイメージを格納するために、EFIシステムパーティション(ESP)を使います。
このパーティションは、FATファイルシステムでフォーマットされています。パーティション分割には(MBRではなく)GUIDパーティションテーブルが使用されていて、C12A7328-F81F-11D2-BA4B-00A0C93EC93B
というGUID(Globally Unique Identifier)が与えられています。ディスクには(互換性などのために)MBRも存在していて、そのパーティションIDは 0xEF
です。
Microsoft Windowsを実行しているマシンでは、ESPパーティションは通常、ディスク上の最初のパーティションですが、必須ではありません。ESPは、インストール時にオペレーティングシステムによって作成ないし設定され、Linuxシステムでは /boot/efi
の下にマウントされます。
/home
パーティション
システムの各ユーザーには個人のファイルや設定を保存するためのホームディレクトリが与えられ、そのほとんどは /home
の下に置かれます。ホームディレクトリ名はユーザー名と同じであるのが風ですから、ユーザーJohnのディレクトリは /home/john
になります。
ただし、例外もあり、たとえば rootユーザーのホームディレクトリは /root
ですし、システムサービスのユーザーのホームディレクトリは別の位置であることががあります。
/home
ディレクトリのパーティション(ホームパーティション)のサイズを決定する規則はありません。システムのユーザー数とその使用方法を考慮して決定します。たとえば、Webブラウジングとワードプロセッシングのみを行うユーザーは、ビデオ編集を行うユーザーよりも必要なスペースが少なくて済むでしょう。
可変データ(/var
)
このディレクトリには、"可変データ”(variable data
)、すなわち、システムログ(/var/log
)、一時ファイル(/var/tmp
)、アプリケーションデータのキャッシュ(/var/cache
)など、システムが稼働中に読み書きするデータが含まれます。
たとえば、/var/www/html
はApache Webサーバーのデータファイルを置くディレクトリですし、/var/lib/mysql
はMySQLサーバーのデータベースファイルを置きます。ただし、どちらも別の位置に変更できます。
/var
を別のパーティションに配置する理由の1つは、安定性です。多くのアプリケーションとプロセスは、/var
と /var/log
や /var/tmp
などのサブディレクトリに書き込みを行います。プロセスの誤動作によって、ファイルシステムに空き領域がなくなるまでデータを書き込む可能性があります。
/var
と /
が同じファイルシステムにある場合、ルートファイルシステムの空き容量がなくなってしまい、カーネルパニックからファイルシステムが破損して、回復が困難な状況に陥る可能性があります。/var
を別のパーティションに分けておけば、ルートファイルシステムは影響を受けません。
/home
と同様に、システムの使用方法によって異なるため、/var
のパーティションのサイズを決定する普遍的なルールはありません。家庭用のシステムでは数ギガバイトしか必要ないこともありますが、データベースやWebサーバーではもっと多くのスペースが必要になるでしょう。そのようなシナリオでは、ルートパーティションとは異なるパーティションに /var
を配置して、ディスク障害に対する予防策を講じておくことがお勧めです。
スワップ
スワップパーティションは、必要に応じてメモリページをRAMからディスクにスワップするために使用されます。このパーティションは、専用のパーティションID(0x82)を持ち、使用する前に mkswap
と呼ばれるユーティリティでセットアップする必要があります。
スワップパーティションは他のパーティションのようにマウントできません。つまり、通常のディレクトリのようにアクセスしてその内容を確認することはできません。
システムは(一般的ではありませんが)複数のスワップパーティションを持つことができ、Linuxではパーティションではなくスワップ ファイル の使用もサポートします。スワップファイルは、必要な時にスワップ領域をすばやく増やすのに役立ちます。
スワップパーティションのサイズは論争の的となる課題です。Linuxの初期の古いルール(“RAM容量の2倍”)は、システムの使用方法と物理RAMの量によって不適切な場合があります。
Red Hat Enterprise Linux 7のドキュメントでは、Red Hatは以下を推奨しています。
RAMの量 | 推奨スワップサイズ | ハイバネーションする場合の推奨スワップサイズ |
---|---|---|
RAMが2GB未満 |
RAM容量の2倍 |
RAM容量の3倍 |
RAM2-8GB |
RAMと同容量 |
RAM容量の2倍 |
RAM8-64GB |
少なくとも4G |
RAM容量の1.5倍 |
RAMが64GB以上 |
少なくとも4G |
推奨されない |
もちろん、スワップ容量はワークロードに依存します。データベース、web、SAPサーバーなどの重要なサービスを実行しているマシンでは、これらのサービス(またはソフトウェアベンダー)のドキュメントで推奨事項を確認することを勧めます。
Note
|
スワップパーティションとスワップファイルの作成と有効化については、LPIC-1のObjective 104.1を参照してください。 |
LVM
ディスクを1つまたは複数のパーティションに分割し、各パーティションにファイルと関連するメタデータを格納するファイルシステムを格納する方法についてはすでに説明しました。パーティション分割の欠点は、システム管理者がデバイスの空きディスク領域をどのように配分するかを事前に決定しなければならないことです。パーティションが当初の見込みよりも多くの領域を必要とする場合、後で問題になることがあります。もちろんパーティションのサイズは変更できますが、ディスク上に空き容量がない場合など、容量の拡大が不可能な場合があります。
LVM(Logical Volume Management)は、従来のパーティショニングよりも柔軟なディスク領域管理方法を提供する、一種のストレージ仮想化です。LVMの目標は、エンドユーザーのストレージニーズへの対応を容易にすることです。最も基本となる要素は 物理ボリューム(PhysicalVolume)といって、ディスクパーティションやRAIDアレイなどのブロックデバイスです。
いくつかの物理ボリュームを ボリュームグループ(VolumeGroups)にグループ化して、それぞれのPV容量を合計したサイズのストレージとして抽象化した1つの論理デバイスとします。
ボリュームグループを作成する際に、それぞれの物理ボリュームが、エクステント と呼ばれる固定サイズ(デフォールトは4M)のピースに分割されます。物理ボリューム上のエクステントは 物理エクステント(Phisical Extents)と呼ばれ、後述する論理ボリューム上のエクステントは 論理エクステント(Logical Extents)と呼ばれます。通常、論理エクステントと物理エクステントは1対1でマップされますが、ディスクミラーリングなどの機能を使用する場合には、対応付けが変更されることがあります。
ボリュームグループから指定した数のエクステントを切り出して、論理ボリューム(Logical Volume)を作成します。論理ボリュームは、パーティションと同様に(ブロックデバイスとして)機能しますが、より柔軟性があります。
論理ボリュームのサイズは作成時に指定しますが、実際には物理エクステントのサイズ(デフォルトでは4MB)に、論理ボリューム上のエクステントの数を掛けたものです。つまり、論理ボリュームを拡張するには、ボリュームグループから未使用のエクステントを論理ボリュームに追加するだけです。同様に、エクステントを削除して論理ボリュームを縮小することもできます。
論理ボリュームが作成されると、オペレーティングシステムからは通常のブロックデバイスとして認識されます。デバイスは /dev
に作成されます。名前は /dev/VGNAME/LVNAME
です。ここで言う、VGNAME
はボリュームグループの、LVNAME
は論理ボリュームの名前です。
これらのデバイスは、標準的なユーティリティ(たとえば、mkfs.ext4
など)を使って希望するファイルシステム種別でフォーマットし、通常の方法でマウントできます。すなわち、mount
コマンドで手動で、あるいは /etc/fstab
ファイルに追加することで自動的にマウントできます。
演習
-
Linuxシステムでは、GRUBブートローダーのファイルはどこに置かれますか?
-
骨董PC(1994年以前の製造)が常にカーネルをロードできるようにするには、ブートパーティションをどこに配置する必要がありますか?
-
EFIパーティションは、通常どこにマウントされますか?
-
ファイルシステムを手動でマウントする場合、どのディレクトリにマウントするのが(慣例上)適当ですか?
発展演習
-
ボリュームグループの最小要素は何ですか?
-
論理ボリュームの実際のサイズはどう定義されますか?
-
MBRパーティションスキームで、EFIシステムパーティションのIDは何ですか?
-
スワップパーティションに加えて、Linuxシステムのスワップ領域をすばやく増やすにはどうすればよいですか?
まとめ
このレッスンでは、パーティション分割について学習しました。どのディレクトリに専用のパーティション割り当てるべきかと、その理由を学びました。また、LVM(Logical Volume Management)の概要と、従来のパーティショニングと比較してデータとディスク容量をより柔軟に割り当てる仕組みについても説明しました。
次のファイル、用語、およびユーティリティについて説明しました。
/
-
Linuxルートファイルシステム。
/var
-
“可変データ” のディレクトリ。時間の経過とともにサイズが変化するデータ。
/home
-
一般ユーザーのホームディレクトリの標準的な親ディレクトリ。
/boot
-
ブートローダーが利用するファイル、Linuxカーネル、および初期RAMディスクを格納するディレクトリ。
- EFIシステムパーティション(ESP)
-
UEFIを搭載したシステムにおける、ブートファイルを保存するために使用される。
- スワップ領域
-
実装容量よりも多くのRAMが使用される場合に、メモリページをスワップアウトするために使用される。
- マウントポイント
-
デバイス(ハードディスクなど)がマウントされるディレクトリ。
- パーティション
-
ハードディスクの分割領域。
演習の解答
-
Linuxシステムでは、GRUBブートローダーのファイルはどこに置かれますか?
/boot/grub
の中。 -
骨董PC(1994年以前の製造)が常にカーネルをロードできるようにするには、ブートパーティションをどこに配置する必要がありますか?
シリンダー1024の前。
-
EFIパーティションは、通常どこにマウントされますか?
/boot/efi
。 -
ファイルシステムを手動でマウントする場合、どのディレクトリにマウントするのが(慣例上)適当ですか?
/mnt
の下。パーティションは任意のディレクトリにマウントできますので、あくまでも「慣例」です。
発展演習の解答
-
ボリュームグループ内の最小単位は何ですか
エクステント。
-
論理ボリュームの実際のサイズはどう定義されますか?
物理エクステントのサイズに、論理ボリューム内のエクステントの数を掛けたもの。
-
MBRパーティションスキームで、EFIシステムパーティションのIDは何ですか?
IDは
0xEF
です。 -
スワップパーティションに加えて、Linuxシステムのスワップスペースをすばやく増やすにはどうすればよいですか?
スワップ用のファイルを作成して登録する。