Lo hice y lo entendí

El blog de Vicente Navarro
01 ene

A vueltas con el “hdparm -B” en Debian Lenny

En estos momentos estoy trabajando con una Debian Lenny/Testing. Estar con una Debian Testing tiene las ventajas de estar muy al día con versiones bastante recientes de los paquetes pero al mismo tiempo te vas encontrando con diferentes problemillas que bueno, al menos sirven para descubrir cosas. Trabajar directamente sobre una Unstable a veces tiene consecuencias desastrosas, como he podido comprobar en alguna ocasión, así que no se lo recomiendo a nadie.

Pues bien, tras una de las frecuentes actualizaciones de Lenny/Testing me encuentro estos errores:

Checking battery state...
/dev/sda:
 setting Advanced Power Management level to 0xfe (254)
SG_IO: bad/missing ATA_16 sense data
 HDIO_DRIVE_CMD failed: Input/output error

/dev/sdb:
 setting Advanced Power Management level to 0xfe (254)

/dev/sdc:
 setting Advanced Power Management level to 0xfe (254)

/dev/sdd:
 setting Advanced Power Management level to 0xfe (254)
 HDIO_DRIVE_CMD failed: Invalid argument

/dev/sde:
 setting Advanced Power Management level to 0xfe (254)
 HDIO_DRIVE_CMD failed: Invalid argument

/dev/hda:
 setting Advanced Power Management level to 0xfe (254)
 HDIO_DRIVE_CMD failed: Input/output error

/dev/hdb:
 setting Advanced Power Management level to 0xfe (254)
 HDIO_DRIVE_CMD failed: Input/output error

Hace ya varios meses de que saltara la bomba aquella de que Ubuntu dañaba los discos duros: Linux no mata discos duros, se mueren solos. Y precisamente en aquella ocasión, pudimos ver que Debian Etch no ejecutaba ningún comando hdparm (fuera de lo especificado en /etc/default/hdparm, claro), por lo que el comportamiento que tuviera el disco sería el que el fabricante le pusiera por defecto, y de ahí la afirmación de que ni Ubuntu, ni Debian, ni ningún Linux estropeaban el disco duro por este motivo, sino que era cosa de los fabricantes que hacían una tecnología de discos duros que por defecto se comportaba de forma dañina para los propios discos.

Indagando en los errores anteriores, en los que veo que se está intentando hacer un “hdparm -B 254” a todos los discos, funcionando en sdb y sdc y fallando en todos los demás porque, o son discos duros/memorias USB (caso de sdd y sde), o no son discos en absoluto (caso de sda), o son unidades ópticas (caso de hda y hdb), llego a varios scripts en /etc/acpi que se dedican a ejecutar estos comandos hdparm:

ac.d/90-hdparm.sh
battery.d/90-hdparm.sh
resume.d/90-hdparm.sh
start.d/90-hdparm.sh

En el script (es el mismo en todos los directorios) vemos que los desarrolladores de Debian han decidido llevar cuidado con los ciclos de carga y descarga. Dicen que 128 es el valor por defecto en muchos discos duros, así que ponen 254 cuando se trabaja conectado a corriente y 128 cuando se trabaja con la batería para proteger el disco contra golpes (claro, si el disco está conectado a la corriente el portátil no se puede mover mucho y en realidad no es tan común trabajar con batería):

#! /bin/sh
#
# This script adjusts hard drive APM settings using hdparm. The hardware
# defaults (usually hdparm -B 128) cause excessive head load/unload cycles
# on many modern hard drives. We therefore set hdparm -B 254 while on AC
# power. On battery we set hdparm -B 128, because the head parking is
# very useful for shock protection.
#

En el cuerpo del script vemos que si la variable de entorno CONTROL_HD_POWERMGMT está definida en /etc/laptop-mode/laptop-mode.conf y tiene un valor distinto de 0, este script no hará nada:

DO_HDPARM=y
if [ -e /usr/sbin/laptop_mode ] ; then
  LMT_CONTROL_HD_POWERMGMT=$(. /etc/laptop-mode/laptop-mode.conf && echo "$CONTROL_HD_POWERMGMT")
  if [ "$LMT_CONTROL_HD_POWERMGMT" != 0 ] ; then
    # Laptop mode controls hdparm -B settings, we don't.
    DO_HDPARM=n
  fi
fi

En caso contrario, el script usa el comando /usr/bin/on_ac_power para ver si estamos conectados a la corriente y hacer un hdparm -B 254 o un hdparm -B 128 en caso contrario a todos los ficheros de dispositivo sd? y hd?:

