File System Hierarchy and Management

Linux ファイルシステム階層構造と管理 徹底解説

はじめに

Linux システムにおけるファイルシステムは、全てのデータの格納・組織化・アクセスの基盤である。「Everything is a file(全てはファイルである)」という Unix 哲学に基づき、通常のファイルだけでなく、デバイス、プロセス情報、カーネルパラメータまでもがファイルシステムを通じてアクセスされる。

システム管理者にとって、ファイルシステム階層構造(FHS)の理解、各種ファイルシステムの特性の把握、そしてファイルシステムの作成・管理・監視・修復の技術は、日常業務の根幹を成す。

本記事では、FHS に基づくディレクトリ構造の詳細から、主要なファイルシステム(ext4, XFS, Btrfs, ZFS)の特徴と運用、マウント管理、ディスク使用量の監視、ファイルシステムの修復、クォータ管理、チューニングに至るまで、包括的に解説する。

対象読者

  • Linux システム管理者(初級〜中級)
  • インフラエンジニア・SRE
  • ストレージ管理を担当するエンジニア

本記事で扱う範囲

内容
第1章FHS(Filesystem Hierarchy Standard)
第2章主要ディレクトリの詳細
第3章仮想ファイルシステム(/proc, /sys, /dev)
第4章ファイルシステムの種類と特徴
第5章ファイルシステムの作成と管理
第6章マウント管理と /etc/fstab
第7章ディスク使用量の監視
第8章ファイルシステムの検査と修復
第9章クォータ管理
第10章ファイルシステムのチューニング
第11章高度なトピックとベストプラクティス

第1章: FHS(Filesystem Hierarchy Standard)

1.1 FHS の概要

FHS(Filesystem Hierarchy Standard)は、Unix 系オペレーティングシステムにおけるディレクトリ構造とディレクトリ内容の標準規格である。Linux Standard Base(LSB)の一部として、Linux ディストリビューション間での互換性を確保するために策定されている。

現在の最新バージョンは FHS 3.0(2015年6月リリース)であり、主要な Linux ディストリビューション(RHEL, Ubuntu, SUSE 等)がこの標準に従っている。

1.2 ディレクトリ構造の全体像

/(ルート)
├── bin/     → 基本コマンド(全ユーザー用)
├── boot/    → ブートローダー関連ファイル
├── dev/     → デバイスファイル
├── etc/     → システム設定ファイル
├── home/    → ユーザーホームディレクトリ
├── lib/     → 共有ライブラリ
├── lib64/   → 64ビット共有ライブラリ
├── media/   → リムーバブルメディアのマウントポイント
├── mnt/     → 一時的なマウントポイント
├── opt/     → サードパーティアプリケーション
├── proc/    → プロセス情報(仮想ファイルシステム)
├── root/    → root ユーザーのホームディレクトリ
├── run/     → 実行時の変動データ
├── sbin/    → システム管理コマンド
├── srv/     → サービスデータ
├── sys/     → カーネル・デバイス情報(仮想ファイルシステム)
├── tmp/     → 一時ファイル
├── usr/     → ユーザー用の読み取り専用データ
│   ├── bin/     → ユーザーコマンド
│   ├── include/ → C ヘッダーファイル
│   ├── lib/     → ライブラリ
│   ├── local/   → ローカルインストール用
│   ├── sbin/    → システム管理コマンド
│   └── share/   → アーキテクチャ非依存データ
└── var/     → 変動データ
    ├── cache/   → アプリケーションキャッシュ
    ├── lib/     → 状態情報
    ├── log/     → ログファイル
    ├── mail/    → メールボックス
    ├── run/     → → /run へのシンボリックリンク
    ├── spool/   → スプールデータ
    └── tmp/     → 再起動間で保持される一時ファイル

1.3 FHS の分類基準

FHS では、ディレクトリを2つの軸で分類する。

共有可能性(Shareable vs Non-shareable)

分類説明
Shareableネットワーク経由で他のホストと共有可能/usr, /opt, /home
Non-shareable特定のホストに固有/etc, /boot, /var/run

変動性(Static vs Variable)

分類説明
Static管理者の操作なしには変化しない/usr, /opt, /boot
Variable管理者の操作なしに変化する/var, /tmp, /run

分類マトリクス

StaticVariable
Shareable/usr, /opt/var/mail, /var/spool
Non-shareable/etc, /boot/var/run, /var/lock

1.4 現代の Linux における変化

現代の Linux ディストリビューション(特に systemd ベース)では、以下の変更が導入されている。

# /bin, /sbin, /lib, /lib64 が /usr/ 配下へのシンボリックリンクになった
# これを「usr merge」(usrmerge)と呼ぶ
ls -la /bin
# 出力例: lrwxrwxrwx 1 root root 7 /bin -> usr/bin

ls -la /sbin
# 出力例: lrwxrwxrwx 1 root root 8 /sbin -> usr/sbin

ls -la /lib
# 出力例: lrwxrwxrwx 1 root root 7 /lib -> usr/lib

ls -la /lib64
# 出力例: lrwxrwxrwx 1 root root 9 /lib64 -> usr/lib64

# /var/run が /run へのシンボリックリンク
ls -la /var/run
# 出力例: lrwxrwxrwx 1 root root 4 /var/run -> /run

# /var/lock が /run/lock へのシンボリックリンク
ls -la /var/lock
# 出力例: lrwxrwxrwx 1 root root 9 /var/lock -> /run/lock

第2章: 主要ディレクトリの詳細

2.1 /etc — システム設定

システム全体の設定ファイルが格納されるディレクトリ。FHS では、このディレクトリにバイナリを配置してはならないと規定されている。

# 主要な設定ファイル
ls /etc/
ファイル/ディレクトリ説明
/etc/hostnameホスト名
/etc/hostsホスト名と IP アドレスのマッピング
/etc/resolv.confDNS リゾルバーの設定
/etc/fstabファイルシステムのマウント設定
/etc/passwdユーザーアカウント情報
/etc/shadow暗号化されたパスワード
/etc/groupグループ情報
/etc/sudoerssudo の設定
/etc/ssh/SSH の設定
/etc/systemd/systemd の設定
/etc/crontabシステムの cron 設定
/etc/sysctl.confカーネルパラメータの設定
/etc/sysctl.d/カーネルパラメータのドロップイン
/etc/security/PAM セキュリティ設定
/etc/logrotate.d/ログローテーション設定
/etc/default/サービスのデフォルト設定
/etc/profileシステム全体のシェルプロファイル
/etc/profile.d/プロファイルのドロップイン
/etc/environmentシステム全体の環境変数
/etc/modprobe.d/カーネルモジュール設定
/etc/udev/rules.d/udev ルール
# /etc 配下の設定ファイルの変更を追跡する(etckeeper を使用)
sudo apt install etckeeper  # Debian/Ubuntu
sudo yum install etckeeper  # RHEL/CentOS

