What information do you want to know? It is all there, under
/sys/block/device/. In Bash:
Code:
for SYS in /sys/block/sd[a-z] ; do
SIZE=$[ ($(cat "$SYS/size" 2>/dev/null)-0)/2 ] # kilobytes
VENDOR="$(cat "$SYS/device/vendor" 2>/dev/null)"
MODEL="$(cat "$SYS/device/model" 2>/dev/null)"
SCSI="$(find "$SYS/device/scsi_disk/" -maxdepth 1 -name '*:*' -printf '%f\n' 2>/dev/null)"
echo "Device /dev/${SYS##*/}:"
echo " Vendor: $VENDOR"
echo " Model: $MODEL"
echo " Size: $SIZE k"
echo " SCSI: $SCSI"
echo ""
done
You can determine which partitions have been mounted from the disk. It is a bit complicated to do fully, because the partitions may participate in a software-RAID (md) and/or LVM volume.
Anyway, here is a quick script I cobbled together that lists all SCSI/SATA devices (not hardware RAID devices, but including USB storage devices), and whether they're mounted (and where):
Code:
#!/bin/bash
# Create a temporary working directory,
WORK="$(mktemp -d)" || exit $?
# and remove it when this script exits.
trap "rm -rf '$WORK'" EXIT
( # Generate list of md and dm devices,
for SYS in /sys/block/md[0-9]* ; do
echo -n "/dev/${SYS##*/}"
for D in "$SYS/md/rd"[0-9]* ; do
DEV="$(readlink "$D")"
echo -n " /${DEV//-//}"
done
echo ""
done
for SYS in /sys/block/dm-* ; do
echo -n "/dev/mapper/$(cat "$SYS/dm/name")"
for D in "$SYS/slaves/"* ; do
echo -n " /dev/${D##*/}"
done
echo ""
done
) | awk '
{ for (i = 2; i <= NF; i++)
dev[$i] = dev[$i] " " $1
}
END { changes = 1
while (changes) {
changes = 0
for (d in dev) {
sub(/^ +/, "", dev[d])
val = ""
n = split(dev[d], old)
for (i = 1; i <= n; i++)
if (old[i] in dev) {
changes = 1
val = val " " dev[old[i]]
} else
val = val " " old[i]
sub(/^ +/, "", val)
dev[d] = val
}
}
for (d in dev) {
b = d
sub(/[0-9]*$/, "", b)
printf("%s: %s\n", b, dev[d])
}
}' > "$WORK/devices"
# Scan known SCSI/SATA block devices.
echo ""
for DEV in /sys/block/sd* ; do
SIZE=$[ ( $(cat "$DEV/size") -0 )/2 ] # in units of 1024 bytes
VENDOR="$(cat "$DEV/device/vendor")"
MODEL="$(cat "$DEV/device/model")"
SCSI="$(find "$DEV/device/scsi_disk/" -maxdepth 1 -name '*:*:*:*' -printf '%f')"
PARTS="/dev/${DEV##*/} $(sed -ne 's|^/dev/'"${DEV##*/}"': *\(.*\)$|\1|p' "$WORK/devices" | tr -s '\n ' ' ') "
MOUNTS=""
while read MDEV MROOT MTYPE MIGNORE ; do
MDEV="${MDEV%%[0-9]}"
MDEV="${MDEV%%[0-9]}"
for PART in $PARTS ; do
USED=0
[ "$PART" = "$MDEV" ] && USED=1 && break
done
[ $USED -ne 0 ] && MOUNTS="$MOUNTS $MROOT"
done < /proc/mounts
MOUNTS="${MOUNTS# }"
[ -z "$MOUNTS" ] && MOUNTS="(none)"
echo "Device /dev/${DEV##*/}:"
echo " Size: $SIZE k ($[SIZE/1024] M) ($[SIZE/1048576].$[((SIZE*10)/1048576)%10] G)"
echo " Vendor: $VENDOR"
echo " Model: $MODEL"
[ -n "$SCSI" ] && echo " SCSI: $SCSI"
echo " Mounted: $MOUNTS"
echo ""
done 2>/dev/null