第3章 パーティションとファイルシステムの作成

LPIC-1 102.1 / 104.1 相当

新しいディスクを使えるようにするには、「パーティションを切る」「ファイルシステムを作る」という2つの工程が必要です。

パーティションテーブル: MBR と GPT

方式特徴
MBR古い方式。基本パーティションは4つまで、2TBを超えるディスクを扱えない。
GPT新しい方式。128個までパーティションを作成でき、2TBを超える大容量ディスクにも対応。

fdisk / parted でパーティションを作成

$ sudo fdisk /dev/sdb        # 対話形式でパーティション操作(MBR/GPT両対応)
Welcome to fdisk (util-linux 2.39.3).
Changes will remain in memory only, until you decide to write them.

Command (m for help): (ここで n・p・w などのサブコマンドを入力していく)
$ sudo parted /dev/sdb print # partedで現在のパーティションを確認
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 107GB
Partition Table: gpt

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  1075MB  1074MB  ext4
 2      1075MB  107GB   106GB   xfs

この行のこの値に注目: fdiskはCommand (m for help):というプロンプトが表示された時点でまだ何も変更されておらず、この後n(新規作成)やw(書き込み)などのサブコマンドを入力して初めて操作が進みます。partedのprint結果にあるPartition Table: gptで、そのディスクがMBRとGPTのどちらの形式かを確認できます。

注意: wでパーティションテーブルへの変更を書き込むと、元に戻すことはできません。特に対象デバイス名(/dev/sdbなど)を、システムが動いているディスク(/dev/sdaなど)と間違えていないかを実行前に必ず確認してください。作業対象を取り違えると、システムディスクの中身ごと失われる事故につながります。

mkfs でファイルシステムを作成

パーティションを作成しただけではまだ使えません。mkfs(make filesystem)でファイルシステムを書き込む必要があります。

注意: mkfsは指定したパーティション上の内容をすべて消去し、新しいファイルシステムで上書きします。すでにデータが入っているパーティションに対して実行すると、その中身は復元できません。実行前に対象のデバイス名を必ず確認しましょう。
$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 26214400 4k blocks and 6553600 inodes
Filesystem UUID: 3f2e1a4b-5c6d-47e8-9a0b-1c2d3e4f5a6b
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
$ sudo mkfs.xfs /dev/sdb2
meta-data=/dev/sdb2              isize=512    agcount=4, agsize=6553600 blks
data     =                       bsize=4096   blocks=26214400, imaxpct=25
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=12800, version=2

この行のこの値に注目: mke2fs(mkfs.ext4)はWriting superblocks and filesystem accounting information: doneのように「done」という完了メッセージで終われば正常です。mkfs.xfsには「done」という語は表示されず、代わりにメタデータ情報の表示(log =internal logの行など)まで進んでエラーが出なければ正常に完了しています。mkfs.ext4のFilesystem UUIDは、そのファイルシステムを一意に識別するIDで、/etc/fstabでUUID指定のマウントを行う際にこの値を使います。

ファイルシステム特徴
ext4Linuxで長年使われる標準的なファイルシステム。安定性が高い。
xfs大容量ファイルの扱いに強く、多くのサーバー系ディストリで標準採用。
btrfsスナップショットなど高度な機能を持つ次世代ファイルシステム。

LVM(論理ボリュームマネージャー)の考え方

LVMは、複数の物理ディスクを1つの「プール」としてまとめ、後から柔軟にサイズ変更できるようにする仕組みです。3つの階層で構成されます。

階層役割
PV(物理ボリューム)実際の物理ディスクやパーティション
VG(ボリュームグループ)複数のPVをまとめたプール
LV(論理ボリューム)VGから切り出した、実際にマウントして使う単位
LVMの利点: 運用を止めずにLVの容量を拡張できるため、ディスク容量が足りなくなったときの対応がしやすくなります。
物理ディスク /dev/sdb 物理ディスク /dev/sdc PV(物理ボリューム) PE PE PE… PV(物理ボリューム) PE PE PE… VG (ボリュームグループ) PEのプール LV(論理ボリューム) /dev/vg0/lv_data LV(論理ボリューム) /dev/vg0/lv_home ファイル システム (ext4等) ファイル システム (ext4等)
LVMの階層構造。物理ディスクはPV(物理ボリューム)としてLVMに取り込まれ、内部は固定サイズのPE(Physical Extent、既定4MiB)に分割されます。複数のPVのPEはVG(ボリュームグループ)というプールにまとめられ、そこから必要な分だけLV(論理ボリューム)として切り出し、その上にファイルシステムを作成して利用します。