if [ $DO_HDPARM = y ] ; then
  AC_POWER=$( /usr/bin/on_ac_power; echo $? )
  for dev in /dev/sd? /dev/hd? ; do
    if [ -b $dev ] ; then
      if [ $AC_POWER -eq 1 ] ; then
        hdparm -B 128 $dev
      else
        hdparm -B 254 $dev
      fi
    fi
  done
fi

Este script forma parte del paquete acpi-support, nuevo en Lenny, y cuya descripción es:

scripts for handling many ACPI events

This package contains scripts to react to various ACPI events. It only includes scripts for events that can be supported with some level of safety cross platform.

It is able to:

  • Detect loss and gain of AC power, lid closure, and the press of a number of specific buttons (on Asus, IBM, Lenovo, Panasonic, Sony and Toshiba laptops).
  • Suspend, hibernate and resume the computer, with workarounds for hardware that needs it.
  • On some laptops, set screen brightness.

Si vamos a la lista de bugs del paquete acpi-support, vemos los bugs relacionados:

#448710: acpi-support: On notebooks the ACPI system causes the drive to retract every minute and thus decreases disk life by a high amount.

#448673: acpi-support: excessively load cycles some hard drives

Que además, también apuntan al bug de Ubuntu:

Bug #59695 High frequency of load/unload cycles on some hard disks may shorten lifetime

Mirando entre otros bugs, también encuentro el:

#457386: acpi-support: hard disk load cycle fix is problematic for optical drives

que la verdad es que a mí también me afecta, como llevo algunos días viendo en la salida del dmesg:

hda: drive_cmd: status=0x51 { DriveReady SeekComplete Error }
hda: drive_cmd: error=0x04 { AbortedCommand }
ide: failed opcode was: 0xef
hdb: drive_cmd: status=0x51 { DriveReady SeekComplete Error }
hdb: drive_cmd: error=0x04 { AbortedCommand }
ide: failed opcode was: 0xef

Como parece que ya hay una solución propuesta, a ver si en alguna actualización de los próximos días se soluciona.

Por cierto, el fichero /etc/laptop-mode/laptop-mode.conf que hemos mencionado antes, es parte del paquete laptop-mode-tools. Ese paquete lleva un script de arranque y parada en /etc/init.d/laptop-mode que crea o elimina el fichero /var/run/laptop-mode-tools/enabled para controlar si el laptop-mode está habilitado y ejecuta el comando /usr/sbin/laptop_mode que, según su página de man:

This  manual  page documents briefly the /usr/sbin/laptop_mode command.
/usr/sbin/laptop_mode is a program that  enables  and  disables  laptop
mode.  Laptop mode is a feature included in Linux kernels with versions
2.6.6 and higher, and 2.4.23 and higher. The intent of laptop  mode  is
to  increase battery life by letting your hard drive spin down. This is
achieved by grouping disk write activity into "chunks" that are  spaced
at larger intervals than they normally would be.

El /usr/sbin/laptop_mode en definitiva es un script de bash bastante largo que, usando la configuración de /etc/laptop-mode/laptop-mode.conf y /etc/laptop-mode/conf.d, hace:

# Script to start or stop laptop_mode, and to control various settings of the
# kernel, hardware etc. that influence power consumption.

Curioseando por el script vemos, entre otras muchas cosas, las líneas que configuran la frecuencia con la que el kernel debería escribir en disco:

echo "Adjusting 2.6 kernel parameters to enable laptop mode." >> $OUTPUT
set_sysctl /proc/sys/vm/laptop_mode               "$LM_SECONDS_BEFORE_SYNC"
set_sysctl /proc/sys/vm/dirty_writeback_centisecs "$AGE"
set_sysctl /proc/sys/vm/dirty_expire_centisecs    "$AGE"
set_sysctl /proc/sys/vm/dirty_ratio               "$LM_DIRTY_RATIO"
set_sysctl /proc/sys/vm/dirty_background_ratio    "$LM_DIRTY_BACKGROUND_RATIO"

Por ejemplo, si buscamos el parámetro LM_SECONDS_BEFORE_SYNC en el laptop-mode.conf veremos:

#
# Seconds laptop mode has to to wait after the disk goes idle before doing
# a sync.
#
LM_SECONDS_BEFORE_SYNC=2

Y si buscamos el CONTROL_HD_POWERMGMT, el que se consultaba en el script 90-hdparm.sh, encontramos:

#
# Should laptop mode tools control the hard drive power management settings?
#
CONTROL_HD_POWERMGMT=0


#
# Power management for HD (hdparm -B values)
#
BATT_HD_POWERMGMT=1
LM_AC_HD_POWERMGMT=254
NOLM_AC_HD_POWERMGMT=254

