Le noyau Linux fait tourner le disque. Jetez un œil à ces lignes de drivers/ata/libata-core.c (code source du noyau) :
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 vous commentez ces lignes et recompilez le noyau, les disques ne démarreront pas. Vous aurez alors besoin d'une commande pour les faire tourner, par exemple lorsque hdparm désactive PUIS, il fait tourner le disque. Jetez un œil à ce lien.
C'est tout ce que je sais sur PUIS.
Modifier : Je viens de remarquer que votre disque tourne avant l'écran grub :cela signifie que la carte mère fait tourner le disque. Vous pouvez essayer de désactiver le port sata correspondant dans votre configuration BIOS/UEFI, s'il le permet, et réessayer. Si cela fonctionne, le lecteur restera immobile jusqu'à ce que le noyau le lance, après l'écran grub et avant l'invite de connexion de l'utilisateur, et vous pouvez trouver dans 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)
À ce stade, si vous piratez le noyau, le lecteur ne démarrera pas du tout comme je l'ai décrit plus tôt.
Modification 2 : J'ai trouvé une meilleure commande pour faire tourner le disque :
sg_sat_set_features --feature=7 /dev/sdX
il fait partie du package sg3_utils, nécessite des privilèges root, mais fait bien tourner le disque.Post mis à jour sur le forum arch linux, c'est ma solution finale pour l'instant.Un petit résumé de ce post :
- si votre disque compatible PUIS tourne avant l'écran du chargeur de démarrage, essayez de désactiver le port sata correspondant ou essayez une carte de contrôleur sata PCI-ex
- recompiler le noyau pour désactiver la commande qui fait tourner les disques dans l'état PUIS
- utilisez sg_sat_set_feature pour faire tourner le disque
- Rescanner le port sata pour accéder aux partitions
Modification 3 : Une âme charitable a écrit un patch, sur le forum archlinux :https://bbs.archlinux.org/viewtopic.php?pid=1855326#p1855326
Transcription :
Si nous ne pouvons pas éviter de corriger libata, autant désactiver les lecteurs PUIS au démarrage pour se débarrasser des messages d'erreur sans fin. L'inconvénient est que nous devons dire au noyau de les réactiver sur demande, car les outils de l'espace utilisateur comme sg_sat* attendent une entrée dans /dev.
Jetez un œil à mon correctif provisoire pour cette fonctionnalité. J'espère que quelqu'un prendra le temps de le retravailler selon les standards du noyau et de le proposer en amont. J'ai écrit le patch contre clean v4.19.56.
N'oubliez pas de définir le paramètre de noyau "libata.spinup_control=0" dans le chargeur de démarrage après avoir recompilé le module et reconstruit votre image initramfs !
Alors vous devriez
echo 1 > /sys/module/libata/parameters/spinup_control
et lancez une nouvelle analyse du lecteur que vous souhaitez faire tourner.
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:
Merci à az12shareart, qui s'est inscrit sur le forum arch linux juste pour écrire ceci, je pense.
J'ai cherché la chose exacte il y a quelques années, pour Linux Mint et un vieux disque dur qui n'était également utilisé que pour le stockage occasionnel de données.
Les solutions que j'ai trouvées (je n'ai plus les liens à portée de main) étaient les mêmes que vous semblez avoir trouvées :quelques les disques durs peuvent avoir un réglage de cavalier qui devrait faire en sorte que le lecteur reste en veille / ne tourne pas au démarrage. Mais cela n'a pas fonctionné, mes résultats étaient exactement les mêmes que les vôtres, il tourne toujours au démarrage. Je n'ai trouvé aucun correctif pour cela, pour autant que je sache, c'était le BIOS/GRUB/linux, séparément ou travaillant ensemble, ou simplement le disque dur lui-même qui n'écoutait pas.
J'ai fait quelques "hot plug"/"hot swap" tester, connecter l'alimentation à un disque dur (SATA) pendant que l'ordinateur était en marche. Il a généré des entrées de journal (dmesg &/var/log/syslog
) et a fonctionné avec succès . Ensuite, lorsque vous avez terminé avec le lecteur (sync, unmount, sleep/hdparm -y
) en débranchant à nouveau l'alimentation. Travaillé! Mais il a apparemment besoin d'une carte mère et d'un système d'exploitation compatibles, donc YMMV.
Cependant, tirer la prise d'alimentation pour utiliser le lecteur n'est pas très pratique ou facile, j'ai donc câblé un interrupteur unipolaire bipolaire - DPST, Wikipedia a un schéma - a 4 bornes, pour les 2 fils d'alimentation séparés (12V &5V ?), pour les garder séparés et les allumer/éteindre tous les deux en même temps. En le connectant à l'alimentation du HD, je peux allumer et éteindre le disque chaque fois que nécessaire.
Mise à jour :
Remplacement à chaud utilisé pour fonctionner sur Linux Mint 14/15/16, mais pour une raison quelconque, il a cessé de fonctionner sur 17 et plus, je suppose qu'un changement de noyau l'a arrêté. Désormais, l'échange à chaud d'un disque dur ne semble fonctionner que, mais le lecteur se lit comme corrompu , seul un redémarrage à la mise sous tension le fait fonctionner correctement. Peut-être existe-t-il un moyen simple de le faire fonctionner à nouveau, ou un noyau recompilé est-il nécessaire avec des commutateurs spéciaux... ?
Mise à jour 2
Le remplacement à chaud fonctionne apparemment à nouveau pour Ubuntu 16.04 (Mint 18 devrait également fonctionner).