¿Cómo decirle a Linux Kernel> 3.0 que ignore por completo un disco que falla?

23

Tengo un ordenador portátil de Samsung (Cronos s7) con un disco duro SATA en el autobús ata:1, que se detecta como /dev/sda, un SSD 8G en ata:2, /dev/sdby varios otros dispositivos en el resto de la interfaz SATA.

El problema es que el disco SSD es

  • soldado a la placa principal (inamovible)
  • reventado (solo da errores de E / S para cualquier operación)
  • no aparece en la BIOS (probablemente porque está roto)

Ahora este disco:

  • retrasa el arranque de tres a cinco minutos tratando de sondear el disco que falla, lo cual es molesto;
  • pero lo más molesto es que el sistema no se suspende por /dev/sdbfallar.

Tenga en cuenta que puedo vivir con el retraso en el arranque --- lo que me preocupa es la reanudación / suspensión.


Entonces la pregunta es: ¿puedo decirle al kernel que evite incluso probar el dispositivo en ata: 2?

En el kernel anterior (<3.0), cuando aún podía profundizar un poco en la fuente, había un parámetro de línea de comandos del estilo hdb=ignoreque habría funcionado.

He intentado todos los trucos propuestos a continuación con udevy los libata:forceparámetros del kernel, sin éxito. Específicamente, lo siguiente no funciona:

  1. Agregar a uno de los siguientes /etc/udev/rules.d/un archivo (en ejecución temprana como 00-ignoredisk.ruleso tarde como 99-ignoredisk.ruleso en ambos lugares)

    SUBSYSTEMS=="scsi", DRIVERS=="sd", ATTRS{rev}=="SSD ", ATTRS{model}=="SanDisk iSSD P4 ", ENV{UDISKS_IGNORE}="1" 
    

    ni

    KERNEL=="sdb", ENV{UDISKS_IGNORE}="1"
    

    ni muchas soluciones intermedias, esto hace que el disco no sea accesible después del arranque, pero se prueba en el arranque y aún se verifica al suspenderlo, lo que hace que la suspensión falle.

  2. La edición de los archivos del sistema /lib/udev/rules.d/60-persistent-storage.rules(y udisks, udisks2) cambiando

    KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md", GOTO="persistent_storage_end"
    

    a

    KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md|sdb*", GOTO="persistent_storage_end"
    

    De nuevo, esto tiene algún efecto, enmascarando el disco desde el espacio de usuario, pero el disco aún es visible para el núcleo.

  3. Arrancar con todas las combinaciones posibles (bueno, muchas de ellas) de los libata:forceparámetros (que se encuentran, por ejemplo, aquí ) para desactivar DMA, velocidad más baja o lo que sea sobre el disco que falla --- no funciona. Se utiliza el parámetro, pero el disco todavía está sondeado y falla.

    Completamente udevadm info -a -n /dev/sdbpegado a http://paste.ubuntu.com/6186145/

    smartctl -i /dev/sdb -T permissive da:

    root@samsung-romano:/home/romano# smartctl -i /dev/sdb -T permissive
    smartctl 5.43 2012-06-30 r3573 [x86_64-linux-3.8.0-31-generic] (local build)
    Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net
    
    Vendor:               /1:0:0:0
    Product:              
    User Capacity:        600,332,565,813,390,450 bytes [600 PB]
    Logical block size:   774843950 bytes
    >> Terminate command early due to bad response to IEC mode page
    

    lo cual es claramente incorrecto Sin embargo:

    root@samsung-romano:/home/romano# fdisk -b 512 -C 970 -H 256 -S 63 /dev/sdb
    fdisk: unable to read /dev/sdb: Input/output error
    

