#!/bin/bash # diskinfo 1.12 2008-04-29 16:07:41-04 davidsen Stable # tabs=4 # # display disk info # this usage function needs to be defined before it's used Usage() { exec 1>&2 echo -e "\n\n\nDiskInfo usage\n" echo -e " diskinfo [ options ] [ drives ]\n" echo "With no arguments diskinfo lists the sizes of devices with" echo "names of the format /dev/hd? and /dev/sd?. Options allow" echo "display of the size of partitions, and their use by raid" echo "(md) arrays, or lvm (dm) devices." echo "" echo "Options" echo " -v verbose - at the moment just displays version information" echo " rather than more information about the devices." echo " -p partitions - shows information about partitions on the" echo " devices listed, their size and usage." echo " -d debug - does nothing in the released version, just a handy" echo " thing to have if you try to enhance this script." echo " -e european disk size notation, \"MiB\" instead of \"MB,\" etc" echo "" echo "To specify a subset of drives or drives with alternate names," echo "the drive names may be put on the command line in wildcard" echo "notation." echo -e "\nENTER to see examples: \c" read ans echo -e "\n\n" echo "Examples:" echo " diskinfo hd[ab] sdb" echo " diskinfo -p sd?" echo " diskinfo -p md1p_*" echo -e "\n\n" exit 2 } # option parsing verbose=0 partitions=false debug=false # MB and GB unit notation - someone asked for this Unit_MB="MB" Unit_GB="GB" while getopts "pvde" opt; do case "$opt" in "p") partitions=true;; "v") let verbose+=1;; "d") debug=true;; "e") # European unit notation Unit_MB="MiB"; Unit_GB="GiB";; "?") Usage;; esac done if [ $verbose -gt 0 ]; then echo -e 'diskinfo v1.12 Stable 2008-04-29 16:07:41-04 davidsen@tmr.com\n' >&2 fi # A gigabyte in sectors Gig_sect=$((2*1024*1024)) # this does the output do_blkdev() { local drive id modelfile id="$1" drive=$2 # size in MB or GB as makes sense size=$(cat ${drive}/size) if [ $size -lt $Gig_sect ]; then MB=$(echo "scale=1;$size/2048"|bc) UNIT=$Unit_MB else MB=$(echo "scale=1;$size/(2*1024^2)"|bc) UNIT=$Unit_GB fi modelfile="${drive}/device/model" if [ -f "$modelfile" ]; then model=$(cat "${modelfile}") else if [ -d ${drive}/holders ]; then model=$(ls ${drive}/holders) [ -n "$model" ] && model=" ($(echo $model))" else model="undefined" fi fi printf "%-8s %6s %-2s %s\n" "$id" $MB $UNIT "$model" } # identify devices eval DISKS=\${${OPTIND}:-hd? sd?} # process the block devices cd /sys/block for disk in ${DISKS} do if [ -d "${disk}" ]; then do_blkdev "$disk" "$disk" if $partitions; then for ptn in ${disk}/${disk}[1-9]*; do if [ -d "$ptn" ]; then do_blkdev " ${ptn##*/}" $ptn else echo " no partition table" fi done fi fi done