結論:dfコマンドはファイルシステム全体の「ディスク空き容量・inode」を確認する必須コマンド
df(Disk Free)コマンドは、Linux/Unixシステムにマウントされている各ファイルシステムの総容量・使用量・空き容量・使用率・マウントポイント・inode使用状況を一括で確認するための基本コマンドです。
サーバー運用や保守業務において、「ディスク容量不足のアラートが出た」「ログやDBの増大でパーティションが圧迫されていないか」を調べる初動調査で必ず最初に実行します。ファイルやディレクトリ個別のサイズを調べる du コマンド と組み合わせることで、ディスク逼迫の原因を最短で突き止めることができます。
【最速コピペ】実務でよく使う df コマンド早見表
| やりたいこと | 実行コマンド | 実務での主な用途 |
|---|---|---|
| 容量を見やすい単位で表示 | df -h | 日常のディスク容量・使用率確認(最頻出) |
| ファイルシステム種別も表示 | df -hT | ext4, xfs, tmpfs などの種別確認 |
| inode(ファイル数)の使用率確認 | df -i | 容量はあるのにファイル作成できない障害調査 |
| tmpfs等の仮想FSを除外 | df -h -x tmpfs -x devtmpfs | 物理ストレージ・実ディスクのみを抽出 |
| 特定ディレクトリの所属先を確認 | df -h /var/log | 該当ディレクトリがどのパーティションにあるか確認 |
| 全パーティションの合計を表示 | df -h --total | システム全体の総ディスク容量を把握 |
| 1行固定表示(スクリプト用) | df -hP | 長いデバイス名による改行崩れを防止 |
| 使用率80%以上の領域を抽出 | df -hP | awk 'NR>1 {sub(/%/,"",$5); if($5>=80) print $1,$5"%",$6}' | 容量警告アラートのワンライナー判定 |
df コマンドの基本構文と出力項目の読み方
df コマンドの基本構文は以下の通りです。
df [オプション] [ファイルまたはディレクトリ...]
引数を指定せずに df を実行すると、マウントされている全ファイルシステムの状態が 1KB(1024バイト)ブロック単位で表示されます。
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 2004244 0 2004244 0% /dev
tmpfs 406604 1104 405500 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 477528944 77651116 375547180 18% /
/dev/sda2 1992552 141208 1730104 8% /boot
出力結果の各カラム(項目)の意味
| カラム名 | 名称 | 意味と確認ポイント |
|---|---|---|
Filesystem | ファイルシステム | パーティションのデバイス名(/dev/sda1, LVMの論理ボリューム名)や、tmpfs・overlay などの仮想ファイルシステム名。 |
1K-blocks / Size | 総容量 | ファイルシステム全体の容量(デフォルトは1KBブロック数、-h 付与時は GB/MB などの単位付き)。 |
Used | 使用済み容量 | 現在データとして使用されている容量。 |
Available / Avail | 利用可能な空き容量 | 一般ユーザーが新規に書き込める空き容量。 |
Use% | 使用率 | 使用済み容量のパーセンテージ。80%〜90% を超えるとディスク枯渇のリスクが高まります。 |
Mounted on | マウントポイント | ファイルシステムがシステムツリー上のどのディレクトリに接続されているか(例:/(ルート), /home, /boot, /var)。 |
【現場の深掘り知見】なぜ「Used + Available」が「Size」と一致しないのか?
df の出力を細かく計算すると、「Used(使用量) + Available(空き容量)」の合計が「Size(総容量)」よりも小さくなることに気づくはずです。
例えば上記の例では:
- 総容量(1K-blocks):
477,528,944 - Used(使用量):
77,651,116 - Available(空き容量):
375,547,180 - 合計(Used + Available):
453,198,296(差分:24,330,648 ブロック = 約24GB 不足)
この差分の正体は、Linuxの主要ファイルシステム(ext4 など)にあらかじめ設定されている「rootユーザー専用の予約ブロック(Reserved blocks)」です。
ext4 ではデフォルトで総容量の 5% が root 専用に確保されています。一般ユーザーが容量を 100% 使い切ってしまっても、root がログインしてログ調査や障害対応を行えるようにし、同時にファイルシステムの断片化を防ぐ目的があります。Available カラムには「一般ユーザーが使える空き容量」が表示されるため、この予約領域分が差し引かれて表示されます。
大容量ストレージ(数TB以上)で5%の予約領域が無駄になる場合は、tune2fs -m コマンドで予約率を 1% などに削減することも可能です。
# 予約ブロックの割合を 1% に変更する例(要root権限)
sudo tune2fs -m 1 /dev/sda1
実務で必須の主要オプション一覧&実行例
1. 人間に読みやすい単位で表示する(-h / -H オプション)
実務で最も常用されるのが -h(–human-readable)オプションです。バイト数を自動的に K(キロ)、M(メガ)、G(ギガ)、T(テラ)の単位に変換して表示します。
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 398M 1.1M 397M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 456G 75G 359G 18% /
/dev/sda2 1.9G 138M 1.7G 8% /boot
※ -h はコンピュータの標準である 1024進数(KiB, MiB, GiB) で計算します。ハードディスクメーカーの表記と同じ 1000進数(KB, MB, GB) で計算したい場合は大文字の -H(–si)を使用します。
2. ファイルシステムの種類を表示する(-T オプション)
-T(–print-type)を付けると、各パーティションがどのファイルシステム形式(ext4, xfs, btrfs, tmpfs, overlay 等)でフォーマットされているかが Type カラムに表示されます。通常は -h と組み合わせて df -hT として実行します。
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 398M 1.1M 397M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 456G 75G 359G 18% /
/dev/sda2 ext4 1.9G 138M 1.7G 8% /boot
3. inode(アイノード)の使用状況を確認する(-i オプション)
ディスク容量だけでなく、ファイルやディレクトリを管理するインデックス構造体である inode(アイノード) の残数を確認するには -i(–inodes)オプションを使用します。
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 501061 384 500677 1% /dev
tmpfs 508255 620 507635 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 30400512 2515910 27884602 9% /
/dev/sda2 131072 312 130760 1% /boot
Inodes:そのファイルシステムで作成可能な最大ファイル・ディレクトリ数IUsed:現在使用中の inode 数IFree:残りの空き inode 数IUse%:inode の使用率(これが 100% になると容量が余っていても新規ファイル作成不可になります)
4. 一時領域(tmpfs等)を除外して実ディスクのみ表示する(-x オプション)
近年のLinuxサーバーでは、tmpfs や devtmpfs、Snapの squashfs など多数の仮想ファイルシステムがマウントされており、df -h の出力が埋もれてしまいがちです。-x <TYPE>(–exclude-type)を使うと、指定したファイルシステムを除外して物理ディスクのみをすっきり表示できます。
# tmpfs, devtmpfs, squashfs を除外して表示
df -h -x tmpfs -x devtmpfs -x squashfs
5. 特定のファイルシステム種別のみ抽出する(-t オプション)
逆に、特定のファイルシステム(例:ext4 や xfs のみ)を指定して確認したい場合は -t <TYPE>(–type)を使用します。
# ext4 と xfs のパーティションのみ表示
df -hT -t ext4 -t xfs
6. 全パーティションの合計行を表示する(–total オプション)
--total オプションを付与すると、出力の最下行に total 行が追加され、システム全体の総容量・使用量・空き容量の合算値を確認できます。
$ df -h --total -x tmpfs -x devtmpfs
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 456G 75G 359G 18% /
/dev/sda2 1.9G 138M 1.7G 8% /boot
total 458G 75G 361G 18% -
7. スクリプト処理で改行崩れを防ぐ POSIX 形式(-P オプション)
シェルスクリプトやパイプ処理(awk 等)で df の出力をパースする場合、デバイス名(Filesystem)が長すぎると行が途中で折り返されてしまい、カラムの位置がずれるバグの原因になります。
-P(–portability)オプションを指定すると、必ず「1ファイルシステム=1行」の POSIX 規格フォーマットで出力されるため、スクリプト作成時は必須の安全対策となります。
# POSIX 形式(1行固定)で表示
df -hP
8. 特定ディレクトリやファイルのマウントポイントを調べる
df の引数にファイルやディレクトリのパスを指定すると、そのパスが属しているファイルシステムの情報だけをピンポイントで確認できます。
# /var/log が属するパーティションの空き容量を確認
$ df -h /var/log
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 456G 75G 359G 18% /
# カレントディレクトリ(現在いる場所)の空き容量を確認
$ df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 456G 75G 359G 18% /
df コマンドと du コマンドの違い・使い分け
Linuxでディスク容量を調べるコマンドとして、df と並んで使われるのが du(Disk Usage)コマンド です。両者には明確な役割と仕組みの違いがあります。
| 比較項目 | df コマンド | du コマンド |
|---|---|---|
| 確認の対象 | ファイルシステム(パーティション全体) | ファイル・ディレクトリ単位 |
| 主な目的 | 全体の空き容量・使用率・マウント位置の把握 | どのフォルダやファイルが容量を食っているかの特定 |
| 実行速度 | 超高速(一瞬)(スーパーブロック等のメタデータのみ参照) | ディレクトリ走査のためファイル数に応じて時間がかかる |
| 非特権ユーザーの実行 | 全パーティションの容量が即座に見える | 読み取り権限のないディレクトリは Permission denied になる |
| 削除中ファイル(deleted) | プロセスが掴んでいる削除ファイルも使用量に含む | ファイルツリーから消えているためカウントされない |
実務における容量逼迫調査の鉄板3ステップ
サーバーでディスク容量警告が発生した際は、以下のステップで調査・対処するのが現場の王道フローです。
- ステップ1(df):
df -hを実行し、使用率が 90% を超えているマウントポイント(例:/や/var)を特定する。 - ステップ2(du): 該当パーティション配下のディレクトリ使用量を大きい順にソートして肥大化箇所を絞り込む。
sudo du -sh /* 2>/dev/null | sort -rh | head -n 10 - ステップ3(find): 絞り込んだディレクトリ内で巨大ファイル(ログやダンプ)を特定する。
sudo find /var/log -type f -size +100M -exec ls -lh {} +
inode 枯渇(No space left on device)の調査と解決手順
Linuxサーバー管理で最も陥りやすいトラブルの一つが、「df -h で見るとディスク空き容量が何十GBもあるのに、ファイルを作ろうとすると No space left on device エラーが出る」という現象です。
この原因は inode(アイノード)の枯渇 です。
なぜ inode が枯渇するのか?
Linuxではファイルシステムを作成した時点で、作成可能なファイルの最大数(inode総数)が決まっています。サイズが数バイト〜数キロバイトの極小ファイルを数百万個単位で作成すると、バイト容量は余っているのに inode が 100% に達し、新しいファイルやソケットが一切作成できなくなります。
【inode が枯渇しやすい主な原因】
- Postfix等のメールスプール(
/var/spool/postfix/maildrop等に未送信メールが大量滞留) - PHPのセッションファイル(
/var/lib/php/sessionsのガベージコレクション不全) - Webサーバーの小さなキャッシュファイルや一時ファイル(
/tmp配下) - 細切れに大量出力されたアプリケーションログ
inode を大量消費しているディレクトリを特定するワンライナー
どのディレクトリが inode(ファイル数)を食い潰しているかは、以下のコマンドでファイル数をカウントして特定します。
# /var 配下の第1階層ディレクトリごとのファイル数をカウント(他FSへの越境防止に -xdev を使用)
for dir in /var/*; do
if [ -d "$dir" ]; then
echo -n "$dir: "
find "$dir" -xdev | wc -l
fi
done | sort -k2 -n
大量ファイルを安全に削除するテクニック
数万〜数十万個のファイルが存在するディレクトリで rm * を実行すると、引数が多すぎて bash: /bin/rm: Argument list too long エラーで失敗します。find コマンド の -delete オプションを使うことで、安全かつ高速に削除できます。
# 7日以上前の古いセッションファイルを安全に一括削除
find /var/lib/php/sessions -type f -mtime +7 -delete
「ファイルを削除したのに df の容量が増えない」原因と解決策(deleted問題)
巨大なログファイルを rm で削除した直後、df -h で確認しても空き容量が全く増えていないケースが頻繁に発生します。
原因:プロセスがファイルハンドルを開いたままにしている
Linuxでは、ファイルが rm でアンリンク(ディレクトリエントリから削除)されても、実行中のプロセス(Nginx, Apache, Java, Python 等)がそのファイルをオープンし続けている限り、ディスク上のブロックは解放されません。df はファイルシステムのメタデータを見るため「使用中」としてカウントされ続けます。
解決手順:deletedファイルを特定して解放する
1. lsof コマンド で削除済みファイルを開いているプロセスを特定する:
# 削除済みだがプロセスが保持しているファイルとPIDを一覧表示
sudo lsof +L1
# または grep で抽出
sudo lsof | grep '(deleted)'
出力例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
nginx 12345 root 4w REG 253,0 52428800000 0 123456 /var/log/nginx/access.log (deleted)
2. プロセスをリロードまたは再起動してディスクを解放する:
# サービスをリロードしてファイルディスクリプタを再オープンさせる
sudo systemctl reload nginx
3. 【緊急時】プロセスを即座に再起動できない場合の対処法:
本番サービスを停止・再起動できない場合は、/proc/<PID>/fd/<FD番号> に対して空リダイレクトを行うことで、プロセスを動かしたままファイルサイズを 0 に切り詰める(truncateする)ことができます。
# PID 12345 の FD 4 番のファイルを空にして容量を即時解放
sudo bash -c ': > /proc/12345/fd/4'
実務で使えるワンライナー&ディスク監視シェルスクリプト
1. 使用率80%以上のパーティションを抽出するワンライナー
awk と df -hP を組み合わせ、マウントポイントごとの使用率が閾値(80%)以上の行だけをフィルタリングします。
df -hP -x tmpfs -x devtmpfs | awk 'NR>1 {
use = $5;
sub(/%/, "", use);
if (use >= 80) {
printf "WARNING: %s (%s) is at %s%%\n", $6, $1, use
}
}'
2. 容量・inode を定期チェックして通知する監視スクリプト
サーバーの cron に登録して毎時実行するディスク・inode監視スクリプトのテンプレートです。
#!/bin/bash
# ==============================================================================
# ディスク容量&inode使用率 監視スクリプト
# ==============================================================================
set -euo pipefail
THRESHOLD=85
ALERT=0
REPORT=""
# 1. ディスク容量(バイト使用率)チェック
while read -r fs size used avail use_pct mount; do
use_num="${use_pct%\%}"
if [ "$use_num" -ge "$THRESHOLD" ]; then
ALERT=1
REPORT+="$(printf "[DISK ALERT] %s (%s): %s used (Avail: %s)\n" "$mount" "$fs" "$use_pct" "$avail")"$'\n'
fi
done < <(df -hP -x tmpfs -x devtmpfs -x squashfs | awk 'NR>1')
# 2. inode 使用率チェック
while read -r fs inodes iused ifree iuse_pct mount; do
iuse_num="${iuse_pct%\%}"
if [ "$iuse_num" -ge "$THRESHOLD" ]; then
ALERT=1
REPORT+="$(printf "[INODE ALERT] %s (%s): %s inode used (IFree: %s)\n" "$mount" "$fs" "$iuse_pct" "$ifree")"$'\n'
fi
done < <(df -iP -x tmpfs -x devtmpfs -x squashfs | awk 'NR>1')
# 閾値超過時に管理者へ通知
if [ "$ALERT" -eq 1 ]; then
echo -e "ホスト: $(hostname)\n日時: $(date '+%Y-%m-%d %H:%M:%S')\n\n$REPORT" | \
mail -s "[WARNING] Disk Alert on $(hostname)" admin@example.com
fi
よくある質問(FAQ)
Q1. df コマンドを実行したら固まって(フリーズして)返ってきません。原因と対策は?
NFS(Network File System)やネットワークストレージが応答不能(ハングアップ)になっていることが主な原因です。df はデフォルトですべてのマウントポイントにアクセスを試みるため、停止したリモートサーバーへのタイムアウト待ちでフリーズします。
【対策】
ローカルファイルシステムのみに限定して表示する -l(–local)オプションを付けて実行します。
# ネットワークファイルシステム(NFS/CIFS等)を無視してローカルFSのみ確認
df -hl
Q2. Docker コンテナ内で df -h を打つとホストの容量が見えるのはなぜですか?
DockerコンテナはホストOSのLinuxカーネルを共有しているため、コンテナ内のルートファイルシステム(/)は通常 overlay 形式でホスト上のストレージ(/var/lib/docker/overlay2)にマウントされています。
そのため、df -h で表示される Size や Avail はホスト側のDocker用パーティションの容量を示します。コンテナ個別で実際に消費している差分容量を調べたい場合は、ホスト側で docker system df または docker ps -s を実行してください。
Q3. 容量の単位を MB や GB で固定して出力したい場合は?
-h は値に応じて自動で単位(K, M, G)が切り替わりますが、集計スクリプト等で単位を固定したい場合は -m(MB単位)、-k(KB単位)、または -B <SIZE>(–block-size)オプションを指定します。
# MB(メガバイト)単位で固定表示
df -m
df -B 1M
# GB(ギガバイト)単位で固定表示
df -B 1G
関連コマンド
du: ファイル・ディレクトリごとのディスク使用量を集計・調査mount: ファイルシステムのマウント状況の確認・接続操作fstab: 起動時のファイルシステム自動マウント設定ファイル(/etc/fstab)ext4: Linux標準ファイルシステムの特徴と運用free: システムのメモリ・スワップ空き容量と使用状況の確認lsof: プロセスが開いているファイル一覧(deletedファイルの特定)awk: テキスト処理・使用率アラート判定ワンライナーfind: 肥大化ログや大量ファイルの検索・一括削除

コメント