如何告诉 Linux Kernel > 3.0 完全忽略故障磁盘?

如何告诉 Linux Kernel > 3.0 完全忽略故障磁盘?

我有一台三星笔记本电脑 (Chronos s7),总线上有一个 SATA 硬盘ata:1,被检测为/dev/sda、 、 上的 8G SSD ata:2/dev/sdb以及 SATA 接口其余部分上的各种其他设备。

问题是SSD盘

  • 焊接到主板上(不可移动)
  • 失败(它只是为任何操作提供 I/O 错误)
  • 它没有出现在BIOS中(可能是因为它坏了)

现在这个磁盘:

  • 尝试探测故障磁盘时将启动延迟三到五分钟,这很烦人;
  • 但最烦人的是系统因/dev/sdb失败而无法挂起。

请注意,我可以忍受启动时的延迟——让我担心的是恢复/挂起的事情。


所以问题是:我可以告诉内核避免探测 ata:2 上的设备吗?

在较旧的内核(<3.0)中,当我仍然能够深入研究源代码时,有一个hdb=ignore可以完成此任务的样式的命令行参数。

我已经尝试了下面提出的所有技巧udevlibata: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(和udisks, udisks2)更改

    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(例如找到这里)以禁用 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

libata根本没有 noprobe 选项;那是一个遗留的 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

该设备是否未通过您的 BIOS 以任何方式显示?

通常,硬盘驱动器配置为“自动”模式,我会检查并确保这些设备处于禁用状态,甚至达到仅显式启用一个硬盘驱动器并禁用其他所有设备的程度。

内核启动选项

通常,您可以通过使用可以作为开关传递给 Linux 内核的不同引导选项来禁用各种子系统被引导 Linux 内核自动检测。

这里列出了大多数(如果不是全部)选项:

Linux 简明书籍

你可能想浏览一下 O'Reilly 的书,Linux 内核简述, 具体来说,第 7 章:定制内核

这本书由作者 Greg Kroah-Hartman 在他的个人网站上免费提供。整本书也可以下载。

答案4

Linux 检查锁定的方法:(sudo hdparm -I /dev/sdX使用 X = a..z ;当然,您必须知道您的驱动器是什么设备)。在(大)输出的末尾,您必须能够在最后 10 行中读取:*not* locked

相关内容