GNU/Linux >> LINUX-Kenntnisse >  >> Linux

HDD Power-Up im Standby:Hochfahren verhindern

Der Linux-Kernel fährt das Laufwerk hoch. Schauen Sie sich diese Zeilen von drivers/ata/libata-core.c (Kernel-Quellcode) an:

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;
}

Wenn Sie diese Zeilen auskommentieren und den Kernel neu kompilieren, werden die Laufwerke nicht hochgefahren. Dann benötigen Sie einen Befehl, um sie hochzufahren. Wenn beispielsweise hdparm PUIS deaktiviert, wird das Laufwerk hochgefahren. Sehen Sie sich diesen Link an.

Das ist alles, was ich über PUIS weiß.

Bearbeiten: Ich habe gerade bemerkt, dass Ihr Laufwerk vor dem Grub-Bildschirm hochfährt:Dies bedeutet, dass das Motherboard das Laufwerk hochfährt. Sie können versuchen, den entsprechenden SATA-Port in Ihrer BIOS/UEFI-Konfiguration zu deaktivieren, falls dies so etwas zulässt, und es erneut versuchen. Wenn es funktioniert, bleibt das Laufwerk still, bis der Kernel es hochfährt, nach dem Grub-Bildschirm und vor der Eingabeaufforderung für die Benutzeranmeldung, und Sie können es in dmesg

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

Wenn Sie an dieser Stelle den Kernel hacken, wird das Laufwerk überhaupt nicht hochfahren, wie ich es zuvor beschrieben habe.

Änderung 2: Ich habe einen besseren Befehl gefunden, um die Festplatte hochzufahren:

sg_sat_set_features --feature=7 /dev/sdX

Es ist Teil des sg3_utils-Pakets, erfordert Root-Rechte, dreht aber die Festplatte gut hoch. Beitrag aktualisiert im Arch-Linux-Forum, das ist vorerst meine endgültige Lösung. Eine kleine Zusammenfassung dieses Beitrags:

  • Wenn Ihre PUIS-fähige Festplatte vor dem Bootloader-Bildschirm hochfährt, versuchen Sie, den entsprechenden SATA-Anschluss zu deaktivieren, oder versuchen Sie es mit einer PCI-ex-Satacontroller-Karte
  • kompilieren Sie den Kernel neu, um den Befehl zu deaktivieren, der die Festplatten in den PUIS-Zustand hochfährt
  • verwenden Sie sg_sat_set_feature, um die Festplatte hochzufahren
  • sata-Port neu scannen, um Zugriff auf Partitionen zu erhalten

Änderung 3: Eine freundliche Seele hat einen Patch im Archlinux-Forum geschrieben:https://bbs.archlinux.org/viewtopic.php?pid=1855326#p1855326

Transkription:

Wenn wir es nicht vermeiden können, libata zu patchen, können wir auch PUIS-Laufwerke beim Booten deaktivieren, um endlose Fehlermeldungen loszuwerden. Der Nachteil ist, dass wir dem Kernel mitteilen müssen, sie auf Anfrage wieder zu aktivieren, da Userspace-Tools wie sg_sat* einen Eintrag in /dev erwarten.

Werfen Sie einen Blick auf meinen vorläufigen Patch für diese Funktion. Ich hoffe, jemand erwägt, seine Zeit zu verschwenden, um es auf Kernel-Standards zu überarbeiten und es Upstream vorzuschlagen. Ich habe den Patch gegen saubere v4.19.56 geschrieben.

Denken Sie daran, den Kernel-Parameter "libata.spinup_control=0" im Bootloader zu setzen, nachdem Sie das Modul neu kompiliert und Ihr initramfs-Image neu erstellt haben!

Dann sollten Sie

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

und starten Sie einen erneuten Scan für das Laufwerk, das Sie hochfahren möchten.

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:

