第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指定のマウントを行う際にこの値を使います。
| ファイルシステム | 特徴 |
|---|---|
ext4 | Linuxで長年使われる標準的なファイルシステム。安定性が高い。 |
xfs | 大容量ファイルの扱いに強く、多くのサーバー系ディストリで標準採用。 |
btrfs | スナップショットなど高度な機能を持つ次世代ファイルシステム。 |
LVM(論理ボリュームマネージャー)の考え方
LVMは、複数の物理ディスクを1つの「プール」としてまとめ、後から柔軟にサイズ変更できるようにする仕組みです。3つの階層で構成されます。
| 階層 | 役割 |
|---|---|
| PV(物理ボリューム) | 実際の物理ディスクやパーティション |
| VG(ボリュームグループ) | 複数のPVをまとめたプール |
| LV(論理ボリューム) | VGから切り出した、実際にマウントして使う単位 |
スワップ領域の作成
物理メモリが不足した際に一時的にデータを退避させる領域として、スワップパーティション(またはスワップファイル)を作成できます。
$ 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で実際にファイルシステム側の容量も合わせて広がったことが最終行のブロック数から分かります。
gdisk — GPTディスク専用の対話型ツール
fdiskは近年GPTにも対応していますが、伝統的にはfdiskはMBR向け、gdiskはGPT向けという役割分担で説明されることが多く、試験対策としても両者の対応関係を押さえておくとよいでしょう。
| ツール | 主な対象 | 特徴 |
|---|---|---|
fdisk | MBR(新しいバージョンはGPTも対応) | もっとも古くから使われている定番ツール |
gdisk | GPT専用 | fdisk風の対話操作でGPTを扱う |
parted | MBR/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/ext4 | tune2fs -l /dev/sdb1(各種パラメータの表示・変更) |
| xfs | xfs_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% /
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の柔軟性を前提に運用しながら調整していくという考え方が実務ではよく採られます。