“Eco 1> / sys / block / sdX / device / delete” em todos os discos, exceto na lista predeterminada

8

Eu tenho uma lista de discos scsi que preciso remover. A lista é considerada aleatória na melhor das hipóteses e muda de tempos em tempos. Quero remover tudo, exceto uma lista predefinida que eu criei. Vamos supor, por enquanto, que eu só quero manter:

/dev/sda
/dev/sdb

O comando que preciso executar é:

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

Onde X é o dispositivo a ser removido.

Eu não sou bom em scripts bash, então eu realmente não sei por onde começar.

Para recapitular para que eu não seja DV por não ser claro.

Eu preciso "ecoar 1> / sys / block / sdX / device / delete" para cada dispositivo sdX no sistema, exceto por uma lista predeterminada.

EDIT: Após a resposta abaixo, é isso que eu decidi usar. "LocalDisks.txt" deve conter linhas como "/ dev / sda"

#!/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
fonte

Respostas:

6

Aqui está uma abordagem que deve funcionar:

  • Obter a lista de sdXdispositivos a serem excluídos

    exclude=$(cut -d/ -f3 exclude.txt)
  • Itere nos /sys/block/sdXdiretórios:

    for sysfile in /sys/block/sd? ; do
  • Extraia o sdXnome desse caminho e construa o deletenome do arquivo

      dev=$(basename $sysfile)
      del=$sysfile/device/delete
  • Verifique se isso sdXestá na lista excluída:

      if [[ $exclude == *$dev* ]] ; then
        echo "Device $dev excluded"
  • Verifique se você possui permissões de gravação apropriadas no arquivo de exclusão

      elif [ ! -w $del ] ; then
        echo "$del does not exist or is not writable"
  • Faça a exclusão (na verdade não)

      else
        echo "echo 1 > $del"
      fi
  • Você Terminou!

    done
Esteira
fonte
Eu acho que isso vai dar certo. No entanto, preciso fazer um ajuste. Eu tenho tantos discos que alguns são / dev / sdXX - se eu adicionar um ponto de interrogação ao que você já possui, ele retornará apenas o / dev / sdXX e, se houver apenas um ponto de interrogação, ele retornará apenas os / dev / sdX. Faz sentido ... Como ele pode atender a ambos?
LVLAaron
2
Eu substituí o? com um *
LVLAaron
Sim, isso era a coisa certa a fazer lá. Eu não tinha pensado no que acontece se você tiver muitas unidades.
Tapete de
Tecnicamente, você me deu exatamente o que eu pedi, eu só especificado um X. :)
LVLAaron