¿Cómo hago para que Linux reconozca una nueva unidad SATA / dev / sda que cambié en caliente sin reiniciar?


41

El intercambio en caliente de una unidad SATA / dev / sda fallida funcionó bien, pero cuando fui a cambiar una nueva unidad, no se reconoció:

[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

Intenté un par de cosas para hacer que el servidor encuentre el nuevo / dev / sda, como rescan-scsi-bus.sh pero no funcionaron:

[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

Terminé reiniciando el servidor. / dev / sda fue reconocido, arreglé el RAID de software, y todo está bien ahora. Pero para la próxima vez, ¿cómo puedo hacer que Linux reconozca una nueva unidad SATA que he intercambiado en caliente sin reiniciar?

El sistema operativo en cuestión es RHEL5.3:

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

El disco duro es un Seagate Barracuda ES.2 SATA 3.0-Gb / s 500-GB, modelo ST3500320NS.

Aquí está la salida de 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)

Actualización : en quizás una docena de casos, nos hemos visto obligados a reiniciar los servidores porque el intercambio en caliente no ha "funcionado". Gracias por las respuestas para mirar más en el controlador SATA. He incluido la salida lspci para el sistema problemático anterior (nombre de host: fs-2). Todavía podría usar algo de ayuda para comprender qué es exactamente lo que no es compatible con el hardware en términos de intercambio en caliente para ese sistema. Avíseme qué otra salida, además de lspci, podría ser útil.

La buena noticia es que el intercambio en caliente "simplemente funcionó" hoy en uno de nuestros servidores (nombre de host: www-1), lo cual es muy raro para nosotros. Aquí está la salida de 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)

Verificaría el estado de su controlador SATA en la versión del kernel de Linux que está utilizando. Podría ser un error o simplemente no admitido
Nathan

¿Era 0 el número de BUS o 1?

3
Era el bus 0. / sys / class / scsi_host contiene host0 a host5. dmesg muestra ata1 a ata6. ata1 corresponde a host0, ata2 corresponde a host1, etc.
Philip Durbin el

Respuestas:


43

Si su controlador SATA admite el intercambio en caliente, "debería funcionar (tm)".

Para forzar una nueva exploración en un BUS SCSI (cada puerto SATA se muestra como un BUS SCSI) y buscar nuevas unidades, utilizará:

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

En lo anterior, <n> es el número de BUS.


Lo siento, no hay alegría; ejecutar ese comando solo activa el mismo reescaneo automático que se activa cuando conecto inicialmente la unidad. Gracias, sin embargo!
hakamadare

Es bastante posible que se deba realizar alguna configuración en el controlador de incursión para que pueda ver el disco. En mi caso, fue necesario volver a agregar el nuevo disco a la incursión.
MikeKulls

Obtengo permiso denegado incluso cuando uso sudoy cuando cambio al usuario root.
Aaron Franke

En mi sistema que arrancó desde un SSD NVMe, esto funcionó para detectar un SATA HD recién enchufado. Solía powertopdejar que se apagaran más cosas, así que tal vez el puerto SATA en el que enchufé la unidad estaba completamente dormido. (El sistema se ha conectado una unidad óptica SATA y detectada en el arranque, pero probablemente fue el sueño, también.) Como otros sugieren, para evitar restablecer el enlace SATA para unidades activas, averiguar qué hostids ya están en uso y no se scanlos , solo el que conectó una nueva unidad. (O cualquiera sin usar si no conoce la numeración.)
Peter Cordes

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

55
Tenga cuidado con esto: dmesg demostró que restableció por completo todos mis enlaces SATA. Posiblemente valga la pena probarlo antes de ejecutarlo en producción y perder toneladas de escrituras.
Ivan Kozik

12

Cuando una unidad ha fallado en algunas circunstancias, Linux no se dará cuenta de que realmente la ha sacado físicamente de la matriz. Si tiene ese problema (como lo hice esta mañana) puede hacer lo siguiente:

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

