By the SNMP Monitoring team · Reviewed July 2026
Need the disk OID, not a lecture on capacity planning? Two families cover storage: the HOST-RESOURCES hrStorageTable (one generic table where every disk, RAM and swap area is a row) and the UCD dskTable (Net-SNMP's dedicated per-filesystem view with a ready-made percent-used). This page is the paste-ready reference for both, plus the conversion everyone forgets — hrStorageTable values are in allocation units, not bytes.
The "how do I alert before it fills at 3 a.m." side is the twin: monitor disk space. Hubs: sensors, all OIDs.
hrStorageTable columns
Every storage area lives as a row in 1.3.6.1.2.1.25.2.3.1. Same five columns per row:
| Column | OID | Meaning / type |
|---|---|---|
| hrStorageType | 1.3.6.1.2.1.25.2.3.1.2 | What kind — hrStorageFixedDisk for disks (OID value) |
| hrStorageDescr | 1.3.6.1.2.1.25.2.3.1.3 | Label / mount, e.g. "/" or "C:\\ Label:..." (text) |
| hrStorageAllocationUnits | 1.3.6.1.2.1.25.2.3.1.4 | Bytes per unit — the multiplier (Integer) |
| hrStorageSize | 1.3.6.1.2.1.25.2.3.1.5 | Total size, in allocation units (Integer) |
| hrStorageUsed | 1.3.6.1.2.1.25.2.3.1.6 | Used, in allocation units (Integer) |
hrStorageSize and hrStorageUsed are counts of fixed-size blocks, not bytes — that's the gotcha. Multiply by hrStorageAllocationUnits to get real bytes.
Identifying a volume
The row index for "/" or "C:" isn't fixed, so don't hard-code .1. Find the right row each time:
- Walk
hrStorageDescr(.3) and match on the mount/label you care about ("/", "/var", "C:\"). - Or filter
hrStorageType(.2) tohrStorageFixedDiskto skip RAM, swap, and virtual/RAM-disk rows. - Grab that row's index, then read
.5and.6at the same index.
The table mixes physical disks, RAM, swap and removable media in one place, so filtering by type or description is how you avoid graphing "memory" as if it were a disk. Match every poll — indexes can shift after a reboot or a mount change.
A related trap: hrStorageTable on Linux lists a pile of pseudo-filesystems you almost never want on a capacity dashboard — tmpfs, devtmpfs, /run, /dev/shm, loop mounts, and so on. Left in, they clutter graphs and can throw false "95% full" alerts on tiny RAM-backed mounts that are supposed to run near capacity. So identification isn't just "find the row you want"; it's also "exclude the rows you don't." Build an allowlist of the real mounts you care about ("/", "/var", "/data") by hrStorageDescr, or filter to hrStorageFixedDisk and then drop anything whose description looks like a virtual mount. That curation is a one-time setup step that saves a lot of alert noise later — and it's the reason the UCD dskTable, which only lists configured filesystems, is often the cleaner starting point on a host you control.
UCD dskTable alternative
On Net-SNMP hosts there's a friendlier, filesystem-only table at 1.3.6.1.4.1.2021.9.1 — and it hands you a percentage directly:
- dskPath —
1.3.6.1.4.1.2021.9.1.2— mount point - dskTotal —
1.3.6.1.4.1.2021.9.1.6— total size (kB) - dskAvail —
1.3.6.1.4.1.2021.9.1.7— available (kB) - dskUsed —
1.3.6.1.4.1.2021.9.1.8— used (kB) - dskPercent —
1.3.6.1.4.1.2021.9.1.9— percent used, precomputed
When it's easier: dskPercent means no allocation-unit math, and dskPath is a clean mount point. The catch — it's UCD/Net-SNMP-specific and only appears if disks are configured in snmpd.conf, so a switch or appliance won't have it while it still answers hrStorageTable.
Worked snmpwalk example
Walk the storage table:
snmpwalk -v2c -c <RO_string> <host> 1.3.6.1.2.1.25.2.3.1
HOST-RESOURCES-MIB::hrStorageDescr.31 = STRING: /
HOST-RESOURCES-MIB::hrStorageAllocationUnits.31 = INTEGER: 4096 Bytes
HOST-RESOURCES-MIB::hrStorageSize.31 = INTEGER: 26214400
HOST-RESOURCES-MIB::hrStorageUsed.31 = INTEGER: 18874368
Row .31 is the root filesystem. Or the UCD view, percent ready-made:
snmpwalk -v2c -c <RO_string> <host> 1.3.6.1.4.1.2021.9.1.9
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 72
<RO_string> is a placeholder — allowlist the storage prefix you poll, not the whole tree.

Converting & computing free %
Turning the raw columns into usable numbers:
- Read
hrStorageAllocationUnitsfor the row (bytes per block — often 4096). - Bytes used =
hrStorageUsed × allocationUnits. - Bytes total =
hrStorageSize × allocationUnits. - Free bytes =
(hrStorageSize − hrStorageUsed) × allocationUnits. - Percent used =
hrStorageUsed ÷ hrStorageSize × 100— no conversion needed, since both are in the same units.
From the walk above: 18874368 ÷ 26214400 × 100 = 72% used. In bytes, total 26214400 × 4096 ≈ 107.4 GB, free (26214400 − 18874368) × 4096 ≈ 30.1 GB. Percent is the cheap one — you never need bytes just to alert on "how full."
How to monitor disk space (how-to)
Reference stops here; the alerting logic — per-mount thresholds, growth-rate warnings, excluding pseudo-filesystems — is the twin: monitor disk space via SNMP. Related references: memory & swap OIDs, RAID status OIDs, the full OID catalog, and glossary.
Frequently asked questions
What is the OID for disk usage in SNMP?
hrStorageUsed at 1.3.6.1.2.1.25.2.3.1.6 (in allocation units, per row) is the portable answer; pair it with hrStorageSize (.5) and hrStorageAllocationUnits (.4). On Net-SNMP hosts, dskPercent (1.3.6.1.4.1.2021.9.1.9) gives percent-used directly.
How do I find my disk's row?
Walk hrStorageDescr (1.3.6.1.2.1.25.2.3.1.3) and match the mount or label you want, or filter hrStorageType (.2) to hrStorageFixedDisk to drop RAM/swap rows. Use that row's index for size and used. Don't assume a fixed index — it can change across reboots.
hrStorageTable or UCD dskTable — which should I use?
Use hrStorageTable for cross-vendor portability; it's on almost everything. Use the UCD dskTable (1.3.6.1.4.1.2021.9.1) on Net-SNMP hosts when you want a ready-made dskPercent and clean mount paths without allocation-unit math. Note it must be configured in snmpd.conf to appear.
How do I convert the value to GB?
Multiply by the allocation units, then by the usual byte scale: bytes = value × hrStorageAllocationUnits, and divide by 1,000,000,000 for GB (or 1,073,741,824 for GiB). For a used percentage you can skip all of that, since hrStorageUsed ÷ hrStorageSize is already unitless.
Key takeaways
- Disks live in the hrStorageTable (
1.3.6.1.2.1.25.2.3.1) — descr.3, allocUnits.4, size.5, used.6, type.2. - size/used are in allocation units, not bytes:
bytes = value × allocationUnits. - Find the row by description or
hrStorageFixedDisktype, never a fixed index. - UCD dskTable (
1.3.6.1.4.1.2021.9.1) gives ready-madedskPercenton Net-SNMP. - Percent used = used ÷ size × 100 — no conversion required.
- Procedure: disk-space how-to; catalog: sensors/all.