
LinuxサーバーやWSL2環境を使っていて、「No space left on device」というエラーに突然遭遇したり、ディスク使用率が100%に達してシステムの動作が急激に重くなったりした経験はないでしょうか。
サーバー運用においてディスク容量の逼迫は、データベースの書き込み停止やログ出力の失敗、各種サービスの異常終了を引き起こす重大なトラブルです。しかし、Linux標準コマンドの df -h ではパーティション全体の空き容量しかわからず、du -sh /* では階層を1つ調べるたびにコマンドを打ち直す必要があり、原因特定に長い時間がかかってしまいます。
この記事では、モダンなCLIツール duf でディスク全体の空き状況を一瞬で可視化し、TUI(端末UI)ツール ncdu で容量を圧迫している巨大ディレクトリやファイルを直感的に特定・対処する手順を解説します。初心者の方でも迷わないよう、ツールの導入から実務で役立つ安全な操作方法まで丁寧に説明します。
この記事で行うこと
前提条件・対象読者
なぜ標準のdf・duコマンドでは時間がかかるのか
Linuxのディスク容量を確認する際、古くから使われている標準コマンドにはそれぞれ使いづらい点があります。
従来の調査フローにおける2大ストレス
df -hの限界 パーティション全体の使用率(例:/dev/sda1が 98% など)はわかりますが、具体的にどのディレクトリやファイルが容量を食っているのかは一切わかりません。du -sh /* 2>/dev/null | sort -hrの限界 ルート直下の各ディレクトリのサイズを一覧表示できますが、例えば/varが大きいとわかった後、次はdu -sh /var/*、その次はdu -sh /var/log/*のように、階層を掘り下げるたびにコマンドを再実行しなければなりません。ディレクトリのサイズ計算には時間がかかるため、原因にたどり着くまでに何度も待たされることになります。
dufとncduを組み合わせるメリット
この課題を解決するのが、duf と ncdu の組み合わせです。
| 項目 | duf | ncdu |
|---|---|---|
| 主な役割 | ディスク全体の空き状況・マウント一覧の可視化 | 特定ディレクトリ内の詳細調査・ファイル特定 |
| 置き換える標準コマンド | df コマンドの代替 | du コマンドの代替 |
| 表示形式 | カラー表・プログレスバー表示 | 端末UI(TUI)による対話的な階層ツリー |
| 特徴 | 一目でどのドライブが満杯かわかる | 矢印キーでディレクトリを潜りながら原因を探せる |
実務では、まず duf で「どのマウントポイントが逼迫しているか」を把握し、次にその領域に対して ncdu を実行して「何が容量を食っているか」を突き止める流れが最も効率的です。
手順1:dufを使える状態にしてディスク全体を把握する
まずは、ディスク全体の利用状況を美しく整理して表示してくれる duf(Disk Usage/Free Utility)を使える状態にします。
ディストリビューション別のインストール方法
お使いのLinux環境に合わせて、以下のコマンドを実行してください。
Ubuntu / Debian系の場合:
sudo apt update
sudo apt install duf
※Ubuntu 22.04 LTS以降およびDebian 12以降であれば、標準リポジトリからそのままインストール可能です。
Fedora系の場合:
sudo dnf install duf
RHEL / AlmaLinux / Rocky Linux系の場合:
sudo dnf install epel-release
sudo dnf install duf
※RHEL系では、EPEL(Extra Packages for Enterprise Linux)リポジトリを有効化することでインストールできます。
Arch Linux系の場合:
sudo pacman -Sy duf
※Arch Linuxでは事前にパッケージデータベースの同期(-Sy)を行ってください。なお、Windows上のMSYS2環境の pacman には duf が収録されていないため、Windows環境では後述のScoop(scoop install duf)やGitHubリリースのバイナリをご利用ください。
macOS(Homebrew)の場合:
brew install duf
インストールが完了したら、バージョン確認コマンドを実行して正常にインストールされたか確認します。
duf --version
dufでディスク使用量を表示する
インストールが完了したら、ターミナルで duf と入力して実行します。
duf
実行すると、ターミナルの横幅に合わせて自動調整された美しいカラーテーブルが表示されます。
- Local Devices:ローカルストレージ(SSDやHDD、ルートパーティションなど)
- Mounted Devices:マウントされた外部ドライブやネットワークドライブ
- Special Devices:tmpfsなどの仮想メモリファイルシステム
各行には、マウントポイント(Mounted on)、ファイルシステム形式(Type)、合計容量(Size)、使用量(Used)、空き容量(Avail)、および直感的なカラーバー付きの使用率(Usage)が表示されます。使用率が危険水域に達しているドライブは赤系統で強調されるため、どのパーティションが逼迫しているかが一瞬で判断できます。
覚えておくと便利な実務オプション
実務でよく使う duf のオプションをいくつか紹介します。
ローカルドライブのみに絞り込んで表示したい場合:
duf --only local
Dockerコンテナや仮想ファイルシステム(tmpfs)が多く存在する場合、ローカルストレージだけに絞ることで画面が見やすくなります。
使用率(Usage)順に並べ替えたい場合:
duf --sort usage
容量(Size)順に並べ替えたい場合:
duf --sort size
注意点として、duf の --sort オプションはツール内部の仕様により「昇順(小さい順・低い順)」でソートされます。現行のバージョンには降順(大きい順)にするオプションが用意されていないため、最も使用率が高いドライブや最も容量が大きいドライブは、テーブルの「一番下(末尾)」に表示される点に留意してください。
手順2:ncduを使える状態にして原因ディレクトリを深掘りする
duf で逼迫しているマウントポイント(多くはルート / や /var、/home など)が特定できたら、次はどのディレクトリやファイルが肥大化しているのかを ncdu(NCurses Disk Usage)で調査します。
ディストリビューション別のインストール方法
ncdu は主要なディストリビューションの公式リポジトリに収録されています。
Ubuntu / Debian系の場合:
sudo apt update
sudo apt install ncdu
Fedora系の場合:
sudo dnf install ncdu
RHEL / AlmaLinux / Rocky Linux系の場合:
sudo dnf install epel-release
sudo dnf install ncdu
※RHEL系では、EPELリポジトリを有効化することでインストールできます。
Arch Linux系の場合:
sudo pacman -Sy ncdu
※Windows上のMSYS2環境でも、pacman -S ncdu でそのままインストール可能です。
macOS(Homebrew)の場合:
brew install ncdu
バージョン確認コマンドを実行し、導入されたことを確認します。
ncdu -v
ncduの実行と実務で必須の安全オプション
ncdu は引数にスキャンしたいディレクトリパスを指定して起動します。
現在のディレクトリをスキャンする場合:
ncdu
特定のディレクトリ(例:/var/log)をスキャンする場合:
sudo ncdu /var/log
システム全体(ルートディレクトリ /)を調査する場合は、以下のコマンドを実行します。
sudo ncdu -x /
ここで付与しているオプションには、実務上非常に重要な意味があります。
sudoを付ける理由 システムディレクトリ(/var,/root,/etcなど)には一般ユーザーでは読み取り権限がないファイルが多く存在します。sudoを付けずに実行すると大量のPermission deniedが発生し、正しい容量計算ができません。-xオプション(同一ファイルシステム限定)の重要性-xは、指定したディレクトリと同じファイルシステム内のみをスキャンし、別のマウントポイントをまたがないようにするオプションです。これがないと、NFSなどのネットワークストレージ、外付けハードディスク、あるいはWSL2環境でマウントされているWindows側の巨大なC:\ドライブ(/mnt/c)まで延々とスキャンしてしまい、スキャンがいつまでも終わらなくなります。ルート直下の調査では必ず-xを指定するのが鉄則です。-rオプション(読み取り専用モード)ncduには画面上からファイルを削除できる機能が備わっていますが、誤操作で重要なシステムファイルを消してしまう危険があります。削除を行わず調査だけに専念したい場合は、以下のように-rを付けて起動すると安心です。
sudo ncdu -rx /
ncduの画面操作方法
スキャンが完了すると、容量の大きい順にディレクトリとファイルが並んだTUI画面が表示されます。
主なキーボード操作は以下の通りです。
| キー | 動作内容 |
|---|---|
↑ / ↓ または k / j | カーソルの上下移動 |
Enter または → / l | 選択したディレクトリに入る(深掘り) |
← または h | 1つ上の親ディレクトリに戻る |
s | サイズ順(昇順/降順)に並び替え |
n | ファイル名順に並び替え |
g | グラフ表示の切り替え(グラフ+パーセント、パーセントのみ、非表示) |
c | 子アイテム数の表示切り替え |
i | 選択中のアイテムの詳細情報(フルパス、更新日時など)を表示 |
d | 選択中のファイルまたはディレクトリを削除(確認プロンプトあり) |
b | 現在のディレクトリでシェルを一時起動 |
q | ncduを終了する |
? | キーボードヘルプを表示 |
矢印キーを使って「サイズの大きいフォルダ」へと順番に潜っていくだけで、数秒から数十秒で容量を圧迫している真犯人のファイル(巨大化したログファイルやコアダンプ、肥大化したキャッシュなど)にたどり着くことができます。
手順3:原因別の安全な容量削減とクリーンアップ
ncdu で肥大化している場所が特定できたら、適切に対処して空き容量を回復させます。Linux環境で容量不足を引き起こしやすい4大原因と、その安全な対処法を紹介します。
1. システムログ(systemd-journald)の肥大化
/var/log/journal/ にあるsystemdのジャーナルログがギガバイト単位で溜まっているケースは非常によくあります。 このログは直接 rm で消すのではなく、専用の管理コマンド journalctl を使って安全に削減します。
現在のジャーナルログ使用量を確認するコマンド:
journalctl --disk-usage
ログを直近の容量(例:合計500MBまで)に制限して古いものを自動削除するコマンド:
sudo journalctl --vacuum-size=500M
あるいは、保存期間(例:直近7日間分のみ残す)で削除するコマンド:
sudo journalctl --vacuum-time=7d
2. パッケージマネージャのキャッシュ蓄積
UbuntuやDebianでは、過去にインストールしたパッケージのアーカイブファイル(.deb)が /var/cache/apt/archives/ に溜まり続けます。
不要になった古いパッケージキャッシュを一括削除するコマンド:
sudo apt clean
過去のカーネルアップデートなどで使われなくなった孤立パッケージを掃除するコマンド:
sudo apt autoremove --purge
これらを実行するだけで、数GBの空き容量が一瞬で確保できることがあります。
3. Docker関連データ(/var/lib/docker)の肥大化
/var/lib/docker が数十GB以上を消費している場合、使われなくなったコンテナイメージ、停止中コンテナ、ビルドキャッシュ、不要なボリュームが原因です。 不要なDockerリソースを一括でクリーンアップする手順については、以下の当サイト個別記事で詳しく解説しています。
4. WSL2環境での仮想ディスク肥大化
WSL2上でLinuxを使っている場合、Linux内でファイルを削除しても、Windows側の仮想ディスクファイル(ext4.vhdx)は自動的に縮小されず、WindowsのCドライブ容量が圧迫されたままになります。 WSL2の肥大化したディスクを安全に圧縮してWindowsの空き容量を取り戻す手順は、以下の記事を参考にしてください。
うまくいかない場合の確認ポイント
Permission deniedのエラーが多発する
原因: root権限が必要なディレクトリを一般ユーザー権限でスキャンしようとしています。
対処法: ncdu の前に必ず sudo を付与して実行してください。
sudo ncdu -x /
ncduでファイルを削除したのに空き容量が増えない
原因: Linuxでは、起動中のプロセスがファイルを開いたまま(Open状態)にしていると、ファイルシステム上で rm して名前を消しても、そのプロセスが終了するまでディスク上のブロックが解放されません。肥大化したログファイルを直接削除した場合によく発生します。
対処法: 削除された後もプロセスに掴まれているファイルを確認します。
sudo lsof +L1
または以下のコマンドで確認できます。
sudo lsof | grep deleted
一覧に表示されたプロセスのサービス名(例:nginx、apache2、syslogなど)を確認し、そのサービスを再起動します。
sudo systemctl restart nginx
サービスが再起動されるとファイルディスクリプタが解放され、空き容量が即座に回復します。
ncduのスキャンに時間がかかりすぎる
原因: 数百万個以上のファイルが存在する大規模ファイルサーバーなどで画面の描画更新がボトルネックになっているか、外部マウントを巻き込んでいる可能性があります。
対処法: 画面の描画頻度を下げてスキャンを高速化する -q(Quietモード)を使用するか、怪しいディレクトリに絞ってスキャンを実行してください。
sudo ncdu -qx /var
よくある質問
Q. 本番サーバーでncduを実行しても安全ですか?
A. はい、基本的には安全です。ただし、ディスクI/Oが発生するため、データベースが高負荷で稼働しているピーク時間帯の全スキャンは避けるのが無難です。また、誤削除を防ぐために必ず -r オプションを付けて読み取り専用モードで起動することをおすすめします。
Q. dufとdfで表示される空き容量にわずかな差があるのはなぜですか?
A. Linuxのext4などのファイルシステムでは、rootユーザー用に全体の約5%が緊急用予約領域(Reserved Blocks)として確保されています。df は一般ユーザーが書き込み可能な容量を表示するのに対し、duf はファイルシステム全体の物理的な空き容量を基に計算している場合があるため、わずかな差異が生じることがあります。
Q. ncduのバージョン1系と2系は何が違いますか?
A. ncdu 1.x系はC言語で実装された長期サポート(LTS)版であり、多くのLinuxディストリビューションの安定版パッケージとして広く利用されています。一方の2.x系はプログラミング言語Zigでゼロから再設計されたバージョンで、メモリ消費量の削減とスキャンのさらなる高速化が図られています。基本的な操作方法や主要オプションはどちらも共通です。
Q. WindowsやMSYS2環境でも使えますか?
A. はい、利用可能です。 ncdu はMSYS2のパッケージマネージャ(pacman -S ncdu)から直接インストールできます。 一方、duf はMSYS2公式リポジトリには登録されていないため、Windowsのパッケージマネージャ Scoop(scoop install duf)や Chocolatey(choco install duf)を使うか、GitHubの公式ReleasesからWindows用バイナリ(zip)をダウンロードしてPATHを通すことで、MSYS2ターミナルやPowerShell上からも快適に利用できます。
まとめ
Linuxでディスク容量が逼迫した際の調査手順をまとめます。
- 全体把握:
dufコマンドで、どのパーティション・マウントポイントが満杯になっているかを確認する - 原因特定:
sudo ncdu -x [対象パス]を実行し、TUI上で大容量ディレクトリやファイルを特定する - 安全確保:本番環境では誤操作を防ぐため読み取り専用モード(
-r)を活用し、別マウント横断を防ぐ-xを必ず付ける - 適切に対処:ジャーナルログの制限削除(
journalctl --vacuum-size)やパッケージキャッシュ削除(apt clean)など、安全な方法で容量を解放する - プロセス確認:削除しても容量が戻らない場合は
lsof +L1で削除済みオープンファイルを確認し、サービスを再起動する
従来の df や du コマンドで苦労していた方は、ぜひ duf と ncdu をサーバーやWSL2環境に導入し、スムーズな容量管理に役立ててください。
次に読むおすすめ記事
Linuxの全体像や初期設定、サーバー構築手順、トラブル解決を体系的に学びたい方は、以下の完全ガイドもあわせて参考にしてください。

また、日常的に使うLinuxの基本コマンドを総復習したい方は、以下のチートシート記事もおすすめです。


