ByteScope

df

読み取りのみ

マウントされているファイルシステムごとの空きと使用量を報告します。

コマンド
adb shell df
コマンド
ファイルとストレージ
リスク
読み取りのみ

構文

df [-k] [-h] [-H] [-P] [-i] [<path>]

フラグと引数

トークン意味
-k1024 バイトブロック。ヘッダのラベルを頼れるものに固定するフラグです。
-h人間向け、1024 進。
-H人間向け、1000 進。
-PPOSIX 出力:512 バイトブロックで、割合の列名は Capacity になります。
-iバイトではなく inode を数えます。列の中身は inode 数になります。
-t <type>表を 1 つの種類のファイルシステムに絞ります。Android では持つ価値があります。絞らない一覧は、見たい 2 つのパーティションを何十もの `tmpfs` とオーバーレイのマウントの下に埋めてしまうからです。
-a既定では隠れている擬似ファイルシステムも含めます。あるはずのマウントが普通の一覧に出てこないとき、そもそもマウントされていないと結論する前に手を伸ばしてください。

使用例

  • df -k /data

    userdata パーティションの空き容量を 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-blocks1024 バイトブロック単位の合計。`-k` と既定。
512-blocks512 バイトブロック単位の合計。`-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 も不要、どこにもアップロードしません。

Android Storage Analyzer を開く

関連コマンド

df と同じ作業で出てくるコマンド。

コマンド何をするか
duディレクトリツリーが占めているディスク容量を報告します。
dumpsys diskstatsパーティションごとの空き容量、ディスク書き込み遅延の実測、そしてキャッシュされたアプリ別の使用量内訳。
pm trim-caches指定した空き容量に達するまで、システムにキャッシュファイルを捨てさせます。

他のファイルとストレージコマンド

コマンド何をするか
findディレクトリツリーを歩いて一致したものを印字します。大きなファイル、空のフォルダ、残骸を探すのに使います。
rm端末上のファイル、またはディレクトリツリーを削除します。

Web ADB ツール群のパーサを書きながら、AOSP・toybox・カーネルのソースに突き合わせて確認しています。バージョンやメーカーで本当に挙動が変わるところは、世界の半分の端末で間違いになる数値を出す代わりに、そう書いてあります。

よくある質問

adb shell のコマンドはどう実行しますか?

端末で開発者向けオプションと USB デバッグを有効にし、ケーブルを繋いだうえで、platform-tools を入れた機械から adb shell <コマンド> を実行します。adb shell だけを実行すれば対話プロンプトが出て、接頭辞なしで打てます。スクリーンショットのようにバイナリを出力するコマンドでは adb shell ではなく adb exec-out を使ってください。素のシェルサービスは端末を割り当て、それが改行のバイトを書き換えてデータを壊します。

adb shell のコマンドに root は必要ですか?

このリファレンスにあるものには不要です。すべて shell ユーザーとして動き、自分の Android ユーザー向けのパッケージ管理、ほとんどの dumpsys サービスの読み取り、設定プロバイダへの書き込み、入力の注入、共有ストレージの読み取りができます。root が必要なのはこのリファレンスがあえて避けていること、つまり他のアプリのプライベートデータの読み取り(debuggable なビルドに対する run-as を除く)、システムパーティションへの書き込み、/data/anr の直接読み取りです。

自分の端末では出力が違って見えるのはなぜ?

Android のバージョンか、メーカーのどちらかです。一部のフラグやフィールドは特定のリリースから入ったもので、それはコマンドごとに注記しています。残りはメーカーによる改変で、いちばん影響が大きいのは dumpsys です。ダンプはデバッグ出力で、そのテキストはサービスの作者が最後に印字した内容そのもの、しかもメーカーはそれを変えて自分の変更をバックポートします。フィールドは位置ではなく名前で読み、見慣れない形は失敗ではなく差分として扱ってください。

端末ではなくブラウザから実行できますか?

多くのコマンドは可能です。このサイトの Web ADB ツール群は、Chromium 系のデスクトップブラウザから WebUSB で端末と話し、SDK のインストールも不要、どこにもアップロードしません。各ページは、該当するツールがあればそこへリンクしています。知っておく価値のある制限が 2 つあります。ADB インターフェイスを保持できるプログラムは同時に 1 つだけなので、デスクトップの adb server は先に止める必要があります。そして adb forward と adb reverse はブラウザでは一切動きません。

打つより押したい場合は、Web ADB Toolkit がこの種のコマンドをブラウザから USB 経由で実行します。あるいは全コマンドを見る。