GNU/Linux >> Tutoriales Linux >  >> Linux

HDD Power-Up en Standby:evita que gire

El kernel de Linux hace girar la unidad. Eche un vistazo a estas líneas de drivers/ata/libata-core.c (código fuente del kernel):

if (!tried_spinup && (id[2] == 0x37c8 || id[2] == 0x738c)) {
    tried_spinup = 1;
    /*
     * Drive powered-up in standby mode, and requires a specific
     * SET_FEATURES spin-up subcommand before it will accept
     * anything other than the original IDENTIFY command.
     */
    err_mask = ata_dev_set_feature(dev, SETFEATURES_SPINUP, 0);
    if (err_mask && id[2] != 0x738c) {
        rc = -EIO;
        reason = "SPINUP failed";
        goto err_out;
    }
    /*
     * If the drive initially returned incomplete IDENTIFY info,
     * we now must reissue the IDENTIFY command.
     */
    if (id[2] == 0x37c8)
        goto retry;
}

Si comenta estas líneas y vuelve a compilar el núcleo, las unidades no girarán. Entonces necesitará un comando para activarlas, por ejemplo, cuando hdparm deshabilita PUIS, gira la unidad. Eche un vistazo a este enlace.

Eso es todo lo que sé sobre PUIS.

Editar: Me acabo de dar cuenta de que su disco gira antes de la pantalla de grub:esto significa que la placa base está girando el disco. Puede intentar deshabilitar el puerto sata correspondiente en su configuración BIOS/UEFI, si lo permite, e intentarlo de nuevo. Si está funcionando, la unidad permanecerá inmóvil hasta que el núcleo la active, después de la pantalla de grub y antes de la solicitud de inicio de sesión del usuario, y puede encontrarla en dmesg

ataX.00: failed to IDENTIFY (SPINUP failed, err_mask=0x4)
ataX.00: revalidation failed (errno=-5)
ataX: SATA link up 6.0 Gbps (SStatus 133 SControl 300)

En este punto, si piratea el núcleo, la unidad no girará como describí anteriormente.

Edición 2: Encontré un mejor comando para hacer girar el disco:

sg_sat_set_features --feature=7 /dev/sdX

es parte del paquete sg3_utils, requiere privilegios de root, pero hace girar muy bien el disco. Publicación actualizada en el foro de arch linux, esa es mi solución final por ahora. Un pequeño resumen de esa publicación:

  • si su disco habilitado para PUIS gira antes de la pantalla del cargador de arranque, intente deshabilitar el puerto sata correspondiente o pruebe con una tarjeta controladora sata PCI-ex
  • recompile el kernel para deshabilitar el comando que activa los discos en estado PUIS
  • use sg_sat_set_feature para hacer girar el disco
  • volver a escanear el puerto sata para obtener acceso a las particiones

Edición 3: Un alma caritativa escribió un parche en el foro de archlinux:https://bbs.archlinux.org/viewtopic.php?pid=1855326#p1855326

Transcripción:

Si no podemos evitar parchear libata, también podríamos deshabilitar las unidades PUIS en el arranque para deshacernos de un sinfín de mensajes de error. La desventaja es que tenemos que decirle al núcleo que las vuelva a habilitar cuando se solicite, ya que las herramientas del espacio de usuario como sg_sat* esperan una entrada dentro de /dev.

Eche un vistazo a mi parche tentativo para esa característica. Espero que alguien considere dedicar su tiempo para volver a trabajarlo según los estándares del kernel y proponerlo aguas arriba. Escribí el parche contra clean v4.19.56.

¡Recuerde configurar el parámetro del kernel "libata.spinup_control=0" en el cargador de arranque después de volver a compilar el módulo y reconstruir su imagen initramfs!

Entonces deberías

echo 1 > /sys/module/libata/parameters/spinup_control

y vuelva a escanear la unidad que desea activar.

echo '- - -' > devices/pci0000:00/0000:00:1f.2/ata4/host3/scsi_host/host3/scan

--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -171,6 +171,10 @@ static int atapi_an;
 module_param(atapi_an, int, 0444);
 MODULE_PARM_DESC(atapi_an, "Enable ATAPI AN media presence notification (0=0ff [default], 1=on)");

+static int spinup_control = 1;
+module_param(spinup_control, int, 0644);
+MODULE_PARM_DESC(spinup_control, "Spin up standby drives (0=PUIS drives disabled, 1=standby drives can spin up [default])");
+
 MODULE_AUTHOR("Jeff Garzik");
 MODULE_DESCRIPTION("Library module for ATA devices");
 MODULE_LICENSE("GPL");
@@ -1978,28 +1982,40 @@ retry:
            goto err_out;
    }

