如何使Linux识别我热插拔而无需重启的新SATA / dev / sda驱动器?


41

热插拔出故障的SATA / dev / sda驱动器工作正常,但是当我换入新驱动器时,无法识别:

[root@fs-2 ~]# tail -18 /var/log/messages
May 5 16:54:35 fs-2 kernel: ata1: exception Emask 0x10 SAct 0x0 SErr 0x50000 action 0xe frozen
May 5 16:54:35 fs-2 kernel: ata1: SError: { PHYRdyChg CommWake }
May 5 16:54:40 fs-2 kernel: ata1: link is slow to respond, please be patient (ready=0)
May 5 16:54:45 fs-2 kernel: ata1: device not ready (errno=-16), forcing hardreset
May 5 16:54:45 fs-2 kernel: ata1: soft resetting link
May 5 16:54:50 fs-2 kernel: ata1: link is slow to respond, please be patient (ready=0)
May 5 16:54:55 fs-2 kernel: ata1: SRST failed (errno=-16)
May 5 16:54:55 fs-2 kernel: ata1: soft resetting link
May 5 16:55:00 fs-2 kernel: ata1: link is slow to respond, please be patient (ready=0)
May 5 16:55:05 fs-2 kernel: ata1: SRST failed (errno=-16)
May 5 16:55:05 fs-2 kernel: ata1: soft resetting link
May 5 16:55:10 fs-2 kernel: ata1: link is slow to respond, please be patient (ready=0)
May 5 16:55:40 fs-2 kernel: ata1: SRST failed (errno=-16)
May 5 16:55:40 fs-2 kernel: ata1: limiting SATA link speed to 1.5 Gbps
May 5 16:55:40 fs-2 kernel: ata1: soft resetting link
May 5 16:55:45 fs-2 kernel: ata1: SRST failed (errno=-16)
May 5 16:55:45 fs-2 kernel: ata1: reset failed, giving up
May 5 16:55:45 fs-2 kernel: ata1: EH complete

我尝试了几件事使服务器找到新的/ dev / sda,例如rescan-scsi-bus.sh,但是它们没有用:

[root@fs-2 ~]# echo "---" > /sys/class/scsi_host/host0/scan
-bash: echo: write error: Invalid argument
[root@fs-2 ~]#
[root@fs-2 ~]# /root/rescan-scsi-bus.sh -l
[snip]
0 new device(s) found.
0 device(s) removed.
[root@fs-2 ~]#
[root@fs-2 ~]# ls /dev/sda
ls: /dev/sda: No such file or directory

我最终重新启动了服务器。/ dev / sda被识别,我修复了软件RAID,现在一切都很好。但是对于下一次,如何使Linux能够识别我热插拔的新SATA驱动器而无需重启?

有问题的操作系统是RHEL5.3:

[root@fs-2 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.3 (Tikanga)

硬盘驱动器是Seagate Barracuda ES.2 SATA 3.0-Gb / s 500-GB,型号ST3500320NS。

这是lscpi输出:

[root@fs-2 ~]# lspci
00:00.0 RAM memory: nVidia Corporation MCP55 Memory Controller (rev a2)
00:01.0 ISA bridge: nVidia Corporation MCP55 LPC Bridge (rev a3)
00:01.1 SMBus: nVidia Corporation MCP55 SMBus (rev a3)
00:02.0 USB Controller: nVidia Corporation MCP55 USB Controller (rev a1)
00:02.1 USB Controller: nVidia Corporation MCP55 USB Controller (rev a2)
00:04.0 IDE interface: nVidia Corporation MCP55 IDE (rev a1)
00:05.0 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:05.1 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:05.2 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:06.0 PCI bridge: nVidia Corporation MCP55 PCI bridge (rev a2)
00:08.0 Bridge: nVidia Corporation MCP55 Ethernet (rev a3)
00:09.0 Bridge: nVidia Corporation MCP55 Ethernet (rev a3)
00:0a.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0b.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0c.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0d.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0e.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0f.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:18.0 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Miscellaneous Control
00:19.0 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration
00:19.1 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Address Map
00:19.2 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] DRAM Controller
00:19.3 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Miscellaneous Control
03:00.0 VGA compatible controller: Matrox Graphics, Inc. MGA G200e [Pilot] ServerEngines (SEP1) (rev 02)
04:00.0 PCI bridge: NEC Corporation uPD720400 PCI Express - PCI/PCI-X Bridge (rev 06)
04:00.1 PCI bridge: NEC Corporation uPD720400 PCI Express - PCI/PCI-X Bridge (rev 06)

