Linuxové jádro roztočí disk. Podívejte se na tyto řádky z drivers/ata/libata-core.c (zdrojový kód jádra):
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;
}
Pokud zakomentujete tyto řádky a překompilujete jádro, disky se neroztočí. Pak budete potřebovat příkaz k jejich roztočení, například když hdparm zakáže PUIS, roztočí disk. Podívejte se na tento odkaz.
To je vše, co o PUIS vím.
Upravit: Právě jsem si všiml, že se váš disk roztáčí před obrazovkou grub:to znamená, že základní deska roztáčí disk. Můžete zkusit deaktivovat odpovídající sata port v konfiguraci BIOS/UEFI, pokud to umožňuje, a zkusit to znovu. Pokud to funguje, zůstane disk v klidu, dokud ho jádro neroztočí, po obrazovce grub a před výzvou k přihlášení uživatele, což můžete najít v 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)
Pokud v tomto okamžiku hacknete jádro, disk se vůbec neroztočí, jak jsem popsal dříve.
Úprava 2: Našel jsem lepší příkaz pro roztočení disku:
sg_sat_set_features --feature=7 /dev/sdX
je součástí balíčku sg3_utils, vyžaduje práva roota, ale pěkně roztáčí disk. Aktualizovaný příspěvek na fóru arch linux, to je prozatím mé konečné řešení. Malé shrnutí tohoto příspěvku:
- Pokud se váš disk s povoleným PUIS roztočí před obrazovkou zavaděče, zkuste deaktivovat odpovídající port SATA nebo vyzkoušejte kartu Satacontroller PCI-ex
- znovu zkompilujte jádro, abyste zakázali příkaz, který roztáčí disky ve stavu PUIS
- použijte sg_sat_set_feature k roztočení disku
- znovu prohledejte port SATA, abyste získali přístup k oddílům
Úprava 3: Nějaká dobrá duše napsala patch na fórum archlinux:https://bbs.archlinux.org/viewtopic.php?pid=1855326#p1855326
Přepis:
Pokud se nemůžeme vyhnout záplatování libata, můžeme také zakázat jednotky PUIS při spouštění, abychom se zbavili nekonečných chybových zpráv. Nevýhodou je, že musíme říct jádru, aby je na požádání znovu povolilo, protože nástroje uživatelského prostoru jako sg_sat* očekávají záznam v /dev.
Podívejte se na můj předběžný patch pro tuto funkci. Doufám, že někdo zváží, že ušetří čas, aby to přepracoval na standardy jádra a navrhl to upstream. Napsal jsem opravu proti čisté verzi 4.19.56.
Nezapomeňte nastavit parametr jádra "libata.spinup_control=0" v zavaděči po rekompilaci modulu a přestavbě obrazu initramfs!
Pak byste měli
echo 1 > /sys/module/libata/parameters/spinup_control
a znovu naskenujte jednotku, kterou chcete roztočit.
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:
Myslím, že díky az12shareart, který se zaregistroval na fóru arch linux jen proto, aby to napsal.
Před několika lety jsem hledal přesně to, co jsem měl, Linux Mint a starý HD, který se také používal jen pro příležitostné ukládání dat.
Řešení, která jsem našel (už nemám po ruce odkazy), byla stejná, jako byste našli vy:několik pevné disky mohou mít nastavení propojky, které by mělo způsobí, že disk zůstane v režimu spánku / neroztočí se při spouštění. Ale nefungovalo to, moje výsledky byly úplně stejné jako ty, stále se točí při startu. Nenašel jsem pro to žádné opravy, pokud vím, byl to BIOS/GRUB/linux, samostatně nebo spolupracující, nebo jen samotný HD, který neposlouchal.
Provedl jsem nějaké "hot plug"/"hot swap" testování, připojení napájení k pevnému disku (SATA), když byl počítač v provozu. Vygenerovalo to několik záznamů protokolu (dmesg &/var/log/syslog
) a fungoval úspěšně . Po dokončení s diskem (synchronizace, odpojení, režim spánku/hdparm -y
) opětovným odpojením napájení. Pracoval! Ale zřejmě potřebuje kompatibilní základní desku a OS, takže YMMV.
Vytažení napájecí zástrčky za účelem použití jednotky však není příliš pohodlné ani snadné, a tak jsem zapojil dvoupólový jednocestný spínač - DPST, schéma má Wikipedia - má 4 svorky pro 2 samostatné napájecí vodiče (12V &5V?), abyste je udrželi odděleně a oba je zapínali/vypínali současně. Když jej připojím k napájení HD, mohu disk kdykoli zapnout a vypnout.
Aktualizace:
Hot swapping použito pracovat na Linux Mint 14/15/16, ale z nějakého důvodu přestal fungovat na 17 a vyšší, předpokládám, že to zastavila nějaká změna jádra. Nyní se zdá, že výměna pevného disku za chodu funguje, ale disk se čte jako poškozený , úspěšně funguje pouze restartování po zapnutí. Možná existuje snadný způsob, jak to znovu uvést do provozu, nebo je potřeba nějaké překompilované jádro s nějakými speciálními přepínači...?
Aktualizace 2
Hot swapping zřejmě opět funguje pro Ubuntu 16.04 (Mint 18 by měl fungovat také).