HDD Tray ermitteln LED blinken
Beschreibung:
Es gibt ein tolles tool. Mit der man die LED zum Tray blinken lassen kann.
Noch ein kleines Script dazu wo man nur dass device angeben muss.
Durchführung:
apt-get install -y lsscsi sg3-utils
Festplatten anzeigen lassen:
lsscsi -g
Ausgabe:
[1:0:0:0] cd/dvd Slimtype DVD A DS8ACSH LP5M /dev/sr0 /dev/sg17
[3:0:0:0] disk SEAGATE XS400ME70004 0004 /dev/sda /dev/sg0
[3:0:1:0] disk SEAGATE ST20000NM002D E004 /dev/sdb /dev/sg1
[3:0:2:0] disk WDC WUS721010AL5204 C980 /dev/sdc /dev/sg2
[3:0:3:0] disk SEAGATE ST20000NM002D E006 /dev/sdd /dev/sg3
[3:0:4:0] disk WDC WUS721010AL5204 C980 /dev/sde /dev/sg4
[3:0:5:0] disk SEAGATE ST20000NM002D E006 /dev/sdf /dev/sg5
[3:0:6:0] disk WDC WUS721010AL5204 C980 /dev/sdg /dev/sg6
[3:0:7:0] disk WDC WUS721010AL5204 C980 /dev/sdh /dev/sg7
[3:0:8:0] disk WDC WUS721010AL5204 C980 /dev/sdi /dev/sg8
[3:0:9:0] disk WDC WUS721010AL5204 C980 /dev/sdj /dev/sg9
[3:0:10:0] disk WDC WUS721010AL5204 C980 /dev/sdk /dev/sg10
[3:0:11:0] disk SEAGATE XS400ME70004 0004 /dev/sdl /dev/sg11
[3:0:12:0] disk WDC WUS721010AL5204 C980 /dev/sdm /dev/sg12
[3:0:13:0] disk WDC WUS721010AL5204 C980 /dev/sdn /dev/sg13
[3:0:14:0] disk WDC WUS721010AL5204 C980 /dev/sdo /dev/sg14
[3:0:15:0] disk WDC WUS721010AL5204 C980 /dev/sdp /dev/sg15
[3:0:16:0] enclosu BROADCOM VirtualSES 03 - /dev/sg16
[4:0:0:0] cd/dvd AMI Virtual CDROM0 1.00 /dev/sr1 /dev/sg18
Script:
nano /root/usr/local/bin/identify-disk.sh
Inhalt
#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<USAGE
Usage:
identify-disk [--on|--off|--blink SECONDS] /dev/sdX|sdX|sdXn
Beispiele:
identify-disk --on /dev/sdf
identify-disk --off sdg
identify-disk --blink 15 sdg8 # Partition ok, wird zu sdg normalisiert
USAGE
}
MODE="on"; BLINK_SECS=0
[[ $# -lt 1 ]] && { usage; exit 1; }
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--on) MODE="on"; shift ;;
--off) MODE="off"; shift ;;
--blink) MODE="blink"; BLINK_SECS="${2:-}"; [[ -z "$BLINK_SECS" ]] && { echo "Fehlende Sekunden bei --blink"; exit 1; }; shift 2 ;;
-h|--help) usage; exit 0 ;;
*) DISK="$1"; shift ;;
esac
done
command -v lsscsi >/dev/null || { echo "lsscsi fehlt"; exit 1; }
command -v sg_ses >/dev/null || { echo "sg3-utils (sg_ses) fehlt"; exit 1; }
# /dev/ Präfix + Partitionen weg (sdg8 -> sdg)
[[ "$DISK" =~ ^sd ]] && DISK="/dev/$DISK"
BASE="$(basename "$DISK")"
BASE_NOPART="${BASE%%[0-9]*}" # strip trailing digits
DISK="/dev/$BASE_NOPART"
[[ -e "$DISK" ]] || { echo "Gerät nicht gefunden: $DISK"; exit 1; }
# Zeile in lsscsi finden – robust: /dev/sdX als eigenes Feld, nicht am Zeilenende
LINE="$(lsscsi -g | awk -v d="$DISK" '$0 ~ ("[[:space:]]" d "[[:space:]]"){print; exit}')"
if [[ -z "$LINE" ]]; then
# Fallback (manche lsscsi-Formate): prüfe explizit das Blockdev-Feld
LINE="$(lsscsi -g | awk -v d="$DISK" '{if ($(NF-1)==d) {print; exit}}')"
fi
[[ -n "$LINE" ]] || { echo "Konnte $DISK nicht in lsscsi -g finden."; exit 1; }
# H:B:T:L extrahieren
if [[ "$LINE" =~ \[([0-9]+):([0-9]+):([0-9]+):([0-9]+)\] ]]; then
HOST="${BASH_REMATCH[1]}"; BUS="${BASH_REMATCH[2]}"; TARGET="${BASH_REMATCH[3]}"; LUN="${BASH_REMATCH[4]}"
else
echo "Konnte SCSI-Adresse nicht parsen."; exit 1
fi
# Passendes SES (enclosure) auf gleichem Host:Bus
SES_LINE="$(lsscsi -g | awk -v h="$HOST" -v b="$BUS" '$2=="enclosu" && $1 ~ ("\\["h":"b":"){print; exit}')"
[[ -n "$SES_LINE" ]] || { echo "Kein SES/Enclosure auf ${HOST}:${BUS} gefunden (HW-RAID? Nutze Hersteller-CLI)."; exit 1; }
SES_DEV="$(echo "$SES_LINE" | awk '{print $NF}')"
[[ -e "$SES_DEV" ]] || { echo "SES-Gerät existiert nicht: $SES_DEV"; exit 1; }
case "$MODE" in
on) sg_ses --index="$TARGET" --set=ident "$SES_DEV"; echo "Identify-LED an: Slot $TARGET ($DISK) über $SES_DEV";;
off) sg_ses --index="$TARGET" --clear=ident "$SES_DEV"; echo "Identify-LED aus: Slot $TARGET ($DISK) über $SES_DEV";;
blink) sg_ses --index="$TARGET" --set=ident "$SES_DEV"; echo "LED an für $BLINK_SECS s: Slot $TARGET ($DISK)"; sleep "$BLINK_SECS"; sg_ses --index="$TARGET" --clear=ident "$SES_DEV"; echo "LED aus.";;
esac
Ausführbar machen
chmod +x /root/usr/local/bin/identify-disk.sh
Hilfe/Bedienung
Usage:
identify-disk [--on|--off|--blink SECONDS] /dev/sdX|sdX|sdXn
Beispiele:
identify-disk --on /dev/sdf
identify-disk --off sdg
identify-disk --blink 15 sdg8 # Partition ok, wird zu sdg normalisiert
Alte Laufwerke entfernen:
Sobald alte Laufwerke entfernt werden, bleiben Sie tot in der Liste.
Erst Laufwerk entfernen. Dann neu einschieben.
Das machen wir wieder mit einem script
nano /usr/local/bin/scsi-hotswap
Inhalt
#!/usr/bin/env bash
set -euo pipefail
if [[ $# -ne 1 ]]; then
echo "Usage: $0 /dev/sdX"
exit 1
fi
DISK="$1"
# Normalisieren: Partitionen abschneiden, /dev/ hinzufügen falls nötig
[[ "$DISK" =~ ^sd ]] && DISK="/dev/$DISK"
BASE_NOPART="${DISK%%[0-9]*}"
DISK="$BASE_NOPART"
if [[ ! -b "$DISK" ]]; then
echo "Fehler: Gerät $DISK existiert nicht oder ist kein Blockdevice."
exit 1
fi
# lsscsi muss installiert sein
command -v lsscsi >/dev/null || { echo "Bitte installiere lsscsi (apt install lsscsi)"; exit 1; }
# Host:Bus:Target:LUN ermitteln
LINE="$(lsscsi -g | awk -v d="$DISK" '{if ($(NF-1)==d) {print; exit}}')"
if [[ -z "$LINE" ]]; then
echo "Konnte $DISK nicht in lsscsi -g finden."
exit 1
fi
if [[ "$LINE" =~ \[([0-9]+):([0-9]+):([0-9]+):([0-9]+)\] ]]; then
HOST="${BASH_REMATCH[1]}"
BUS="${BASH_REMATCH[2]}"
TARGET="${BASH_REMATCH[3]}"
LUN="${BASH_REMATCH[4]}"
else
echo "Konnte SCSI-Adresse nicht parsen."
exit 1
fi
echo ">>> Entferne $DISK (SCSI $HOST:$BUS:$TARGET:$LUN)"
echo 1 | sudo tee /sys/class/scsi_device/${HOST}:${BUS}:${TARGET}:${LUN}/device/delete >/dev/null
echo ">>> Bitte neue Festplatte in Slot ${TARGET} einsetzen..."
read -p "Weiter mit ENTER, wenn neue Platte steckt."
echo ">>> Rescanne Slot $TARGET..."
echo "${HOST} ${BUS} ${TARGET}" | sudo tee /sys/class/scsi_host/host${HOST}/scan >/dev/null
echo ">>> Neue Device-Liste:"
lsscsi -g | grep "\[${HOST}:${BUS}:${TARGET}:"
Nun noch ausführbar machen
chmod +x /usr/local/bin/scsi-hotswap