RHEL 基礎 #6 ファイルシステムの基本 — XFS、mount、/etc/fstab

読了 9分

#5 で権限を設定したファイルは結局 ファイルシステム の上に住み、そのファイルシステムは ブロックデバイス (ディスク) の上に作られて、ツリーのどこかにマウントされています。この記事はその一層を整理します。新しいディスクを一枚追加してデータディレクトリとしてマウントする流れまで一気に進みます。

RHEL 基礎 シリーズでこの記事の位置:

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 の違い #

項目XFSext4
RHEL のデフォルト✅ (RHEL 7+)RHEL 6 時代のデフォルト
大きなファイル / 大きなボリューム非常に強い (ペタバイト)良い (数十 TB)
小さなファイル多数 / メタデータ変更が頻繁普通やや有利
縮小 (resize 縮める)不可可能
拡張 (resize 増やす)可能 (xfs_growfs)可能 (resize2fs)
スナップショットLVM 経由 (外部)LVM 経由 (外部)

最もよく言及される違いは 縮小不可 という点です。XFS は一度確保したサイズを縮められません。拡張は可能です。運用では問題にならないことが多いですが、知っておく方が良いです。

その他に出会う fsbtrfs は 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
$ 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 のよく使うパターン
$ 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 の両方をうまく扱えます。

parted で GPT パーティション一枚
$ 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 #

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) マウントポイントを作って一時マウント #

mount
$ 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 は起動時に自動マウントするファイルシステムの一覧です。

UUID 確認
$ sudo blkid /dev/vdb1
/dev/vdb1: UUID="abc12345-67de-89fa-bcde-1234567890ab" TYPE="xfs" PARTUUID="..."

UUID をコピーして /etc/fstab に一行追加します。

/etc/fstab — 末尾に追加
UUID=abc12345-67de-89fa-bcde-1234567890ab  /data  xfs  defaults  0  0

六つのカラム:

#意味
1デバイス — UUID 推奨 (デバイス名は起動ごとに変わる可能性)
2マウントポイント
3ファイルシステム種別
4オプション — defaultsnoatimenofail など
5dump バックアップの可否 (ほぼ常に 0)
6fsck 順序 — / は 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 のよく使うオプション #

オプション意味
defaultsrw、suid、dev、exec、auto、nouser、async (デフォルト束)
noatimeファイル読み取り時に access time を更新しない — 性能 ↑、推奨
nofail起動時に失敗しても続行 (データディスク向け)
ro / rw読み取り専用 / 読み書き
noexec中のバイナリ実行禁止 — /tmp のようなところのセキュリティ用
nosuidSUID ビット無視 — セキュリティ用
nodevデバイスファイル無視 — セキュリティ用
_netdevネットワークファイルシステム (NFS、iSCSI) — ネットワーク後にマウント

運用では defaults,noatime,nofail 程度がデータディスクの標準セット。セキュリティを気にする環境では nosuid,nodev,noexec まで追加。

swap の運用 #

現在の 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.0Gi

swap ファイルの追加 #

パーティションの空きがないとき ファイルを swap として 使えます。一時的 / 追加の swap によく使います。

swap ファイル 1GB を作る
$ 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 に:

/etc/fstab
/swapfile  none  swap  sw  0  0

swappiness #

カーネルが 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 は 物理ディスクとファイルシステムの間の抽象化レイヤ です。

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 /pathswap の状態 / オフ
mkswap / swaponswap を作って有効化
xfs_growfs /mnt / resize2fs /dev/X拡張 (LV を拡げた後)

まとめ #

この記事で押さえた絵:

  • RHEL 9 のデフォルト fs は XFS。大きなボリュームに強いが 縮小不可
  • lsblk (ブロックツリー) / df (マウント済み fs の使用量) / du (ディレクトリごと) — ディスク診断の三点セット。
  • 新ディスク追加の流れ: 認識 → partedmkfs.xfsmount/etc/fstab 登録 → mount -a で検証
  • /etc/fstabUUID で 登録 (デバイス名は変動の可能性)。データディスクには 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/ 分離 — までを一度に押さえてシリーズを締めくくります。

X