如何告诉linux内核完全忽略磁盘,好像它甚至没有连接?

注意

请向下滚动查看答案 (它有几点,但它是正确的)。 这个问题是通过内核3.12.7及更高版本的补丁来解决的。 我希望它也会回溯到早期版本。

我的笔记本电脑是三星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之前,所有这些都是英特尔智能响应技术未被禁用的副作用吗? 如果是,如何在机器上重新安装窗户时检查它? 或者这是在黑暗中拍摄的? (在SSD驱动器没有显示的BIOS中,没有关于英特尔SRT的信息)。

关于标记为重复:

我改变了问题的标题; 我不认为链接的问题能解决我的问题。 我肯定知道 SSD失败了。 我问是否有可能告诉linux内核根本不调查它。

这里有两个解决方案:一个是快速应用,虽然只是部分地解决了问题,另一个是完整的,但需要你编译自己的内核。

正确答案是内核补丁。

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

更新1补丁现在是上游(至少在3.12.7稳定内核中),请参阅git存储库 。 我在Ubuntu启动板中询问了backport 。

更新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 

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

解决方法

至少启用挂起恢复的问题已由Unix StackExchange用户Emmanuel在https://unix.stackexchange.com/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 

…现在系统正常暂停(并恢复)。

您可以尝试使用以下信息创建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”

要保存nano中的更改… 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”

希望这可以帮助。

https://serverfault.com/questions/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”

保存,重启,也许它有效。 如果没有,那么,这是保修后的吗?

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

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

 sudo rmmod ahci 

重新加载,运行:

 sudo modprobe ahci 

如果你发现一切都很顺利,你现在可以完全禁用它(不要在下次启动时加载它)。 打开文件/etc/modprobe.d/blacklist.conf ,并添加以下行:

 blacklist ahci 

要将ssd驱动程序列入黑名单,只需用sd替换ahci即可

据我所知,除了删除SSD之外,没有办法删除消息。

我去为你写了一个内核补丁,它实现了在启动时禁用单个磁盘的能力,这样你就不必费心在udev中禁用它,或者在初始启动期间等待。

http://dev.gentoo.org/~robbat2/patches/3.13-libata-disable-disks-by-param.patch

应该很容易应用于许多内核(上面的行添加了2013-05-21 / v3.10-rc1 *,但可以安全地手动应用,不需要该行)。