# etckeeper の初期化(git で /etc を管理)
sudo etckeeper init
sudo etckeeper commit "Initial commit"

# 変更の確認
sudo git -C /etc log --oneline
sudo git -C /etc diff

2.2 /var — 変動データ

システムの運用中に変化するデータが格納されるディレクトリ。

# /var の構造
tree -L 1 /var/
ディレクトリ説明管理のポイント
/var/log/ログファイルログローテーションの設定が重要
/var/lib/アプリケーションの状態データバックアップ対象
/var/cache/キャッシュデータ削除可能(再生成される)
/var/spool/スプールデータ(印刷、メール等)キューイングデータ
/var/tmp/再起動で保持される一時ファイル/tmp より長寿命
/var/mail/ユーザーメールボックスメール未読通知
# /var/log の主要なログファイル
ls -la /var/log/

# 主要なログファイル
# /var/log/syslog       - システムログ(Debian系)
# /var/log/messages     - システムログ(RHEL系)
# /var/log/auth.log     - 認証ログ(Debian系)
# /var/log/secure       - 認証ログ(RHEL系)
# /var/log/kern.log     - カーネルログ
# /var/log/dmesg        - ブート時のカーネルメッセージ
# /var/log/boot.log     - ブートログ
# /var/log/cron         - cron ログ
# /var/log/maillog      - メールログ
# /var/log/lastlog      - 最終ログイン情報
# /var/log/wtmp         - ログイン履歴
# /var/log/btmp         - 失敗したログイン試行

# ログローテーションの設定確認
cat /etc/logrotate.conf
ls /etc/logrotate.d/