更新:在大约十二种情况下,由于热插拔尚未“奏效”,我们被迫重新启动服务器。感谢您提供更多有关SATA控制器的答案。我已经为上述有问题的系统提供了lspci输出(主机名:fs-2)。我仍然可以使用一些帮助来了解在该系统的热插拔方面,硬件方面究竟不支持什么。请让我知道lspci以外的其他输出可能有用。

好消息是,今天热插拔在我们的其中一台服务器(主机名:www-1)上“工作正常”,这对我们来说非常罕见。这是lspci输出:

[root@www-1 ~]# lspci
00:00.0 RAM memory: nVidia Corporation MCP55 Memory Controller (rev a2)
00:01.0 ISA bridge: nVidia Corporation MCP55 LPC Bridge (rev a3)
00:01.1 SMBus: nVidia Corporation MCP55 SMBus (rev a3)
00:02.0 USB Controller: nVidia Corporation MCP55 USB Controller (rev a1)
00:02.1 USB Controller: nVidia Corporation MCP55 USB Controller (rev a2)
00:04.0 IDE interface: nVidia Corporation MCP55 IDE (rev a1)
00:05.0 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:05.1 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:05.2 IDE interface: nVidia Corporation MCP55 SATA Controller (rev a3)
00:06.0 PCI bridge: nVidia Corporation MCP55 PCI bridge (rev a2)
00:08.0 Bridge: nVidia Corporation MCP55 Ethernet (rev a3)
00:09.0 Bridge: nVidia Corporation MCP55 Ethernet (rev a3)
00:0b.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0c.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:0f.0 PCI bridge: nVidia Corporation MCP55 PCI Express bridge (rev a3)
00:18.0 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] HyperTransport Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Miscellaneous Control
00:18.4 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Link Control
00:19.0 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] HyperTransport Configuration
00:19.1 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Address Map
00:19.2 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] DRAM Controller
00:19.3 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Miscellaneous Control
00:19.4 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, Sempron] Link Control
03:00.0 VGA compatible controller: Matrox Graphics, Inc. MGA G200e [Pilot] ServerEngines (SEP1) (rev 02)
04:00.0 PCI bridge: NEC Corporation uPD720400 PCI Express - PCI/PCI-X Bridge (rev 06)
04:00.1 PCI bridge: NEC Corporation uPD720400 PCI Express - PCI/PCI-X Bridge (rev 06)
09:00.0 SCSI storage controller: LSI Logic / Symbios Logic SAS1064ET PCI-Express Fusion-MPT SAS (rev 04)

我会在您使用的Linux内核版本中检查SATA控制器的状态。可能是错误,也可能是不支持的平原
内森

总线号是0还是1?

3
它是总线0。/sys/class/scsi_host包含host0到host5。dmesg显示ata1到ata6。ATA1对应host0,ATA2对应主机1等
菲利普·德宾

Answers:


43

如果您的SATA控制器支持热插拔,则它应该“正常工作”。

要在SCSI BUS(每个SATA端口显示为SCSI BUS)上强制重新扫描并查找新驱动器,您将使用:

echo "0 0 0" >/sys/class/scsi_host/host<n>/scan

在上面,<n>是总线编号。


对不起,没有喜悦;运行该命令只会触发与我最初插入驱动器时触发的相同的自动重新扫描。不过谢谢!
hakamadare

很可能需要在RAID控制器上进行一些配置才能使其看到磁盘。就我而言,有必要将新磁盘重新添加到团队中。
MikeKulls 2015年

即使使用sudo以及切换到root用户,我也会获得拒绝权限。
亚伦·弗兰克

在从NVMe SSD引导的系统上,这可以检测到新插入的SATA HD。我powertop过去经常关闭电源,所以也许我将驱动器插入的SATA端口已完全处于睡眠状态。(该系统具有SATA光盘驱动器连接,并在开机检测,但它可能是睡着了。)至于其他建议,以避免重置SATA连结为活动驱动器,弄清楚哪些hostID已经被使用,不要scan那些,只有您插入新驱动器的那个。(或者任何不使用的号码,如果您不知道编号的话。)
Peter Cordes

