Como saber qual dispositivo de bloco mapeia para qual unidade física

3

Eu tenho um servidor com software RAID 1, dois discos SATA hot-swap. Um disco rígido começou a mostrar erros, estou pensando em removê-lo e substituí-lo, apenas o problema é que não tenho idéia de qual dos dois corresponde a quais dispositivos. E não consigo desligar o servidor para descobrir.

Eu tenho / dev / sda e / dev / sdb, / dev / sda é a falha. Pensei em fazer algo ao longo das linhas

# mdadm --manage /dev/md0 --remove /dev/sda1

em seguida, pare / suspenda a unidade usando o software de ajuste e tente ouvir qual dos dois parou, mas isso não funcionará em um ambiente de servidor barulhento. Os painéis do drive não possuem LEDs.

Obrigado por qualquer ideia!

    
por Karolis T. 10.09.2009 / 18:55

4 respostas

1

O A e o B em sda e sdb devem ser mapeados para os canais 1 e 2 (ou 0 e 1) para suas unidades. Se o sistema está configurado para que eles sejam rotulados, você pode dizer isso. Não sei como seus discos são estruturados com a fiação; Eu os tive numerados com letras pequenas na placa-mãe para que você possa dizer qual porta está indo para qual unidade.

Suponho que você poderia usar sua ideia para tentar sentir a vibração das unidades também, se houver espaço suficiente para você sentir as pulsões. Mais uma vez depende da maneira como eles são montados.

    
por 10.09.2009 / 19:03
3

Você pode ver S / N nos discos? Use hdparm -i / dev / sda para obter S / N e identificar o disco.

    
por 10.09.2009 / 19:04
1

Uma maneira fácil de verificar qual é a unidade que, se você tiver LEDs de unidade adequados, é apenas

dd if=/dev/sda of=/dev/null

E veja qual deles tem uma luz que está solidamente presa.

    
por 10.09.2009 / 19:23
0

Bem, no ano passado eu escrevi um script que traduz esse ataX.YY stuff para um nome de dispositivo, encontrado aqui:
Erros do Linux ATA: Traduzindo para um nome de dispositivo?

No entanto, minha versão pessoal deste script recebeu melhorias importantes desde então (agora mostrará até mesmo o controlador ao qual o HDD está conectado, por exemplo), então foi apenas um minuto trabalho para mim para reduzi-lo para seus propósitos especiais:

#!/bin/bash
#
# LICENSE: GPL

function float_eval()
{
    local st=0
    local r=0.0
    if [[ $# -gt 0 ]]; then
       r=$(echo "scale=5; $*" | bc -q 2>/dev/null)
       st=$?
       if [[ $st -eq 0  &&  -z "$r" ]]; then st=1; fi
    fi
echo $r
return $st
}

_heahdcnt=0
_badhdcnt=0
_usbcnt=0

echo -e "\nRetrieving assignments from /sys/block ..."
while read Path ID
do
   sizeBlk=$(< /sys/block/$ID/size)

   if grep -q '/usb[0-9]*/' <<< $Path; then
     echo -ne "\n\n(Device /dev/$ID is not an ATA device, but a USB device [e. g. a pen drive])"
      ((_usbcnt++))
   else

     if [ ! -f /sys/block/$ID/device/model ]; then
        echo -e "Error: Couldn't determine model of /dev/$ID\!\n"
     else 
        echo -ne "\n\n/dev/$ID is a $(< /sys/block/$ID/device/model)"

       # when we get a 0, something went wrong; so in this case, skip any calculations
       if [ $sizeBlk -gt 0 ]; then

         sizegib=$((sizeBlk >> 21))

        # nb: since current bc cannot do bit shift operations without external modules 
        # loaded at runtime, we will resort to a temp variable which contains the
        # shifted value

         sizeBlkLsh9=$((sizeBlk << 9))
         sizegb=$(float_eval "$sizeBlkLsh9 / 1000000000")

         # use formatted output, don't mix literals and arithmetic in one string (as with echo)

         LC_NUMERIC=C printf " (%4.0f GiB / %4.0f GB )" $sizegib $sizegb

         ((_heahdcnt++))
       else
         ((_badhdcnt++))
       fi
    fi

    [[ $sizeBlk -eq 0 ]] && echo "WARNING: There appears to be some trouble with device \
 /dev/$ID. You should check this more thoroughly."
  fi

# process substitution
done < <(ls -l /sys/block/sd* \
\
| sed -e 's^.*-> \.\.^/sys^' \
      -e 's^/host[0-9]\{1,2\}/target\([0-9]\{1,2\}\(:[0-9]\)\{2,3\}/\)\{1,2\}block/^ ^')

echo -e "\n\nScanning of hardware completed.\n"

echo "You have $[$_heahdcnt + $_badhdcnt + $_usbcnt] devices connected:"
echo -n "$_heahdcnt healthy HDD(s), $_badhdcnt bad HDD(s)"
[[ $_usbcnt -gt 0 ]] && echo " and $_usbcnt USB device(s)."

NOTA: A função auxiliar float_eval (), embora não seja absolutamente necessária, pode evitar cálculos errôneos em bilhões ou trilhões de bytes (GB e TB, não confundir com GiB / TiB). Especialmente na faixa de TB, esses cálculos podem desviar-se cada vez mais de seus valores precisos quando calculados a partir do tamanho do bloco em inteiro (longo). A principal razão (ou causa) é que nunca usamos um ponto decimal com as capacidades do HDD antes de atingir a marca de 1 TB nas capacidades do HDD há alguns anos, portanto os cálculos de números inteiros podem não ser mais apropriados em todos os casos .

Além disso, eu estaria interessado em alguém melhorar este script para que ele mostre números de série quando houver duas unidades com identificação de fabricante idêntica. Infelizmente, até agora não consegui encontrar essa informação em /sys/block/* .

    
por 26.10.2013 / 01:12