Wie kann Linux ein neues SATA / dev / sda-Laufwerk erkennen, das ich ohne Neustart im laufenden Betrieb ausgetauscht habe?


41

Das Auslagern eines fehlerhaften SATA / dev / sda-Laufwerks im laufenden Betrieb funktionierte einwandfrei, aber als ich ein neues Laufwerk einlegte, wurde es nicht erkannt:

[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

Ich habe ein paar Dinge versucht, damit der Server das neue / dev / sda findet, wie rescan-scsi-bus.sh, aber sie haben nicht funktioniert:

[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

Am Ende wurde der Server neu gestartet. / dev / sda wurde erkannt, ich habe das Software-RAID repariert und jetzt ist alles in Ordnung. Aber wie kann ich Linux das nächste Mal dazu bringen, ein neues SATA-Laufwerk zu erkennen, das ich ohne Neustart im laufenden Betrieb ausgetauscht habe?

Das fragliche Betriebssystem ist RHEL5.3:

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

Bei der Festplatte handelt es sich um eine Seagate Barracuda ES.2 SATA 3.0-Gb / s 500-GB, Modell ST3500320NS.

Hier ist die lscpi-Ausgabe:

[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)

Update : In vielleicht einem Dutzend Fällen mussten wir Server neu starten, weil Hot-Swap nicht "nur funktioniert" hat. Vielen Dank für die Antworten, um mehr über den SATA-Controller zu erfahren. Ich habe die Lspci-Ausgabe für das problematische System oben aufgenommen (Hostname: fs-2). Ich könnte immer noch Hilfe gebrauchen, um zu verstehen, was in Bezug auf den Hot-Swap für dieses System in Bezug auf Hardware nicht genau unterstützt wird. Bitte lassen Sie mich wissen, welche andere Ausgabe neben lspci nützlich sein könnte.

Die gute Nachricht ist, dass Hot-Swap heute auf einem unserer Server "funktioniert" hat (Hostname: www-1), was für uns sehr selten ist. Hier ist die lspci-Ausgabe:

[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)

Ich überprüfe den Status Ihres SATA-Controllers in der Version des von Ihnen verwendeten Linux-Kernels. Es könnte ein Fehler sein oder einfach nicht unterstützt
Nathan

War 0 die BUS-Nummer oder 1?

3
Es war Bus 0. / sys / class / scsi_host enthält host0 bis host5. dmesg zeigt ata1 bis ata6. ata1 entspricht host0, ata2 entspricht host1 usw.
Philip Durbin

Antworten:


43

Wenn Ihr SATA-Controller Hot-Swap unterstützt, sollte er "nur funktionieren (tm)".

Um einen erneuten Scan auf einem SCSI-Bus zu erzwingen (jeder SATA-Port wird als SCSI-Bus angezeigt) und neue Laufwerke zu finden, verwenden Sie:

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

In der obigen Abbildung ist <n> die BUS-Nummer.


Entschuldigung, keine Freude; Wenn Sie diesen Befehl ausführen, wird nur derselbe automatische Neu-Scan ausgelöst, der beim erstmaligen Anschließen des Laufwerks ausgelöst wird. Trotzdem danke!
Hakamadare

Möglicherweise muss auf dem RAID-Controller eine Konfiguration vorgenommen werden, damit die Festplatte angezeigt wird. In meinem Fall war es notwendig, die neue Festplatte wieder in den Schlachtzug aufzunehmen.
MikeKulls

Ich bekomme die Erlaubnis verweigert, auch wenn ich sudoden root-Benutzer benutze und zum root-Benutzer wechsle.
Aaron Franke

Auf meinem System, das von einer NVMe-SSD gebootet wurde, funktionierte dies, um eine neu angeschlossene SATA-Festplatte zu erkennen. Ich verwende powertop, um mehr Dinge herunterzufahren, also war der SATA-Port, an den ich das Laufwerk angeschlossen habe, möglicherweise voll im Schlaf. (Das System ist ein optisches SATA - Laufwerk angeschlossen und beim Booten erkannt, aber es war wahrscheinlich schläft, auch.) Wie andere vorschlagen, zu vermeiden , dass die SATA - Verbindung für aktive Laufwerke zurückzusetzen, herauszufinden , welche hostIDs sind bereits im Einsatz und nicht scandiejenigen , , nur der, an den Sie ein neues Laufwerk angeschlossen haben. (Oder eine unbenutzte, wenn Sie die Nummerierung nicht kennen.)
Peter Cordes

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

5
Gehen Sie dabei vorsichtig vor: dmesg hat gezeigt, dass alle meine SATA-Verbindungen durch einen Hard-Reset zurückgesetzt wurden. Möglicherweise lohnt es sich zu testen, bevor Sie es in der Produktion ausführen und Tonnen von Schreibvorgängen verlieren.
Ivan Kozik

12

Wenn ein Laufwerk unter bestimmten Umständen ausgefallen ist, merkt Linux nicht, dass Sie es tatsächlich physisch aus dem Array gezogen haben. Wenn Sie dieses Problem haben (wie ich es heute Morgen getan habe), können Sie Folgendes tun:

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

Beispiel: In meinem Fall war / dev / sda fehlgeschlagen und ich wollte den Server nicht neu starten.

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

Nachdem ich das getan hatte, war das neue Laufwerk (das tatsächlich bereits physisch hinzugefügt worden war) sofort sichtbar.

Wenn es an dieser Stelle nicht sichtbar ist, können Sie auch einen erneuten Scan erzwingen:

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

Das "- - -" ist ein Platzhalter für Kanal, ID und LUN. Sie können den Scan also auf eine bestimmte Untermenge beschränken, indem Sie stattdessen Zahlen angeben.

Bevor Sie beginnen, können Sie auch:

readlink /sys/block/<devnode>

Welches zeigt Ihnen den Pfad mit der richtigen Host-Nummer, um / proc / scsi / scsi nach dem Entfernen auf Verschwinden zu überprüfen.


7

Wie wäre es damit (scheint in Ubuntu zu funktionieren):

sudo partprobe


Möglicherweise müssen Sie auch "yum install parted"
Antonio

partedFTW ... Sie sollten es auch wissen , neben den üblichen Verdächtigen wie fdisk, gdisk, cgdisk, testdisk.
So

6

Ich kann nicht glauben, dass noch niemand AHCI erwähnt hat ... Ihr SATA-Controller muss sich im AHCI-Modus befinden, um Hot-Swap zu ermöglichen. Überprüfen Sie dies, indem Sie sich den Treiber ansehen, den Sie verwenden:

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

Sehen Sie, wie dort "ahci" steht.

Wenn dies nicht der Fall ist, aktivieren Sie es einfach in Ihrem BIOS. Außerdem haben einige BIOS-Dateien, insbesondere auf Servern oder UEFI, eine "Hot Swap = enabled / disabled" -Einstellung pro Festplatte, die Sie auch aktivieren sollten, wenn sie vorhanden sind.


1
Du bist mein neuer bester Freund: D
allyourcode

2

Hier ist, warum ich den Computer neu starten musste ...

Ich habe gerade mein / dev / sdc ausgetauscht. Ich habe scsiadd -r 3 0 0 verwendet, um die alte Festplatte auszuschalten, bevor ich sie herausgezogen habe. Nach der Installation der neuen Festplatte wurde die neue Festplatte nicht als / dev / sdc, sondern als / dev / sdd angezeigt. Nach einem Neustart würde die Festplatte wieder als / dev / sdc angezeigt.

Es sieht also so aus, als ob Hotswap funktioniert. Ok, es kann sein, dass / dev / sd * nicht mehr dasselbe ist.

Könnte dies eine Antwort auf Ihr Problem sein?


Hmmm, nun, rescan-scsi-bus.sh funktioniert bereits auf / proc / scsi / scsi, so wie es scheint. Wir versuchen es ohnehin mit einem anderen Server-Anbieter, sodass Hot-Swap möglicherweise in Zukunft für uns "funktioniert".
Philip Durbin

4
Ja, daran kommt man nicht vorbei, soviel ich weiß. Aus diesem Grund verwenden Sie die Datenträgerbezeichnung oder UUID und hängen Ihre fs damit ein (manuell oder in fstab), Sie können es festlegen, und es ändert sich dann nicht. Der einzige Trick ist, dass Ihr Bootloader auf dem neuen Laufwerk installiert wird, aber beim Neustart immer noch funktioniert, obwohl einige schnelle Experimente mit GRUB (ich habe sda ​​auf einem Computer mit sd [a, b, c, d] und Software ersetzt) raid1 für den gesamten Systemteil der fs).
Ronald Pottol

1
Sie sollten die Geräte / dev / sd * niemals in Konfigurationsdateien wie fstab verwenden. Sie sollten niemals annehmen, dass die Namen immer gleich sind. Verwenden Sie stattdessen die Syntax UUID = ... (ohne Anführungszeichen), wie Sie sie in man fstab sehen. Verwenden Sie den Befehl blkid, um die UUID herauszufinden. (Alternativ können Sie auch das Label oder die ID bevorzugen; siehe auch / dev / disk / by- *)
Peter

1

Meine DVD auf meinem Fedora 16-Computer ist an eine SATA-Schnittstelle angeschlossen. Es war verschlossen und ließ sich nicht öffnen oder schließen. Wenn ich partprobe als root laufen lasse, funktioniert meine CD-ROM / DVD wieder. Ich gehe davon aus, dass dies auf einem anderen Computer hilfreich sein wird, auf dem gelegentlich ein Hot-Swap-Problem auftritt. Vielen Dank!


1

Der von Ihnen verwendete Fusion-MPT SAS-Controller ist ein Low-End-RAID-Controller. Wenn Sie es nicht für RAID verwenden, bietet es möglicherweise immer noch eine nicht hilfreiche Ebene der Behinderung / Abstraktion.

Möglicherweise müssen Sie den RAID-Controller mit mpt-status oder lsiutil anstupsen, damit er den Bus tatsächlich scannt.

http://hwraid.le-vert.net/wiki/LSIFusionMPT hat eine schöne Menge an Dokumentation, aber ich kann nicht sagen, dass ich es überprüft habe.


1

In einigen Fällen muss Hot-Swap möglicherweise im BIOS des Motherboards und / oder des SATA-Controllers aktiviert werden. Dies hängt vollständig von der Marke und dem Modell beider Geräte ab. Wenn Sie jedoch integrierte SATA-Controller haben, die Hotswap unterstützen sollen , lohnt es sich, das Motherboard-BIOS zu durchsuchen. SATA-Karten verfügen möglicherweise über eigene BIOS-Einstellungen, viele Karten der unteren Preisklasse jedoch normalerweise nicht.

Wenn ich mich richtig erinnere, habe ich das mit einer Reihe von Gigabyte-Motherboards und vielleicht einigen anderen Marken benötigt. Ich brauchte es, damit ein Hot-Swap-SATA-Fach funktioniert. Wenn die Funktion deaktiviert ist, verursacht das Entfernen des Laufwerks keine Probleme, aber ein neues Laufwerk wird erst nach einem Neustart registriert. Das Aktivieren der Einstellung funktionierte wie erwartet. Laufwerke, die in der Schublade platziert wurden, wurden sofort hochgefahren und standen dem Betriebssystem zur Verfügung.


Ich habe gerade eine Maschine im Haus überprüft, von der ich weiß, dass sie diese hatte. Auf dem Gigabyte Z77X-UD3H-Motherboard mit integrierten Marvell 88SE9172- und Intel 7 Series / C210-Controllern läuft
STW

1

Ich weiß, dass diese Frage alt ist, aber ich hatte einige Erfolge, die ich anderswo nicht gesehen habe. Hatte heute ähnliche Probleme mit einem Dell Precision 380. Irgendwann funktionierte es durch eine Kombination der folgenden Aktionen:

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

WARNUNG: Dies kann auch andere ATA-Geräte im System stören. Wenn Sie Dateisysteme auf diesen Geräten eingehängt haben, wird dies wahrscheinlich schlecht enden. Meine Situation war mir egal, aber deine vielleicht.

Welche der oben genannten Befehle in welcher Reihenfolge benötigt werden, ist mir derzeit nicht bekannt. Einige Befehle müssen möglicherweise wiederholt werden. Wenn ich raten müsste, würde ich sagen, in der oben gezeigten Reihenfolge zu tun, dann scsi_host erneut am Ende. Bei meinen Erkundungen habe ich noch einige mehr unternommen.

Der erste Befehl (scsi_host scan) weist den SCSI-Midlayer an, alle Busse nach neuen / geänderten Geräten zu durchsuchen. Der zweite Befehl versucht, das SCSI-Ziel (Festplattengerät) zurückzusetzen. Die letzten beiden arbeiten mit dem Treiber für den AHCI-Controller.

Ich fand die fraglichen Gegenstände größtenteils durch ausführliche Untersuchung und kühnes Experimentieren.

Sie können scsi_device-Knoten mit Gerätehersteller und -modell abgleichen (mit grep werden die Dateinamen vor dem Inhalt gedruckt):

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

Die erste Ziffer der SCSI-Geräte-ID sollte die scsi_host-Nummer sein. Sie können dann scsi_host-Knoten mit den Knoten ihrer Geräte abgleichen:

ls -l /sys/class/scsi_host

Ich vermute, dass ich nie die Möglichkeit haben werde, mich weiter zu verfeinern. Deshalb wollte ich diese Informationen in der Hoffnung teilen, andere näher zu bringen. Wenn ich mehr Informationen bekomme, bearbeite ich diese Antwort, um sie wiederzugeben.

Hoffe das hilft.


0

Damit Hotplug funktioniert, muss das acpiphp-Modul geladen sein.

[root@example ~]# modprobe acpiphp

Wenn dies beim Booten funktionieren soll, müssen Sie dies so konfigurieren, dass es beim Booten geladen wird. Eine Möglichkeit besteht darin, / edit /etc/rc.modules (das von rc.sysinit aufgerufen wird) zu erstellen und die folgende Zeile hinzuzufügen:

modprobe acpiphp

Denken Sie daran, wenn Sie diese Datei erstellen, um sie mit chmod + x zu versehen, wie sie so heißt.


Interessant. Ich hatte noch nie von Acpiphp gehört. Vielen Dank. Es scheint für Advanced Configuration und Power Interface PCI Hot Plug zu stehen. PCI ist natürlich Peripheral Component Interconnect.
Philip Durbin

2
acpiphp ist für PCI-Hotplug, dh das Hinzufügen und Entfernen von PCI-Karten im laufenden Betrieb . Einige teure Systeme unterstützen dies. Und auch viele Hypervisoren.
Derobert
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.