スワップ領域の作成

物理メモリが不足した際に一時的にデータを退避させる領域として、スワップパーティション(またはスワップファイル)を作成できます。

$ sudo mkswap /dev/sdb3      # スワップ用のパーティションを初期化
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=5a6b7c8d-9e0f-1a2b-3c4d-5e6f7a8b9c0d
$ sudo swapon /dev/sdb3      # スワップを有効化
$ swapon --show               # 現在有効なスワップ領域を確認
NAME       TYPE      SIZE USED PRIO
/dev/sdb3  partition   4G   0B   -2
$ sudo swapoff /dev/sdb3     # スワップを無効化

この行のこの値に注目: swapon自体は成功しても何も表示しないため、有効化できたかどうかはswapon --showで確認します。USED列が0Bであれば、まだそのスワップ領域は実際には使われていない状態です。swapoffも同様に、成功時は無出力です。

/etc/fstab に登録しておけば、再起動後も自動的に有効化されます(書式は第4章で扱います)。

LVMコマンドの実践例

PV・VG・LVを実際に作成する際は、それぞれ対応するコマンドを順番に実行します。

$ sudo pvcreate /dev/sdb1 /dev/sdc1      # 物理ボリュームを作成
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdc1" successfully created.
$ sudo vgcreate vg_data /dev/sdb1 /dev/sdc1  # ボリュームグループを作成
  Volume group "vg_data" successfully created
$ sudo lvcreate -L 20G -n lv_home vg_data    # 20GBの論理ボリュームを作成
  Logical volume "lv_home" created.
$ sudo mkfs.ext4 /dev/vg_data/lv_home
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 5242880 4k blocks and 1310720 inodes
...(省略。最後に done が表示されれば成功)
$ sudo lvextend -L +10G /dev/vg_data/lv_home  # 論理ボリュームを10GB拡張
  Size of logical volume vg_data/lv_home changed from 20.00 GiB (5120 extents) to 30.00 GiB (7680 extents).
$ sudo resize2fs /dev/vg_data/lv_home          # ext系ファイルシステム側も拡張に合わせる
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/vg_data/lv_home is mounted on /home; on-line resizing required
The filesystem on /dev/vg_data/lv_home is now 7864320 (4k) blocks long.

この行のこの値に注目: LVMコマンドは各段階で「successfully created」「created」のように完了報告を返すため、進捗を追いやすいのが特徴です。lvextendの出力にあるchanged from 20.00 GiB ... to 30.00 GiBで拡張後のサイズを確認でき、その後のresize2fsで実際にファイルシステム側の容量も合わせて広がったことが最終行のブロック数から分かります。

注意: LVの容量を「縮小」する操作は、先にファイルシステム側を縮小してからLV側を縮小しないとデータ破損のリスクがあります。拡張の場合はこの順序を気にする必要はありません。

gdisk — GPTディスク専用の対話型ツール

fdiskは近年GPTにも対応していますが、伝統的にはfdiskはMBR向け、gdiskはGPT向けという役割分担で説明されることが多く、試験対策としても両者の対応関係を押さえておくとよいでしょう。

ツール主な対象特徴
fdiskMBR(新しいバージョンはGPTも対応)もっとも古くから使われている定番ツール
gdiskGPT専用fdisk風の対話操作でGPTを扱う
partedMBR/GPT両対応非対話的にスクリプトから操作しやすい

mkfsの主なオプション

ファイルシステム作成時には、用途に応じてブロックサイズやラベルを指定できます。

$ sudo mkfs.ext4 -L data -b 4096 /dev/sdb1   # -L: ラベル名を付与, -b: ブロックサイズ(byte)を指定
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 26214400 4k blocks and 6553600 inodes
...(省略)
$ sudo mkfs.xfs -f /dev/sdb2                  # -f: 既存のファイルシステムを上書きして強制作成
meta-data=/dev/sdb2              isize=512    agcount=4, agsize=6553600 blks
data     =                       bsize=4096   blocks=26214400, imaxpct=25

この行のこの値に注目: -fを付けずに既にファイルシステムが存在するデバイスへmkfs.xfsを実行すると、「デバイスに既存のファイルシステムがあるようです」という警告で処理が止まります。-fはこの安全確認を飛ばして強制的に上書きするためのオプションなので、対象デバイスを取り違えていないか特に慎重に確認してから使う必要があります。

