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).