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 /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 /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 scriptscript. Das Script wartet solange bis wir die festplatte getauscht haben.
wenn getauscht bestätigen.

nano /usr/local/bin/scsi-hotswap.sh

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

Hilfe/Benutzung:

Usage: /usr/local/bin/scsi-hotswap.sh /dev/sdX

Ausgabe:

root@backupsrv001:~# scsi-hotswap.sh /dev/sdq
>>> Entferne /dev/sdq (SCSI 3:0:17:0)
>>> Bitte neue Festplatte in Slot 17 einsetzen...
Weiter mit ENTER, wenn neue Platte steckt.
>>> Rescanne Slot 17...
>>> Neue Device-Liste: