Lo hice y lo entendí

El blog de Vicente Navarro
14 oct

Disk might not be spun down properly. Update shutdown utility.

Ahora mismo estoy usando el kernel 2.6.22.6 en todos mis sistemas Linux. En uno de ellos con discos SATA de vez en cuando, al ejecutar el comando halt, me aparece este error unas décimas de segundo antes de apagar:

DISK MIGHT NOT BE SPUN DOWN PROPERLY. UPDATE SHUTDOWN UTILITY
For more info, visit http://linux-ata.org/shutdown.html

Bueno, en realidad sé exactamente lo que pone porque lo he buscado en las fuentes del kernel, porque no da tiempo a leerlo entero, sino que más bien es un rápido flash del que únicamente se queda en la mente algo así como “el disco no se ha parado bien”. El mensaje lo podemos encontrar en drivers/ata/libata-scsi.c:

/* XXX: This is for backward compatibility, will be
 * removed.  Read Documentation/feature-removal-schedule.txt
 * for more info.
 */
if ((qc->dev->flags & ATA_DFLAG_SPUNDOWN) &&
    (system_state == SYSTEM_HALT ||
     system_state == SYSTEM_POWER_OFF)) {
        static unsigned long warned = 0;

        if (!test_and_set_bit(0, &warned)) {
                ata_dev_printk(qc->dev, KERN_WARNING,
                        "DISK MIGHT NOT BE SPUN DOWN PROPERLY. "
                        "UPDATE SHUTDOWN UTILITY\n");
                ata_dev_printk(qc->dev, KERN_WARNING,
                        "For more info, visit "
                        "http://linux-ata.org/shutdown.html\n");

Como el propio mensaje indica, tenemos que acudir a: Serial ATA (SATA) shutdown info, donde podremos obtener una explicación del problema.

Antes de apagar un disco duro, tenemos que guardar lo que contiene la caché y aparcar las cabezas de lectura/escritura para que no aterricen sobre la superficie magnética, lo que podría dañarla. Es raro que tal cosa ocurra, en cualquier caso, ya que si se apaga el sistema de golpe, la controladora del disco es capaz de aparcar la cabeza sin corriente externa para evitar problemas, pero no es aconsejable en absoluto hacerlo así. Puede hacer ruidos extraños y reducir la vida del disco.

En Linux, para hacer esto, tenemos los drivers IDE/ATA de toda la vida, los que en el “make menuconfig” encontramos en:

Device Drivers → ATA/ATAPI/MFM/RLL support (CONFIG_IDE)

Este driver, aunque funciona bien, tiene muchos hacks para permitir compatibilidad hacia atrás con viejos dispositivos. Así que cuando aparecieron los discos SATA, los desarrolladores decidieron partir con una implementación limpia del estándar ATA, en principio para acoger los drivers de SATA pero en la que también se van añadiendo drivers PATA. Ese driver, en el “make menuconfig” lo encontramos en:

Device Drivers → Serial ATA (prod) and Parallel ATA (experimental) drivers (CONFIG_ATA)

y la página del proyecto es, precisamente, linux-ata.org: Serial ATA (SATA) for Linux.

Este nuevo driver trata los discos SATA como si fueran discos SCSI, tal y como leemos en la descripción de estos drivers en la ayuda del kernel:

CONFIG_ATA:

If you want to use a ATA hard disk, ATA tape drive, ATA CD-ROM or
any other ATA device under Linux, say Y and make sure that you know
the name of your ATA host adapter (the card inside your computer
that "speaks" the ATA protocol, also called ATA controller),
because you will be asked for it.

NOTE: ATA enables basic SCSI support; *however*,
'SCSI disk support', 'SCSI tape support', or
'SCSI CDROM support' may also be needed,
depending on your hardware configuration

Pues bien, en los drivers IDE de toda la vida se lanzaban los comandos FLUSH CACHE y STANDBYNOW antes de apagar el sistema. Sin embargo, el nuevo driver se basa en SCSI y en sistemas SCSI varios hosts pueden acceder a un mismo disco, por lo que aparcar sus cabezas antes de la parada del sistema puede molestar a otro host que aún esté usando ese disco. Por tanto, en el nuevo driver (<=2.6.21) el comando STANDBYNOW no es lanzado durante la parada.

El driver del kernel 2.6.22 se actualizó para que se lanzaran los comandos FLUSH CACHE y STANDBYNOW antes de: power off, suspend-to-ram y suspend-to-disk, pero desafortunadamente, la inmensa mayoría de implementaciones del comando shutdown de las diferentes distribuciones aún no son compatibles con este cambio.

Por ejemplo, hasta ahora, algunas implementaciones de shutdown lanzaban el comando STANDBYNOW explicítamente, sin cubrir casos como el sleep-to-disk.

Por tanto, la situación actual queda así:

  1. El shutdown lanza un FLUSH CACHE (no en todas las distribuciones)
  2. El shutdown lanza un STANDBYNOW y para el disco
  3. La parada del kernel comienza
  4. El driver SATA lanza un FLUSH CACHE
  5. El driver SATA lanza un STANDBYNOW (nuevo con el 2.6.22)

Primer problema: algunas distribuciones no guardan la caché del disco antes de pararlo. Segundo problema: los pasos 4 y 5 podrían arrancar de nuevo un disco ya parado.

En definitiva, es necesario actualizar el comando shutdown en todas las distribuciones, cosa que ninguna de ellas ha hecho aún.

En Debian hay un bug abierto para que modifiquen este problema: #426224 Please update shutdown to support libata drivers in newer kernels

En Ubuntu también hay un bug: #114683 New libata/scsi spindown functionality in 2.6.22 requires changes in userland shutdown(8), con interesante información en la discusión, que, curiosamente, ha sido cerrado como inválido porque “a Ubuntu no le afecta el problema” (¿no dicen los desarrolladores del driver SATA que ninguna distribución ha arreglado el problema aún?):

As discussed with the libata upstream, we don’t need to change our /sbin/reboot utility at all. The 2.6.22 kernel will notice that we have made no attempt to flush the caches or shutdown the disk, and will perform it for us.

Hace poco, también salió el tema en la bitácora del usuario chavi en Barrapunto: Aparcando el disco duro, que, entre otras cosas, nos indica que podemos encontrar los paquetes sysv-rc, sysvinit y sysvinit-utils que solucionan el problema en Debian entre los paquetes no oficiales de Roland Stigge.

:wq

Entradas relacionadas

17 Comentarios a “Disk might not be spun down properly. Update shutdown utility.”

  • Ringmaster dice:

    Me he quedado impresionado. Qué investigación, qué metódico. Muy bueno, a ver si lo arreglan pronto (aunque yo no veo el mensaje aún teniendo SATA, porque mientras se apaga veo la barra de progreso de Kubuntu, supongo).

  • @Ringmaster ¡Muchas gracias! Bueno, ya ves que se supone que en Ubuntu no pasa ¿?¿? :-O

  • cruzki dice:

    En gentoo sospecho que si que esta arreglado esto. Uso libata desde el kernel 2.6.18 y nunca me ha aparecido el mensaje ese (usando tanto ordenadores con discos ata como en ordenadores con discos serial ata)

  • @cruzki En una rápida búsqueda encuentro estos parches para el kernel 2.6.21 de Gentoo que se supone que atajan el problema:

    [PATCH] libata: implement libata.spindown_compat
    [PATCH] libata: fix shutdown warning message printing

    Sin embargo, he de decir que yo no suelo usar el kernel de la distribución, sino el oficial directamente descargado desde kernel.org. Es posible que algunas distribuciones le metan mano directamente al kernel como hace Gentoo en lugar de arreglar el shutdown para hacerlo compatible con el kernel oficial.

    Otro sitio al que he llegado es:

    Mandriva Linux Archives: Re: [Kernel-Discuss] linux 2.6.22 & shutdown

    donde dicen:

    It looks like we are not affected, since we don’t run SHUTDOWN for libata disks. Gentoo uses the same shutdown binary from SysVinit, and here’s their conclusion:
    http://www.mail-archive.com/linux-ide@vger.kernel.org/msg06670.html

  • Alex dice:

    Un articulo muy interesante y muy bien detallado. Me ha gustado, aunque no tenga discos ATA de momento.

  • Alberto dice:

    Hola. Excelente trabajo, metódico y muy detallado. Llevo años con Debian a nivel de usuario avanzado, la verdad es que nunca me había fijado excesivamente en los mensajes de apagado, siempre prestamos más atención al arranque. Uso Lenny con un kernel 2.6.20.18 compilado por mi y efectivamente el error aparece. Voy a investigar más sobre el tema.

    He encontrado esta página de casualidad, pero tengo claro que a partir de ahora será una de mis referencias.

  • @Alberto Muchas gracias, me alegro de que te haya resultado útil.

  • Boyan dice:

    Hola, veo en algunos foros la sugerencia de editar

    /etc/init.d/halt

    y cambiar

    hddown=”-h”

    por

    hddown=”"

    Pero no entiendo bien qué repercusión puede tener eso. ¿Alguien puede explicarlo?
    ¡Gracias!

  • @Boyan La opción -h sirve para:

     -h     Put all hard drives on the system in stand-by mode just before halt or power-off.

    Como el kernel 2.6.22 ya hace esto, tal y como se comenta en la entrada:

    El driver del kernel 2.6.22 se actualizó para que se lanzaran los comandos FLUSH CACHE y STANDBYNOW antes de: power off, suspend-to-ram y suspend-to-disk, pero desafortunadamente, la inmensa mayoría de implementaciones del comando shutdown de las diferentes distribuciones aún no son compatibles con este cambio.

    es innecesario e inconveniente hacer el stand-by de nuevo ya que, entre otras cosas, podría arrancar el disco de nuevo.

  • Ary dice:

    Muy buena la explicación. Excelente!
    Soy víctima de este problema desde que actualicé mi kernel 2.6.21 al 2.6.22.
    Quite la -h y no me aparece más el error.
    Mi pregunta es: es una solución buena esta, o podría traer otros problemas?
    Si ya no me aparece más el mensaje este, puedo seguir usando el kernel 2.6.22 con tranquilidad?? pues mi distribución (Debian Lenny) todavía no actualizaron el shutdown.
    Salu2 y muchas gracias :)

  • Ary ¡Gracias!

    Preguntas que:

    es una solución buena esta, o podría traer otros problemas?

    No me atrevo yo a decirte ni que sí ni que no con total seguridad. Pero desde luego, si el kernel ya no se queja es muy buena señal, ¿no te parece?

  • Ary dice:

    Si es verdad… en eso tienes razón.
    Solo que me quedé pensando en los paquetes sysv-rc, sysvinit y sysvinit-utils de Roland Stigge. Si los pruebo, después te comentaré que tal funcionaron.
    Nuevamente muchas gracias por la ayuda.
    Salu2

    PD: hay alguna forma de ver (cuando vuelvo a encender la máquina) los printk que tira el kernel en el momento que se apaga la máquina?

  • akae dice:

    Muy buena explicación. Me quedé flasheado ayer mirando el shutdown cuando, casi al final, saca el mensaje del “spun”; y justo la primera entrada en google me lleva a tu explicación clara del problema y las soluciones. Gracias!

  • JRChan dice:

    Wow! Excelente explicación, andaba googleando esto y tu página me da tranquilidad por qué entiendo el problema. Soy usuario Debian avanzado y recien cambie a una laptop HP dv2425 con disco SATA y Debian Lenny 2.6.22, me llamó la atención ese mensaje al apagar el equipo además de un sonido característico del disco duro como si apagara la máquina de pronto y me puso los pelos de punta.

    Ahora probaré los paquetes de Roland Stigge para ver que sucede.

    Mil gracias

  • @JRChan Me alegro de que te haya resultado de utilidad.

  • ary dice:

    Debian ya lo solucionó

Tema LHYLE09, creado por Vicente Navarro