第6章 ファイルシステムの運用(fstab・スワップ・マウント)
LPIC-2 203.1 相当
ファイルシステムをOS起動時に自動的にマウントする仕組みや、スワップ領域の管理は、Linuxサーバー運用の基本です。本章では、その中心となる/etc/fstabの書式と、関連する各種コマンドを扱います。
/etc/fstab の書式
/etc/fstab(filesystem table)は、システム起動時にどのデバイス・パーティションを、どこに、どのオプションでマウントするかを定義する設定ファイルです。1行が1つのマウントポイントに対応し、6個のフィールドをスペースまたはタブで区切って記述します。
/etc/fstab の例
UUID=1a2b3c4d-... / ext4 defaults 0 1
UUID=5e6f7g8h-... /home ext4 defaults 0 2
LABEL=swap-part none swap sw 0 0
/dev/sr0 /media/cdrom0 iso9660 ro,noauto,user 0 0
server:/export /mnt/nfs nfs defaults,_netdev 0 0
| フィールド | 意味 |
|---|---|
| 1. デバイス | マウント対象(UUID/LABEL/デバイスファイルパスのいずれか) |
| 2. マウントポイント | マウント先のディレクトリ(スワップはnone) |
| 3. ファイルシステムタイプ | ext4、xfs、btrfs、swap、nfs、iso9660など |
| 4. マウントオプション | defaults、ro(読み取り専用)、noauto(起動時に自動マウントしない)、user(一般ユーザーによるマウントを許可)、_netdev(ネットワークが上がってからマウントする)など |
| 5. dumpフラグ | 古いdumpコマンドによるバックアップ対象かどうか(0=対象外、1=対象)。現在はほぼ0が使われる |
| 6. fsckパス | 起動時のファイルシステムチェック順序(0=チェックしない、1=最優先=ルート、2=それ以降) |
UUID・LABELによるマウント
デバイスファイルパス(/dev/sda1など)は、ディスクの増設や交換によって番号がずれる可能性があります。そのため、実務では変化しない識別子であるUUID(Universally Unique Identifier)や、任意に設定できるLABEL(ラベル)を使うのが基本です。
$ blkid # 全ブロックデバイスのUUID・LABEL・ファイルシステムタイプを一覧表示
/dev/sda1: UUID="1a2b3c4d-..." TYPE="ext4" PARTUUID="..."
/dev/sda2: LABEL="swap-part" UUID="5e6f7g8h-..." TYPE="swap"
$ lsblk -f # ツリー形式でデバイスとファイルシステム情報を表示
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 rootfs 1a2b3c4d-5e6f-7890-abcd-ef1234567890 /
└─sda2 swap swap-part 5e6f7g8h-90ab-cdef-1234-567890abcdef [SWAP]
sdb
└─sdb1 ext4 9f8e7d6c-5b4a-3210-fedc-ba0987654321 /mnt/data
$ sudo e2label /dev/sda1 rootfs # ext系ファイルシステムにLABELを設定(正常時は無出力)
この行のこの値に注目: lsblk -fはblkidと似た情報をツリー形式で見やすく表示し、MOUNTPOINT列でどこにマウントされているかまで一目で分かるのが利点です。スワップパーティションはMOUNTPOINT欄が[SWAP]という特別な表記になります。e2labelでLABELを設定した後は、lsblk -fやblkidを再実行して反映されているか確認します。
blkidで確認したUUIDを/etc/fstabにそのまま貼り付けるのが最も一般的な運用です。fstabを編集した後は、システムを再起動する前に必ずsudo mount -aで構文・マウント可否を確認する習慣をつけてください。記述ミスがあると、次回起動時にファイルシステムのマウントに失敗し、レスキューモードでの復旧作業が必要になることがあります(復旧手順は別章で扱います)。
mount・umount・blkidコマンド
$ sudo mount /dev/sdb1 /mnt/data # 手動でマウント(正常時は無出力)
$ sudo mount -a # /etc/fstabに記載された全エントリをマウント(noautoを除く)(正常時は無出力)
$ sudo mount -o remount,ro / # ルートファイルシステムを読み取り専用で再マウント(正常時は無出力)
$ sudo umount /mnt/data # アンマウント(正常時は無出力)
$ sudo umount -l /mnt/data # 使用中のファイルシステムを遅延アンマウント(lazy unmount)(正常時は無出力)
$ findmnt /mnt/data # 現在のマウント状態をツリー形式で確認
TARGET SOURCE FSTYPE OPTIONS
/mnt/data /dev/sdb1 ext4 rw,relatime
この行のこの値に注目: mount・umount系のコマンドは成功時には何も表示しないため、実際にマウント状態がどう変わったかはfindmntやmount(引数なし)、df -hで別途確認する必要があります。findmntのOPTIONS列には、指定したオプションだけでなくカーネル側で補完された実際の有効オプション(この例ではrelatime)まで表示されるため、意図通りのオプションで実際にマウントされているかを正確に確認できます。
fuser -m /mnt/dataやlsof +D /mnt/dataで該当プロセスを特定し、可能であれば正常に終了させてからアンマウントするのが安全です。umount -l(lazy unmount)はその場でマウントポイントを切り離しますが、実際の解放は使用中のプロセスが終了してから行われるため、データ不整合のリスクを完全には排除できない点に注意してください。
よく使うマウントオプションの一覧
4番目のフィールド(マウントオプション)はカンマ区切りで複数指定できます。実務でよく使われる代表的なオプションを整理します。
| オプション | 意味 |
|---|---|
defaults | rw,suid,dev,exec,auto,nouser,async相当の標準的な組み合わせ |
noatime | ファイルアクセス時刻の更新を省略し、I/O性能を向上させる(頻繁な読み取りが多い環境で有効) |
nosuid | SUID/SGIDビットを無効化する(外部メディアなどセキュリティ上信頼できない領域で使用) |
noexec | そのファイルシステム上でのプログラム実行を禁止する(一時領域やアップロード先などで使用) |
nofail | 起動時にそのデバイスが見つからなくても、システム全体の起動を失敗させずに続行する(USBドライブやリムーバブルストレージ向け) |
x-systemd.automount | 実際にアクセスされるまでマウントを遅延させる(systemdのautomount機能と連携) |
nofailは特に重要なオプションです。これを指定していないリムーバブルメディアのエントリが/etc/fstabに残ったまま、そのデバイスを取り外した状態で再起動すると、システムがマウント待ちで起動シーケンスを止めてしまうことがあります。外付けストレージやネットワークドライブのエントリには、原則としてnofail(ネットワーク越しの場合はさらに_netdev)を付けておくのが安全な運用です。
PARTUUIDとGPTパーティション
GPT(GUID Partition Table)形式のディスクでは、ファイルシステムのUUIDとは別に、パーティションそのものを識別するPARTUUIDも利用できます。blkidやlsblk -o NAME,PARTUUIDで確認でき、/etc/fstabではPARTUUID=...という形式で指定します。ファイルシステムをまだ作成していない、あるいはファイルシステムタイプを問わずパーティション単位で参照したい場合に使われます。
スワップ領域の管理
スワップは、物理メモリが不足した際にディスク上へ一時的にデータを退避させる領域です。パーティションとして確保する方法と、通常のファイルとして確保する方法(スワップファイル)があります。
$ sudo fallocate -l 2G /swapfile # 2GBのスワップファイルを作成(正常時は無出力)
$ sudo chmod 600 /swapfile # 他ユーザーから読めないようパーミッションを制限(正常時は無出力)
$ sudo mkswap /swapfile # スワップ領域として初期化
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=3c4d5e6f-7890-abcd-ef12-34567890abcd
$ sudo swapon /swapfile # スワップを有効化(正常時は無出力)
$ swapon --show # 現在有効なスワップ領域の一覧と使用量を確認
NAME TYPE SIZE USED PRIO
/dev/sda2 partition 2G 0B -2
/swapfile file 2G 0B -3
$ sudo swapoff /swapfile # スワップを無効化(正常時は無出力)
この行のこの値に注目: mkswapの出力にあるUUID=は、そのまま/etc/fstabのデバイス指定欄に使える値です。swapon --showのPRIO(優先度)列は数値が大きいほど優先的に使われることを示し、複数のスワップ領域がある場合、同じ優先度のものは容量に応じて交互に(ラウンドロビン的に)使用されます。USED列が常に容量近くまで埋まっている場合は、物理メモリ不足のサインです。
/etc/fstabに/swapfile none swap sw 0 0のような行を追加しておくことで、次回起動時にも自動的に有効化されます。スワップの使用量が常に高い状態が続く場合は、物理メモリの不足を示すサインである可能性が高く、根本的にはメモリ増設や、メモリを多く消費しているプロセスの見直しを検討すべきです。
systemd-mountユニットによるマウント管理
systemdは、/etc/fstabのエントリを内部的に.mountユニットへ自動変換して管理しています。fstabを直接編集する代わりに、.mountユニットファイルを個別に作成することもできます。
/etc/systemd/system/mnt-data.mount の例
[Unit]
Description=Data volume mount
[Mount]
What=/dev/sdb1
Where=/mnt/data
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target
ユニットファイル名は、マウントポイントのパスをsystemd規則でエスケープしたもの(/mnt/data→mnt-data.mount)と一致させる必要があります。作成後は通常のユニットと同様にsystemctl daemon-reload・systemctl start mnt-data.mount・systemctl enable mnt-data.mountで管理します。
$ systemctl list-units --type=mount # 現在アクティブな.mountユニットの一覧(fstab由来のものも含む)
UNIT LOAD ACTIVE SUB DESCRIPTION
-.mount loaded active mounted Root Mount
boot.mount loaded active mounted /boot
boot-efi.mount loaded active mounted /boot/efi
home.mount loaded active mounted /home
mnt-data.mount loaded active mounted Data volume mount
5 loaded units listed.
$ systemctl status mnt-data.mount
● mnt-data.mount - Data volume mount
Loaded: loaded (/etc/systemd/system/mnt-data.mount; enabled; preset: enabled)
Active: active (mounted) since Thu 2026-08-21 06:00:20 JST; 3h 45min ago
Where: /mnt/data
What: /dev/sdb1
Docs: man:fstab(5)
man:systemd-fstab-generator(8)
Tasks: 0 (limit: 4649)
Memory: 0B
CPU: 0
この行のこの値に注目: list-units --type=mountの-.mountという表記は、ルートファイルシステム(/)自身のユニット名です。fstab由来のマウントも、自動生成された.mountユニットとして同じ一覧に表示されるため、fstabで書いたか.mountユニットファイルで書いたかを問わず、統一的に状態を確認できます。systemctl statusのWhere・What行は、それぞれマウントポイントと実際のデバイスを示し、fstabの2番目・1番目のフィールドに対応します。
/etc/fstabに書くのが最もシンプルで実務上も一般的です。.mountユニットは、他のsystemdユニット(サービス起動前に必ずマウントを待つ、など)との依存関係を明示したい場合や、条件付き自動マウント(.automountユニットと組み合わせたオンデマンドマウント)を構成したい場合に選択肢になります。