18
echo "- - -" >/sys/class/scsi_host/host<n>/scan
       ^ ^
        \_\_______ note spaces between the dashes.

5
请注意这一点:dmesg显示它很难重置我的所有SATA链接。可能值得在投入生产之前进行测试,并避免大量写入操作。
伊万·科兹克

12

当驱动器在某些情况下发生故障时,Linux不会意识到您实际上已经从阵列中物理地将其拉出。如果您有此问题(如我今天上午所做的那样),则可以执行以下操作:

echo 1 > /sys/block/<devnode>/device/delete

例如,在我的情况下,/ dev / sda失败了,并且我不想重启服务器,所以我这样做了:

echo 1 > /sys/block/sda/device/delete

完成之后,新的驱动器(实际上已经在物理上添加了)立即可见。

如果此时不可见,也可以执行此操作以强制重新扫描:

echo "- – -" > /sys/class/scsi_host/host<n>/scan

“---”分别是通道,id和LUN的通配符,因此,如果需要,可以通过指定数字来限制扫描到某些子集。

在开始之前,您还可以:

readlink /sys/block/<devnode>

它将为您显示带有正确主机号的路径,以便在删除后检查/ proc / scsi / scsi是否消失。


7

怎么样(似乎可以在Ubuntu中工作):

须藤partprobe


您可能还需要“百胜安装分手”
安东尼

partedFTW ...你应该知道它好,除了通常的嫌疑人喜欢fdiskgdiskcgdisktestdisk
sjas 2015年

6

我不敢相信还没有人提到AHCI ...您的SATA控制器必须处于AHCI模式才能启用热插拔。通过查看正在使用的驱动程序来检查此问题:

root@peter:~ # find /sys -name sdk
/sys/devices/pci0000:00/0000:00:11.0/ata5/host4/target4:0:0/4:0:0:0/block    /sdk
/sys/block/sdk
/sys/class/block/sdk

root@peter:~ # readlink /sys/devices/pci0000:00/0000:00:11.0/driver
../../../bus/pci/drivers/ahci

root@peter:~ # lspci -k | less
[... big long output... search for ahci or your pci address, or use the awk below ...]

root@peter:~ # lspci -k | awk '$1 == "00:11.0" {x=1}; x && /in use/ {print $0; exit}'
    Kernel driver in use: ahci

看看那里怎么说“ ahci”。

如果不是,则只需在您的BIOS中启用它即可。此外,某些BIOS(尤其是在服务器或UEFI上)的每个磁盘都有“热交换=启用/禁用”设置,如果存在,也应启用该设置。


1
您是我的新好朋友:D
allyourcode'Mar

2

这就是为什么我需要重新启动计算机的原因...

我只是热交换了我的/ dev / sdc。我已使用scsiadd -r 3 0 0将旧磁盘关闭,然后再将其拉出。然后,在安装新磁盘之后,新磁盘不会显示为/ dev / sdc,而是显示为/ dev / sdd。重新引导后,磁盘将再次显示为/ dev / sdc。

因此看来hotswap可以正常工作,可能只是/ dev / sd *不再相同。

这可以解决您的问题吗?


嗯,好吧,rescan-scsi-bus.sh已经在/ proc / scsi / scsi上运行了,就像scsiadd看起来一样。无论如何,我们都在尝试其他服务器供应商,因此也许将来热插拔将对我们“起作用”。
菲利普·德宾

4
是的,就我所知,你无法解决这个问题。这就是为什么您使用磁盘标签或UUID,并通过它(手动或在fstab中)挂载fs的原因,可以对其进行设置,然后它不会改变。唯一的技巧是让您的引导加载程序安装到新驱动器上,但在重新引导后仍可以工作,尽管通过GRUB进行了一些快速实验(我正在用sd [a,b,c,d]和软件替换计算机上的sda fs的所有系统部分的raid1)。
罗纳德·帕托

