df コマンドの使い方|ディスク使用量・空き容量とinodeの確認方法

コマンドリファレンス
  1. 結論:dfコマンドはファイルシステム全体の「ディスク空き容量・inode」を確認する必須コマンド
    1. 【最速コピペ】実務でよく使う df コマンド早見表
  2. df コマンドの基本構文と出力項目の読み方
    1. 出力結果の各カラム(項目)の意味
    2. 【現場の深掘り知見】なぜ「Used + Available」が「Size」と一致しないのか?
  3. 実務で必須の主要オプション一覧&実行例
    1. 1. 人間に読みやすい単位で表示する(-h / -H オプション)
    2. 2. ファイルシステムの種類を表示する(-T オプション)
    3. 3. inode(アイノード)の使用状況を確認する(-i オプション)
    4. 4. 一時領域(tmpfs等)を除外して実ディスクのみ表示する(-x オプション)
    5. 5. 特定のファイルシステム種別のみ抽出する(-t オプション)
    6. 6. 全パーティションの合計行を表示する(–total オプション)
    7. 7. スクリプト処理で改行崩れを防ぐ POSIX 形式(-P オプション)
    8. 8. 特定ディレクトリやファイルのマウントポイントを調べる
  4. df コマンドと du コマンドの違い・使い分け
    1. 実務における容量逼迫調査の鉄板3ステップ
  5. inode 枯渇(No space left on device)の調査と解決手順
    1. なぜ inode が枯渇するのか?
    2. inode を大量消費しているディレクトリを特定するワンライナー
    3. 大量ファイルを安全に削除するテクニック
  6. 「ファイルを削除したのに df の容量が増えない」原因と解決策(deleted問題)
    1. 原因:プロセスがファイルハンドルを開いたままにしている
    2. 解決手順:deletedファイルを特定して解放する
  7. 実務で使えるワンライナー&ディスク監視シェルスクリプト
    1. 1. 使用率80%以上のパーティションを抽出するワンライナー
    2. 2. 容量・inode を定期チェックして通知する監視スクリプト
  8. よくある質問(FAQ)
    1. Q1. df コマンドを実行したら固まって(フリーズして)返ってきません。原因と対策は?
    2. Q2. Docker コンテナ内で df -h を打つとホストの容量が見えるのはなぜですか?
    3. Q3. 容量の単位を MB や GB で固定して出力したい場合は?
  9. 関連コマンド
  10. 参考リンク
  11. 関連記事

結論:dfコマンドはファイルシステム全体の「ディスク空き容量・inode」を確認する必須コマンド

df(Disk Free)コマンドは、Linux/Unixシステムにマウントされている各ファイルシステムの総容量・使用量・空き容量・使用率・マウントポイント・inode使用状況を一括で確認するための基本コマンドです。

サーバー運用や保守業務において、「ディスク容量不足のアラートが出た」「ログやDBの増大でパーティションが圧迫されていないか」を調べる初動調査で必ず最初に実行します。ファイルやディレクトリ個別のサイズを調べる du コマンド と組み合わせることで、ディスク逼迫の原因を最短で突き止めることができます。

【最速コピペ】実務でよく使う df コマンド早見表

やりたいこと実行コマンド実務での主な用途
容量を見やすい単位で表示df -h日常のディスク容量・使用率確認(最頻出)
ファイルシステム種別も表示df -hText4, 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の論理ボリューム名)や、tmpfsoverlay などの仮想ファイルシステム名。
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サーバーでは、tmpfsdevtmpfs、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. ステップ1(df): df -h を実行し、使用率が 90% を超えているマウントポイント(例://var)を特定する。
  2. ステップ2(du): 該当パーティション配下のディレクトリ使用量を大きい順にソートして肥大化箇所を絞り込む。
    sudo du -sh /* 2>/dev/null | sort -rh | head -n 10
  3. ステップ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%以上のパーティションを抽出するワンライナー

awkdf -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 で表示される SizeAvail はホスト側の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 : 肥大化ログや大量ファイルの検索・一括削除

参考リンク

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント