Linuxサーバを運用していると、 「ディスク容量が足りない」 という問題に遭遇することがあります。
たとえば、次のような症状です。
ログが書き込めない。
アプリケーションが突然エラーになる。
このようなときに重要なのが、 dfとduです。
どちらもディスク容量の確認に利用しますが、 役割は異なります。
dfでファイルシステム全体の使用状況を確認し、
duで
どのディレクトリやファイルが容量を使っているのか
を特定できる状態を目指します。
dfとduの違いを最初に理解しよう
dfとduは似ていますが、 確認する対象が異なります。
どのディスク領域が どれくらい使用されているか確認する。
df -h
どのディレクトリやファイルが 容量を使っているか確認する。
du -sh /var
dfコマンド:ファイルシステムの使用量を確認する
dfは、 ファイルシステムごとの ディスク使用量を確認するコマンドです。
df
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 52403200 40203120 12190080 77% /
/dev/sda1 1048576 210000 838576 21% /boot
/dev/sdb1 104806400 30120400 74686000 29% /data
ただし、1K-blocksなどの数字は少し読みにくいので、 実務では -hを付けることが多いです。
df -h:見やすい単位で確認する
df -h
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 50G 46G 4.0G 92% /
/dev/sda1 1.0G 210M 814M 21% /boot
/dev/sdb1 100G 29G 71G 29% /data
-hは
human-readableの意味で、
GB・MBなど人が読みやすい単位で表示します。
df -hの表示項目を理解しよう
特に重要なのは、 Use%とMounted onです。
たとえば「/ が92%」なら、 ルートファイルシステムの容量がかなり使用されていることが分かります。
使用率が高ければすぐ異常なのか?
ディスク使用率が高いからといって、 必ずしも即障害というわけではありません。
ただし、 100%近くまで使用されると新しいデータを書き込めなくなる 可能性があります。
「80%なら必ず異常」という絶対的な基準ではありません。 ディスクの増加速度や用途、運用ルールを含めて判断します。
df -i:inode使用量も確認できる
ディスク容量に空きがあるのに、 「No space left on device」 になることがあります。
その原因の一つが inode不足です。
df -i
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda2 3276800 3265000 11800 100% /
/dev/sdb1 6553600 150000 6403600 3% /data
この例では、 容量ではなく inodeの使用率が100%になっています。
小さなファイルを大量に作成した場合など、 ディスク容量に空きがあってもinodeが不足することがあります。
duコマンド:ディレクトリやファイルの使用量を確認する
dfで 「/ が92%」 と分かったら、 次は 何が容量を使っているのか を調べます。
そこで使うのが duです。
du /var
ただし、これでは配下の情報が大量に表示されるため、 実務ではオプションを付けて使います。
du -sh:指定したディレクトリの合計容量を確認する
du -sh /var
$ du -sh /var
18G /var
-sはsummary、
-hはhuman-readableです。
du -h –max-depth=1:1階層ずつ調べる
/varが18GB使っていると分かったら、 次は /varの中のどこが大きいのか を調べます。
du -h --max-depth=1 /var
$ sudo du -h --max-depth=1 /var
1.2G /var/lib
15G /var/log
650M /var/cache
120M /var/tmp
18G /var
この結果から、 /var/logが15GBと非常に大きいことが分かります。
sortと組み合わせて大きい順に並べる
duの結果を 容量の大きい順に並べたい 場合は、 sortと組み合わせると便利です。
du -h --max-depth=1 /var | sort -hr
$ sudo du -h --max-depth=1 /var | sort -hr
18G /var
15G /var/log
1.2G /var/lib
650M /var/cache
120M /var/tmp
これなら、 大きなディレクトリをすぐに見つけられます。
du
容量を調べる
sort -hr
大きい順に並べる
sort -hrの意味
大きなファイルを探したい場合
ディレクトリ単位ではなく、 さらに具体的に どのファイルが大きいのか を確認したい場合もあります。
du -ah /var/log | sort -hr | head
$ sudo du -ah /var/log | sort -hr | head
15G /var/log
8.2G /var/log/app.log
4.5G /var/log/nginx
3.8G /var/log/nginx/access.log
2.1G /var/log/messages
1.2G /var/log/nginx/error.log
この例なら、 /var/log/app.log が8.2GB使っていることが分かります。
実務でのディスク逼迫調査の基本手順
たとえば監視システムから、
web01のルートファイルシステムが逼迫しています。
というアラートが来たとします。
この場合、 次のように調査できます。
df -h
du -h --max-depth=1 / | sort -hr
du -h --max-depth=1 /var | sort -hr
/var/log = 15G
du -ah /var/log | sort -hr | head
大きなファイルを見つけても、すぐ削除しない
ディスク使用量の大きなファイルを見つけると、 「削除すればよい」と考えてしまいがちです。
しかし、 実際のサーバでは そのファイルが何に使われているのか を確認する必要があります。
ログ・データベース・バックアップ・アプリケーションデータなど、 大きくても必要なファイルはあります。 削除前に用途や保管要件、サービスへの影響を確認しましょう。
削除したのにdfの空き容量が増えないこともある
Linuxでは、 プロセスがファイルを開いたままの状態で そのファイルを削除すると、 ファイル名は消えてもディスク領域が解放されない 場合があります。
このようなケースでは、 lsofなどで 削除済みファイルを掴んでいるプロセスを確認することがあります。
lsof +L1
削除済みだがプロセスがまだ開いているファイルなどがあると、 dfでは使用中に見える一方、 duでは見つけられないことがあります。
dfとduの値が完全に一致しないことがある理由
dfとduは、 そもそも確認している情報が異なります。
使用されているブロック全体を確認
見えているファイル・ディレクトリの使用量を集計
そのため、 完全に同じ数値にならない場合があります。
duでPermission deniedが出る場合
ルートディレクトリ配下を調べていると、 権限不足で次のような表示が出ることがあります。
$ du -h --max-depth=1 /
du: cannot read directory '/root': Permission denied
必要な権限がある場合は、 sudoを付けて確認することがあります。
sudo du -h --max-depth=1 /
ここで実際に試してみよう:ディスク逼迫調査シミュレーター
疑似Linuxサーバで、 「/ が95%使用されている」 という障害を調査してみましょう。
dfで全体を確認し、 duを使って原因となっている場所を 徐々に絞り込んでください。
Disk Usage Troubleshooting
まずdf -hで逼迫しているファイルシステムを確認しましょう
dfは全体、duは中身を調べるために使います。
この演習のゴール
df -h
/ が95%
du /
/varが大きい
du /var
/var/logが大きい
du /var/log
app.logが原因候補
理解度チェック:次に何を実行する?
次に、ルート配下の 「どのディレクトリが容量を使っているのか」 を調べたい場合、どのコマンドが適切でしょうか?
「全体を見るdf」と「中身を見るdu」の違いを思い出しましょう。
初心者が間違えやすいポイント
① dfとduを同じものだと思う
② duをいきなり/全体に大量表示する
du /だけでは
非常に多くの結果が表示される場合があります。
--max-depth=1や
-sを使い、
段階的に掘っていくのがおすすめです。
③ 大きいログをその場でrmする
ログファイルは、 サービスが現在利用している可能性があります。
ログローテーション設定や 保持要件などを確認してから対応しましょう。
確認問題:df・duの基本を確認しよう
ファイルシステム全体の空き容量を 読みやすい単位で確認するコマンドはどれですか?
df -hではファイルシステムごとの Size・Used・Avail・Use%などを確認できます。
/varディレクトリ全体の合計使用量だけを 確認したい場合、適切なコマンドはどれですか?
-sで合計値、-hで読みやすい単位にして 指定ディレクトリの容量を確認できます。
ディスク容量には空きがあるのに 新しいファイルを作成できない場合、 追加で確認したいものはどれですか?
inodeが枯渇すると、 ディスク容量に空きがあっても 新しいファイルを作成できない場合があります。 df -iで確認できます。
3問に挑戦してみましょう。
まとめ
dfは、 ファイルシステム全体の使用量を確認する
duは、 ファイルやディレクトリが使用している容量を確認する
df -hで逼迫箇所を確認し、
duで
原因となるディレクトリを掘っていく
df -iで
inode使用率も確認できる
大きなファイルを見つけても、 用途や影響を確認してから対応する ことが重要
次はネットワーク状態を確認できるようになろう
Linuxサーバの障害は、 ディスクだけで発生するわけではありません。
たとえば、
といったネットワーク確認も、 Linuxサーバ運用では欠かせません。
次は「Linuxのネットワーク確認コマンドを学ぶ」を学びましょう
次の記事では、 Linuxサーバのネットワーク状態を確認するために、 ip・ping・ss・ip route・名前解決確認などを扱います。
「通信できない」というトラブルに対して、 どこから確認すればよいのか を順番に学習していきます。
Linuxのネットワーク確認コマンドを学ぶ →
