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/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