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

Rma*_*ano 20 boot ssd disk-management udev

注意

向下滚动以获取答案(它有几点但它是正确的)。该问题通过将在内核 3.12.7 及更高版本中的补丁解决;我希望它也能移植到早期的版本。

我的笔记本电脑是三星 Chronos 系列 s 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
Run Code Online (Sandbox Code Playgroud)

之后它在许多检查中失败,延迟启动,延迟关闭,并使(我认为)无法挂起。

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

SUBSYSTEMS=="pci"  DRIVERS=="ahci" KERNELS=="ata2" OPTIONS=="ignore_device"
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

另一方面,如果有人知道如何在不使用 Windows 的情况下将 SSD 置于“缓存”模式时如何重置 SSD……或者启动“实时”Windows 以执行相同操作……

谢谢!

数据补充:

完整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
Run Code Online (Sandbox Code Playgroud)

这显然是错误的。尽管如此:

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
Run Code Online (Sandbox Code Playgroud)

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

其他想法:

在安装 Linux 之前,所有这一切都是英特尔智能响应技术没有被禁用的副作用吗?如果是,除了在机器上重新安装 Windows 之外,我如何检查它?或者这是在黑暗中拍摄?(在 bios 中没有显示 SSD 驱动器,也没有关于英特尔 SRT 的信息)。

关于标记为重复:

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

Rma*_*ano 18

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

正确答案是内核补丁。

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

更新 1补丁现在在上游(至少在 3.12.7 稳定内核中),请参阅 git 存储库。我在 Ubuntu launchpad 中要求向后移植

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

安装补丁后,添加

 libata.force=2.00:disable
Run Code Online (Sandbox Code Playgroud)

内核引导参数将隐藏磁盘对 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
Run Code Online (Sandbox Code Playgroud)

要添加内核参数(临时和永久),您可以查看此问答:如何添加内核启动参数?

解决方法

至少启用挂起恢复的问题已被 Unix StackExchange 用户 Emmanuel 在https://unix.stackexchange.com/a/103742/52205 中解决。以 root 身份发出以下命令:

echo 1 > /sys/block/sdb/device/delete
Run Code Online (Sandbox Code Playgroud)

暂停前。

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

-rwxr-xr-x 1 root root 204 Dec  6 16:03 99_delete_sdb
Run Code Online (Sandbox Code Playgroud)

内容:

#!/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
Run Code Online (Sandbox Code Playgroud)

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


Rom*_*uet 5

您可以尝试使用以下信息创建 udev 规则(udevdm 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"
Run Code Online (Sandbox Code Playgroud)

1)创建 udev 规则。

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

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

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

子系统=="scsi", 驱动程序=="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"

希望这可以帮助。