(Datos del SSD de http://ubuntuforums.org/showthread.php?t=1935699&p=11739579#post11739579 ).

Rmano
fuente
Lo sentimos si esto es demasiado obvio, pero dado que no ha incluido en su pregunta: ¿se ha asegurado de que el nombre del dispositivo o UUID no figure en la lista /etc/fstab? Porque el retraso en el arranque podría ser causado antes por el kernel o udev, que parece ser el caso, pero también más tarde por fsck, al leer fstab.
Teresa e Junior
Sí, no se menciona / dev / sdb (o sus particiones) en los archivos del sistema. El retraso es incluso antes de que se inicie init ... está en kthread (porque el arranque continúa en paralelo), pero está en un nivel más fundamental. Pero realmente el retraso de arranque es el menor problema: si pudiera ignorar el disco durante la suspensión / reanudación para que la suspensión funcione, estaré contento. (gracias de cualquier manera).
Rmano
¿Estás usando en initrd? Si es así, ¿de quién?
hildred
@hildred: estoy usando kernel de stock e initramfs de Ubuntu 13.04. Puedo deshabilitar AHCI o todos los SATA allí, pero entonces mi sistema está muerto --- no hay discos en absoluto.
Rmano
Debian (y Umbutu) compilan el subsistema ata como módulo. ¿Has intentado configurar los parámetros para el módulo cuando lo carga el initrd?
hildred

Respuestas:

26

libatano tiene una opción sin sonda en absoluto; esa era una opción IDE heredada ...

Pero fui y escribí un parche de kernel para ti que lo implementa. Debería aplicarse a muchos núcleos muy fácilmente (la línea anterior se agregó 2013-05-21 / v3.10-rc1 *, pero se puede aplicar de forma segura manualmente sin esa línea).

Actualización El parche ahora está en sentido ascendente (al menos en 3.12.7 kernel estable). Está en el núcleo estándar distribuido con Ubuntu 14.04 (que se basa en 3.13-estable).

Una vez instalado el parche, agregue

 libata.force=2.00:disable

a los parámetros de arranque del kernel ocultarán el disco del kernel de Linux. Verifique que el número sea correcto; buscar el nombre del dispositivo puede ayudar (obviamente, debe verificar los mensajes del núcleo antes de agregar los parámetros de arranque):

(0)samsung-romano:~% dmesg | grep iSSD
[    1.493279] ata2.00: ATA-8: SanDisk iSSD P4 8GB, SSD 9.14, max UDMA/133
[    1.494236] scsi 1:0:0:0: Direct-Access     ATA      SanDisk iSSD P4  SSD  PQ: 0 ANSI: 5

El número importante es el ata2.00de la primera línea de arriba.

robbat2
fuente
Muchas gracias. Intentaré verificarlo tan pronto como pueda recordar cómo compilar e instalar un núcleo en mi Ubuntu. Desafortunadamente, tendré una semana muy compleja ...
Rmano
1
+1 Es claramente mejor que el truco que publiqué. Espero que se haga oficial.
Emmanuel
1
Ok, probé el parche. Funciona. Si necesita empujarlo hacia arriba, puedo agregar mi Probado por: al parche --- tiene mi correo electrónico verdadero en mi perfil. Lo instalé siguiendo (con peculiaridades) las instrucciones en wiki.ubuntu.com/Kernel/BuildYourOwnKernel .
Rmano
1
@ illuminÉ --- acabo de editar la respuesta en ese sentido --- espera a que se apruebe.
Rmano
1
¡Otra razón para AMAR EL GENTOO!
eyoung100
15

Los problemas de hardware tienen solución de hardware físico. ¿Consideró desoldar o cortar la fuente de alimentación de la unidad?

EDITAR: Ok, si esa no es una opción, la gente está usando esto antes para conectar en caliente un disco duro. Podrías usar eso para deshabilitar tu disco.

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

Tenga en cuenta que cualquier otro proceso puede forzar un escaneo del bus SATA y luego hacer que regrese. Intenta hacerlo justo antes de hibernar el portátil.

Editado por OP: funcionó . Agregué el siguiente archivo:

-rwxr-xr-x 1 root root 204 Dec  6 16:03 99_delete_sdb

con contenido:

#!/bin/sh

# Tell grub that resume was successful

case "$1" in
    suspend|hibernate)
        if [ -d /sys/block/sdb ]; then
            echo Deleting device sdb 
            echo 1 > /sys/block/sdb/device/delete       
        fi
        ;;
