Direkt zum Hauptinhalt

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/identify-disk.sh

Inhalt

#!/usr/bin/env bash
set -euo pipefail

usage() {
  cat <<USAGE
Usage:
  identify-disk [--on|--off|--blink SECONDS] /dev/sdXsdX|sdX|sdXn

Beispiele:
  identify-disk --on  /dev/sdf
  # LED an
  identify-disk --off /dev/sdf       # LED aussdg
  identify-disk --blink 15 /dev/sdfsdg8   # LEDPartition 15sok, an,wird dannzu aussdg Hinweis:
- Findet Slot (Target) und Enclosure (SES) automatisch über lsscsi.
- Funktioniert auf SAS-Backplanes mit SES/SGPIO. Bei HW-RAID ohne SES
  ggf. herstellerspezifisches CLI (storcli/perccli/ssacli/arcconf) nötig.normalisiert
USAGE
}

# Defaults
MODE="on"; BLINK_SECS=0

# Args parsen
if
[[ $# -lt 1 ]]; then&& { usage; exit 1; fi}

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 "FehlenderFehlende SekundenwertSekunden bei --blink"; exit 1; }; shift 2 ;;
    -h|--help) usage; exit 0 ;;
    *) DISK="$1"; shift ;;
  esac
done

# Binärdateien prüfen
command -v lsscsi >/dev/null || { echo "lsscsi fehlt. Bitte installieren."fehlt"; exit 1; }
command -v sg_ses  >/dev/null || { echo "sg3-utils (sg_ses) fehlt. Bitte installieren."fehlt"; exit 1; }

# /dev/sdX normalisierenPräfix if+ [[Partitionen weg (sdg8 -z> "${DISK:-}" ]]; then usage; exit 1; fi
ifsdg)
[[ "$DISK" =~ ^sd[a-z]+[0-9]*$sd ]]; then&& DISK="/dev/$DISK"
fiBASE="$(basename if"$DISK")"
BASE_NOPART="${BASE%%[0-9]*}"       # strip trailing digits
DISK="/dev/$BASE_NOPART"
[[ ! -e "$DISK" ]]; then|| { echo "Gerät nicht gefunden: $DISK"; exit 11; fi}

# 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 11; fi}

# 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]}"   # das ist dein Slot/Schacht-Index; LUN="${BASH_REMATCH[4]}"
else
  echo "Konnte SCSI-Adresse nicht parsen."; exit 1
fi

# Passendes SES-EnclosureSES (enclosure) auf gleichem Host:Bus finden
# Beispiel-Zeile: [3:0:16:0]   enclosu BROADCOM VirtualSES ... /dev/sg16
SES_LINE="$(lsscsi -g | awk -v h="$HOST" -v b="$BUS" '
  $2=="enclosu" && $1 ~ ("\\["h":"b":"){print; {print}
exit}' | head -n1))"

if
[[ -zn "$SES_LINE" ]]; then|| { echo "Kein SES/Enclosure auf Host:Bus ${HOST}:${BUS} gefunden."
  echo "Dein Controller spricht evtl. kein SES direktgefunden (HW-RAID?) – nutzeNutze Hersteller-CLI.CLI)."; exit 11; fi

# SES /dev/sgX extrahieren (letztes Feld ist /dev/sgN)}
SES_DEV="$(echo "$SES_LINE" | awk '{print $NF}')"
if [[ ! -e "$SES_DEV" ]]; then|| { echo "SES-Gerät existiert nicht: $SES_DEV"; exit 11; fi

# Aktion ausführen}

case "$MODE" in
  on)    sg_ses --index="$TARGET" --set=ident   "$SES_DEV"; echo "Identify-LED anan: (Slot $TARGET ($DISK) über $SES_DEV) – für $DISK"
    SES_DEV";;
  off)   sg_ses --index="$TARGET" --clear=ident "$SES_DEV"; echo "Identify-LED ausaus: (Slot $TARGET ($DISK) über $SES_DEV) – für $DISK"
    SES_DEV";;
  blink) sg_ses --index="$TARGET" --set=ident   "$SES_DEV"; echo "Identify-LED an (Slot $TARGET) – blinkefür $BLINK_SECS s…s: Slot $TARGET ($DISK)"; sleep "$BLINK_SECS"; sg_ses --index="$TARGET" --clear=ident "$SES_DEV"; echo "Identify-LED wieder aus."
    ;;
  *)
    usage; exit 1 ;;
esac

Ausführbar machen

chmod +x /root/identify-disk.sh