Verdienst an az12shareart, der sich im Arch-Linux-Forum registriert hat, nur um dies zu schreiben, denke ich.


Ich habe vor ein paar Jahren genau danach gesucht, nach Linux Mint und einer alten HD, die auch nur gelegentlich als Datenspeicher diente.

Die Lösungen, die ich gefunden habe (ich habe die Links nicht mehr zur Hand), waren die gleichen, die Sie anscheinend gefunden haben:einige Festplatten haben möglicherweise eine Jumper-Einstellung, die sollte dazu führen, dass das Laufwerk beim Booten im Ruhezustand bleibt / nicht hochfährt. Aber es hat nicht funktioniert, meine Ergebnisse waren genau die gleichen wie deine, es dreht sich immer noch beim Booten. Ich habe keine Korrekturen dafür gefunden, soweit ich weiß, war es das BIOS/GRUB/Linux, separat oder zusammen, oder nur die HD selbst, die nicht zuhörte.

Ich habe etwas "Hot-Plug"/"Hot-Swap" gemacht Testen, Anschließen der Stromversorgung an eine (SATA-)Festplatte, während der Computer in Betrieb war. Es generierte einige Log-Einträge (dmesg &/var/log/syslog ) und erfolgreich funktioniert . Wenn Sie dann mit dem Laufwerk fertig sind (Sync, Unmount, Sleep/hdparm -y ) Trennen Sie die Stromversorgung erneut. Hat funktioniert! Aber es braucht anscheinend ein kompatibles Motherboard und Betriebssystem, so YMMV.

Das Ziehen des Netzsteckers zum Verwenden des Laufwerks ist jedoch nicht sehr bequem oder einfach, daher habe ich einen zweipoligen Einwegschalter verdrahtet - DPST, Wikipedia hat ein Diagramm - hat 4 Anschlüsse für die 2 separaten Stromkabel (12 V &5V?), um sie getrennt zu halten und beide gleichzeitig ein- und auszuschalten. Wenn ich es an die Stromversorgung der HD anschließe, kann ich das Laufwerk bei Bedarf ein- und ausschalten.

Aktualisierung:

Hot-Swapping verwendet um unter Linux Mint 14/15/16 zu arbeiten, aber aus irgendeinem Grund hat es auf 17 und höher aufgehört zu arbeiten, ich vermute, dass eine Kernel-Änderung es gestoppt hat. Jetzt scheint das Hot-Swapping einer Festplatte nur noch zu funktionieren, aber das Laufwerk wird als beschädigt angezeigt , nur ein Neustart beim Einschalten bringt es erfolgreich zum Laufen. Vielleicht gibt es einen einfachen Weg, es wieder zum Laufen zu bringen, oder es wird ein neu kompilierter Kernel mit einigen speziellen Schaltern benötigt ...?

Aktualisierung 2

Hot Swapping funktioniert anscheinend wieder für Ubuntu 16.04 (Mint 18 sollte auch funktionieren).


Linux
  1. So booten Sie von einem USB-Laufwerk in VirtualBox unter Linux

  2. Journalctl:Wie verhindert man, dass Text im Terminal abgeschnitten wird?

  3. Verhindern, dass Tmux auf Ssh startet?

  4. Verhindern, dass 10.2 das Wolfram Mathematica-Verzeichnis unter Linux erstellt

  5. Wie kann verhindert werden, dass ein bestimmtes Programm ausgetauscht wird?

So erstellen Sie unter Linux ein ISO von einem bootfähigen USB-Laufwerk

So booten Sie von einem USB-Laufwerk in Virtualbox unter Linux

Sollte Dual Booting von einer 4-TB-Festplatte funktionieren?

SSD-Cache zur Minimierung der HDD-Spin-up-Zeit?

Verhindern Sie, dass Ubuntu 14.04 auf Virtualbox sperrt, wenn Windows gesperrt ist

Wie verhindert man, dass chgrp das „setuid bit“ löscht?