1
绝对不要在配置文件(例如fstab)中使用/ dev / sd *设备。您永远不应假设名称始终相同。相反,您应该使用UUID = ...语法(不带引号),例如在man fstab中看到的那样。要查找UUID,请使用blkid命令。(或者,您可能更喜欢使用标签或ID;另请参阅/ dev / disk / by- *)
彼得

1

我在Fedora 16机器上的DVD已连接到SATA接口。它已被锁定,无法打开或关闭。以root身份运行partprobe,使我的cdrom / DVD再次工作。我认为这对偶尔出现热插拔问题的花药机会有所帮助。谢谢!


1

您拥有的Fusion-MPT SAS控制器是低端RAID控制器。如果您不将其用于RAID,则它可能仍会提供无用的阻塞/抽象层。

您可能需要使用mpt-status或lsiutil戳入RAID控制器,以使其实际扫描总线。

http://hwraid.le-vert.net/wiki/LSIFusionMPT有大量的文档,但是我不能说我已经对其进行了验证。


1

在某些情况下,可能需要在主板和/或SATA控制器的BIOS上启用热交换。这完全取决于双方的品牌和型号,但如果你有板载SATA控制器应该支持热插拔那么它的价值通过主板BIOS梳理。SATA卡可能具有也可能没有其自己的BIOS设置,许多低端卡没有,但是服务器级卡通常具有。

如果我没记错的话,我需要大量的技嘉主板,也许还有其他一些品牌。我需要它才能使热插拔SATA托盘正常工作。禁用此功能后,卸下驱动器不会引起问题,但是新驱动器要等到重启后才能注册。要使设置按预期方式工作,放置在托盘中的驱动器会立即旋转,并可供OS使用。


刚刚检查了一个我知道有这个机器的内部机器;它运行的是技嘉Z77X-UD3H主板,带有板载Marvell 88SE9172和Intel 7系列/ C210控制器
STW

1

我知道这个问题很旧,但是我取得了一些成功,但没有其他地方有报道。今天在Dell Precision 380上也遇到了类似的麻烦。最终通过以下几种组合使其起作用:

echo "- - -" > /sys/class/scsi_host/host2/scan
echo 1 > /sys/class/scsi_device/2:0:0:0/device/reset
echo 1 > /sys/devices/pci0000:00/0000:00:1f.2/rescan
echo 1 > /sys/devices/pci0000:00/0000:00:1f.2/reset

警告:这也可能会破坏系统上的其他ATA设备。如果您在这些开发平台上挂载了文件系统,那么结局可能会很糟糕。我的情况不在乎,但您可能会。

目前,我尚不知道上述命令中的确切命令是什么,以及顺序是什么。某些命令可能需要重复。如果必须猜测,可以按照上面显示的顺序进行操作,然后在最后再次进行另一个scsi_host扫描。我在探索中做了很多。

第一个命令(scsi_host scan)告诉SCSI中间层扫描所有总线以查找新的/更改的设备。第二个命令尝试重置SCSI目标(磁盘设备)。最后两个正在使用AHCI控制器本身的驱动程序。

我主要通过详细的检查和大胆的实验找到了有问题的项目。

您可以将scsi_device节点与设备品牌和型号匹配(使用grep在内容前面打印文件名):

grep . /sys/class/scsi_device/*/device/model

SCSI设备ID的第一位应该是scsi_host号。然后,可以使用以下命令将scsi_host节点与其设备节点匹配:

ls -l /sys/class/scsi_host

我怀疑我永远不会有机会进一步完善,因此我想分享此信息,以期使其他人更紧密。如果确实获得更多信息,我将编辑此答案以进行反映。

希望这可以帮助。


0

为了使热插拔工作,您必须加载acpiphp模块。

[root@example ~]# modprobe acpiphp

显然,如果您希望在启动时执行此操作,则必须将其配置为在启动时加载-一种方法是创建/编辑/etc/rc.modules(由rc.sysinit调用)并添加以下行:

modprobe acpiphp

请记住,如果您创建此文件以chmod + x,则以这种方式调用它。


有趣。我从未听说过acpiphp。谢谢。它似乎代表高级配置和电源接口PCI热插拔。当然,PCI是外围组件互连。
菲利普·德宾

2
acpiphp用于PCI热插拔,即热添加和卸下PCI卡。一些昂贵的系统支持这一点。还有许多管理程序。
derobert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.