GNU/Linux >> Belajar Linux >  >> Linux

HDD Power-Up in Standby:mencegah agar tidak berputar

Kernel linux memutar drive. Lihatlah baris-baris berikut dari drivers/ata/libata-core.c (kode sumber 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;
}

Jika Anda mengomentari baris ini dan mengkompilasi ulang kernel, drive tidak akan berputar. Kemudian Anda memerlukan perintah untuk mengaktifkannya, misalnya saat hdparm menonaktifkan PUIS, drive akan berputar. Lihat tautan ini.

Itu saja yang saya tahu tentang PUIS.

Edit: Saya baru saja memperhatikan bahwa drive Anda berputar sebelum layar grub:ini berarti motherboard memutar drive. Anda dapat mencoba menonaktifkan port sata yang sesuai di konfigurasi BIOS/UEFI Anda, jika memungkinkan, dan coba lagi. Jika berfungsi, drive akan tetap diam sampai kernel memutarnya, setelah layar grub dan sebelum prompt login pengguna, dan Anda dapat menemukannya di 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)

Pada titik ini, jika Anda meretas kernel, drive tidak akan berputar sama sekali seperti yang saya jelaskan sebelumnya.

Edit 2: Saya menemukan perintah yang lebih baik untuk memutar disk:

sg_sat_set_features --feature=7 /dev/sdX

itu bagian dari paket sg3_utils, memerlukan hak akses root, tetapi memutar disk dengan baik. Posting diperbarui di forum arch linux, itulah solusi terakhir saya untuk saat ini. Ringkasan kecil dari posting itu:

  • jika disk berkemampuan PUIS Anda berputar sebelum layar boot loader, coba nonaktifkan port sata yang sesuai, atau coba kartu pengontrol sata PCI-ex
  • kompilasi ulang kernel untuk menonaktifkan perintah yang memutar disk dalam status PUIS
  • gunakan sg_sat_set_feature untuk memutar disk
  • pindai ulang port sata untuk mendapatkan akses ke partisi

Edit 3: Seseorang yang baik hati menulis tambalan, di forum archlinux:https://bbs.archlinux.org/viewtopic.php?pid=1855326#p1855326

Transkripsi:

Jika kita tidak dapat menghindari tambalan libata, sebaiknya nonaktifkan drive PUIS saat boot untuk menghilangkan pesan kesalahan yang tak ada habisnya. Sisi negatifnya adalah kami harus memberi tahu kernel untuk mengaktifkannya kembali berdasarkan permintaan, karena alat userspace seperti sg_sat* mengharapkan entri di dalam /dev.

Lihatlah tambalan tentatif saya untuk fitur itu. Saya harap seseorang akan mempertimbangkan untuk meluangkan waktunya untuk mengolahnya menjadi standar kernel dan mengusulkannya ke hulu. Saya menulis tambalan terhadap clean v4.19.56.

Ingatlah untuk menyetel parameter kernel "libata.spinup_control=0" di bootloader setelah mengkompilasi ulang modul dan membangun kembali citra initramfs Anda!

Maka Anda harus

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

dan keluarkan pemindaian ulang ke drive yang ingin Anda putar.

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:

Penghargaan untuk az12shareart, yang mendaftar ke forum arch linux hanya untuk menulis ini, menurut saya.


Saya menelusuri hal yang persis sama beberapa tahun lalu, untuk Linux Mint dan HD lama yang juga hanya digunakan untuk penyimpanan data sesekali.

Solusi yang saya temukan (tidak lagi memiliki tautan) sama dengan yang Anda temukan:beberapa hard drive mungkin memiliki pengaturan jumper yang harus menyebabkan drive tetap tidur / tidak berputar saat boot. Tapi tidak berhasil, hasil saya sama persis dengan hasil Anda, masih berputar saat boot. Saya tidak menemukan perbaikan untuk itu, yang saya tahu itu adalah BIOS/GRUB/linux, secara terpisah atau bekerja sama, atau hanya HD itu sendiri yang tidak mendengarkan.

Saya melakukan beberapa "hot plug"/"hot swap" pengujian, menghubungkan daya ke hard drive (SATA) saat komputer menyala &berjalan. Itu menghasilkan beberapa entri log (dmesg &/var/log/syslog ) dan berhasil bekerja . Kemudian setelah selesai dengan drive (sinkronkan, unmount, sleep/hdparm -y ) mencabut daya lagi. Bekerja! Tapi ternyata membutuhkan motherboard &OS yang kompatibel, jadi YMMV.

Namun, menarik steker listrik untuk menggunakan drive tidak terlalu nyaman atau mudah, jadi saya menyambungkan sakelar lemparan satu kutub ganda - DPST, Wikipedia memiliki diagram - memiliki 4 terminal, untuk 2 kabel daya terpisah (12V &5V?), untuk memisahkan keduanya dan menyalakan/mematikan keduanya secara bersamaan. Menghubungkannya ke daya HD, saya dapat menghidupkan &mematikan drive kapan pun diperlukan.

Pembaruan:

Hot swapping digunakan untuk bekerja di Linux Mint 14/15/16, tetapi untuk beberapa alasan berhenti bekerja di 17 &lebih tinggi, saya menduga beberapa perubahan kernel menghentikannya. Sekarang hot swapping hard drive hanya berfungsi, tetapi drive terbaca sebagai corrupted , hanya power-on reboot yang membuatnya berhasil. Mungkin ada cara mudah untuk membuatnya berfungsi kembali, atau beberapa kernel yang dikompilasi ulang diperlukan dengan beberapa sakelar khusus...?

Perbarui 2

Pertukaran panas tampaknya berfungsi lagi untuk Ubuntu 16.04 (Mint 18 seharusnya juga berfungsi).


Linux
  1. Bagaimana cara mencegah pengguna menyalin file ke hard drive lain?

  2. Dari nama perangkat df ke nama drive fisik (vendor / tipe)

  3. Bagaimana mencegah proses dari menulis file

  1. Cara Boot dari Drive USB di VirtualBox di Linux

  2. Journalctl:Bagaimana Mencegah Teks Terpotong Di Terminal?

  3. Cegah Tmux Memulai Di Ssh?

  1. Salinan Dd Penuh Dari Hdd Ke Hdd?

  2. Bagaimana Mencegah `ls` Dari Menyortir Output?

  3. Cegah Sigint Mencapai Proses Anak?