it-swarm.cn

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

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

[[email protected] ~]# 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 ,但它们不起作用:

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

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

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

[[email protected] ~]# 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输出:

[[email protected] ~]# 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)

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

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

[[email protected] ~]# 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)
44
Philip Durbin

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

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

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

在上面,<n>是BUS编号。

45
user1797
echo "- - -" >/sys/class/scsi_Host/host<n>/scan
       ^ ^
        \_\_______ note spaces between the dashes.
19
Noah

当驱动器在某些情况下发生故障时,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中检入删除后是否消失。

14
karora

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

须藤partprobe

8
user59282

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

[email protected]:~ # 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

[email protected]:~ # readlink /sys/devices/pci0000:00/0000:00:11.0/driver
../../../bus/pci/drivers/ahci

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

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

看看那里怎么说“ ahci”。

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

6
Peter

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

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

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

这可以解决您的问题吗?

2
Peter

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

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

http://hwraid.le-vert.net/wiki/LSIFusionMPT 有很多文档,但是我不能说我已经验证过。

1
aij

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

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

1
STW

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

1
Stuart Edge

我知道这个问题很旧,但是我取得了一些成功,但没有其他地方有报道。今天在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

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

希望这可以帮助。

1
Ben Scott

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

[[email protected] ~]# modprobe acpiphp

显然,如果要在引导时工作,则必须配置在引导时加载的一种方法-创建/编辑/etc/rc.modules(由rc.sysinit调用)并添加以下行:

modprobe acpiphp

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

0
nox