作成後にラベルやUUIDなど各種情報を後から変更・確認したい場合は、ファイルシステムごとに専用の管理コマンドが用意されています。

ファイルシステム情報確認・調整コマンド
ext2/ext3/ext4tune2fs -l /dev/sdb1(各種パラメータの表示・変更)
xfsxfs_info /マウントポイント
共通e2label / xfs_admin -L(ラベルの変更)

inode(アイノード)の考え方

ext系などのファイルシステムでは、ファイルの実データとは別に「inode」と呼ばれる管理情報(所有者、権限、タイムスタンプ、データの格納場所など)が各ファイルに割り当てられています。作成できるファイル数は、ディスクの空き容量だけでなくinodeの残数によっても制限されます。

$ df -i                 # ファイルシステムごとのinode使用状況を確認
Filesystem     Inodes  IUsed   IFree IUse% Mounted on
/dev/sda2     6553600 123456 6430144    2% /
試験対策: 小さなファイルを大量に作るワークロード(メールサーバーのメールキューなど)では、ディスク容量に余裕があってもinodeが枯渇して「No space left on device」というエラーになることがあります。df -iで確認できることを覚えておきましょう。

LVMスナップショット

LVMには、ある時点のLVの状態をそのまま保持しておく「スナップショット」機能もあります。バックアップ前に整合性の取れた状態を確保する目的でよく使われます。

$ sudo lvcreate -L 5G -s -n lv_home_snap /dev/vg_data/lv_home  # -s: スナップショットとして作成
  Logical volume "lv_home_snap" created.
$ sudo lvremove /dev/vg_data/lv_home_snap                     # 不要になったら削除
Do you really want to remove active logical volume vg_data/lv_home_snap? [y/n]: y
  Logical volume "lv_home_snap" successfully removed

この行のこの値に注目: lvremoveは元に戻せない操作のため、既定で[y/n]の確認プロンプトを挟みます。スナップショットを削除しても元の論理ボリューム(lv_home)には影響しません。

スナップショットは「作成した瞬間の状態を丸ごと複製する」わけではなく、元のLVとの差分だけを記録する仕組みになっています。そのため作成直後はほとんど容量を使いませんが、元のLV側でデータの変更が積み重なるほどスナップショット側の使用容量も増えていきます。スナップショット用に確保した領域(先の例では5G)を使い切ってしまうと、そのスナップショット自体が壊れて使えなくなる点には注意が必要です。バックアップ取得中だけ一時的に使い、目的を終えたら速やかに削除する、という運用が基本になります。

パーティション設計の考え方

1つの大きなパーティションにすべてをまとめるのではなく、/・/home・/varのように役割ごとにパーティションを分ける設計も広く行われています。たとえばログが際限なく増え続けても、/varを独立させておけば/本体の容量を圧迫せずに済み、システムが完全に動かなくなる事態を避けやすくなります。一方でパーティションを細かく分けすぎると、逆に「片方は余っているのにもう片方だけ容量不足になる」という管理の手間も増えます。LVMを使えば、パーティションを切った後からでも容量の融通が利くため、最初から完璧な設計を目指すよりも、LVMの柔軟性を前提に運用しながら調整していくという考え方が実務ではよく採られます。

確認クイズ

Q1. 2TBを超える大容量ディスクに対応できるパーティションテーブル方式はどれですか?

解説: GPTは2TBを超える大容量ディスクに対応し、128個までパーティションを作成できます。MBRは古い方式で制限があります。

Q2. パーティションを作成した後、実際にファイルを保存できるようにするために行う操作はどれですか?

解説: パーティション作成後、mkfs(make filesystem)でファイルシステムを書き込むことで初めて利用可能になります。

Q3. LVMにおいて、複数の物理ボリューム(PV)をまとめたプールを何と呼びますか?

解説: PVをまとめたプールをVG(ボリュームグループ)と呼び、そこから必要な分だけLV(論理ボリューム)を切り出して使います。

Q4. 大容量ファイルの扱いに強く、サーバー系ディストリビューションで標準採用されることが多いファイルシステムはどれですか?

解説: xfsは大容量ファイルの扱いに強く、RHEL系などサーバー用途のディストリビューションで標準採用されることが多いファイルシステムです。