我怎样才能告诉Linux内核完全忽略磁盘,就好像它没有连接一样?


18

注意

向下滚动以找到答案(虽然只有很少的几点,但这是正确的)。该问题通过一个内核3.12.7及更高版本中的补丁解决。我希望它也可以移植回早期版本。

我的笔记本电脑是Samsung Chronos系列。7. Ubuntu Gnome Remix 13.04,带有英特尔更新的驱动程序。

我的内置SSD驱动器(8G容量)有问题。它因COMRESET和输入/输出错误而失败。我完全相信问题出在硬件上。不幸的是,我没有在笔记本电脑中安装Windows来检查这是否与SSD配置有关。

问题是udev可以识别该磁盘:

KERNEL[9.515930] add      /devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sdb (block)
ACTION=add
DEVNAME=sdb
DEVPATH=/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sdb
DEVTYPE=disk
MAJOR=8
MINOR=16
SEQNUM=1785
SUBSYSTEM=block
UDEV_LOG=3

之后,它在很多检查中都失败了,从而延迟了启动,延迟了关机并使得(我认为)无法挂起。

是否可以告诉Linux完全忽略ata2链接上的任何内容?我尝试将此行添加到/etc/udev/rules.d/10-local.rules

SUBSYSTEMS=="pci"  DRIVERS=="ahci" KERNELS=="ata2" OPTIONS=="ignore_device"

但这不起作用。

另一方面,如果有人知道如何在不使用Windows的情况下将其保留在“缓存”模式下而重置SSD或引导“活动”窗口来执行相同的操作...

谢谢!

添加的数据:

完整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数据)。

其他思想:

这是否可能是在安装Linux之前未禁用英特尔智能响应技术的副作用?如果是,在没有在计算机上重新安装Windows的情况下如何检查?还是这是在黑暗中拍摄?(在BIOS中没有显示SSD驱动器,并且与Intel SRT无关。)

关于重复标记:

我更改了问题的标题;我认为链接的问题不能回答我的问题。我肯定 知道 SSD出现故障。我在问是否有可能告诉linux内核根本不进行探测。


2
如果要隐藏的磁盘是“ sdb”,请发布“ udevadm info -a -n / dev / sdb”的完整输出吗?
罗曼·拉格

1
这根本不是链接问题的重复项。您可以取消将其标记为重复项吗?我更改标题以更好地表达问题。不是关于SSD检查,而是关于Linux上磁盘管理的一般问题。谢谢!
Rmano

1
只是...拔出磁盘有什么问题?
Braiam 2013年

1
关于超级用户的类似问题:如何禁用驱动器的内核探测?
ændrük

3
Braiam:将SSD磁盘焊接到主板上。
Rmano

Answers:


14

这里有两种解决方案:一种快速应用,尽管仅部分解决了问题,另一种是完整的解决方案,但需要您编译自己的内核。

正确的答案是内核补丁。

罗宾·约翰逊(Robin H. Johnson)为SATA内核驱动程序(在Unix / Linux堆栈交换站点中找到了)编写了一个补丁,该补丁将驱动器完全隐藏了。

更新1修补程序现在位于上游(至少在3.12.7稳定内核中),请参阅 git存储库。我在Ubuntu启动板中要求反向移植

更新2该补丁位于Ubuntu Trusty Thar 14.04的标准内核中;所以现在只需要在启动参数中添加以下内容。

安装补丁后,添加

 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

要添加内核参数(临时的和永久的机器人),您可以检查以下问答:如何添加内核引导参数?

解决方法

至少由Unix StackExchange用户Emmanuel在/unix//a/103742/52205中解决了启用暂停恢复的问题。以root用户身份发出命令:

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

暂停之前。

要使其永久,请添加以下文件/etc/pm/sleep.d/并使其可执行:

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

内容:

#!/bin/sh

# Delete the failing disk so that it will not block suspend

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

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


