第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)まで表示されるため、意図通りのオプションで実際にマウントされているかを正確に確認できます。

umountが失敗する場合: 「device is busy」のようなエラーが出る場合、そのファイルシステム上のファイルを開いているプロセスが残っています。fuser -m /mnt/dataやlsof +D /mnt/dataで該当プロセスを特定し、可能であれば正常に終了させてからアンマウントするのが安全です。umount -l(lazy unmount)はその場でマウントポイントを切り離しますが、実際の解放は使用中のプロセスが終了してから行われるため、データ不整合のリスクを完全には排除できない点に注意してください。

よく使うマウントオプションの一覧

4番目のフィールド(マウントオプション)はカンマ区切りで複数指定できます。実務でよく使われる代表的なオプションを整理します。

オプション意味
defaultsrw,suid,dev,exec,auto,nouser,async相当の標準的な組み合わせ
noatimeファイルアクセス時刻の更新を省略し、I/O性能を向上させる(頻繁な読み取りが多い環境で有効)
nosuidSUID/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番目のフィールドに対応します。

fstabと.mountユニットの使い分け: 単純な固定ディスクのマウントは、これまで通り/etc/fstabに書くのが最もシンプルで実務上も一般的です。.mountユニットは、他のsystemdユニット(サービス起動前に必ずマウントを待つ、など)との依存関係を明示したい場合や、条件付き自動マウント(.automountユニットと組み合わせたオンデマンドマウント)を構成したい場合に選択肢になります。

確認クイズ

Q1. 設定ファイル/etc/fstab の各行で、実運用上デバイスファイルパス(/dev/sda1など)の代わりに使うことが推奨される識別子はどれですか?

解説: UUIDはディスクの増設・交換で番号がずれるデバイスファイルパスと異なり不変の識別子であるため、/etc/fstabでの指定に推奨されます。

Q2. 設定ファイル/etc/fstab を編集した後、再起動する前に構文とマウント可否を確認するために実行すべきコマンドはどれですか?

解説: mount -aは/etc/fstabに記載された全エントリをマウントしようとするため、記述ミスがあれば再起動前にエラーとして検出できます。

Q3. umountの実行時に「device is busy」のようなエラーが出た場合、原因を特定するために使えるコマンドはどれですか?

解説: fuser -mは指定したファイルシステム上のファイルを開いているプロセスを特定でき、アンマウント失敗の原因調査に使えます。

Q4. スワップファイルを作成する際、mkswapコマンドの前に行っておくべき設定はどれですか?

解説: スワップファイルは他ユーザーから読み取れないよう、mkswap前にchmod 600でパーミッションを制限しておくのが基本です。

Q5. 外付けストレージなど、起動時にデバイスが見つからない可能性があるエントリに付けておくべき/etc/fstabのオプションはどれですか?

解説: nofailを指定しておくと、そのデバイスが見つからなくてもシステム全体の起動を失敗させずに続行できます。