Storage health for server technicians — know which disk is dying before it takes the RAID with it.
SAS, SATA and NVMe SMART read natively (Dell PERC / LSI MegaRAID included), remaining-life estimates, a health gate for scripts, Prometheus metrics and webhook alerts — plus RAM, CPU and the motherboard (BIOS, devices, BMC sensors), and checks for fake or rebranded drives. One static Linux binary, no dependencies.
curl -fsSL https://wayang.dalang.io/dcheck/install.sh | sh
+ smartmontools (optional): … | sh -s -- --with-smartmontools
Linux & macOS · x86_64 / arm64 · latest release v0.5.1
Real output from a Dell PowerEdge R630: a Toshiba SAS drive with 92,000 power-on hours is flagged before it fails.
Everything a technician needs to decide: keep, watch, back up, or replace.
Reads ATA, SCSI/SAS and NVMe health straight from the kernel (HDIO, SG_IO, NVMe admin). Works in a minimal rescue system. If smartmontools is installed, both sources are merged.
Tested on Dell PERC H330/H730 (LSI MegaRAID 3008/3108): SAS health status, grown defects, error counters, SAS link rate and phy errors, and full SMART for SATA SSDs behind the controller (ATA pass-through, no smartctl needed).
SSD: vendor / ACS wear indicator or host writes vs rated TBW. HDD: power-on hours vs design life and the drive's rated start-stop / load-unload cycles. Shown for 24/7 and 8h/day, with a confidence level.
dcheck check exits 0/1/2/3 by the worst verdict — drop it into cron, systemd or CI. dcheck watch alerts on any change for the worse and can POST a webhook.
dcheck prometheus prints health severity, temperature, power-on hours, bytes written and more for your scraper. Every report is also available as stable JSON.
Memory usage, ECC errors (EDAC), DIMM slot map with vendor / type / speed from SMBIOS, DDR5 temperature. CPU model, topology, clock, cache, load, and per-socket temperatures judged against each CPU's own limits.
Every SATA / SAS drive carries a WWN with its maker's IEEE OUI. dcheck checks it against the brand in the model name (all 1,662 OUIs of the major makers, from the IEEE registry), checks NVMe controller vendors (a "Samsung 980" on a Maxio controller), and flags generic names like "SSD 1TB".
Counterfeit flash reports more space than it has. dcheck verify writes address-tagged data and reads it back with the OS cache dropped; a fake fails as soon as the writes pass its real capacity, and dcheck tells you the real size.
dcheck recover (read-only) tells you the chance — an HDD keeps old data, an SSD with TRIM erases it — and dcheck undelete brings files back: NTFS, FAT32 and exFAT with their names, other filesystems by carving, always to another disk, with a block map of where each file lies.
Maker, board, BIOS version and age, UEFI / Secure Boot; PCIe devices with driver, link width and AER errors; USB devices. On servers the BMC is read over native IPMI (no ipmitool): fans, temperatures, power draw, power supplies and the event log — a redundant PSU without AC is flagged.
Neon truecolor in modern terminals, the ANSI palette on a Linux console or iDRAC/iLO virtual console, --plain for ASCII-only fonts, NO_COLOR respected, text stays selectable.
Reads only, unless you ask: SMART self-tests and dcheck verify. Verify writes test files to free space and deletes them, refuses to fill a system disk without --size, and overwrites a whole drive only with --destructive after you type ERASE <name>. Ceph RBD, DRBD, device-mapper and loop devices are skipped. A drive that is plugged in but never answers is still listed (from the kernel log) as REPLACE.
~1 MB binary for Linux (static musl) and macOS, x86_64 and arm64. dcheck update downloads the latest release, verifies its SHA-256 checksum and replaces itself atomically.
Captured on two Dell PowerEdge R630 servers and a lab PC (serial numbers masked); the counterfeit result is a simulation. Click to enlarge; arrow keys to navigate.
Command deck — live summary of every module
Storage array — SSD + 4 SAS HDDs behind a PERC H730
Alerts at a glance — two drives past their design life
HDD report — 5.5 years past its design life
SAS HDD — manufacture date, rated cycles, design life
SATA SSD — wear, lifetime temperatures, device statistics
Memory — usage, DIMM slot map, ECC
Processor — load, temperature, 80-thread grid
Command reference overlay
Boot splash (0.5 s, any key skips)
Undelete? HDD — ~92% of the free space still holds old data
Undelete? SSD with discard — TRIM already erased the free space
Motherboard — Dell R630 over IPMI: a redundant PSU without AC
Undelete — block map of where each deleted file lies (demo data)
Capacity test — the plan and warnings before anything is written
Capacity test — a counterfeit drive (simulated) fails with its real size
Any Linux distribution on x86_64 or aarch64 (static binary, nothing else required), and macOS on Apple Silicon or Intel.
Detects the architecture, downloads the release, verifies SHA-256 and installs to /usr/local/bin (with sudo if needed, or ~/.local/bin). Options: DCHECK_INSTALL_DIR=/opt/bin, DCHECK_VERSION=0.5.1 (pin a version).
Offline or air-gapped server? Download the tarball for your architecture from the release directory below, copy it over, and run tar xzf + install.
Uses apt, dnf, yum, zypper, apk, pacman or brew; skipped if already installed. Add --dry-run to see what would happen. Not required: SATA, SAS and NVMe — including SATA behind PERC/MegaRAID and USB bridges — are read natively.
| What | Needed? | Why |
|---|---|---|
| Runtime libraries | none | Static binary (musl) — any distribution, rescue systems, containers |
| curl / wget, sha256sum, tar, awk | installer & update | Present on stock Ubuntu, Debian, Fedora, RHEL. Minimal container: apt install -y curl ca-certificates |
| root (sudo) | for SMART | Raw disk access; without it the disk list still works |
| smartmontools | optional | Second SMART source, merged with the native read |
| dmidecode | optional | RAM module detail; SMBIOS is also read directly from sysfs |
| curl | optional | Only for dcheck watch --webhook |
| Platform | File |
|---|---|
| Linux x86_64 (Dell / HPE / Supermicro, most PCs) | dcheck-0.5.1-x86_64-unknown-linux-musl.tar.gz |
| Linux aarch64 (Ampere, Raspberry Pi 4/5, Orange Pi) | dcheck-0.5.1-aarch64-unknown-linux-musl.tar.gz |
| macOS Apple Silicon (M1–M4) | dcheck-0.5.1-aarch64-apple-darwin.tar.gz |
| macOS Intel | dcheck-0.5.1-x86_64-apple-darwin.tar.gz |
| Checksums | SHA256SUMS |
Releases are immutable: a published version never changes. Older versions stay available under /dcheck/v<version>/.
From a one-off check during a site visit to continuous monitoring of a whole fleet.
sudo dcheck check — one line per disk with its verdict and the reason.sudo dcheck → Storage. The array table shows health, remaining life and temperature for every drive, even behind a PERC / MegaRAID controller.c to copy the report into a ticket.dcheck check, a Prometheus scrape, or dcheck watch --webhook.| Verdict | Means | Do | exit |
|---|---|---|---|
| ✔ OK | No failure signs. | Nothing. Re-check periodically. | 0 |
| ? UNKNOWN | No SMART data (not root, USB bridge, SD card). | Run with sudo; the report says why. | 1 |
| ▲ MONITOR | Early warning: reallocated sectors, CRC errors, high temperature, past design life. | Watch the trend, check cables and cooling, order a spare. | 2 |
| ✖ BACK UP NOW | Pending / uncorrectable sectors, media errors, attribute at threshold, wear ≥ 90%. | Back up immediately, schedule the swap. | 3 |
| ✖ REPLACE | The drive reports SMART failure, or it is plugged in but never answers (dead drive, listed as ataN). | Replace now. | 3 |
Every disk report has an AUTHENTICITY section. Below: a generic SSD from a lab machine, and a genuine Samsung SM863a behind a PERC H730 (real output).
Levels: CONSISTENT, UNVERIFIED (nothing to compare), UNBRANDED, SUSPICIOUS (a brand with a zero or missing WWN), LIKELY FAKE (a brand with another maker's OUI or controller). A clean result means consistent, not proven genuine — so prove the capacity too.
In the UI: v on a disk shows the plan and asks for y before writing (free-space test only; the destructive whole-disk test stays in the shell). From a shell:
| Command | Writes | Safeguards |
|---|---|---|
| dcheck verify /dev/sdX | Test files in free space, deleted afterwards. Existing files are kept. | Asks first. On a system disk (/, /boot, /var, /home …) it needs --size or --full. |
| --size 8G | At most 8 GiB (quick test of the first part). | — |
| --destructive | The whole drive. All data on it is lost. | Refused if mounted, swap or LVM/RAID. Lists the partitions and filesystems it finds; you type the device name, or ERASE <name> if it holds data. |
Back up first: on a counterfeit drive, writes past its real capacity can land on existing files (dcheck stops as soon as it sees that). Verify also overwrites free space, so do not run it while you still hope to undelete a file.
Stop writing to that disk first. Then, from another shell or in the UI (u on a disk):
Real output from a Dell R630 (HDD). On a lab SSD with btrfs discard=async the same command says ALMOST NONE and ~0% — TRIM had already erased the free space. Everything here is read-only; nothing is written to the disk.
In the UI: on the recovery screen press d for the deleted files and their block map, space to mark, w to recover into a folder on another disk. From a shell:
| Filesystem | What comes back |
|---|---|
| NTFS | Name, folder and data (fragmented files too). Deleted under Linux's ntfs3 driver the name is gone: saved as record-N with its type. |
| FAT32 / exFAT | Long name, folder and data (FAT32: assumed contiguous). |
| ext4 / XFS / btrfs | --carve: JPEG, PNG, PDF, ZIP and Office files by signature; names are lost. |
The source is only read, the destination must be on another disk, existing files are never overwritten, and each file is marked INTACT, PARTLY REUSED or OVERWRITTEN from the allocation map. Tested on images made on Linux (write, delete, write again): every recovered file matched the original's SHA-256.
systemctl enable --now dcheck.timer. A non-zero exit marks the unit failed, so any existing alerting on failed units (or OnFailure=) picks it up.
Posts only when something gets worse (a new issue or a worse verdict):
| ↑ ↓ / j k | Move / scroll | Enter | Open |
| Esc / b | Back | 1 2 3 | Storage / memory / processor |
| PgUp PgDn g G | Page / top / bottom | r | Rescan / refresh |
| c | Copy the log (OSC 52) | ? / q | Help / quit |
Flags: --plain (ASCII), --light, --transparent, --mouse. Env: DCHECK_COLOR=truecolor|ansi, NO_COLOR, DCHECK_NO_SPLASH. Config: ~/.config/dcheck/config.json (temp_warn_c, hdd_design_years, …).