我有一台配备软件 RAID 1 的服务器,两个热插拔 SATA 磁盘。一个硬盘开始显示错误,我正在考虑移除并更换它,唯一的问题是我不知道这两个硬盘中的哪个对应哪个设备。而且我无法关闭服务器来查找原因。
我有 /dev/sda 和 /dev/sdb,但 /dev/sda 出现故障。考虑做类似的事情
# mdadm --管理 /dev/md0 --删除 /dev/sda1
然后使用调整软件以某种方式停止/暂停驱动器,并尝试听取其中哪个停止了,但这在嘈杂的服务器环境中行不通。驱动器面板没有 LED。
感谢您的任何想法!
答案1
sda 和 sdb 中的 A 和 B 应映射到驱动器的通道 1 和 2(或 0 和 1)。如果系统设置为标记它们,您可以通过这种方式来判断。我不知道您的驱动器是如何通过布线构造的;我已经在主板上用小字体对它们进行了编号,这样您就可以知道哪个端口连接到哪个驱动器。
我认为您可以用您的想法来尝试感受驱动器的振动,如果有足够的空间让您感受驱动器的话。同样,这取决于它们的安装方式。
答案2
您能看到磁盘上的 S/N 吗?使用 hdparm -i /dev/sda 获取 S/N 并识别磁盘。
答案3
一个简单的方法来检查哪个驱动器是哪个,如果你有正确的驱动器 LED,就是
dd if=/dev/sda of=/dev/null
看看哪一个的灯牢牢地亮着。
答案4
好吧,去年我编写了一个脚本,将这些ataX.YY
东西翻译成设备名称,如下所示:
Linux ATA 错误:转换为设备名称?
然而,我的个人的从那时起,这个脚本的版本已经得到了重大增强(例如,现在甚至会显示 HDD 连接到的控制器),因此我只需花一分钟的时间就可以将其精简以满足您的特殊用途:
#!/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() 辅助函数虽然不是绝对必要的,但可以避免数十亿或数万亿字节(GB 或 TB,不要与 GiB/TiB 混淆)的错误计算。特别是在 TB 范围内,当从(长)整数的块大小计算时,此类计算可能会越来越偏离其准确值。主要原因(或原因)是我们从未使用过小数点在几年前 HDD 容量达到 1 TB 之前,整数计算可能不再适用于所有情况。
此外,我也很想知道有人能改进这个脚本,让它在两个驱动器具有相同制造商 ID 时显示序列号。不幸的是,到目前为止我还没有成功找到这些信息/sys/block/*
。