Skip to main content

statblk

Gather disk and partition information for block devices and print it as a table or JSON.

Supports Linux and macOS.

Install

From PyPI:

pip install statblk

From a clone of this repository:

pip install .

Optional shell tab completion:

pip install 'statblk[completion]'

Requires Python 3.6+ and the multiCMD package (>= 1.47).

Quick start

statblk
statblk -j                    # JSON output (rows, header first)
statblk -J                    # JSON objects with numeric sizes/rates
statblk -o NAME,SIZE,MOUNTPOINT
statblk sda nvme              # filter rows matching sda or nvme
statblk 2                     # refresh every 2 seconds (watch mode)

Output columns

By default every column that has data is shown (a column that is empty for every row, such as LABEL when nothing is labelled, is hidden from the table):

Column Description
NAME Block device name (device-mapper devices show their /dev/mapper name, e.g. pve-root)
FSTYPE Filesystem type
SIZE Device or filesystem size
FSUSE% Filesystem space used (mounted entries); TIMEOUT for a mount that didn't answer (e.g. dead NFS server)
MOUNTPOINT Mount path
SMART SMART health (OK, DENIED, TIMEOUT, etc.)
LABEL Volume label
UUID Filesystem UUID
MODEL Drive model (from udev via lsblk, sysfs fallback)
SERIAL Drive serial (from udev via lsblk, sysfs fallback)
DISCARD TRIM / discard support
READ Current read throughput
WRITE Current write throughput

Use -o / --output to select columns (comma-separated) or -x / --exclude to omit columns. Columns named with -o are always shown, even when empty; --show_empty_columns keeps empty columns in the default view. JSON output (-j / -J) always includes every selected column.

Options

Output format

Flag Description
-j, --json Print JSON instead of a table (list of rows, header first; values as displayed)
-J, --json_objects Print JSON as a list of objects: SIZE/READ/WRITE in bytes and FSUSE% as an integer (null when unavailable)
-b, --bytes Print sizes and throughput as raw byte counts
-H, --si Use powers of 1000 (SI) instead of 1024 for sizes
-R, --full Do not truncate long values to terminal width
-o, --output Columns to include (default: all with data)
-x, --exclude Columns to omit
--show_empty_columns Keep columns that are empty for every row in the table

Filtering

Flag Description
filter_patterns … Show rows matching any pattern (regex)
-D, --match_devname_only Apply patterns to device names only (kernel name or /dev/mapper name)
-v, --invert_match Invert pattern match (with no patterns, prints only the header)
-F, -fo, --formated_only Only entries with a filesystem type
-M, -mo, --mounted_only Only mounted devices
-B, -bo, --best_only Shortest mount point per device
-A, -ao, --active_only Only devices with read/write activity
-P, --pseudo Include pseudo filesystems (tmpfs, nfs, cifs, …)
--show_zero_size_devices Include zero-size devices

Runtime

Flag Description
-t, --timeout Time budget per refresh in seconds for lsblk, smartctl and statvfs (default: 2)
-w, --watch SECONDS Repeat output every SECONDS (watch mode)
--sudo Run external commands via sudo (needed for SMART on many systems). smartctl is also looked up in /usr/sbin, /sbin, /usr/local/sbin when it isn't on PATH
--debug Print suppressed exceptions to stderr
-V, --version Show version and exit

Watch mode

Prefer -w / --watch. A trailing integer positional still works the same as before:

statblk -w 5       # update every 5 seconds
statblk 5          # same (trailing integer)
statblk sda 3      # filter to sda, refresh every 3 seconds
statblk -w 3 sda   # same with explicit flag (flag wins if both are given)

After the first refresh, --active_only is enabled automatically on Linux so only busy devices are shown (not on macOS, where throughput isn't available). Each refresh re-reads mounts, labels, UUIDs, sizes, and per-drive sysfs info such as model/serial, so hot-swapped drives show up correctly (throughput iterators stay live across refreshes). Press Ctrl-C to stop (exit status 130).

If a filter pattern looks like a number, append 0 so it is not treated as the refresh interval (or use -w and keep the number as a filter):

statblk nvme0 0    # match nvme0, single run (no watch)
statblk -w 0 nvme0 # same via flag

Platform notes

Linux

Uses sysfs, /proc/self/mountinfo, lsblk, and optionally smartctl.

  • SMART requires smartctl (smartmontools). Use --sudo if permission is denied. It only runs against hardware-backed disks (not loop, dm, md, zram, nbd). The column is hidden when no disk reports SMART; use -o or --show_empty_columns to show it and --debug to see why it is empty.
  • autofs trigger mounts are ignored (stat-ing them would trigger the automount); the real filesystem appears once mounted.
  • READ / WRITE throughput comes from /sys/class/block/*/stat (always 512-byte sector units).
  • On a single-shot run (and the first row of watch mode), READ/WRITE are a lifetime busy-time average (bytes / time spent in I/O since boot). In watch mode, later refreshes are interval rates over the sleep period (Δbytes / wall clock).

macOS

Uses diskutil and mount. Throughput columns are always zero (no per-device sysfs stats). APFS snapshot nodes such as the sealed system volume (disk3s1s1 on /) are listed.

Development

Install test deps:

pip install -r requirements-dev.txt

Run unit tests (default; live excluded) and embedded doctests:

pytest
python -m doctest statblk.py -v
python statblk.py --doctest

Optional live checks:

pytest -m live          # soft smoke on this host
pytest -m live_strict   # compare FSUSE% and names to df/lsblk

License

GPLv3+ — Yufei Pan (pan@zopyr.us)

Project home: github.com/yufei-pan/statblk

Metadata

Release files for statblk 1.45

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for statblk 1.45
File Size Uploaded Provenance Actions
statblk-1.45.tar.gz 36.6 kB Without provenance Details for statblk-1.45.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for statblk 1.45
File Interpreter ABI Platform Actions
statblk-1.45-py3-none-any.whl Python 3 none any Details for statblk-1.45-py3-none-any.whl

Total release size: 63.1 kB

Release files / statblk-1.45.tar.gz

Download URL statblk-1.45.tar.gz
Size 36.6 kB
Tags Source
SHA-256 checksum
How to use checksums
f2c4c59b0d96428879f4d14fa65fd2710353ecf3e62fcbad54bbbdc0a6e2336a
BLAKE2b-256 checksum
How to use checksums
870c9f017c1123759183cade4f1c243db9aee4825f6c427b5619e8e95f6d5ccd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / statblk-1.45-py3-none-any.whl

Download URL statblk-1.45-py3-none-any.whl
Size 26.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fe3566c42d81d8277e678896f306a5c6ecdeb3382fc531964a20d30a175775d6
BLAKE2b-256 checksum
How to use checksums
67553fb4be2a64331f18c72e3690eef3fdefcd32025c66b0b503be81d1eb2198
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for statblk 1.45

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.45 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page