Linux カーネルがドライブをスピンアップします。 drivers/ata/libata-core.c (カーネル ソース コード) の次の行を見てください:
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;
}
これらの行にコメントを付けてカーネルを再コンパイルすると、ドライブはスピンアップしません。次に、ドライブをスピンアップするコマンドが必要になります。たとえば、hdparm が PUIS を無効にすると、ドライブがスピンアップします。このリンクを見てください。
PUIS について私が知っているのはこれだけです。
編集: grub 画面の前にドライブがスピンアップしていることに気付きました。これは、マザーボードがドライブをスピンアップしていることを意味します。 BIOS/UEFI 構成で対応する sata ポートを無効にしてみてください (許可されている場合)。動作している場合、ドライブは、カーネルがスピンアップするまで、grub 画面の後、ユーザーのログイン プロンプトの前に静止したままになります。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)
この時点で、カーネルをハッキングすると、前述のようにドライブがまったく回転しなくなります。
編集 2: ディスクを起動するためのより良いコマンドを見つけました:
sg_sat_set_features --feature=7 /dev/sdX
これは sg3_utils パッケージの一部であり、root 権限が必要ですが、ディスクを適切にスピンアップします。arch Linux フォーラムで更新された投稿は、今のところ私の最終的な解決策です。その投稿の簡単な要約:
- PUIS 対応ディスクがブートローダー画面の前にスピンアップする場合は、対応する sata ポートを無効にするか、PCI-ex satacontroller カードを試してください
- カーネルを再コンパイルして、ディスクを PUIS 状態でスピンアップするコマンドを無効にする
- sg_sat_set_feature を使用してディスクを起動します
- sata ポートを再スキャンしてパーティションにアクセスする
編集 3: 親切な人が archlinux フォーラムにパッチを書きました:https://bbs.archlinux.org/viewtopic.php?pid=1855326#p1855326
文字起こし:
libata へのパッチ適用が避けられない場合は、ブート時に PUIS ドライブを無効にして、無限のエラー メッセージを取り除くこともできます。欠点は、sg_sat* などのユーザー空間ツールは /dev 内のエントリを想定しているため、要求に応じてそれらを再度有効にするようにカーネルに指示する必要があることです。
その機能の暫定的なパッチを見てください。誰かが時間を割いてカーネル標準に合わせて作り直し、アップストリームに提案してくれることを願っています。クリーンな v4.19.56 に対するパッチを書きました。
モジュールを再コンパイルして initramfs イメージを再構築した後、ブートローダーで「libata.spinup_control=0」カーネル パラメータを設定することを忘れないでください!
echo 1 > /sys/module/libata/parameters/spinup_control
スピンアップしたいドライブに再スキャンを発行します。
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:
これを書くためだけに arch Linux フォーラムに登録した az12shareart のおかげだと思います。
数年前、Linux Mint と、時折のデータ ストレージとしてのみ使用されていた古い HD を探しました。
私が見つけた解決策 (もうリンクは手元にありません) は、あなたが見つけたように見えるものと同じでした:いくつか ハード ドライブには、すべきジャンパー設定がある場合があります ドライブがスリープ状態のままになる/起動時にスピンアップしないようにします。 でも それは機能しませんでした。私の結果はあなたのものとまったく同じでした。起動時にまだスピンアップしています。それに対する修正は見つかりませんでした。私が知っているのは、BIOS/GRUB/linux が個別に、または一緒に動作していたか、またはリッスンしていない HD 自体であったことだけです。
「ホット プラグ」/「ホット スワップ」を行いました テスト、コンピューターの稼働中に(SATA)ハードドライブに電源を接続します。いくつかのログ エントリが生成されました (dmesg &/var/log/syslog
) と 正常に動作しました .次に、ドライブの操作が完了したら (同期、アンマウント、スリープ/hdparm -y
) ) 再び電源プラグを抜きます。働いた!しかし、どうやら互換性のあるマザーボードと OS が必要なので、YMMV.
ただし、電源プラグを抜いてドライブを使用するのはあまり便利でも簡単でもないので、2極単投スイッチを配線しました-DPST、ウィキペディアには図があります-2つの別々の電源線(12V)用に4つの端子があります&5V?)、それらを別々に保ち、両方を同時にオン/オフにします。 HD の電源に接続すると、必要なときにいつでもドライブのオンとオフを切り替えることができます。
更新:
ホットスワップ使用 Linux Mint 14/15/16で動作するようにしましたが、何らかの理由で17以降で動作しなくなりました。カーネルの変更により停止したと思います。ハードドライブのホットスワップは機能しているように見えるだけですが、ドライブは壊れていると表示されるようになりました 、電源投入時の再起動のみが正常に機能します。再び動作させる簡単な方法があるかもしれません。または、いくつかの特別なスイッチを備えた再コンパイルされたカーネルが必要なのかもしれません...?
アップデート 2
ホットスワップは Ubuntu 16.04 で再び機能しているようです (Mint 18 も機能するはずです)。