失敗したディスクを完全に無視するようにLinuxカーネル> 3.0に指示する方法は?

失敗したディスクを完全に無視するようにLinuxカーネル> 3.0に指示する方法は?

バスにはSATA HDDを搭載したSamsung Notebook(Chronos s7)があり、これはSATAインターフェースの他のさまざまなデバイスで8G SSData:1として検出されます。/dev/sdaata:2/dev/sdb

問題はSSDディスクです。

  • マザーボードにはんだ付け(取り外し可能)
  • 失敗(すべてのジョブに対してI / Oエラーのみが発生)
  • BIOSには表示されません(おそらく破損している可能性があります)。

これで、このディスクは次のようになります。

  • 失敗したディスクのスキャン中に起動が3〜5分遅れます。これは迷惑なことです。
  • しかし、最も迷惑なのは、システムが/dev/sdb中断されないことです。

私は起動時に遅延を取ることができます。私が心配するのは再開/一時停止です。


質問は次のとおりです。ata:2でデバイスを検索しないようにカーネルに指示できますか?

以前のカーネル(<3.0)には、まだソースコードを調べることができたときにhdb=ignoreこれを実行できるコマンドライン引数スタイルがありました。

以下に提案されているすべてのトリックudevとカーネルパラメータを試しましたが、libata:force成功しませんでした。特に、以下は機能しません。

  1. /etc/udev/rules.d/次のファイルのいずれかに追加します(初期実行00-ignoredisk.rules、後半実行、99-ignoredisk.rulesまたは両方の場所)。

    SUBSYSTEMS=="scsi", DRIVERS=="sd", ATTRS{rev}=="SSD ", ATTRS{model}=="SanDisk iSSD P4 ", ENV{UDISKS_IGNORE}="1" 
    

    ...でもない

    KERNEL=="sdb", ENV{UDISKS_IGNORE}="1"
    

    中間ソリューションもあまりありません。つまり、起動後にディスクにアクセスすることはできませんが、起動時にスキャンし、一時停止中にスキャンを実行して一時停止に失敗します。

  2. システムファイル/lib/udev/rules.d/60-persistent-storage.rules(およびudisksudisks2)の変更を編集する

    KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md", GOTO="persistent_storage_end"
    

    到着

    KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md|sdb*", GOTO="persistent_storage_end"
    

    繰り返しますが、これはユーザー空間からディスクを保護する効果がありますが、ディスクはカーネルに表示され続けます。

  3. 可能なすべてのパラメータの組み合わせから始めてください(まあ、たくさん)libata:force(例:findここ)DMAを無効にしたり、遅くしたり、障害が発生したディスクに関するすべての操作を実行することは機能しません。このパラメーターが使用されましたが、ディスクがまだ検出されてエラーが発生しました。

    完全な貼りudevadm info -a -n /dev/sdb付けhttp://paste.ubuntu.com/6186145/

    smartctl -i /dev/sdb -T permissive以下を提供します。

    root@samsung-romano:/home/romano# smartctl -i /dev/sdb -T permissive
    smartctl 5.43 2012-06-30 r3573 [x86_64-linux-3.8.0-31-generic] (local build)
    Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net
    
    Vendor:               /1:0:0:0
    Product:              
    User Capacity:        600,332,565,813,390,450 bytes [600 PB]
    Logical block size:   774843950 bytes
    >> Terminate command early due to bad response to IEC mode page
    

    これは明らかに間違っています。それにもかかわらず:

    root@samsung-romano:/home/romano# fdisk -b 512 -C 970 -H 256 -S 63 /dev/sdb
    fdisk: unable to read /dev/sdb: Input/output error
    

(SSDデータhttp://ubuntuforums.org/showthread.php?t=1935699&p=11739579#post11739579)。

答え1

libatanoprobe オプションはまったくありません。これは従来のIDEオプションです。

しかし、私は行ってカーネルを書いた修理するあなたのためにそれを実現しなさい。多くのカーネルで非常に簡単に動作します(上記の行は2013-05-21/v3.10-rc1 *に追加されましたが、行なしで手動で安全に適用できます)。

修正するパッチは今上流(少なくとも3.12.7安定カーネルでは)。 Ubuntu 14.04(3.13-stableベース)で配布される標準カーネルにあります。

パッチのインストール後に追加

 libata.force=2.00:disable

カーネルブートパラメータに追加すると、Linuxカーネルからディスクが非表示になります。番号が正しいことをもう一度確認してください。デバイス名を検索すると役立ちます(明らかにカーネルメッセージを確認する必要があります)。今後起動パラメータの追加):

(0)samsung-romano:~% dmesg | grep iSSD
[    1.493279] ata2.00: ATA-8: SanDisk iSSD P4 8GB, SSD 9.14, max UDMA/133
[    1.494236] scsi 1:0:0:0: Direct-Access     ATA      SanDisk iSSD P4  SSD  PQ: 0 ANSI: 5

重要な数字はata2.00上記の最初の行の数字です。

答え2

ハードウェアの問題には物理ハードウェアソリューションがあります。ドライブのはんだを取り除いたり、電源を切ったりすることを検討しましたか?

編集:まあ、これは人々が以前にハードドライブをホットプラグするために使用したオプションではなかったと思います。これを使用してドライブを無効にできます。

echo 1 > /sys/block/sdb/device/delete

他のプロセスでは、SATAバスを強制的に検索してから戻すことができます。ノートブックを休止状態にする前に、これを試してください。

OP編集:効率的な。次のファイルを追加しました。

-rwxr-xr-x 1 root root 204 Dec  6 16:03 99_delete_sdb

コンテンツ:

#!/bin/sh

# Tell grub that resume was successful

case "$1" in
    suspend|hibernate)
        if [ -d /sys/block/sdb ]; then
            echo Deleting device sdb 
            echo 1 > /sys/block/sdb/device/delete       
        fi
        ;;
esac

...これでシステムが正しく一時停止(および再開)されます。

答え3

バイオス

BIOSでデバイスがどのように表示されないのですか?

通常、ハードドライブは「自動」モードで構成されており、1つのハードドライブのみを明示的に有効にし、残りはすべて無効にしても、そのデバイスが無効になっていることを確認します。

カーネルブートオプション

通常、Linuxカーネルにスイッチに渡すことができるさまざまな起動オプションを使用して、Linuxカーネルの自動検出で起動するさまざまなサブシステムを無効にできます。

すべてではありませんが、ほとんどのオプションがここにリストされています。

Linuxの簡潔な本

O'Reillyの本を閲覧したいかもしれません。Linuxカーネルの簡単な紹介具体的には、第7章:カーネルのカスタマイズ

この本は作家Greg Kroah-Hartmanの個人的なウェブサイトで無料で利用可能です。本全体をダウンロードすることもできます。

答え4

Linuxがロックを確認する方法:(sudo hdparm -I /dev/sdXX = a..zを使用してください。もちろん、ドライブがどのデバイスであるかを知る必要があります)。 (大きい)出力が終わったら、最後の10行を読むことができるはずです*not* locked

関連情報