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/gettray.sh

Inhalt

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

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

Beispiele:
  identify-disk --on  /dev/sdf       # LED an
  identify-disk --off /dev/sdf       # LED aus
  identify-disk --blink 15 /dev/sdf  # LED 15s an, dann aus

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.
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 "Fehlender Sekundenwert 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."; exit 1; }
command -v sg_ses  >/dev/null || { echo "sg3-utils (sg_ses) fehlt. Bitte installieren."; exit 1; }

# /dev/sdX normalisieren
if [[ -z "${DISK:-}" ]]; then usage; exit 1; fi
if [[ "$DISK" =~ ^sd[a-z]+[0-9]*$ ]]; then
  DISK="/dev/$DISK"
fi
if [[ ! -e "$DISK" ]]; then
  echo "Gerät nicht gefunden: $DISK"
  exit 1
fi

# Zeile finden
LINE="$(lsscsi -g | awk -v d="$DISK" '$0 ~ (" " d "$"){print; exit}')"
if [[ -z "$LINE" ]]; then
  echo "Konnte $DISK nicht in lsscsi -g finden."
  exit 1
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-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}
' | head -n1)"

if [[ -z "$SES_LINE" ]]; then
  echo "Kein SES/Enclosure auf Host:Bus ${HOST}:${BUS} gefunden."
  echo "Dein Controller spricht evtl. kein SES direkt (HW-RAID?) – nutze Hersteller-CLI."
  exit 1
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 1
fi

# Aktion ausführen
case "$MODE" in
  on)
    sg_ses --index="$TARGET" --set=ident "$SES_DEV"
    echo "Identify-LED an (Slot $TARGET über $SES_DEV) – für $DISK"
    ;;
  off)
    sg_ses --index="$TARGET" --clear=ident "$SES_DEV"
    echo "Identify-LED aus (Slot $TARGET über $SES_DEV) – für $DISK"
    ;;
  blink)
    sg_ses --index="$TARGET" --set=ident "$SES_DEV"
    echo "Identify-LED an (Slot $TARGET) – blinke $BLINK_SECS s…"
    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/gettray.sh