如何知道哪个块设备映射到哪个物理驱动器

如何知道哪个块设备映射到哪个物理驱动器

我有一台配备软件 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/*

相关内容