GNU/Linux >> Linux Esercitazione >  >> Linux

Accensione dell'HDD in standby:impedisce la rotazione

Il kernel Linux fa girare l'unità. Dai un'occhiata a queste righe da drivers/ata/libata-core.c (codice sorgente 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;
}

Se commenti queste righe e ricompili il kernel, le unità non gireranno. Allora avrai bisogno di un comando per farle girare, per esempio quando hdparm disabilita PUIS fa girare l'unità. Dai un'occhiata a questo link.

Questo è tutto quello che so su PUIS.

Modifica: Ho appena notato che il tuo disco gira prima della schermata di grub:questo significa che la scheda madre sta girando il disco. Puoi provare a disabilitare la porta sata corrispondente nella tua configurazione BIOS/UEFI, se lo consente, e riprovare. Se funziona, l'unità rimarrà ferma finché il kernel non la avvia, dopo la schermata di grub e prima del prompt di accesso dell'utente, e puoi trovarla in 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)

A questo punto, se hackeri il kernel, l'unità non girerà affatto come ho descritto prima.

Modifica 2: Ho trovato un comando migliore per far girare il disco:

sg_sat_set_features --feature=7 /dev/sdX

fa parte del pacchetto sg3_utils, richiede i privilegi di root, ma fa girare bene il disco. Post aggiornato sul forum arch linux, questa è la mia soluzione finale per ora. Un piccolo riassunto di quel post:

  • se il tuo disco abilitato PUIS si avvia prima della schermata del caricatore di avvio, prova a disabilitare la porta sata corrispondente o prova una scheda controller sata PCI-ex
  • ricompila il kernel per disabilitare il comando che fa girare i dischi nello stato PUIS
  • usa sg_sat_set_feature per far girare il disco
  • riesamina la porta sata per ottenere l'accesso alle partizioni

Modifica 3: Qualche anima gentile ha scritto una patch, sul forum archlinux:https://bbs.archlinux.org/viewtopic.php?pid=1855326#p1855326

Trascrizione:

Se non possiamo evitare di applicare patch a libata, potremmo anche disabilitare le unità PUIS all'avvio per eliminare infiniti messaggi di errore. Il rovescio della medaglia è che dobbiamo dire al kernel di riabilitarli su richiesta, poiché gli strumenti in spazio utente come sg_sat* si aspettano una voce all'interno di /dev.

Dai un'occhiata alla mia patch provvisoria per quella funzione. Spero che qualcuno consideri di risparmiare tempo per rielaborarlo secondo gli standard del kernel e proporlo a monte. Ho scritto la patch rispetto alla versione 4.19.56 pulita.

Ricordati di impostare il parametro del kernel "libata.spinup_control=0" nel bootloader dopo aver ricompilato il modulo e ricostruito la tua immagine initramfs!

Allora dovresti

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

ed esegui una nuova scansione dell'unità che desideri avviare.

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:

Ringraziamo az12shareart, che si è registrato al forum arch linux solo per scrivere questo, credo.


Ho cercato la cosa esatta alcuni anni fa, per Linux Mint e un vecchio HD che veniva utilizzato solo per l'archiviazione occasionale di dati.

Le soluzioni che ho trovato (non ho più i link a portata di mano) erano le stesse che sembra che tu abbia trovato:poche i dischi rigidi potrebbero avere un'impostazione del ponticello che dovrebbe fare in modo che l'unità rimanga inattiva / non si avvii all'avvio. Ma non ha funzionato, i miei risultati erano esattamente gli stessi dei tuoi, gira ancora all'avvio. Non ho trovato alcuna soluzione per questo, per quanto ne so era BIOS/GRUB/linux, separatamente o funzionanti insieme, o solo l'HD stesso che non ascoltava.

Ho fatto un po' di "hot plug"/"hot swap" test, collegando l'alimentazione a un disco rigido (SATA) mentre il computer era attivo e funzionante. Ha generato alcune voci di log (dmesg &/var/log/syslog ) e ha funzionato correttamente . Poi, quando hai finito con l'unità (sync, unmount, sleep/hdparm -y ) scollegando nuovamente l'alimentazione. Lavorato! Ma a quanto pare ha bisogno di una scheda madre e di un sistema operativo compatibili, quindi YMMV.

Tuttavia, staccare la spina di alimentazione per utilizzare l'unità non è molto comodo o facile, quindi ho collegato un interruttore bipolare a una via - DPST, Wikipedia ha uno schema - ha 4 terminali, per i 2 cavi di alimentazione separati (12V &5V?), per tenerli separati e accenderli/spegnerli entrambi contemporaneamente. Collegandolo all'alimentazione dell'HD, posso accendere e spegnere l'unità quando necessario.

Aggiornamento:

Scambio a caldo usato per funzionare su Linux Mint 14/15/16, ma per qualche motivo ha smesso di funzionare su 17 e versioni successive, immagino che alcune modifiche al kernel lo abbiano fermato. Ora solo l'hot swapping di un disco rigido sembra funzionare, ma l'unità risulta danneggiata , solo un riavvio all'accensione lo fa funzionare correttamente. Forse c'è un modo semplice per farlo funzionare di nuovo, o è necessario un kernel ricompilato con alcune opzioni speciali...?

Aggiornamento 2

Apparentemente l'hot swapping sta funzionando di nuovo per Ubuntu 16.04 (anche Mint 18 dovrebbe funzionare).


Linux
  1. Copia Dd completa da HDD a HDD?

  2. Come impedire a `ls` di ordinare l'output?

  3. Come posso sapere cosa sta facendo girare il mio disco?

  4. Dal nome del dispositivo df al nome dell'unità fisica (fornitore/tipo)

  5. Come impedire a chgrp di cancellare "setuid bit"?

Come creare una ISO da un'unità USB avviabile in Linux

Come avviare dall'unità USB in Virtualbox in Linux

Il doppio avvio dovrebbe funzionare da un HDD da 4 TB?

Cache SSD per ridurre al minimo il tempo di rotazione dell'HDD?

Impedisci a Ubuntu 14.04 di bloccarsi su virtualbox se Windows è bloccato

Come impedire a un processo di scrivere file