「du コマンドを実行したら大量の出力が流れて、結局どこが問題なのか把握できなかった」
Linuxサーバーの運用で、こうした場面に遭遇したことはないでしょうか。
df コマンドでディスク全体の使用率は分かっても、「原因となっているディレクトリ」を特定するには du コマンドが必要です。この記事では、
du コマンドの基本オプションから、ディレクトリごとの容量確認、容量順ソート、特定ディレクトリの除外、ログディレクトリの容量監視まで、現場で必要な使い方を網羅的に解説します。でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
duコマンドとは? dfとの違い
du(disk usage)は、ファイルやディレクトリが実際に使用しているディスク容量を表示するコマンドです。df が「ファイルシステム全体の空き容量」を確認するコマンドなのに対し、du は「特定のディレクトリやファイルがどれだけ容量を使っているか」を調べるコマンドです。・df:ファイルシステム単位で空き容量・使用率を表示(「ディスクがあとどれくらい使えるか」)
・du:ディレクトリ・ファイル単位で使用量を表示(「どこが容量を食っているか」)
実務では
df -h で逼迫しているパーティションを見つけてから、du で原因のディレクトリを絞り込む、という流れが定番です。duコマンドの基本的な使い方
1. 引数なしで実行する(カレントディレクトリ以下)
du を引数なしで実行すると、カレントディレクトリ以下の全サブディレクトリの使用量が表示されます。$ du 48 ./config 128 ./logs 16 ./tmp 256 .
-h オプションを付けるのが一般的です。2. ディレクトリを指定して実行する
調べたいディレクトリをコマンドの引数に指定します。$ du /var/log 1024 /var/log/audit 512 /var/log/httpd 48 /var/log/tuned 8192 /var/log
3. -h オプション(人間が読みやすい単位で表示)
最も頻繁に使うオプションです。容量をK(キロバイト)・M(メガバイト)・G(ギガバイト)の単位で表示してくれます。$ du -h /var/log 1.0M /var/log/audit 512K /var/log/httpd 48K /var/log/tuned 8.0M /var/log
4. -s オプション(合計のみ表示)
サブディレクトリの内訳は不要で、合計だけ知りたい場合に使います。-s は「summarize」の略です。# /var/log 全体の合計容量だけを表示 $ du -sh /var/log 8.0M /var/log
du -sh ディレクトリ名 は現場で最もよく使う形です。特定ディレクトリの容量をサッと確認したい場面で重宝します。5. -a オプション(ファイルも含めて表示)
通常のdu はディレクトリの合計しか表示しませんが、-a(all)を付けると個別のファイルも表示されます。$ du -ah /var/log/httpd 4.0K /var/log/httpd/error_log 256K /var/log/httpd/access_log 56K /var/log/httpd/ssl_access_log 320K /var/log/httpd
6. -c オプション(合計行を追加)
複数のディレクトリを指定した時に、最後に合計行を追加します。$ du -sh /var/log /var/cache /var/lib -c 8.0M /var/log 856M /var/cache 324M /var/lib 1.2G 合計
duコマンドの実践オプション
1. --max-depth=N(表示する階層の深さを制限)
du をそのまま実行すると全サブディレクトリが再帰的に表示されるため、出力が膨大になりがちです。--max-depth で表示する階層の深さを制限できます。# 1階層目のディレクトリだけ表示 $ du -h --max-depth=1 /var 1.2G /var/log 856M /var/cache 324M /var/lib 12M /var/spool 4.0K /var/tmp 2.4G /var
# 2階層目まで表示(サブディレクトリの内訳も確認) $ du -h --max-depth=2 /var 620M /var/cache/yum 236M /var/cache/dnf 856M /var/cache 280M /var/lib/rpm 44M /var/lib/mysql 324M /var/lib 156M /var/log/audit 1.0G /var/log/journal 1.2G /var/log 2.4G /var
--max-depth=1 で大まかに確認し、怪しいディレクトリを --max-depth=2 で掘り下げる」という流れが効率的です。2. --exclude=パターン(特定のディレクトリやファイルを除外)
特定のディレクトリやファイルパターンをduの集計から除外できます。# .cacheディレクトリを除外して集計 $ du -sh --exclude='.cache' /home/user1 2.1G /home/user1 # 圧縮ファイルを除外して集計 $ du -sh --exclude='*.gz' --exclude='*.bz2' /var/log 320M /var/log
3. --apparent-size(実際のファイルサイズを表示)
du はデフォルトではディスク上で使用しているブロックサイズを表示します。これは実際のファイルサイズとは異なる場合があります。# 通常のdu(ディスクブロック単位) $ du -sh /var/log/messages 12M /var/log/messages # 実際のファイルサイズ(apparent-size) $ du -sh --apparent-size /var/log/messages 11M /var/log/messages
--apparent-size を使ってください。容量順にソートして表示する実務テクニック
1. du -sh * | sort -rh(カレントディレクトリ直下を容量順に)
カレントディレクトリ直下のファイルとディレクトリを、容量が大きい順に表示する定番のコマンドです。$ cd /var $ du -sh * | sort -rh 1.2G log 856M cache 324M lib 12M spool 4.0K tmp
・sort -rh:人間が読める単位(K/M/G)を認識して大きい順にソート
2. du -s /パス/* | sort -rn | head -N(トップN件を表示)
ディレクトリを指定して容量順に表示し、上位N件だけに絞る方法です。# /var以下で容量が大きいトップ5を表示 # du -s /var/* | sort -rn | head -5 1228800 /var/log 876544 /var/cache 331776 /var/lib 12288 /var/spool 4 /var/tmp
sort -rn は数値として大きい順にソートします。-h オプションなしの du -s と組み合わせる場合はこちらを使います。3. --max-depth と sort の組み合わせ
--max-depth と sort -rh を組み合わせると、指定階層までのディレクトリを容量順に並べられます。# /var以下の2階層分を容量順で上位10件表示 # du -h --max-depth=2 /var 2>/dev/null | sort -rh | head -10 2.4G /var 1.2G /var/log 1.0G /var/log/journal 856M /var/cache 620M /var/cache/yum 324M /var/lib 280M /var/lib/rpm 156M /var/log/audit 44M /var/lib/mysql 12M /var/spool
実務Tips:ログディレクトリの容量監視
1. ログディレクトリの容量を定期チェックする
サーバーのディスク容量を逼迫させる原因の大半は、ログファイルの肥大化です。特に/var/log 以下は放置すると数GB単位で膨れ上がることがあります。# ログディレクトリの容量を確認 $ du -sh /var/log/* | sort -rh | head -10 1.0G /var/log/journal 156M /var/log/audit 28M /var/log/messages 15M /var/log/secure 5.0M /var/log/maillog
2. journalログの容量制限
systemd環境では/var/log/journal が予想以上に大きくなっていることがあります。以下のコマンドで使用量を確認し、制限を設定できます。# journalログの使用量を確認 $ journalctl --disk-usage Archived and active journals take up 1.0G in the file system. # 500MBに制限する(即座に古いログを削除) $ sudo journalctl --vacuum-size=500M
/etc/systemd/journald.conf で SystemMaxUse=500M を設定してください。3. duで容量変化を記録するワンライナー
cronと組み合わせて、ログディレクトリの容量推移を記録しておくと、突発的な肥大化に早く気づけます。# /var/logの容量を日時付きでファイルに記録 $ echo "$(date '+%Y-%m-%d %H:%M') $(du -sh /var/log)" >> /var/log/disk_usage.log
# cronに登録する例(毎日0時に記録) 0 0 * * * echo "$(date '+\%Y-\%m-\%d \%H:\%M') $(du -sh /var/log)" >> /var/log/disk_usage.log
ncduコマンド ~ インタラクティブなディスク使用量確認ツール ~
du のパイプ連携が面倒に感じる方には、ncdu(NCurses Disk Usage)がおすすめです。対話型のインターフェースでディレクトリの容量を視覚的に確認でき、そのまま不要なファイルの削除もできます。# ncduのインストール(RHEL系) $ sudo dnf install ncdu # ncduのインストール(Debian/Ubuntu系) $ sudo apt install ncdu
# /var ディレクトリを対話的に調査 $ ncdu /var
d キーで削除も可能です。ただし、本番サーバーに追加パッケージをインストールすることがポリシー上難しい場合もあるため、
du コマンドのパイプ連携を使いこなせることが基本です。「Permission denied」が出た時の対処法
du コマンドを一般ユーザーで実行すると、権限のないディレクトリで「Permission denied」エラーが表示されます。$ du -sh /var/* du: cannot read directory '/var/cache/ldconfig': Permission denied du: cannot read directory '/var/log/audit': Permission denied 12M /var/spool
1. sudo を使う(推奨)
ディスク容量の調査は全ディレクトリを対象にする必要があるため、sudo で実行するのが確実です。$ sudo du -sh /var/* | sort -rh | head -10
2. エラーメッセージを非表示にする(2>/dev/null)
sudo権限がない場合や、アクセスできるディレクトリだけの結果で十分な場合は、標準エラー出力をリダイレクトしてエラーメッセージを非表示にします。$ du -sh /var/* 2>/dev/null | sort -rh | head -10
2>/dev/null を付けると、エラーメッセージだけが非表示になり、アクセス可能なディレクトリの結果は正常に表示されます。トラブルシュート ~ duの結果がおかしい場合 ~
1. duの合計とdfの使用量が合わない
du で集計した合計と df の使用量が一致しないことがあります。主な原因は、プロセスが掴んだまま削除されたファイル(deleted but open)です。ファイルが削除されても、それを開いているプロセスがある限りディスク領域は解放されません。
df にはその使用量が反映されますが、du では表示されません。# 削除済みだがプロセスが掴んでいるファイルを確認 $ sudo lsof +L1 | grep deleted
2. duの実行が遅い(大量のファイルがある場合)
du はディレクトリツリーを再帰的に走査するため、ファイル数が多いディレクトリでは実行に時間がかかります。・--max-depth=1 を使う:深い階層まで潜らないため高速化できる
・--exclude で不要なディレクトリを除外:.gitやnode_modules等を除外する
# .gitとnode_modulesを除外して高速に集計 $ du -sh --max-depth=1 --exclude='.git' --exclude='node_modules' /home/user1/project
3. iノード枯渇 ~ 容量はあるのにファイルが作れない ~
「No space left on device」というエラーが出ているのに、df -h で確認するとディスク容量に余裕がある場合は、iノードの枯渇を疑ってください。iノードはファイルやディレクトリごとに1つ消費される管理番号です。小さなファイルが大量に作られるディレクトリ(メールスプール、セッションファイル、キャッシュ等)では、容量よりも先にiノードが不足することがあります。
# iノードの使用状況を確認 $ df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 3276800 3276800 0 100% / # IUse%が100%ならiノードが枯渇している
# ファイル数が多いディレクトリを特定 $ sudo find / -xdev -type d -exec sh -c 'echo "$(find "$1" -maxdepth 1 -type f | wc -l) $1"' _ {} \; 2>/dev/null | sort -rn | head -10
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| ディレクトリの使用量を見やすい単位で表示 | du -h ディレクトリ名 |
| 特定ディレクトリの総使用量だけ表示 | du -sh ディレクトリ名 |
| ファイル単位の使用量も表示 | du -ah ディレクトリ名 |
| 表示する階層を1階層に制限 | du -h --max-depth=1 ディレクトリ名 |
| 特定ディレクトリを除外して集計 | du -sh --exclude='パターン' ディレクトリ名 |
| カレントディレクトリ直下を容量順に表示 | du -sh * | sort -rh |
| 容量が大きいトップ10を表示 | du -sh /var/* | sort -rh | head -10 |
| 2階層分を容量順で表示 | du -h --max-depth=2 /var | sort -rh | head -10 |
| 実際のファイルサイズで表示 | du -sh --apparent-size ディレクトリ名 |
| 対話的にディスク使用量を調査 | ncdu ディレクトリ名 |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:fingerコマンドでユーザー情報を表示する方法|ログイン状況やメール確認も
- 前のページへ:LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドA-E・ディスク・デバイス管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます