df
読み取りのみマウントされているファイルシステムごとの空きと使用量を報告します。
- コマンド
- adb shell df
- コマンド
- ファイルとストレージ
- リスク
- 読み取りのみ
構文
df [-k] [-h] [-H] [-P] [-i] [<path>]フラグと引数
| トークン | 意味 |
|---|---|
| -k | 1024 バイトブロック。ヘッダのラベルを頼れるものに固定するフラグです。 |
| -h | 人間向け、1024 進。 |
| -H | 人間向け、1000 進。 |
| -P | POSIX 出力:512 バイトブロックで、割合の列名は Capacity になります。 |
| -i | バイトではなく inode を数えます。列の中身は inode 数になります。 |
| -t <type> | 表を 1 つの種類のファイルシステムに絞ります。Android では持つ価値があります。絞らない一覧は、見たい 2 つのパーティションを何十もの `tmpfs` とオーバーレイのマウントの下に埋めてしまうからです。 |
| -a | 既定では隠れている擬似ファイルシステムも含めます。あるはずのマウントが普通の一覧に出てこないとき、そもそもマウントされていないと結論する前に手を伸ばしてください。 |
使用例
df -k /datauserdata パーティションの空き容量を KiB で。
df -kマウントされているファイルシステムすべて。
df -h /data目で読むには速いですが、計算に使う数値ではありません。
df -k /data /sdcard端末で重要な 2 行を 1 回の呼び出しで。単位は共有のヘッダで一度だけ宣言されます。
df -k -a擬似ファイルシステムも含めて全部。あるはずのマウントポイントが既定の表に現れないときのために。
出力の読み方
出力例
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/block/dm-9 111222333 98765432 12345678 89% /dataヘッダ行がそのまま単位の宣言で、単位が現れるのはそこだけです。だから位置ではなくヘッダを通して列を読みます。`1K-blocks` は 1 ブロック 1024 バイト、`512-blocks` は 512 バイト、`Size` は人間向けに丸められた値、`Inodes` なら数値はバイトではありません。
出力フィールド
| フィールド | 意味 |
|---|---|
| 1K-blocks | 1024 バイトブロック単位の合計。`-k` と既定。 |
| 512-blocks | 512 バイトブロック単位の合計。`-P` の出力。 |
| Size / Avail | `-h` または `-H` による人間向けの値。有効桁 3 つ。 |
| Use% / Capacity | 使用率。ラベルはフラグ次第で変わります。 |
| Mounted on | マウントポイント。ヘッダでは 2 語、行では 1 列です。 |
| - | 測れなかったファイルシステム。0 ではありません。 |
| IFree / IUse% | `-i` が `Available` と `Use%` の代わりに出す inode の列。パーティションはバイトに余裕があっても inode で満杯になり得て、それが見えるのはこの 2 列だけです。 |
| Filesystem | 背後のデバイス、あるいは bind や擬似マウントの元。最近の端末では、見て分かるパーティションではなく `/dev/block/dm-9` のような device-mapper の名前がふつうです。 |
必要な権限
読み取り専用で権限も要りません。root も `adb root` も、先に有効にしておくものもありません。`df` はマウント表を読み、ファイルシステムごとのブロック数をカーネルに尋ねるので、数値は中に保存されているものではなくファイルシステム自身を語ります。行が正しいために、どのディレクトリも読めている必要はありません。この区別は握っておく価値があります。同じ端末で `du` は歩くものの半分を断るからです。`du /data` が `Permission denied` の壁になっている最中でも、`df` の `/data` の行は信用できます。パスを渡しても変わるのはどの行が印字されるかだけで、引数はどのデバイス上にあるかを調べるために検査され、shell が検査できない引数は推測されずに報告されて飛ばされます。ここには書き込みの形が一切ありません。容量を空けるのは `pm trim-caches` か削除で、それぞれ自分のページと自分の確認を持っていますし、このコマンドのフラグを打ち間違えて辿り着けるものでもありません。Android Storage Analyzer が `/data` の数値をこのコマンドから取っているのは、このページに載っている理由と同じです。端末上のストレージの数値で、shell がたまたま何を開けるかに左右されない唯一のものだからです。
エラーメッセージの読み解き
| メッセージ | 意味 |
|---|---|
| df: '/mnt/media_rw/0000-1111': No such file or directory | そのパス引数を調べられなかったので、その引数には行が出ず、他の引数には出ます。`android11-release` から `android15-release` の各ブランチで `toys/posix/df.c` を確認したところ、ここではパスが本当にシングルクォートで囲まれます。似た語を含む表の行と確実に見分ける手段がそれです。本物の行は何も引用しません。 |
| df: '/data/data/com.example': Permission denied | パス引数は、どのファイルシステム上にあるかを突き止めるためにまず stat されます。アプリ専有ストレージはそれを shell に対して拒否します。ブロック数そのものには権限が要らないのに `df` の問い合わせが権限で失敗しうる唯一の経路がこれで、その引数だけ行が出ず、他の引数の行は出ます。代わりにマウントポイントを尋ねてください。`df /data` なら同じことが分かりますし、権限は何も要りません。 |
| df: Unknown option 'z' (see "df --help") | toybox がその文字を知らず、何も測られていません。引用されるのは、諦めた時点でダッシュの後ろに残っていたものなので、`-kz` は打った語全体ではなく `z` として報告されます。「打った引数」ではなく「置き場所が分からなかった最初の文字」として読んでください。 |
バージョンとメーカーに関する注意
- `-h` と `-H` は出力から見分けられません。列のラベルも単位の文字も同じで、大文字小文字で分かるのはキロバイトの接尾辞だけです。人間向けの値からはどちらの基数か分からないので、重要ならブロックで頼んでください。
- シェルは標準エラーを出力に混ぜるので、`df: /mnt/media_rw/0000-1111: No such file or directory` のような行が表の途中に届き、語数だけは行として通ってしまいます。本物の行は、ヘッダが数値を約束した場所に数値があります。
- Android 5.1 以前の `df` は別実装で、ヘッダも違い、マウントポイントの独立した列もなく、`-k` を理解せずパスとして扱います。
- リリース間で本当にグループ分けが変わったフラグが 1 つあります。`-k` は Android 11 までの toybox では `[-HPkh]` の中にいて、Android 12 でそこから出ました。この種のグループが何をするかに注意してください。toybox は拒否するのではなく、先に立っていたフラグを黙って下ろします。だから古いビルドの `df -P -k` は `-P` が消えて素の 1024 バイトブロックの表になり、Android 12 以降は両方効きます。どちらも何も言いません。境界をまたぐスクリプトが `-k` を単独で送るべき理由がこれです。
- 確認したソースによれば、測れなかったパスの行はパスをシングルクォートで囲みます。ここには root が要るものは何もなく、`adb root` でも 1 行も増えません。マウント表は誰でも読めますし、マウントポイントにブロック数を尋ねるのに、その中を歩く権利は要らないからです。
これには UI があります
Android Storage Analyzer はこのコマンドを USB 経由で実行し、返ってきたものを解析します。Chromium 系ブラウザだけで、SDK も不要、どこにもアップロードしません。
関連コマンド
df と同じ作業で出てくるコマンド。
| コマンド | 何をするか |
|---|---|
| du | ディレクトリツリーが占めているディスク容量を報告します。 |
| dumpsys diskstats | パーティションごとの空き容量、ディスク書き込み遅延の実測、そしてキャッシュされたアプリ別の使用量内訳。 |
| pm trim-caches | 指定した空き容量に達するまで、システムにキャッシュファイルを捨てさせます。 |
他のファイルとストレージコマンド
Web ADB ツール群のパーサを書きながら、AOSP・toybox・カーネルのソースに突き合わせて確認しています。バージョンやメーカーで本当に挙動が変わるところは、世界の半分の端末で間違いになる数値を出す代わりに、そう書いてあります。