esac

... y ahora el sistema se suspende (y reanuda) correctamente.

Emmanuel
fuente
1
Si tan solo fuera cierto. Ni siquiera puedo decir qué chip (o chips) son la unidad SSD, la mayoría no están marcados. Y desactivar un chip no es seguro, ¿qué pasa con los pines de tres estados no controlados? Abrí la computadora portátil con la esperanza de que la unidad SSD estuviera conectada en algún tipo de placa secundaria. Sin suerte. (Y, además, la mayor parte de la dificultad para escribir controladores de kernel es trabajar con hw mal diseñado).
Rmano
@Rmano ¿Cómo se realiza el truco de "borrar"?
Emmanuel
IT WORKS --- Puedo suspender después de que el truco de "eliminar". Muchas gracias. (Todavía retrasa el arranque, pero bueno, no es un problema).
Rmano
Muchas gracias por recordarlo delete.
Michael Shigorin
3

BIOS

¿Este dispositivo no aparece de ninguna manera a través de su BIOS?

Muchas veces, los HDD se configuran en modo "automático", lo reviso y me aseguro de que estos dispositivos estén deshabilitados e incluso hasta el punto de habilitar explícitamente solo un HDD y deshabilitar todo lo demás.

Opciones de arranque del kernel

Muchas veces puede deshabilitar la detección automática de varios subsistemas mediante el kernel de arranque de Linux mediante el uso de diferentes opciones de arranque que pueden pasarse a él como conmutadores.

La mayoría, si no todas, las opciones se enumeran aquí:

Linux en un libro de cáscara de nuez

Es posible que desee leer el libro de O'Reilly, Kernel de Linux en una cáscara de nuez , específicamente, Capítulo 7: Personalizar un kernel .

Este libro está disponible de forma gratuita por su autor, Greg Kroah-Hartman, en su sitio web personal. También se puede descargar todo el libro.

slm
fuente
No, el BIOS no tiene ningún rastro de este disco; Puedo ver el HDD y el DVD y nada más. Antes de fallar, en Windows (ahora ya no hay ventanas en el sistema) se utilizó como caché de aceleración para el disco principal. Traté de configurar el modo AHCI en heredado, apagado, sí o automático (para todos los discos) pero eso no cambió nada o (para apagado) simplemente hizo que el sistema no se iniciara.
Rmano
El otro método que he usado en el pasado es cuando el Kernel se está iniciando para indicarlo a través de Grub (opciones de arranque del kernel) noide=..... Hay muchas otras opciones que puede proporcionar al núcleo de arranque para deshabilitar la detección automática de hardware.
slm
el disco es SATA (scsi), no IDE. Y las hdb=noprobeopciones no se han transferido a scsi (creo que se eliminó alrededor de 2.6.x), por lo que no existe (tan pronto como sé) una sdb=noprobeu ata:2=noprobeopción. He leído (casi) todo el kernel-parameters.txtarchivo en la fuente del núcleo y no puedo encontrar el parámetro correcto. Si conoces a alguien, por favor dilo en una respuesta --- Estaré realmente agradecido.
Rmano
@Rmano: tendré que cavar más para encontrarlo, recuerdo varias opciones relacionadas con la detección de HDD y bus, pero no fuera de mi cabeza.
slm
@Rmano - ¿qué pasa con la opción:libata.dma=
SLM
0

sudo hdparm -I /dev/sdXForma de Linux para verificar el bloqueo: (con X = a..z; debe saber qué dispositivo es su unidad, por supuesto). Al final de la (grande) de salida, debe ser capaz de leer en los últimos 10 líneas: *not* locked.

error de sintaxis
fuente