# ログローテーションの例
cat /etc/logrotate.d/syslog
# /etc/logrotate.d/myapp の設定例
/var/log/myapp/*.log {
    daily               # 毎日ローテーション
    missingok           # ログファイルがなくてもエラーにしない
    rotate 30           # 30世代保持
    compress            # 古いログを圧縮
    delaycompress       # 1世代前のログは圧縮しない
    notifempty          # 空のログファイルはローテーションしない
    create 0640 myapp myapp  # 新しいログファイルのパーミッション
    sharedscripts       # 全ログファイルの処理後にスクリプトを1回実行
    postrotate
        systemctl reload myapp 2>/dev/null || true
    endscript
}

2.3 /usr — ユーザーデータ(読み取り専用)

# /usr の構造
tree -L 1 /usr/
ディレクトリ説明
/usr/bin/一般ユーザー用コマンド
/usr/sbin/システム管理用コマンド
/usr/lib/共有ライブラリ
/usr/lib64/64ビット共有ライブラリ
/usr/include/C/C++ ヘッダーファイル
/usr/share/アーキテクチャ非依存データ(man, doc, locale等)
/usr/local/ローカルでインストールしたソフトウェア
/usr/src/カーネルソースコード等
# /usr/local の構造(ソースからインストールしたソフトウェア)
tree -L 1 /usr/local/
# bin/     - バイナリ
# etc/     - 設定
# include/ - ヘッダー
# lib/     - ライブラリ
# sbin/    - 管理コマンド
# share/   - 共有データ
# src/     - ソースコード

2.4 /boot — ブート関連ファイル

# /boot の内容
ls -la /boot/

# 主なファイル
# vmlinuz-*           - カーネルイメージ
# initrd.img-*        - initramfs イメージ
# config-*            - カーネル設定
# System.map-*        - カーネルシンボルテーブル
# grub/ または grub2/  - GRUB2 の設定とモジュール
# efi/                - UEFI パーティション(マウントポイント)

# /boot のサイズ確認(容量不足はよくある問題)
df -h /boot
du -sh /boot/*

# 古いカーネルの削除(Debian/Ubuntu)
sudo apt autoremove --purge

# 古いカーネルの削除(RHEL/CentOS)
# /etc/dnf/dnf.conf の installonly_limit で保持数を設定
sudo dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q)

2.5 /opt — サードパーティアプリケーション

# /opt の使い方
# パッケージマネージャー以外でインストールするソフトウェアの推奨場所
# 例: /opt/vendor_name/product_name/

# 例: Google Chrome
ls /opt/google/chrome/

# 例: カスタムアプリケーション
sudo mkdir -p /opt/mycompany/myapp
sudo chown -R myapp:myapp /opt/mycompany/myapp

2.6 /tmp と /var/tmp の違い

特性/tmp/var/tmp
保持期間再起動で削除再起動後も保持
systemd のクリーンアップ10日30日
推奨用途短期的な一時ファイル長期的な一時ファイル
tmpfs マウント可能(メモリ上)通常はディスク上
# systemd-tmpfiles によるクリーンアップ設定
cat /usr/lib/tmpfiles.d/tmp.conf
# q /tmp 1777 root root 10d
# q /var/tmp 1777 root root 30d

# /tmp を tmpfs でマウント(メモリベース)
# /etc/fstab に追加:
# tmpfs  /tmp  tmpfs  defaults,noatime,nosuid,nodev,noexec,mode=1777,size=2G  0  0

# 現在の /tmp のマウント状態を確認
mount | grep /tmp
df -h /tmp

第3章: 仮想ファイルシステム

3.1 /proc — プロセス情報ファイルシステム(procfs)

/proc は、カーネルとプロセスの情報をファイルとして公開する仮想ファイルシステムである。ディスク上には実体がなく、カーネルがリアルタイムに生成する情報を提供する。

# /proc のマウント確認
mount | grep proc
# 出力例: proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

# /proc の構造
ls /proc/
# 数値ディレクトリ = PID(プロセスごとの情報)
# その他 = システム全体の情報

プロセス情報(/proc/[PID]/)

# PID 1(systemd)の情報を確認
ls /proc/1/

# 主要なファイル
cat /proc/1/cmdline | tr '\0' ' '   # コマンドライン引数
cat /proc/1/status                   # プロセスの状態詳細
cat /proc/1/maps                     # メモリマッピング
ls -la /proc/1/fd/                   # オープンファイルディスクリプタ
cat /proc/1/limits                   # リソース制限
ls -la /proc/1/cwd                   # カレントディレクトリ
ls -la /proc/1/exe                   # 実行ファイルへのリンク
ls -la /proc/1/root                  # ルートディレクトリ
cat /proc/1/environ | tr '\0' '\n'   # 環境変数
cat /proc/1/io                       # I/O 統計
cat /proc/1/stat                     # プロセス統計(数値)
cat /proc/1/statm                    # メモリ使用量
cat /proc/1/cgroup                   # cgroup 情報
cat /proc/1/mountinfo                # マウント情報

システム情報

# CPU 情報
cat /proc/cpuinfo
# CPU のコア数を確認
grep -c processor /proc/cpuinfo
# CPU モデルを確認
grep "model name" /proc/cpuinfo | head -1

# メモリ情報
cat /proc/meminfo
# 主要な値
grep -E "MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree" /proc/meminfo

# カーネルバージョン
cat /proc/version

# 起動時のカーネルコマンドライン
cat /proc/cmdline

# ロードされたモジュール
cat /proc/modules

# マウントされたファイルシステム
cat /proc/mounts

# ファイルシステムの統計
cat /proc/filesystems

# ディスク I/O 統計
cat /proc/diskstats

# ネットワーク統計
cat /proc/net/dev           # インターフェース統計
cat /proc/net/tcp           # TCP 接続
cat /proc/net/udp           # UDP 接続
cat /proc/net/arp           # ARP テーブル

# 割り込み情報
cat /proc/interrupts

# 起動からの経過時間(秒)
cat /proc/uptime

# ロードアベレージ
cat /proc/loadavg

# パーティション情報
cat /proc/partitions

# RAID 情報
cat /proc/mdstat

# スワップ情報
cat /proc/swaps

/proc/sys — カーネルパラメータ

# カーネルパラメータの読み取り
cat /proc/sys/vm/swappiness
cat /proc/sys/net/ipv4/ip_forward
cat /proc/sys/fs/file-max

# カーネルパラメータの変更(一時的)
echo 10 | sudo tee /proc/sys/vm/swappiness
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

# sysctl でのアクセス(推奨)
sysctl vm.swappiness
sysctl -w vm.swappiness=10

# 主要なカーネルパラメータ
# === メモリ管理 ===
sysctl vm.swappiness            # スワップの積極性(0-100, デフォルト60)
sysctl vm.dirty_ratio           # ダーティページの最大比率
sysctl vm.dirty_background_ratio # バックグラウンドフラッシュ開始比率
sysctl vm.overcommit_memory     # メモリオーバーコミット設定
sysctl vm.min_free_kbytes       # 予約する最小空きメモリ

# === ネットワーク ===
sysctl net.ipv4.ip_forward                    # IP フォワーディング
sysctl net.ipv4.tcp_syncookies                # SYN Cookie 保護
sysctl net.core.somaxconn                     # ソケットバックログ最大値
sysctl net.ipv4.tcp_max_syn_backlog           # SYN バックログ
sysctl net.ipv4.tcp_fin_timeout               # FIN-WAIT-2 タイムアウト
sysctl net.ipv4.tcp_tw_reuse                  # TIME-WAIT ソケットの再利用

# === ファイルシステム ===
sysctl fs.file-max              # システム全体の最大ファイルディスクリプタ数
sysctl fs.inotify.max_user_watches  # inotify の最大監視数
sysctl fs.aio-max-nr            # 最大非同期 I/O リクエスト数

3.2 /sys — sysfs(デバイスとカーネルサブシステム)

/sys は、カーネルのデバイスモデルを公開する仮想ファイルシステムである。

# /sys の構造
ls /sys/
# block/     - ブロックデバイス
# bus/       - バスタイプ(PCI, USB, SCSI等)
# class/     - デバイスクラス(net, block, tty等)
# devices/   - デバイスツリー(物理的な階層構造)
# firmware/  - ファームウェア情報
# fs/        - ファイルシステム情報
# kernel/    - カーネル設定
# module/    - カーネルモジュール
# power/     - 電源管理

# ブロックデバイス情報
ls /sys/block/
cat /sys/block/sda/size           # ディスクサイズ(セクタ数)
cat /sys/block/sda/queue/scheduler  # I/O スケジューラ
cat /sys/block/sda/queue/nr_requests # I/O キューサイズ
cat /sys/block/sda/queue/rotational  # 0=SSD, 1=HDD

# ネットワークデバイス情報
ls /sys/class/net/
cat /sys/class/net/eth0/speed       # リンク速度(Mbps)
cat /sys/class/net/eth0/mtu         # MTU
cat /sys/class/net/eth0/address     # MAC アドレス
cat /sys/class/net/eth0/operstate   # 動作状態(up/down)

# I/O スケジューラの変更
echo "mq-deadline" | sudo tee /sys/block/sda/queue/scheduler
# 利用可能なスケジューラ
cat /sys/block/sda/queue/scheduler
# 出力例: [mq-deadline] kyber bfq none

# CPU 周波数情報
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

3.3 /dev — デバイスファイル

/dev は、システム上のデバイスを表すスペシャルファイルが配置されるディレクトリである。

# デバイスファイルのタイプ
ls -la /dev/sda
# brw-rw---- 1 root disk 8, 0 /dev/sda
# b = ブロックデバイス(ランダムアクセス可能)

ls -la /dev/tty0
# crw--w---- 1 root tty 4, 0 /dev/tty0
# c = キャラクタデバイス(シーケンシャルアクセス)

主要なデバイスファイル

デバイス説明
/dev/sda, /dev/sdb...SCSI/SATA/NVMe ディスク
/dev/sda1, /dev/sda2...パーティション
/dev/nvme0n1NVMe ディスク
/dev/nvme0n1p1NVMe パーティション
/dev/vda仮想ディスク(KVM/QEMU)
/dev/mapper/*Device Mapper デバイス(LVM, LUKS等)
/dev/md0, /dev/md1...MD RAID アレイ
/dev/loop0, /dev/loop1...ループバックデバイス
/dev/tty*端末デバイス
/dev/pts/*疑似端末
/dev/null入力を破棄するデバイス
/dev/zeroゼロバイトを生成するデバイス
/dev/random暗号学的に安全な乱数生成器
/dev/urandom非ブロッキング乱数生成器
/dev/stdin標準入力(→ /proc/self/fd/0)
/dev/stdout標準出力(→ /proc/self/fd/1)
/dev/stderr標準エラー出力(→ /proc/self/fd/2)
# udev によるデバイスの管理
# udev ルールの確認
ls /etc/udev/rules.d/
ls /usr/lib/udev/rules.d/

# udev ルールの例: 特定の USB デバイスに名前を付ける
cat << 'EOF' | sudo tee /etc/udev/rules.d/99-custom-usb.rules
# 特定の USB デバイスにシンボリックリンクを作成
SUBSYSTEM=="block", ATTRS{idVendor}=="0781", ATTRS{idProduct}=="5567", SYMLINK+="my_usb_drive"
EOF

# udev ルールの再読み込み
sudo udevadm control --reload-rules
sudo udevadm trigger

# デバイスの属性を確認(ルール作成に使用)
udevadm info --query=all --name=/dev/sda
udevadm info --attribute-walk --name=/dev/sda

# udev イベントの監視
sudo udevadm monitor

第4章: ファイルシステムの種類と特徴

4.1 主要なファイルシステムの比較

特性ext4XFSBtrfsZFS
最大ボリュームサイズ1 EiB8 EiB16 EiB256 ZiB
最大ファイルサイズ16 TiB8 EiB16 EiB16 EiB
ジャーナリングありあり(メタデータのみ)CoWZIL
スナップショットなしなしありあり
圧縮なしなしあり(zlib, lzo, zstd)あり(lz4, zstd等)
重複排除なしなしありあり
RAIDなし(mdadm)なし(mdadm)内蔵内蔵
チェックサムメタデータのみメタデータのみデータ+メタデータデータ+メタデータ
オンラインリサイズ拡張のみ拡張のみ拡張・縮小拡張のみ
縮小オフラインで可能不可オンラインで可能不可
デフォルトOSDebian/UbuntuRHEL/CentOSSUSEFreeBSD(Linux非標準)

4.2 ext4(Fourth Extended File System)

ext4 は、Linux で最も広く使われているファイルシステムであり、ext3 の後継として2008年に安定版がリリースされた。

ext4 の主要な特徴

# ext4 ファイルシステムの情報表示
sudo dumpe2fs /dev/sda2 | head -50
# または
sudo tune2fs -l /dev/sda2

# 主要な出力項目:
# Filesystem volume name:   <none>
# Filesystem UUID:          abc123-def456-...
# Filesystem state:         clean
# Inode count:              6553600
# Block count:              26214400
# Block size:               4096
# Journal size:             128M
# Inode size:               256
# Feature flags:            has_journal extent flex_bg sparse_super large_file ...

ext4 の特徴詳細

  • エクステントベース: 連続したブロックをエクステントとして管理(最大128MB)
  • 遅延アロケーション: データをディスクに書き込む前にブロック配置を最適化
  • ジャーナリング: メタデータ(+オプションでデータ)の一貫性を保証
  • マルチブロックアロケーション: 複数のブロックを一度に割り当て
  • ファイルシステムバリア: ジャーナルの一貫性を保護
# ext4 ジャーナリングモードの確認と変更
# data=journal   - データとメタデータの両方をジャーナル(最も安全、最も遅い)
# data=ordered   - メタデータのみジャーナル、データは先に書き込み(デフォルト)
# data=writeback - メタデータのみジャーナル、データの順序保証なし(最速)

# 現在のモード確認
cat /proc/mounts | grep "ext4"
# root パーティションのジャーナリングモードを確認
mount | grep "on / "

# fstab でのジャーナリングモード指定
# UUID=xxx / ext4 defaults,data=ordered 0 1

4.3 XFS

XFS は、SGI(Silicon Graphics)が開発した高性能ジャーナリングファイルシステムであり、RHEL 7 以降のデフォルトファイルシステムとして採用されている。

# XFS ファイルシステムの情報表示
sudo xfs_info /dev/sda2
# または(マウントされたパスを指定)
sudo xfs_info /

# 出力例:
# meta-data=/dev/sda2              isize=512    agcount=4, agsize=6553600 blks
#          =                       sectsz=512   attr=2, projid32bit=1
# data     =                       bsize=4096   blocks=26214400, imaxpct=25
#          =                       sunit=0      swidth=0 blks
# naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
# log      =internal log           bsize=4096   blocks=12800, version=2
#          =                       sectsz=512   sunit=0 blks, lazy-count=1
# realtime =none                   extsz=4096   blocks=0, rtextents=0

XFS の主要な特徴

  • アロケーショングループ: ファイルシステムを複数の AG に分割し、並列 I/O を実現
  • B+ ツリー: ディレクトリ、空き領域、エクステントの管理に使用
  • 遅延アロケーション: ext4 同様、書き込み前にブロック配置を最適化
  • オンラインデフラグ: マウント中にデフラグメンテーションが可能
  • ダイレクト I/O: 大きなシーケンシャル I/O に最適化
# XFS のデフラグメンテーション
sudo xfs_fsr /dev/sda2        # ファイルシステム全体
sudo xfs_fsr /path/to/file    # 特定のファイル

# XFS のオンラインリサイズ(拡張のみ)
sudo xfs_growfs /mountpoint

# XFS のフリーズ(スナップショット取得用)
sudo xfs_freeze -f /mountpoint   # フリーズ
sudo xfs_freeze -u /mountpoint   # アンフリーズ

4.4 Btrfs(B-tree File System)

Btrfs は、Linux 向けに開発されたコピーオンライト(CoW)ファイルシステムであり、高度な機能を備える。

# Btrfs ファイルシステムの情報表示
sudo btrfs filesystem show
sudo btrfs filesystem df /mountpoint
sudo btrfs device stats /mountpoint

# サブボリュームの管理
sudo btrfs subvolume list /mountpoint
sudo btrfs subvolume create /mountpoint/subvol1
sudo btrfs subvolume delete /mountpoint/subvol1

# スナップショット
sudo btrfs subvolume snapshot /mountpoint/subvol1 /mountpoint/subvol1_snap
sudo btrfs subvolume snapshot -r /mountpoint/subvol1 /mountpoint/subvol1_readonly_snap

# 圧縮の有効化
sudo mount -o compress=zstd /dev/sda2 /mountpoint
# fstab での設定
# UUID=xxx /mountpoint btrfs defaults,compress=zstd 0 0

# バランス(データの再配置)
sudo btrfs balance start /mountpoint
sudo btrfs balance status /mountpoint

# スクラブ(チェックサム検証)
sudo btrfs scrub start /mountpoint
sudo btrfs scrub status /mountpoint

4.5 ZFS

ZFS は、Sun Microsystems が開発したファイルシステム兼ボリュームマネージャーであり、エンタープライズレベルのデータ整合性を提供する。Linux では OpenZFS として利用可能。

# ZFS のインストール(Ubuntu の場合)
sudo apt install zfsutils-linux

# プールの作成
sudo zpool create mypool /dev/sdb
sudo zpool create mypool mirror /dev/sdb /dev/sdc  # ミラー(RAID1相当)
sudo zpool create mypool raidz /dev/sdb /dev/sdc /dev/sdd  # RAIDZ(RAID5相当)

# プールの状態確認
sudo zpool status
sudo zpool list

# データセットの作成
sudo zfs create mypool/data
sudo zfs create mypool/data/documents

# スナップショット
sudo zfs snapshot mypool/data@snapshot1
sudo zfs list -t snapshot
sudo zfs rollback mypool/data@snapshot1

# 圧縮の設定
sudo zfs set compression=lz4 mypool/data

# クォータの設定
sudo zfs set quota=100G mypool/data

# プロパティの確認
sudo zfs get all mypool/data

# スクラブ(整合性チェック)
sudo zpool scrub mypool

第5章: ファイルシステムの作成と管理

5.1 パーティションの作成

# === fdisk(MBR パーティション向け) ===
sudo fdisk /dev/sdb
# コマンド:
# n: 新規パーティション作成
# d: パーティション削除
# p: パーティションテーブル表示
# t: パーティションタイプ変更
# w: 変更を書き込み
# q: 変更を破棄して終了

# === gdisk(GPT パーティション向け) ===
sudo gdisk /dev/sdb
# コマンドは fdisk に類似

# === parted(MBR/GPT 両対応、スクリプト可能) ===
sudo parted /dev/sdb

# 非対話的な使用例
sudo parted -s /dev/sdb mklabel gpt
sudo parted -s /dev/sdb mkpart primary ext4 1MiB 50GiB
sudo parted -s /dev/sdb mkpart primary xfs 50GiB 100%

# パーティション情報の表示
sudo parted /dev/sdb print
sudo lsblk
sudo blkid

5.2 ファイルシステムの作成(mkfs)

# === ext4 ファイルシステムの作成 ===
sudo mkfs.ext4 /dev/sdb1
# オプション付き
sudo mkfs.ext4 -L "data" \             # ラベル
               -m 1 \                   # 予約ブロック比率(デフォルト5%)
               -O ^has_journal \        # ジャーナリング無効化(推奨しない)
               -b 4096 \               # ブロックサイズ
               -i 16384 \              # inode 比率(バイト/inode)
               -N 10000000 \           # inode 数の直接指定
               -E stride=16,stripe-width=64 \  # RAID 最適化
               /dev/sdb1

# === XFS ファイルシステムの作成 ===
sudo mkfs.xfs /dev/sdb2
# オプション付き
sudo mkfs.xfs -L "xfsdata" \           # ラベル
              -b size=4096 \            # ブロックサイズ
              -d agcount=16 \           # アロケーショングループ数
              -l size=128m \            # ログサイズ
              -f \                      # 強制作成(既存のFS を上書き)
              /dev/sdb2

# === Btrfs ファイルシステムの作成 ===
sudo mkfs.btrfs /dev/sdb3
# 複数デバイスでの作成
sudo mkfs.btrfs -d raid1 -m raid1 /dev/sdb3 /dev/sdc3

# === swap の作成 ===
sudo mkswap /dev/sdb4
sudo mkswap -L "swap" /dev/sdb4

# ラベルの設定・変更
sudo e2label /dev/sdb1 "newlabel"      # ext4
sudo xfs_admin -L "newlabel" /dev/sdb2 # XFS
sudo btrfs filesystem label /dev/sdb3 "newlabel"  # Btrfs

# UUID の変更(必要な場合のみ)
sudo tune2fs -U $(uuidgen) /dev/sdb1   # ext4
sudo xfs_admin -U generate /dev/sdb2   # XFS

5.3 ファイルシステムのチューニングパラメータ

# === ext4 のチューニング ===
# 予約ブロック比率の変更(デフォルト5% → 1%、データ用パーティション向け)
sudo tune2fs -m 1 /dev/sdb1

# マウント回数ベースの自動 fsck を無効化
sudo tune2fs -c 0 /dev/sdb1

# 期間ベースの自動 fsck を無効化
sudo tune2fs -i 0 /dev/sdb1

# ジャーナリングモードの変更
sudo tune2fs -o journal_data_writeback /dev/sdb1

# ファイルシステム機能の有効化
sudo tune2fs -O dir_index /dev/sdb1
sudo tune2fs -O extent /dev/sdb1

# 設定の確認
sudo tune2fs -l /dev/sdb1

# === XFS のチューニング ===
# ラベルの変更(アンマウント時のみ)
sudo xfs_admin -L "newlabel" /dev/sdb2

# UUID の変更
sudo xfs_admin -U generate /dev/sdb2

第6章: マウント管理と /etc/fstab

6.1 mount コマンド

# 基本的なマウント
sudo mount /dev/sdb1 /mnt/data

# ファイルシステムタイプを指定
sudo mount -t ext4 /dev/sdb1 /mnt/data
sudo mount -t xfs /dev/sdb2 /mnt/xfsdata

# UUID でマウント(推奨)
sudo mount UUID=abc123-def456 /mnt/data

# ラベルでマウント
sudo mount LABEL=data /mnt/data

# マウントオプションを指定
sudo mount -o rw,noatime,noexec,nosuid /dev/sdb1 /mnt/data

# 読み取り専用でマウント
sudo mount -o ro /dev/sdb1 /mnt/data

# リマウント(マウントオプションの変更)
sudo mount -o remount,rw /mnt/data

# バインドマウント(ディレクトリを別の場所にマウント)
sudo mount --bind /source/dir /target/dir

# ループバックマウント(ISOイメージ等)
sudo mount -o loop disk.iso /mnt/iso

# 現在のマウント状態を確認
mount
findmnt
findmnt -t ext4
findmnt --target /home

主要なマウントオプション

オプション説明
defaultsrw, suid, dev, exec, auto, nouser, async の組み合わせ
rw / ro読み書き可能 / 読み取り専用
noatimeアクセス時刻を更新しない(パフォーマンス向上)
relatime前回の更新から一定時間経過後のみアクセス時刻を更新
nodiratimeディレクトリのアクセス時刻を更新しない
noexec実行ファイルの実行を禁止
nosuidSUID/SGID ビットを無視
nodevデバイスファイルの解釈を無効化
sync / async同期書き込み / 非同期書き込み
auto / noauto起動時の自動マウント / 手動マウントのみ
user / nouser一般ユーザーによるマウントを許可 / 禁止
nofailマウント失敗時もブートを続行
_netdevネットワークデバイス(ネットワーク起動後にマウント)
discardSSD の TRIM コマンドを有効化
barrier=0/1ジャーナルバリアの無効化/有効化
commit=Nデータ書き込み間隔(秒)
x-systemd.automountsystemd による自動マウント

6.2 /etc/fstab の設定

# /etc/fstab の構造
cat /etc/fstab
# <ファイルシステム>              <マウントポイント>  <タイプ>  <オプション>             <dump>  <pass>
UUID=abc123-def456-...         /                ext4     defaults                  0       1
UUID=def456-ghi789-...         /boot            ext4     defaults                  0       2
UUID=ghi789-jkl012-...         /boot/efi        vfat     umask=0077                0       1
UUID=jkl012-mno345-...         /home            ext4     defaults,noatime          0       2
UUID=mno345-pqr678-...         swap             swap     defaults                  0       0
UUID=pqr678-stu901-...         /var             xfs      defaults,noatime          0       2
UUID=stu901-vwx234-...         /data            ext4     defaults,noatime,nofail   0       2

# tmpfs
tmpfs                          /tmp             tmpfs    defaults,noatime,nosuid,nodev,noexec,mode=1777,size=2G  0  0

# NFS マウント
192.168.1.100:/exports/shared  /mnt/nfs         nfs      defaults,_netdev,nofail   0       0

# CIFS/SMB マウント
//fileserver/share             /mnt/smb         cifs     credentials=/etc/samba/creds,_netdev,nofail  0  0

fstab フィールドの詳細

フィールド説明
ファイルシステムデバイスパス、UUID、LABEL、またはリモートパス
マウントポイントマウント先のディレクトリ
タイプファイルシステムの種類(ext4, xfs, btrfs, nfs, cifs, swap等)
オプションマウントオプション(カンマ区切り)
dumpdump コマンドによるバックアップ(0=なし, 1=あり)
passfsck の実行順序(0=チェックしない, 1=ルート, 2=その他)
# fstab の変更を検証(実際にマウントせずテスト)
sudo mount -a --fake

# fstab の設定をテスト(実際にマウント)
sudo mount -a

# UUID の確認
sudo blkid
sudo blkid /dev/sdb1

# ラベルの確認
sudo e2label /dev/sdb1
sudo xfs_admin -l /dev/sdb2

# systemd の自動マウントユニットを生成
sudo systemctl daemon-reload
systemctl list-units --type=mount

6.3 systemd によるマウント管理

# /etc/systemd/system/data.mount
[Unit]
Description=Data Mount
After=local-fs-pre.target
Before=local-fs.target

[Mount]
What=UUID=abc123-def456
Where=/data
Type=ext4
Options=defaults,noatime

[Install]
WantedBy=local-fs.target
# /etc/systemd/system/data.automount
[Unit]
Description=Data Automount
ConditionPathExists=/data

[Automount]
Where=/data
TimeoutIdleSec=300

[Install]
WantedBy=local-fs.target
# 有効化
sudo systemctl enable --now data.automount

6.4 アンマウント

# 基本的なアンマウント
sudo umount /mnt/data
sudo umount /dev/sdb1

# 強制アンマウント(ビジー状態でも)
sudo umount -f /mnt/data

# 遅延アンマウント(ビジーでなくなり次第アンマウント)
sudo umount -l /mnt/data

# マウントポイントを使用しているプロセスの確認
sudo fuser -m /mnt/data
sudo fuser -mv /mnt/data    # 詳細表示
sudo lsof /mnt/data          # オープンファイルの一覧

# 使用中のプロセスを終了してからアンマウント
sudo fuser -km /mnt/data     # SIGKILL を送信

第7章: ディスク使用量の監視

7.1 df(ディスクフリー)

# 基本的な使用方法
df -h                      # 人間が読みやすい形式
df -hT                     # ファイルシステムタイプ付き
df -i                      # inode の使用量
df -hi                     # inode の使用量(人間が読みやすい形式)

# 出力例:
# Filesystem      Type  Size  Used Avail Use% Mounted on
# /dev/sda2       ext4   50G   15G   32G  33% /
# /dev/sda1       vfat  512M   12M  500M   3% /boot/efi
# /dev/sdb1       xfs   100G   45G   55G  45% /data
# tmpfs           tmpfs  2.0G     0  2.0G   0% /tmp

# 特定のファイルシステムのみ表示
df -h --type=ext4
df -h --exclude-type=tmpfs

# 特定のパスの情報
df -h /data

7.2 du(ディスク使用量)

# ディレクトリごとの使用量
du -sh /var/log/            # サマリーのみ
du -h /var/log/ --max-depth=1  # 1階層のみ
du -h /var/log/ -d 1        # 同上(短縮形)

# 大きなディレクトリを見つける
du -h / -d 1 2>/dev/null | sort -rh | head -20

# 大きなファイルを見つける
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
find / -type f -size +100M -printf "%s %p\n" 2>/dev/null | sort -rn | head -20

# 特定のファイルシステム内のみ検索(他のマウントポイントを除外)
du -hx / -d 1 | sort -rh | head -20  # -x: マウントポイントを越えない

# ncdu(対話的なディスク使用量ビューア)
sudo apt install ncdu  # Debian/Ubuntu
sudo yum install ncdu  # RHEL/CentOS
ncdu /

7.3 ディスク使用量の監視スクリプト

#!/bin/bash
# /usr/local/bin/disk-alert.sh
# ディスク使用率が閾値を超えたら警告

THRESHOLD=85
ALERT_EMAIL="admin@example.com"

df -h --output=source,pcent,target -x tmpfs -x devtmpfs | tail -n +2 | while read fs usage mount; do
    usage_num=${usage%\%}
    if [ "$usage_num" -ge "$THRESHOLD" ]; then
        echo "WARNING: ${fs} mounted on ${mount} is ${usage} full" | \
            mail -s "Disk Usage Alert: ${mount} at ${usage}" "$ALERT_EMAIL"
    fi
done

7.4 inode の監視

# inode の使用量確認
df -i

# inode を大量に消費しているディレクトリの特定
find / -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head -20

# 特定のディレクトリ内のファイル数
find /var/spool -type f | wc -l

# inode 枯渇の一般的な原因:
# - メールキュー内の大量の小さなファイル
# - セッションファイルの蓄積
# - ログファイルの断片化
# - キャッシュディレクトリ内の小さなファイル

第8章: ファイルシステムの検査と修復

8.1 fsck(File System Check)

# 注意: fsck はアンマウントされた、または読み取り専用でマウントされたファイルシステムに対してのみ実行する

# 基本的な使用方法
sudo fsck /dev/sdb1

# ファイルシステムタイプを指定
sudo fsck -t ext4 /dev/sdb1
sudo fsck.ext4 /dev/sdb1

# 自動修復(対話プロンプトに全て yes で回答)
sudo fsck -y /dev/sdb1

# ドライラン(実際に修復せずチェックのみ)
sudo fsck -n /dev/sdb1

# 強制チェック(クリーンなファイルシステムでも実行)
sudo fsck -f /dev/sdb1

# 進捗表示
sudo fsck -C /dev/sdb1

8.2 e2fsck(ext4 用)

# 基本チェック
sudo e2fsck /dev/sdb1

# 自動修復
sudo e2fsck -y /dev/sdb1

# 強制チェック
sudo e2fsck -f /dev/sdb1

# 不良ブロックのチェック
sudo e2fsck -c /dev/sdb1

# 詳細表示
sudo e2fsck -v /dev/sdb1

# ジャーナルの再作成(ジャーナルが破損した場合)
sudo e2fsck -j /dev/sdb1

# スーパーブロックのバックアップを使用して修復
sudo dumpe2fs /dev/sdb1 | grep "Backup superblock"
sudo e2fsck -b 32768 /dev/sdb1

# lost+found ディレクトリの内容確認
ls -la /mountpoint/lost+found/

8.3 xfs_repair(XFS 用)

# 注意: xfs_repair はアンマウント状態でのみ実行可能

# 基本的な修復
sudo xfs_repair /dev/sdb2

# ドライラン
sudo xfs_repair -n /dev/sdb2

# 詳細出力
sudo xfs_repair -v /dev/sdb2

# ログをゼロクリアしてから修復(ログが破損している場合)
sudo xfs_repair -L /dev/sdb2
# 警告: -L オプションはトランザクションログを破棄するため、データが失われる可能性がある

# メモリ使用量の調整(大きなファイルシステムの場合)
sudo xfs_repair -o ag_stride=8 /dev/sdb2

# XFS のチェック(xfs_check は非推奨、xfs_repair -n を使用)
sudo xfs_repair -n /dev/sdb2

8.4 Btrfs の修復

# チェック(読み取り専用)
sudo btrfs check /dev/sdb3

# 修復
sudo btrfs check --repair /dev/sdb3

# スクラブ(マウント中にチェックサム検証)
sudo btrfs scrub start /mountpoint
sudo btrfs scrub status /mountpoint

# デバイスの統計情報
sudo btrfs device stats /mountpoint

8.5 ブート時の自動 fsck

# fstab の pass フィールド(6番目のフィールド)で制御
# 0: チェックしない
# 1: ルートファイルシステム(最初にチェック)
# 2: その他のファイルシステム(ルートの後にチェック)

# 例(/etc/fstab):
# UUID=xxx  /      ext4  defaults  0  1   ← ルート(pass=1)
# UUID=yyy  /home  ext4  defaults  0  2   ← その他(pass=2)
# UUID=zzz  /data  xfs   defaults  0  0   ← チェックしない

# 次回ブート時に強制的に fsck を実行(ext4)
sudo tune2fs -C 100 /dev/sda2    # マウント回数を閾値以上に設定
sudo touch /forcefsck             # または forcefsck ファイルを作成

# カーネルパラメータで強制
# fsck.mode=force

第9章: クォータ管理

9.1 ディスククォータの概要

ディスククォータは、ユーザーまたはグループごとのディスク使用量を制限する仕組みである。

# クォータパッケージのインストール
sudo apt install quota          # Debian/Ubuntu
sudo yum install quota          # RHEL/CentOS

9.2 ext4 のクォータ設定

# 1. fstab でクォータを有効化
# UUID=xxx /home ext4 defaults,usrquota,grpquota 0 2

# 2. リマウント
sudo mount -o remount /home

# 3. クォータファイルの作成
sudo quotacheck -cugm /home
# -c: クォータファイルを新規作成
# -u: ユーザークォータ
# -g: グループクォータ
# -m: リマウントを行わない

# 4. クォータの有効化
sudo quotaon /home

# 5. ユーザーにクォータを設定
sudo edquota -u username
# エディタが開き、以下のような内容が表示される:
# Filesystem       blocks    soft      hard     inodes    soft     hard
# /dev/sda3        1024000   4000000   5000000  500       0        0

# コマンドラインで設定
sudo setquota -u username 4000000 5000000 0 0 /home
# setquota -u <ユーザー> <ブロックソフト> <ブロックハード> <inodeソフト> <inodeハード> <パーティション>

# 6. グループにクォータを設定
sudo edquota -g groupname
sudo setquota -g groupname 10000000 12000000 0 0 /home

# 猶予期間の設定
sudo edquota -t
sudo setquota -t 604800 604800 /home  # 7日(秒)

# クォータの確認
sudo repquota -a          # 全パーティションのクォータレポート
sudo repquota -aug        # ユーザーとグループの両方
sudo quota -u username    # 特定ユーザーのクォータ
sudo quota -g groupname   # 特定グループのクォータ

# クォータの無効化
sudo quotaoff /home

9.3 XFS のクォータ設定

XFS のクォータは、ext4 とは異なり、マウント時にカーネルレベルで設定される。

# fstab でクォータを有効化
# UUID=xxx /data xfs defaults,uquota,gquota,pquota 0 2
# uquota: ユーザークォータ
# gquota: グループクォータ
# pquota: プロジェクトクォータ

# リマウント
sudo mount -o remount /data

# ユーザークォータの設定
sudo xfs_quota -x -c "limit bsoft=4g bhard=5g username" /data

# グループクォータの設定
sudo xfs_quota -x -c "limit -g bsoft=10g bhard=12g groupname" /data

# プロジェクトクォータの設定
# 1. プロジェクトの定義
echo "100:/data/project1" | sudo tee -a /etc/projects
echo "project1:100" | sudo tee -a /etc/projid

# 2. プロジェクトディレクトリの初期化
sudo xfs_quota -x -c "project -s project1" /data

# 3. プロジェクトクォータの設定
sudo xfs_quota -x -c "limit -p bsoft=50g bhard=60g project1" /data

# クォータの確認
sudo xfs_quota -x -c "report -h" /data
sudo xfs_quota -x -c "report -u -h" /data   # ユーザー
sudo xfs_quota -x -c "report -g -h" /data   # グループ
sudo xfs_quota -x -c "report -p -h" /data   # プロジェクト

第10章: ファイルシステムのチューニング

10.1 I/O スケジューラの最適化

# 現在の I/O スケジューラを確認
cat /sys/block/sda/queue/scheduler
# 出力例: [mq-deadline] kyber bfq none

# I/O スケジューラの変更
echo "mq-deadline" | sudo tee /sys/block/sda/queue/scheduler

# 恒久的な変更(udev ルール)
cat << 'EOF' | sudo tee /etc/udev/rules.d/60-io-scheduler.rules
# SSD には none(noop)または mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"

# HDD には mq-deadline または bfq
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="mq-deadline"
EOF
スケジューラ説明推奨環境
mq-deadlineリクエストの期限ベースで順序付け汎用(SSD/HDD両方)
bfq公平なI/O帯域配分デスクトップ、低遅延要求
kyber低レイテンシ最適化高速SSD
none (noop)最小のオーバーヘッドNVMe SSD、仮想化環境

10.2 マウントオプションによるチューニング

# パフォーマンス重視のマウントオプション
# noatime:    アクセス時刻の更新を無効化(最も効果的)
# nodiratime: ディレクトリのアクセス時刻更新を無効化
# discard:    SSD の TRIM コマンドを有効化
# nobarrier:  ジャーナルバリアを無効化(注意: データ損失リスク)

# 例: /etc/fstab
# UUID=xxx /data ext4 defaults,noatime,discard 0 2
# UUID=yyy /data xfs  defaults,noatime,discard,logbufs=8 0 2

10.3 SSD の最適化

# TRIM の定期実行(fstrim タイマー)
sudo systemctl enable --now fstrim.timer

# 手動で TRIM を実行
sudo fstrim -v /
# 出力例: /: 15.2 GiB (16325386240 bytes) trimmed

# SSD の識別
cat /sys/block/sda/queue/rotational
# 0 = SSD, 1 = HDD

# SSD の健康状態の確認
sudo smartctl -a /dev/sda
sudo smartctl -A /dev/sda | grep -i "wear\|life\|written"

第11章: 高度なトピックとベストプラクティス

11.1 RAID の概要

# ソフトウェア RAID の作成(mdadm)
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1  # RAID1(ミラー)
sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 /dev/sdb2 /dev/sdc2 /dev/sdd2  # RAID5

# RAID の状態確認
cat /proc/mdstat
sudo mdadm --detail /dev/md0

# 設定の保存
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u

11.2 LVM(Logical Volume Manager)

# 物理ボリューム(PV)の作成
sudo pvcreate /dev/sdb1 /dev/sdc1

# ボリュームグループ(VG)の作成
sudo vgcreate datavg /dev/sdb1 /dev/sdc1

# 論理ボリューム(LV)の作成
sudo lvcreate -L 50G -n datalv datavg
sudo lvcreate -l 100%FREE -n backlv datavg  # 残りの全容量を使用

# ファイルシステムの作成とマウント
sudo mkfs.ext4 /dev/datavg/datalv
sudo mount /dev/datavg/datalv /data

# LV の拡張
sudo lvextend -L +20G /dev/datavg/datalv
sudo resize2fs /dev/datavg/datalv          # ext4
sudo xfs_growfs /data                       # XFS

# または一度に
sudo lvextend -L +20G -r /dev/datavg/datalv  # -r: ファイルシステムも自動リサイズ

# 状態確認
sudo pvs
sudo vgs
sudo lvs
sudo pvdisplay
sudo vgdisplay
sudo lvdisplay

11.3 暗号化(LUKS)

# LUKS 暗号化パーティションの作成
sudo cryptsetup luksFormat /dev/sdb1

# パーティションのオープン
sudo cryptsetup open /dev/sdb1 encrypted_data

# ファイルシステムの作成
sudo mkfs.ext4 /dev/mapper/encrypted_data

# マウント
sudo mount /dev/mapper/encrypted_data /data

# /etc/crypttab でブート時に自動オープン
# encrypted_data UUID=xxx none luks
# encrypted_data UUID=xxx /etc/keys/data.key luks

# クローズ
sudo umount /data
sudo cryptsetup close encrypted_data

11.4 ベストプラクティス

  1. UUID を使用する: デバイス名(/dev/sdX)は変わる可能性があるため、UUID でマウントを指定する
  2. nofail を活用する: クリティカルでないマウントポイントには nofail を指定して、マウント失敗時もブートを継続させる
  3. 定期的なバックアップ: ファイルシステムのメタデータとデータの定期バックアップを実施する
  4. 監視を設定する: ディスク使用量、inode 使用量、S.M.A.R.T. 情報を監視する
  5. 適切なファイルシステムを選択する: ワークロードに応じて ext4, XFS, Btrfs を使い分ける
  6. 定期的な TRIM: SSD では fstrim.timer を有効にする
  7. ログローテーション: /var/log が溢れないよう適切にログローテーションを設定する
  8. /boot の容量管理: 古いカーネルを定期的に削除する

まとめ

本記事では、Linux ファイルシステム階層構造と管理について包括的に解説した。

重要なポイント

  1. FHS: ディレクトリ構造の標準規格。各ディレクトリの目的を理解することが管理の基本
  2. 仮想ファイルシステム: /proc, /sys, /dev はカーネルとハードウェアへのインターフェース
  3. ファイルシステムの選択: ワークロードに応じて ext4(汎用)、XFS(大規模)、Btrfs(高度な機能)、ZFS(データ整合性)を使い分ける
  4. マウント管理: fstab の正しい設定はシステムの安定稼働の基盤
  5. 監視: df, du による定期的なディスク使用量の監視が重要
  6. 修復: fsck, e2fsck, xfs_repair の使い方を習得しておく
  7. クォータ: ユーザー/グループ/プロジェクトレベルでの使用量制限
  8. チューニング: I/O スケジューラ、マウントオプション、SSD 最適化
  9. LVM: 柔軟なストレージ管理のための論理ボリューム管理
  10. 暗号化: LUKS によるディスク暗号化でデータを保護

参考資料