Y vemos que, como el CONTROL_HD_POWERMGMT es 0, el script 90-hdparm.sh hará hdparm -B 128 o hdparm -B 255 según estemos trabajando con batería o con corriente, pero si no fuera así, el laptop_mode nos pondría un valor tan agresivo para trabajar con batería como 1.

En cualquier caso, bueno es saber que las distribuciones están tratando este problema. Y sobre el problema propiamente dicho, ya he expresado mi opinión en otras ocasiones de que no es algo asociado a Linux sino que es una limitación artificialmente introducida por los fabricantes que están incorporando esta tecnología en sus discos.

Por otra parte, también es conveniente conocer estos cambios para deshacer cualquier cambio manual que se haya podido introducir en el /etc/rc.local o en el /etc/default/hdparm precisamente para minimizar los ciclos de carga y descarga.

:wq

Entradas relacionadas

11 Comentarios a “A vueltas con el “hdparm -B” en Debian Lenny”

  • Y… ¡Feliz 2008 para todos los visitantes! :P

  • Sagman dice:

    Muy buen artículo como siempre :P , siempre ahí metido y averiguando cosas nuevas :D

    Y feliz año 2008, que el 2007 no veas como ha acabado… (con el ordenador roto xD)

  • @Sagman Me alegro de que te haya gustado… ¡Y ya siento lo del ordenador! Espero que no sea muy grave.

  • Bytecoders dice:

    Vaya forma de empezar el año, la verdad es que como continues a este ritmo van a tener que cerrar la Wikipedia. XD
    Buena investigación sobre hdparm en lenny, crees que bien configurado el ACPI podemos ahorrar mucha energía?
    Feliz año nuevo a SuperCoco y a todos/as en general.

  • @Bytecoders ¡Gracias! Sobre el ACPI y la energía, yo creo que sí. Muchos de los scripts de ACPI y del laptop-mode van precisamente encaminados a ahorrar batería cuando se trabaja sin conexión a la corriente.

  • luisp dice:

    ¿Esto significa que no debo preocuparme por corregir el aumento de ciclos, porque el acpi-support se encarga de ello?
    Lo digo porque ya había puesto un hdparm -B 254, pues estaba incrementando 2 cada 10 segundos.
    He instalado debian en un inspiron 1525, y no creí que tendría que hacer tanto trabajo para dejarlo listo.

  • @luisp Ya ves que sí que se ejecuta un “hdparm -B 254” pero sólo si estás trabajando conectado a la corriente. De todas formas, hay gente a la que el número de ciclos le aumenta rápidamente incluso con un valor de 254 y tienen que poner 255.

    Tendrás que hacer algunas pruebas para ver qué es lo mejor para tu caso.

  • ppe dice:

    Hi every body!!!

    I’m Paolo, and I’m Italian student, moreover I’m a debian-lenny user like you!!!
    I have a laptop: SONY Vaio,
    Today I update my debian, but something goes wrong and now
    I don’t have the gnome interface and when I boot the system I have the follow error message:

    /dev/hda:
    setting Advanced Power Management level to 0xef (254)

    /dev/hdb:
    setting Advanced Power Management level to 0xef (254)

    hdb: drive_cmd: status=0×51 { DriveReady SeekComplete Error}
    hdb: drive_cmd: error=0×04 { AbortedCommand}
    ide: Failed opcode was: 0xef

    HDIO_DRIVE_CMD failed: Input/output error

    I find something interestring in your forum, but unfortunatly I don’t know spanish.
    Could you help me!

    Thank you

    Paolo

  • @ppe Hi Paolo. The post basically explains that those errors are harmless as they appear when the Debian Lenny startup scripts try to change the power management mode in optical drives.

  • luisp dice:

    Una cuestión sobre la temperatura.
    Tengo una inspiron 1525. Quité vista y puse ubuntu. El disco duro llega normalmente a los 47 grados. El trackpad está bastante caliente. Estoy con hdparm -B 254. Si dejo que se aparquen más los cabezales, ¿disminuirá la temperatura, o será igual?, porque pienso que lo importante es que el disco disminuya la velocidad, no que se aparquen o no los cabezales.
    Gracias.

  • luisp Yo pienso que la temperatura no bajará mucho si el disco sigue rotando, pero con un modo de conservación de la energía más agresivo, es posible que se pare más a menudo. En cualquier caso, la respuesta la tienes en tu mano. Prueba con otros valores de -B y ya nos cuentas qué tal se porta la temperatura…

Tema LHYLE09, creado por Vicente Navarro