1
谢谢您的提醒/sys/block/*/device/delete
Michael Shigorin 2014年

@kikuto ---您建议的编辑似乎有些偏离主题,但是我添加了一个链接,该链接指向如何添加内核引导参数。谢谢。
Rmano 2015年

5

您可以尝试使用以下信息创建udev规则(udevadm info -a -n / dev / sdb的输出)。

信息:

looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0':
    KERNELS=="1:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{rev}=="SSD "
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="6"
    ATTRS{model}=="SanDisk iSSD P4 "
    ATTRS{state}=="running"
    ATTRS{queue_type}=="none"
    ATTRS{iodone_cnt}=="0x309"
    ATTRS{iorequest_cnt}=="0x30a"
    ATTRS{queue_ramp_up_period}=="120000"
    ATTRS{timeout}=="30"
    ATTRS{evt_media_change}=="0"
    ATTRS{ioerr_cnt}=="0x1d6"
    ATTRS{queue_depth}=="1"
    ATTRS{vendor}=="ATA     "
    ATTRS{device_blocked}=="0"
    ATTRS{iocounterbits}=="32"

1)创建udev规则。

  • sudo nano /etc/udev/rules.d/99-hide-ssd.rules

您可以尝试匹配“ SUBSYSTEMS”“ DRIVERS”键,以及“ ATTRS {rev}”ATTRS {model}属性,然后分配“ UDISKS”变量以将其忽略。

99-hide-ssd.rules文件的内容为:

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

若要保存更改纳米... Ctrl+ O,然后Enter终于Ctrl+ X

2)最后使用以下命令刷新udev规则:

  • sudo udevadm trigger

注意:使用ENV {UDISKS_IGNORE} =“ 1”时,它将忽略Ubuntu 12.10和13.04的磁盘。
对于Ubuntu 12.04,变量将为ENV {UDISKS_PRESENTATION_HIDE} =“ 1”

希望这可以帮助。


尝试过它,仍然在启动时检测到sdb(并延迟了它)。我认为应该是一些内核行参数选项,但是我什么也没找到…… 不管怎么说,还是要谢谢你。
Rmano

@Rmano ...如果您尝试仅匹配内核密钥?规则为KERNEL ==“ sdb”,ENV {UDISKS_IGNORE} =“ 1” ...以查看是否在udev中检测到磁盘。
罗曼·拉格

我知道是很多时间了。但是这个问题仍然没有答案...所有建议都没有奏效。还是谢谢你。
Rmano

2

/server/112147/tell-ubuntu-to-ignore-dead-hard-drive-during-booting部分建议:

以root用户身份,使用您喜欢的文本编辑器打开/etc/udev/rules.d/60-persistent-storage.rules

在下面几行中,您可能会看到类似以下的行:

跳过不合适的块设备的规则

KERNEL ==“ ram * | loop * | fd * | nbd * | gnbd * | dm- | md ”,GOTO =“ persistent_storage_end” 将“ sdb *”添加到第二行,因此如下所示:

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

保存,重新启动,也许可以用。如果不是,那么,此保修后吗?


试了一下,没有运气。仍然有sdb驱动器,仍然阻止挂起。从前存在一个sdb = ignore内核命令行选项...不幸的是,这是保修期。
Rmano

顺便说一句,我没有该文件,所以我添加了它……
Rmano

2

如果其他磁盘未使用ahci或不是SSD,则可以删除它们的内核驱动程序。

要删除该会话(直到下次重新启动),请运行:

sudo rmmod ahci

重新加载它,运行:

sudo modprobe ahci

如果您发现一切正常,则可以将其完全禁用(不要在下次启动时加载)。打开文件/etc/modprobe.d/blacklist.conf,并添加以下行:

blacklist ahci 

将ssd驱动程序列入黑名单,只需将ahci替换为sd


2
这将使我的系统没有任何磁盘...主驱动器已打开ata1,而ssd却已打开ata2。在BIOS中禁用ahci模式会使系统无法启动...
Rmano

1

据我所知,除了删除SSD之外,没有其他方法可以删除消息。


不幸的是,(据我所知)SSD焊接到了主板上。它只是一个8G芯片。
Rmano

切掉芯片上的一根LED,最好找到+ 5V线,然后用X-Acto切掉?
2013年

...如果我只知道哪个芯片以及它在哪里。然后,我担心这会产生更多的问题(无驱动的三态...)。
Rmano 2013年

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.