You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
2.9 KiB
61 lines
2.9 KiB
#!/bin/sh
|
|
|
|
case "${1}" in
|
|
list)
|
|
# GET THE INITITAL OUTPUT OF `ls /sys/block`
|
|
BLK_INFO="$(ls -l --color=never /sys/block | grep -v virtual | grep devices | sed 's/ \+/ /g' | cut -d\ -f9-)"
|
|
# STRIP OFF THE PCI BUS LOCATION INFORMATION
|
|
BLK_INFO="$(echo "${BLK_INFO}" | sed 's|\.\.\/devices/pci[0-9a-f:]\{7\}\(/[0-9a-f:.]\{12\}\)\+/||g')"
|
|
# STRIP OFF THE SUPERFLUOUS USB HOST INFORMATION
|
|
BLK_INFO="$(echo "${BLK_INFO}" | sed 's|\(usb[0-9]\+\)/.*/host|\1/host|g')"
|
|
# STRIP OFF THE SUPERFLUOUS HOST AND TARGET INFORMATION
|
|
BLK_INFO="$(echo "${BLK_INFO}" | sed 's|/host[0-9]\+/target\([0-9]\+\):\([0-9]\+\):\([0-9]\+\)/|/|g')"
|
|
# NORMALIZE NVME INFO
|
|
BLK_INFO="$(echo "${BLK_INFO}" | sed 's|nvme/nvme\([0-9]\+\)/nvme\([0-9]\+\)n\([0-9]\+\)|nvme/N:\2:\3:1|g')"
|
|
# STRIP OFF BLOCKS
|
|
BLK_INFO="$(echo "${BLK_INFO}" | sed 's|/block/.*||g')"
|
|
# CONVERT -> TO A SPACE
|
|
BLK_INFO="$(echo "${BLK_INFO}" | sed 's/ -> / /g')"
|
|
# CONVERT / TO A SPACE
|
|
BLK_INFO="$(echo "${BLK_INFO}" | sed 's|/| |g')"
|
|
# NOW GET DEVICE IDs and SIZES
|
|
echo "${BLK_INFO}" | while read -r BLOCKDEV DEV_PORT DEV_HCIL; do
|
|
DEVICE_ID="$(ls -l --color=never /dev/disk/by-id | sed 's/ \+/ /g' | grep -v 'nvme-eui\|wwn-' | grep "${BLOCKDEV}$" | cut -d\ -f9)"
|
|
DEV_BYTES="$(lsblk -bnPo NAME,SIZE | grep "\"${BLOCKDEV}\"" | cut -d\" -f 4)"
|
|
if [ "${DEV_BYTES}" -ge $((1000000000000000)) ]; then
|
|
DEVICE_SZ="$(awk "BEGIN {print ${DEV_BYTES}/1000^5}" | cut -b1-5)T"
|
|
elif [ "${DEV_BYTES}" -ge $((1000000000000)) ]; then
|
|
DEVICE_SZ="$(awk "BEGIN {print ${DEV_BYTES}/1000^4}" | cut -b1-5)T"
|
|
elif [ "${DEV_BYTES}" -ge $((1000000000)) ]; then
|
|
DEVICE_SZ="$(awk "BEGIN {print ${DEV_BYTES}/1000^3}" | cut -b1-5)G"
|
|
elif [ "${DEV_BYTES}" -ge $((1000000)) ]; then
|
|
DEVICE_SZ="$(awk "BEGIN {print ${DEV_BYTES}/1000^2}" | cut -b1-5)M"
|
|
elif [ "${DEV_BYTES}" -ge 1000 ]; then
|
|
DEVICE_SZ="$(awk "BEGIN {print ${DEV_BYTES}/1000}" | cut -b1-5)K"
|
|
else
|
|
DEVICE_SZ="${DEV_BYTES}B"
|
|
fi
|
|
echo "${DEV_HCIL} ${DEV_PORT} ${BLOCKDEV} ${DEVICE_SZ} ${DEVICE_ID}" >> /tmp/scsictl
|
|
done
|
|
sort -n -o /tmp/scsictl /tmp/scsictl
|
|
column -N H:C:I:L,PORT,DEV,SIZE,NAME -t -R1,4 -o" " /tmp/scsictl
|
|
rm /tmp/scsictl;;
|
|
delete|rescan)
|
|
case "${2}" in
|
|
sd*)
|
|
if [ -e "/sys/class/block/${2}" ]; then
|
|
echo 1 | sudo tee "/sys/class/block/${2}/device/${1}" > /dev/null
|
|
else
|
|
echo "Device '${2}' not found."; exit 1
|
|
fi;;
|
|
[0-9]:*|[0-9][0-9]:*|[0-9][0-9][0-9]:*)
|
|
if [ -e "/sys/class/scsi_device/${2}" ]; then
|
|
echo 1 | sudo tee "/sys/class/scsi_device/${2}/device/${1}" > /dev/null
|
|
else
|
|
echo "Device '${2}' not found."; exit 1
|
|
fi;;
|
|
*) echo "Uknown device '${2}' -- expected sd[x] or n:n:n:n";;
|
|
esac;;
|
|
*) echo "Unknown verb '${1}' -- expected delete, list, or rescan"; exit 1;;
|
|
esac
|