У меня есть сервер с программным 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/*
до сих пор.