Por ejemplo, en mi caso / dev / sda había fallado y no quería reiniciar el servidor, así que hice:

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

Después de hacer eso, la nueva unidad (que ya se había agregado físicamente) fue inmediatamente visible.

Si no es visible en este punto, también puede hacer esto para forzar un nuevo escaneo:

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

Ese "- - -" son comodines para canal, id y LUN respectivamente, por lo que puede restringir el escaneo a algún subconjunto si lo desea especificando números en su lugar.

Antes de comenzar, también podría:

readlink /sys/block/<devnode>

Lo que le mostrará la ruta con el número de host correcto para registrar / proc / scsi / scsi para la desaparición después de la eliminación.


7

¿Qué tal esto (parece funcionar en Ubuntu):

sudo partprobe


También puede necesitar 'yum install parted'
Antonio

partedFTW ... usted debe conocerla bien, además de los sospechosos habituales, como fdisk, gdisk, cgdisk, testdisk.
sjas

6

No puedo creer que nadie haya mencionado AHCI todavía ... su controlador SATA tiene que estar en modo AHCI para habilitar el intercambio en caliente. Verifique esto mirando el controlador que está utilizando:

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

Mira cómo dice "ahci" allí.

Si no es así, habilítelo en su BIOS. Además, algunos BIOS, especialmente en servidores o UEFI tienen una configuración "Hot Swap = habilitado / deshabilitado" por disco que también debe habilitar si existe.


1
Eres mi nuevo mejor amigo: D
allyourcode el

2

He aquí por qué necesitaba reiniciar la computadora ...

Acabo de cambiar mi / dev / sdc. He usado scsiadd -r 3 0 0 para apagar el disco viejo antes de sacarlo. Luego, después de instalar el nuevo disco, el nuevo disco no apareció como / dev / sdc sino como / dev / sdd. Después de reiniciar, el disco volvería a aparecer como / dev / sdc nuevamente.

Parece que hotswap funciona Bien, puede ser que / dev / sd * ya no sea el mismo.

¿Podría ser esta una respuesta a tu problema?


Hmmm, bueno, rescan-scsi-bus.sh ya funciona en / proc / scsi / scsi, tal como parece scsiadd. De todos modos, estamos probando un proveedor de servidores diferente, por lo que tal vez el intercambio en caliente "simplemente funcione" para nosotros en el futuro.
Philip Durbin

44
Sí, no puedes evitar eso, como puedo ver. Esta es la razón por la que usa la etiqueta de disco o UUID, y monta su fs por eso (manualmente o en fstab), puede configurarlo y luego no cambia. El único truco es hacer que su gestor de arranque se instale en la nueva unidad, pero aún así funciona cuando se reinicia, aunque a partir de algunos experimentos rápidos con GRUB (estaba reemplazando sda en una máquina con sd [a, b, c, d] y software) raid1 para toda la parte del sistema de fs).
Ronald Pottol

1
Nunca debe usar los dispositivos / dev / sd * en archivos de configuración como fstab. Nunca debes asumir que los nombres son siempre los mismos. En su lugar, debe usar la sintaxis UUID = ... (sin comillas), como puede ver en man fstab. Para averiguar el UUID, use el comando blkid. (alternativamente, puede preferir la etiqueta o id; también vea / dev / disk / by- *)
Peter

1

Mi DVD en mi máquina Fedora 16 está conectado a una interfaz SATA. Estaba cerrado y no se abriría ni cerraría. Ejecutar partprobe como root hizo que mi cdrom / DVD volviera a funcionar. Creo que ayudará en otras máquinas donde tengo el problema ocasional de intercambio en caliente. ¡Gracias!


1

El controlador SAS Fusion-MPT que tiene es un controlador RAID de gama baja. Si no lo está utilizando para RAID, aún puede proporcionar una capa inútil de obstrucción / abstracción.

Es posible que deba tocar el controlador RAID con mpt-status o lsiutil para que realmente escanee el bus.

