"Echo 1> / sys / block / sdX / device / delete" auf allen Festplatten mit Ausnahme der vorgegebenen Liste

8

Ich habe eine Liste von SCSI-Festplatten, die ich entfernen muss. Die Liste wird bestenfalls als zufällig angesehen und ändert sich von Zeit zu Zeit. Ich möchte alles außer einer vordefinierten Liste entfernen, die ich erstellt habe. Nehmen wir vorerst an, dass ich nur behalten möchte:

/dev/sda
/dev/sdb

Der Befehl, den ich ausführen muss, ist:

"echo 1 > /sys/block/sdX/device/delete"

Wobei X das zu entfernende Gerät ist.

Ich bin nicht gut im Bash-Scripting, daher weiß ich nicht wirklich, wo ich anfangen soll.

Um es noch einmal zusammenzufassen, ich bekomme keine DV, weil ich nicht klar bin.

Ich muss "1> / sys / block / sdX / device / delete" für jedes sdX-Gerät im System mit Ausnahme einer vorgegebenen Liste "echo".

EDIT: Nach der Antwort unten habe ich mich für diese entschieden. "LocalDisks.txt" sollte Zeilen wie "/ dev / sda" enthalten.

#!/bin/bash
exclude=$(cut -d/ -f3 LocalDisks.txt)

for sysfile in /sys/block/sd* ; do

dev=$(basename $sysfile)
del=$sysfile/device/delete

if [[ $exclude == *$dev* ]] ; then
    echo "Device $dev excluded"

elif [ ! -w $del ] ; then
    echo "$del does not exist or is not writable"

else
    echo 1 > $del
fi

done
LVLAaron
quelle

Antworten:

6

Hier ist ein Ansatz, der funktionieren sollte:

  • Rufen Sie die Liste der sdXauszuschließenden Geräte ab

    exclude=$(cut -d/ -f3 exclude.txt)
  • Durch die /sys/block/sdXVerzeichnisse iterieren :

    for sysfile in /sys/block/sd? ; do
  • Extrahieren Sie den sdXNamen aus diesem Pfad und erstellen Sie den deleteDateinamen

      dev=$(basename $sysfile)
      del=$sysfile/device/delete
  • Überprüfen Sie, ob dies sdXin der ausgeschlossenen Liste enthalten ist:

      if [[ $exclude == *$dev* ]] ; then
        echo "Device $dev excluded"
  • Überprüfen Sie, ob Sie über die entsprechenden Schreibberechtigungen für die Löschdatei verfügen

      elif [ ! -w $del ] ; then
        echo "$del does not exist or is not writable"
  • Löschen (nicht wirklich)

      else
        echo "echo 1 > $del"
      fi
  • Du bist fertig!

    done
Matte
quelle
Ich denke, dass das klappen wird. Ich muss jedoch eine Anpassung vornehmen. Ich habe so viele Festplatten, dass einige / dev / sdXX sind. Wenn ich dem bereits vorhandenen ein Fragezeichen hinzufüge, wird nur das / dev / sdXX zurückgegeben. Wenn nur ein Fragezeichen vorhanden ist, werden nur solche wie / dev / zurückgegeben. sdX. Sinnvoll ... Wie kann es beides bedienen?
LVLAaron
2
Ich habe das ersetzt? mit einem *
LVLAaron
Ja, das war das Richtige dort. Ich hatte nicht darüber nachgedacht, was passiert, wenn Sie viele Laufwerke haben.
Mat
Technisch gesehen hast du mir genau das gegeben, wonach ich gefragt habe, ich habe nur ein X angegeben. :)
LVLAaron