RHEL 基礎 #6 ファイルシステムの基本 — XFS、mount、/etc/fstab
#5 で権限を設定したファイルは結局 ファイルシステム の上に住み、そのファイルシステムは ブロックデバイス (ディスク) の上に作られて、ツリーのどこかにマウントされています。この記事はその一層を整理します。新しいディスクを一枚追加してデータディレクトリとしてマウントする流れまで一気に進みます。
RHEL 基礎 シリーズでこの記事の位置:
- #1 RHEL とは — Fedora から RHEL まで、そして AlmaLinux と Rocky Linux
- #2 セットアップ — RHEL 9 インストール、Subscription Manager、初ログイン
- #3 dnf とパッケージ管理 — repo、modules、AppStream
- #4 systemd 入門 — サービス、target、journalctl
- #5 ユーザー/グループ/権限 — UID/GID、sudo、ACL
- #6 ファイルシステムの基本 — XFS、mount、/etc/fstab ← この記事
- #7 基本セキュリティ — firewalld、SSH ハードニング
XFS — RHEL 9 のデフォルト #
RHEL 9 のデフォルトファイルシステムは XFS です。(RHEL 7 からデフォルトで、それ以前は ext4 でした。)
$ findmnt -t xfs,ext4
TARGET SOURCE FSTYPE OPTIONS
/ /dev/mapper/rhel-root xfs rw,relatime,attr2,inode64,...
/boot /dev/vda1 xfs rw,relatime,attr2,inode64,...
/home /dev/mapper/rhel-home xfs rw,relatime,attr2,inode64,...XFS と ext4 の違い #
| 項目 | XFS | ext4 |
|---|---|---|
| RHEL のデフォルト | ✅ (RHEL 7+) | RHEL 6 時代のデフォルト |
| 大きなファイル / 大きなボリューム | 非常に強い (ペタバイト) | 良い (数十 TB) |
| 小さなファイル多数 / メタデータ変更が頻繁 | 普通 | やや有利 |
縮小 (resize 縮める) | 不可 | 可能 |
拡張 (resize 増やす) | 可能 (xfs_growfs) | 可能 (resize2fs) |
| スナップショット | LVM 経由 (外部) | LVM 経由 (外部) |
最もよく言及される違いは 縮小不可 という点です。XFS は一度確保したサイズを縮められません。拡張は可能です。運用では問題にならないことが多いですが、知っておく方が良いです。
その他に出会う fs — btrfs は RHEL 7 で技術プレビュー、RHEL 8 から公式に deprecated。使用禁止。Stratis が代わりに入りました (中級 #3)。コンテナワークロード向けには overlayfs がよく登場しますが、それは Docker/Podman の #4 ボリュームとネットワーク で。
ディスクを見る — lsblk / df / du
#
lsblk — ブロックデバイスツリー
#
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 252:0 0 40G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 39G 0 part
├─rhel-root 253:0 0 25G 0 lvm /
├─rhel-swap 253:1 0 4G 0 lvm [SWAP]
└─rhel-home 253:2 0 10G 0 lvm /home
vdb 252:16 0 20G 0 disk ← 新しく付けたディスクvda がシステムディスク、vdb が後から追加した空のディスク (後で使う) です。仮想化環境では vda / vdb が一般的で、ベアメタル / 旧式の仮想化では sda / sdb がよく出ます。
df — マウント済みファイルシステムの使用量
#
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/rhel-root xfs 25G 12G 13G 48% /
/dev/vda1 xfs 974M 254M 720M 27% /boot
/dev/mapper/rhel-home xfs 10G 1.2G 8.8G 13% /home
tmpfs tmpfs 1.8G 12M 1.8G 1% /run-h が人間に読みやすい単位、-T がファイルシステム種別の表示。運用でディスクアラートが出たら最初によく叩くコマンドです。
du — ディレクトリごとの使用量
#
$ du -sh /var/log # /var/log の合計だけ
$ du -sh /var/* | sort -h # /var 下の各ディレクトリをソート
$ du -sh /var/log/* | sort -h | tail -10 # 大きい順 10 個/ が一杯ですとアラートが来たら du -sh /* から始めて段々と深掘りしていく流れが一般的です。
新しいディスクを一枚追加してマウントする #
この記事の中心となる実習。上の lsblk で見た /dev/vdb 一枚を丸ごと使って /data にマウントしてみます。
VM にディスク追加 — UTM: VM 停止後 Edit → New → Virtual Drive 追加。VirtualBox: VM Settings → Storage → Controller: SATA → Add Hard Disk。
1) ディスク認識の確認 #
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 252:0 0 40G 0 disk
...
vdb 252:16 0 20G 0 disk ← 空ディスク2) パーティション作成 — parted または gdisk
#
小さなディスクは丸ごと一パーティションでも構いません。大きなディスク (≥ 2TB) は GPT が必須。parted は GPT/MBR の両方をうまく扱えます。
$ sudo parted /dev/vdb mklabel gpt
$ sudo parted /dev/vdb mkpart data xfs 0% 100%
$ sudo parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 21.5GB
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 21.5GB 21.5GB data/dev/vdb1 というパーティションができました (vdb + 1)。
$ lsblk /dev/vdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vdb 252:16 0 20G 0 disk
└─vdb1 252:17 0 20G 0 partディスクを丸ごと (パーティションなしで) ファイルシステムにすることも可能 (
mkfs.xfs /dev/vdbを直接)。ただしパーティションテーブルがある方が他のツールから認識されやすく、推奨です。
3) ファイルシステム作成 — mkfs.xfs
#
$ sudo mkfs.xfs /dev/vdb1
meta-data=/dev/vdb1 isize=512 agcount=4, agsize=...
data = bsize=4096 blocks=...
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=...
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.ext4 で作りたければ sudo mkfs.ext4 /dev/vdb1。出力が違うだけで流れは同じです。
4) マウントポイントを作って一時マウント #
$ sudo mkdir -p /data
$ sudo mount /dev/vdb1 /data
$ df -hT /data
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdb1 xfs 20G 175M 20G 1% /dataここまでで /data が動きます。ただし 再起動すると消えます — 一時マウントです。永続登録が次のステップ。
5) /etc/fstab に永続登録 — UUID で
#
/etc/fstab は起動時に自動マウントするファイルシステムの一覧です。
$ sudo blkid /dev/vdb1
/dev/vdb1: UUID="abc12345-67de-89fa-bcde-1234567890ab" TYPE="xfs" PARTUUID="..."UUID をコピーして /etc/fstab に一行追加します。
UUID=abc12345-67de-89fa-bcde-1234567890ab /data xfs defaults 0 0六つのカラム:
| # | 意味 |
|---|---|
| 1 | デバイス — UUID 推奨 (デバイス名は起動ごとに変わる可能性) |
| 2 | マウントポイント |
| 3 | ファイルシステム種別 |
| 4 | オプション — defaults、noatime、nofail など |
| 5 | dump バックアップの可否 (ほぼ常に 0) |
| 6 | fsck 順序 — / は 1、それ以外は 2 または 0 |
6) /etc/fstab の検証 — mount -a
#
/etc/fstab の一行のタイポが起動を止めかねないので 再起動前に必ず 検証します。
$ sudo umount /data # 一時マウントを外して
$ sudo mount -a # /etc/fstab のすべての項目をマウント試行
$ df -hT /data
/dev/vdb1 xfs 20G 175M 20G 1% /data ← /etc/fstab で再度マウントされたmount -a がエラーなしで終われば安全。エラーが出たら一行を直してから再確認。
落とし穴 —
/etc/fstabが壊れたまま再起動すると 起動中のマウント段階で止まり、緊急モード (emergency.target) に入ります。RHEL 9 ではnofailオプションを併記すれば、その項目が失敗しても起動は続きます — データディスクに推奨。
UUID=abc12345-... /data xfs defaults,nofail 0 0/etc/fstab のよく使うオプション
#
| オプション | 意味 |
|---|---|
defaults | rw、suid、dev、exec、auto、nouser、async (デフォルト束) |
noatime | ファイル読み取り時に access time を更新しない — 性能 ↑、推奨 |
nofail | 起動時に失敗しても続行 (データディスク向け) |
ro / rw | 読み取り専用 / 読み書き |
noexec | 中のバイナリ実行禁止 — /tmp のようなところのセキュリティ用 |
nosuid | SUID ビット無視 — セキュリティ用 |
nodev | デバイスファイル無視 — セキュリティ用 |
_netdev | ネットワークファイルシステム (NFS、iSCSI) — ネットワーク後にマウント |
運用では defaults,noatime,nofail 程度がデータディスクの標準セット。セキュリティを気にする環境では nosuid,nodev,noexec まで追加。
swap の運用 #
現在の swap を見る #
$ swapon --show
NAME TYPE SIZE USED PRIO
/dev/mapper/rhel-swap partition 4G 12M -2
$ free -h
total used free ...
Mem: 3.7Gi 1.2Gi 1.8Gi
Swap: 4.0Gi 12Mi 4.0Giswap ファイルの追加 #
パーティションの空きがないとき ファイルを swap として 使えます。一時的 / 追加の swap によく使います。
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ swapon --show
NAME TYPE SIZE USED PRIO
...
/swapfile file 1024M 0B -3永続登録は /etc/fstab に:
/swapfile none swap sw 0 0swappiness
#
カーネルが RAM の代わりに swap をどれくらい積極的に使うかの値 (0~100)。デフォルト 60。
$ cat /proc/sys/vm/swappiness
60
$ sudo sysctl vm.swappiness=10 # 即座
$ echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.conf # 永続サーバーは通常 10~30 程度に低めに設定します。swap によく落ちると応答が遅くなるからです。
LVM をちらっと #
#2 の自動パーティショニングの結果として LVM (/dev/mapper/rhel-root) が出ました。LVM は 物理ディスクとファイルシステムの間の抽象化レイヤ です。
PV (Physical Volume) ─┐
PV ────────────────────┤ → VG (Volume Group) → LV (Logical Volume) → ファイルシステム
PV ────────────────────┘三層の意味:
- PV — ディスク / パーティション一枚を LVM 用にマーク
- VG — PV をまとめたプール
- LV — VG から切り出した論理ボリューム。ここにファイルシステムを乗せる
LVM の本当の価値は 拡張 / 縮小 / スナップショット にあります。/home が一杯になれば同じ VG に PV を足して LV を拡げられます。深掘りは 中級 #2 LVM で本格的に扱います。
上で作った /dev/vdb1 は LVM なしで単純パーティションで進みましたが、運用では LVM の上に置くのがほぼ標準です。
よく出会う落とし穴 #
「再起動したらディスクが付いていない」 #
/etc/fstab の登録忘れの場合。mount コマンドはメモリにのみ作用し、再起動で消えます。/etc/fstab に一行 + mount -a で検証 が正解。
「/etc/fstab を間違えて起動しなくなった」
#
GRUB メニューから rescue モード に入って /etc/fstab を直接修正。あるいは nofail オプションを予め付けておくのが予防策。本番マシンの再起動前は必ず mount -a で検証。
「デバイス名が変わった」 #
/dev/sda だったものが再起動後 /dev/sdb に。SATA スロット変更、USB ディスクの順序、仮想化でのディスク追加順など。だから UUID で登録する のが標準です。blkid で UUID を確認してから /etc/fstab に。
「df と du の結果が違う」 #
df は ファイルシステムのメタデータ ベース、du は 実ファイルを辿って 集計します。誰かが rm で消したファイルを まだプロセスが開いたままだと、df は使用中と見ますが du は見えません。lsof | grep deleted でそういうプロセスを見つけて再起動。
「XFS を縮めたい」 #
XFS は 縮められません。縮めるにはデータを別の場所にバックアップ → 新しい小さいファイルシステムを作る → 復元、の手順が必要です。運用環境で LVM を使っていても LV 自体は縮められても中の XFS は縮められません。
よく使うコマンド一表 #
| コマンド | する仕事 |
|---|---|
lsblk [-f] | ブロックデバイスツリー (+ ファイルシステム / UUID) |
blkid <device> | UUID とファイルシステム種別 |
findmnt [-t xfs] | マウントツリー |
df -hT [path] | ファイルシステム使用量 |
du -sh <path> / du -sh /path/* | sort -h | ディレクトリ使用量 |
parted /dev/X mklabel gpt / mkpart NAME xfs 0% 100% | パーティション |
mkfs.xfs /dev/X / mkfs.ext4 /dev/X | フォーマット |
mount /dev/X /mnt / umount /mnt | 一時マウント |
mount -a | /etc/fstab のすべてを試行 |
swapon --show / swapoff /path | swap の状態 / オフ |
mkswap / swapon | swap を作って有効化 |
xfs_growfs /mnt / resize2fs /dev/X | 拡張 (LV を拡げた後) |
まとめ #
この記事で押さえた絵:
- RHEL 9 のデフォルト fs は XFS。大きなボリュームに強いが 縮小不可。
lsblk(ブロックツリー) /df(マウント済み fs の使用量) /du(ディレクトリごと) — ディスク診断の三点セット。- 新ディスク追加の流れ: 認識 →
parted→mkfs.xfs→mount→/etc/fstab登録 →mount -aで検証。 /etc/fstabは UUID で 登録 (デバイス名は変動の可能性)。データディスクにはnofail。- swap はパーティションかファイルで。
swappinessはサーバーで通常 10~30。 - 運用では LVM の上にファイルシステムを乗せるのが標準 — 拡張 / スナップショットが可能 (中級 #2)。
次 — セキュリティの基本 #
ファイルシステムが押さえられればその上にデータが住み、データに外部からアクセスする経路が ファイアウォール と SSH です。最後の記事であり、このシリーズの収束点。
#7 基本セキュリティ — firewalld、SSH ハードニング では RHEL のファイアウォール抽象化 firewalld の zone モデル、firewall-cmd のコマンド群 (永続 vs 一時)、よく使う zone/service/port のパターン、そして SSH ハードニング — パスワード認証オフ、鍵認証、root ログインのロック、ポート変更、sshd_config.d/ 分離 — までを一度に押さえてシリーズを締めくくります。