#!/bin/bash ############################################################################### # probe-storage.sh # # READ-ONLY storage + disk ground-truth probe. Writes only stdout. # Run on any Proxmox host (or any Linux NFS server) to inventory its physical # disks, mounts, exports, SMART health, and Proxmox storage config. # # Portable: no hardcoded values. Uses only standard CLI tools + smartmontools. # # Usage (via tests/remote.sh): # PROX_HOST=pfv-tsys4 bash tests/remote.sh prox-file perf/scripts/probe-storage.sh # # Or directly on a host: # bash probe-storage.sh > storage-audit.txt ############################################################################### set -u echo "===== HOST: $(hostname -s) $(date -u +%FT%TZ) =====" echo echo "##### lsblk (tree, with model/serial/size/type) #####" lsblk -o NAME,MAJ:MIN,SIZE,TYPE,MOUNTPOINT,MODEL,SERIAL,STATE,ROTA,TRAN,REV 2>&1 echo echo "##### block devices by-id #####" for dev in /dev/disk/by-id/*; do [ -L "$dev" ] || continue case "$(basename "$dev")" in *part[0-9]*) continue;; esac ls -l "$dev" done 2>&1 echo echo "##### nvme list (if any) #####" command -v nvme >/dev/null 2>&1 && nvme list 2>&1 || echo "(no nvme-cli or no nvme devices)" echo echo "##### blkid #####" blkid 2>&1 echo echo "##### mounted filesystems #####" findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS 2>&1 echo echo "##### /etc/fstab #####" cat /etc/fstab 2>&1 echo echo "##### /etc/exports (+ exports.d) #####" cat /etc/exports 2>&1 for f in /etc/exports.d/*.exports; do [ -f "$f" ] && echo "--- $f ---" && cat "$f"; done 2>&1 echo echo "##### df -h (all mounts) #####" df -h 2>&1 echo echo "##### smartctl -a per block device #####" command -v smartctl >/dev/null 2>&1 || echo "(smartctl not installed)" for d in /dev/sd? /dev/nvme?n1; do [ -b "$d" ] || continue echo "----- smartctl -a $d -----" smartctl -a "$d" 2>&1 | grep -iE 'Device Model|Model Number|Serial|Firmware|User Capacity|Rotation Rate|Form Factor|SATA Version|NVMe|SMART overall|Reallocated|Pending|Uncorrect|Power On|Temperature|Media and Data Integrity' || true done echo echo "##### /etc/pve/storage.cfg #####" cat /etc/pve/storage.cfg 2>&1 echo echo "##### pvesm status #####" pvesm status 2>&1 echo echo "##### pvesm list per store #####" for s in $(pvesm status 2>/dev/null | awk 'NR>1 && $3>0 {print $1}'); do echo "--- pvesm list $s ---" pvesm list "$s" 2>&1 | head -40 done echo echo "##### zpool status (if any) #####" command -v zpool >/dev/null 2>&1 && zpool status 2>&1 || echo "(no zfs)" echo echo "##### lvm: pvs/vgs/lvs #####" command -v pvs >/dev/null 2>&1 && { pvs 2>&1; echo; vgs 2>&1; echo; lvs 2>&1; } || echo "(no lvm tools)" echo echo "===== END $(hostname -s) ====="