我有一个软件RAID 1,两个热插拔sata磁盘的服务器。 一个硬盘驱动器开始显示错误,我正在考虑删除和replace它,唯一的问题是,我不知道哪两个设备哪个对应哪个。 而且我无法closures服务器查找。
我有/ dev / sda和/ dev / sdb,/ dev / sda是失败的。 思考如何做一些事情
#mdadm --manage / dev / md0 --remove / dev / sda1
然后以某种方式停止/暂停驱动器使用调谐软件,并尝试聆听两者中的哪一个停止,但是这不会在嘈杂的服务器环境中工作。 驱动器面板没有LED。
感谢您的任何想法!
sda和sdb中的A和B应映射到驱动器的通道1和2(或0和1)。 如果系统设置为标记,则可以这样说。 我不知道你的驱动器是如何与布线结构的; 我已经让他们在主板上用小字体编号,这样你就可以知道哪个端口正在进行什么驱动。
如果有足够的空间让你感受驱动器,我想你可以用你的想法来尝试从驱动器感受振动。 再次取决于他们的方式。
你能看到磁盘上的S / N吗? 使用hdparm -i / dev / sda获取S / N并识别磁盘。
一个简单的方法来检查哪个驱动器是哪个驱动器,如果你有正确的驱动器LED,
dd if=/dev/sda of=/dev/null
看看哪一个有坚固的光线。
那么,去年我写了一个脚本,将ataX.YY东西翻译成设备名称,在这里find:
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 [eg 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容量的小数点 ,而在几年前硬盘容量达到1TB的时候,所以整数计算可能不再适用于所有情况。
另外,如果有两个具有相同制造商ID的驱动器,我会对有人改进此脚本感兴趣,以便显示序列号。 不幸的是,到目前为止我还没有在/sys/block/*中find这个信息。