http://hwraid.le-vert.net/wiki/LSIFusionMPT tiene una buena cantidad de documentación, pero no puedo decir que la haya verificado.


1

En algunos casos, es posible que sea necesario habilitar el intercambio en caliente en el BIOS de la placa base y / o el controlador SATA. Esto depende completamente de la marca y el modelo de ambos, pero si tiene controladores SATA integrados que deberían ser compatibles con hotswap, entonces vale la pena revisar el BIOS de la placa base. Las tarjetas SATA pueden o no tener su propia configuración de BIOS, muchas tarjetas de gama baja no, pero las tarjetas de grado de servidor generalmente sí.

Si recuerdo correctamente, he necesitado esto con varias placas base Gigabyte, y tal vez algunas otras marcas. Lo necesitaba para que funcionara una bandeja SATA de intercambio en caliente; con la función desactivada, la eliminación de la unidad no causó problemas, pero una nueva unidad no se registraría hasta el reinicio. Al habilitar la configuración funcionó como se esperaba, las unidades que se colocaron en la bandeja se pusieron en marcha de inmediato y estuvieron disponibles para el sistema operativo.


Acabo de revisar una máquina interna que sé que tenía esto; está ejecutando una placa base Gigabyte Z77X-UD3H con controladores integrados Marvell 88SE9172 e Intel Serie 7 / C210
STW

1

Sé que esta pregunta es antigua, pero tuve cierto éxito que no vi reportado en otra parte. Tuve problemas similares en una Dell Precision 380 hoy. Finalmente lo puse a trabajar haciendo una combinación de lo siguiente:

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

ADVERTENCIA: Esto también puede interrumpir otros dispositivos ATA en el sistema. Si ha montado sistemas de archivos en esos dispositivos, es probable que eso termine mal. A mi situación no le importaba, pero a la tuya sí.

Exactamente cuál de los comandos anteriores son necesarios y en qué orden, es desconocido para mí en este momento. Algunos comandos pueden necesitar repetirse. Si tuviera que adivinar, diría que haga en el orden que se muestra arriba, luego otra exploración scsi_host nuevamente al final. Hice bastantes más en mis exploraciones.

El primer comando (scsi_host scan) le dice a la capa intermedia SCSI que escanee todos los buses en busca de dispositivos nuevos / modificados. El segundo comando intenta restablecer el objetivo SCSI (dispositivo de disco). Los dos últimos están trabajando con el controlador para el controlador AHCI.

Encontré los artículos en cuestión principalmente mediante un examen detallado y una audaz experimentación.

Puede hacer coincidir los nodos scsi_device con la marca y el modelo del dispositivo (usando grep para imprimir los nombres de los archivos delante del contenido):

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

El primer dígito de la ID del dispositivo SCSI debe ser el número de scsi_host. Luego puede hacer coincidir los nodos scsi_host con los nodos de sus dispositivos con:

ls -l /sys/class/scsi_host

Sospecho que nunca tendré la oportunidad de refinar más, por lo que quería compartir esta información con la esperanza de acercar a otros. Si obtengo más información, editaré esta respuesta para reflexionar.

Espero que esto ayude.


0

Para que hotplug funcione, debe tener cargado el módulo acpiphp.

[root@example ~]# modprobe acpiphp

obviamente, si desea que esto funcione en el arranque, tendrá que configurarlo para que se cargue en el momento del arranque; una forma es crear / editar /etc/rc.modules (que es llamado por rc.sysinit) y agregar la línea:

modprobe acpiphp

recuerde si crea este archivo en chmod + x, como se llama de esa manera.


Interesante. Nunca había oído hablar de acpiphp. Gracias. Parece que significa Configuración avanzada e interfaz de alimentación PCI Hot Plug. PCI es la interconexión de componentes periféricos, por supuesto.
Philip Durbin

2
acpiphp es para conexión en caliente PCI, es decir, agregar y quitar tarjetas PCI en caliente . Algunos sistemas caros admiten esto. Y también muchos hipervisores.
derobert
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.