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


23

我有一台三星笔记本电脑(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(和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(例如,在此处找到)以禁用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
    

(来自http://ubuntuforums.org/showthread.php?t=1935699&p=11739579#post11739579的 SSD数据)。


很抱歉,如果这太明显了,但是由于您还没有包括在您的问题中:是否确定未在其中列出设备名称或UUID /etc/fstab?因为启动延迟可能是由内核或udev引起的,这似乎是这种情况,但在读取时也可能由fsck引起fstab
Teresa e Junior

是的,系统文件中没有提到/ dev / sdb(或其分区)。延迟甚至 init开始之前 ...它在kthread中(因为引导并行进行),但是它处于更基本的级别。但是实际上启动延迟是问题的小问题-如果在挂起/恢复期间只要我可以忽略磁盘,以便挂起工作,我会很高兴的。(不管怎么说,还是要谢谢你)。
Rmano

您正在使用initrd吗?如果是这样,谁?
hildred

@hildred:我正在使用来自Ubuntu 13.04的股票内核和initramfs。我可以在那里禁用AHCI或所有SATA,但随后我的系统就死了---根本没有磁盘。
Rmano

Debian(和Umbutu)将ata子系统编译为模块。您是否曾尝试通过initrd加载模块时为模块设置参数?
hildred

Answers:


26

libata根本没有noprobe选项;那是传统的IDE选项...

但是我去写了一个内核补丁来实现它。它应该非常容易地应用于许多内核(它的上一行是在2013-05-21 / v3.10-rc1 *中添加的,但是可以安全地手动应用而无需该行)。

更新修补程序现在位于上游(至少在3.12.7稳定内核中)。它位于随Ubuntu 14.04(基于3.13稳定版)一起分发的标准内核中。

安装补丁后,添加

 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上面第一行中的。


非常感谢。我一记起如何在Ubuntu上编译并安装内核,便会尝试对其进行检查。不幸的是,我将有一个非常复杂的一周……
Rmano

1
+1显然比我发布的技巧要好。我希望它将成为正式。
伊曼纽尔

1
好,测试了补丁。有用。如果您需要将其推送到上游,我可以将我的Tested-:添加到补丁--您的个人资料中有我的真实电子邮件。我按照wiki.ubuntu.com/Kernel/BuildYourOwnKernel中的说明安装了它(带有怪癖)。
Rmano

1
@illuminÉ---只是在某种意义上编辑了答案---等待它被批准。
Rmano 2014年

1
喜欢GENTOO的另一个原因!
eyoung100 2014年

15

硬件问题有物理硬件解决方案。您是否考虑取消焊接或切断驱动器的电源?

编辑:好的,如果那不是人们在热插拔硬盘之前使用的选项。您可以使用它来禁用驱动器。

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

...现在系统正确地挂起(并恢复)。


1
如果这是真的。我什至无法说出SSD驱动器是哪个芯片-大多数都没有标记。为芯片断电并不安全---非驱动的三态引脚怎么办?我打开笔记本电脑,希望将SSD驱动器连接到某种子板上。没运气。(此外,编写内核驱动程序的大多数困难是解决设计不良的硬件)。
Rmano

@Rmano如何执行“删除”技巧?
伊曼纽尔

IT WORKS ---“删除”把戏后,我可以暂停。非常感谢。(它仍然会延迟启动,但是---不是问题)。
Rmano 2013年

非常感谢您的提醒delete
Michael Shigorin 2014年

3

的BIOS

此设备是否不会通过BIOS以任何方式显示?

通常,将HDD配置为“自动”模式时,我会仔细检查并确保这些设备处于禁用状态,甚至可以明确地仅启用一个HDD并禁用其他所有功能。

内核启动选项

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

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

简而言之Linux

您可能需要浏览O'Reilly的书《坚果壳中的Linux内核》,特别是第7章:自定义内核

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


不,BIOS没有该磁盘的任何痕迹。我只能看到HDD和DVD。在发生故障之前,在Windows(现在系统中不再有窗口)中,它被用作主磁盘的加速缓存。我试图将AHCI模式设置为legacy,off,yes或auto(对于所有磁盘),但没有做任何更改或(for off)只是使系统无法启动。
Rmano

我过去使用的另一种方法是启动内核时,通过Grub(内核启动选项)将其告知noide=....。您可以提供许多其他选项给引导内核,以禁用硬件的自动检测。
slm

磁盘是SATA(scsi),没有IDE。而且hdb=noprobe选项尚未通过scsi(我认为在2.6.x左右已被淘汰),因此(据我所知)它不存在a sdb=noprobeata:2=noprobe选项。我已经(几乎)阅读kernel-parameters.txt了内核源代码中的所有文件,但找不到正确的参数。如果您认识任何人,请在回答中告诉它---我将非常感谢。
Rmano

@Rmano-我必须进一步挖掘才能找到它,我确实记得几个与HDD和总线检测有关的选项,但并不是最想知道的。
slm

@Rmano-选项如何:libata.dma=
slm

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.