-   if (!tried_spinup && (id[2] == 0x37c8 || id[2] == 0x738c)) {
+   /*
+    * My drives indicate with 0x738c that media is ready when PUIS
+    * is enabled, in conflict with the relevant standards.
+    * The compliant behavior therefore prevents spun-up and ready
+    * drives from being recognized on reboot.
+    * I had no choice but to remove "|| id[2] == 0x738c))".
+    */
+   if (!tried_spinup && (id[2] == 0x37c8)) {
        tried_spinup = 1;
        /*
         * Drive powered-up in standby mode, and requires a specific
         * SET_FEATURES spin-up subcommand before it will accept
         * anything other than the original IDENTIFY command.
         */
-       err_mask = ata_dev_set_feature(dev, SETFEATURES_SPINUP, 0);
-       if (err_mask && id[2] != 0x738c) {
-           rc = -EIO;
-           reason = "SPINUP failed";
-           goto err_out;
-       }
-       /*
-        * If the drive initially returned incomplete IDENTIFY info,
-        * we now must reissue the IDENTIFY command.
-        */
-       if (id[2] == 0x37c8)
+       if (spinup_control) {
+           err_mask = ata_dev_set_feature(dev, SETFEATURES_SPINUP, 0);
+           if (err_mask) {
+               rc = -EIO;
+               reason = "SPINUP failed";
+               goto err_out;
+           }
+           /*
+            * If the drive initially returned incomplete IDENTIFY info,
+            * we now must reissue the IDENTIFY command.
+            */
            goto retry;
+       } else {
+           dev->horkage |= ATA_HORKAGE_DISABLE;
+           ata_dev_notice(dev, "horkage modified (drive powered-up in standby)\n");
+       }
    }

-   if ((flags & ATA_READID_POSTRESET) &&
+   if (spinup_control && (flags & ATA_READID_POSTRESET) &&
        (class == ATA_DEV_ATA || class == ATA_DEV_ZAC)) {
        /*
         * The exact sequence expected by certain pre-ATA4 drives is:

Crédito a az12shareart, que se registró en el foro de arch linux solo para escribir esto, creo.


Busqué exactamente lo mismo hace unos años, Linux Mint y un disco duro antiguo que también se usaba solo para el almacenamiento de datos ocasional.

Las soluciones que encontré (ya no tengo los enlaces a mano) fueron las mismas que parece que encontraste:algunas algunas los discos duros pueden tener una configuración de puente que debería hacer que la unidad permanezca inactiva/no gire en el momento del arranque. Pero no funcionó, mis resultados fueron exactamente los mismos que los tuyos, todavía gira en el arranque. No encontré ninguna solución para eso, por lo que sé, fue el BIOS/GRUB/linux, por separado o trabajando juntos, o solo el disco duro en sí mismo que no estaba escuchando.

Hice algo de "conexión en caliente"/"cambio en caliente" prueba, conectando la alimentación a un disco duro (SATA) mientras la computadora estaba funcionando. Generó algunas entradas de registro (dmesg &/var/log/syslog ) y funcionó correctamente . Luego, cuando termine con la unidad (sincronizar, desmontar, dormir/hdparm -y ) desconectando la alimentación nuevamente. ¡Trabajó! Pero aparentemente necesita una placa base y un sistema operativo compatibles, así que YMMV.

Sin embargo, tirar del enchufe para usar la unidad no es muy conveniente ni fácil, así que conecté un interruptor de un solo tiro de dos polos - DPST, Wikipedia tiene un diagrama - tiene 4 terminales, para los 2 cables de alimentación separados (12V &5V?), para mantenerlos separados y encenderlos/apagarlos al mismo tiempo. Conectándolo a la alimentación del HD, puedo encender y apagar el disco cuando sea necesario.

Actualizar:

Intercambio en caliente usado para trabajar en Linux Mint 14/15/16, pero por alguna razón dejó de funcionar en 17 y posteriores, supongo que algún cambio en el kernel lo detuvo. Ahora, el intercambio en caliente de un disco duro solo parece funcionar, pero el disco se lee como dañado , solo un reinicio de encendido hace que funcione correctamente. ¿Tal vez hay una manera fácil de hacer que funcione de nuevo, o se requiere un kernel recompilado con algunos interruptores especiales...?

Actualización 2

Aparentemente, el intercambio en caliente está funcionando nuevamente para Ubuntu 16.04 (Mint 18 también debería funcionar).


Linux
  1. Cómo arrancar desde una unidad USB en VirtualBox en Linux

  2. Journalctl:¿Cómo evitar que el texto se trunque en la terminal?

  3. ¿Cómo puedo saber qué está acelerando mi disco?

  4. Cómo evitar que un proceso escriba archivos

  5. ¿Cómo evitar que chgrp borre el "bit setuid"?

Cómo crear un ISO desde una unidad USB de arranque en Linux

Cómo arrancar desde una unidad USB en Virtualbox en Linux

¿Debería funcionar el arranque dual desde un disco duro de 4tb?

¿Caché SSD para minimizar el tiempo de giro de HDD?

Evite que Ubuntu 14.04 se bloquee en virtualbox si Windows está bloqueado

Del nombre del dispositivo df al nombre de la unidad física (proveedor/tipo)