Назад | Перейти на главную страницу

Как узнать, какое блочное устройство соответствует какому физическому диску

У меня есть сервер с программным RAID 1, два sata-диска с горячей заменой. Один жесткий диск начал показывать ошибки, думаю удалить и заменить его, проблема только в том, что я понятия не имею, какое из двух соответствует какому устройству. И я не могу выключить сервер, чтобы узнать.

У меня есть / dev / sda и / dev / sdb, / dev / sda - неудачный. Подумал о том, чтобы сделать что-то в этом роде

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

затем каким-то образом остановите / приостановите привод с помощью программного обеспечения для настройки и попробуйте прослушать, какой из двух остановился, но это не сработает в шумной серверной среде. На панелях привода нет светодиодов.

Спасибо за любые идеи!

Вы видите S / N на дисках? Используйте hdparm -i / dev / sda, чтобы получить S / N и идентифицировать диск.

Самый простой способ проверить, какой именно диск, если у вас есть правильные светодиоды, - это просто

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

И посмотрите, на каком из них надежно горит свет.

A и B в sda и sdb должны отображаться на каналы 1 и 2 (или 0 и 1) для ваших дисков. Если система настроена так, что они помечены, вы можете сказать это так. Я не знаю, как устроены ваши приводы с проводкой; Они пронумерованы мелким шрифтом на материнской плате, чтобы вы могли сказать, какой порт к какому диску.

Я предположил, что вы могли бы использовать свою идею, чтобы затем попробовать почувствовать вибрацию от приводов, если есть достаточно места для вас, чтобы почувствовать приводы. Опять же, зависит от того, как они установлены.

Ну, в прошлом году я написал сценарий, который переводит это ataX.YY материал к имени устройства, найденный здесь:
Ошибки Linux ATA: перевод на имя устройства?

Однако мой личный С тех пор версия этого скрипта претерпела значительные улучшения (теперь будет даже отображаться контроллер, к которому подключен жесткий диск, например), поэтому мне потребовалась всего одна минута, чтобы сократить его для ваших особых целей:

#!/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)."

НОТА: Вспомогательная функция float_eval (), хотя и не является абсолютно необходимой, может избежать ошибочных вычислений в миллиардах или триллионах байтов (ГБ или ТБ, не путать с ГиБ / ТиБ). Такие вычисления, особенно в диапазоне ТБ, могут все больше и больше отклоняться от своих точных значений при вычислении размера блока в (длинном) целом числе. Основная причина (или причина) в том, что мы никогда не использовали десятичная точка с емкостью жестких дисков до достижения отметки в 1 ТБ емкости жестких дисков несколько лет назад, поэтому целочисленные вычисления могут больше не подходить во всех случаях.

Кроме того, мне было бы интересно, чтобы кто-нибудь улучшил этот скрипт, чтобы он показывал серийные номера, когда есть два диска с одинаковым идентификатором производителя. К сожалению, мне не удалось найти эту информацию в /sys/block/* до сих пор.