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

我怎样才能告诉 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……或者启动“实时”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

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

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)。

补充想法:

这一切是否是安装 Linux 之前未禁用英特尔智能响应技术的副作用?如果是,我该如何在不重新安装 Windows 的情况下检查它?或者这只是瞎猜?(在 BIOS 中,SSD 驱动器未显示,并且没有关于英特尔 SRT 的任何信息)。

关于标记为重复:

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

答案1

这里有两个解决方案:一个应用起来很快,尽管只能部分解决问题;另一个是完整的解决方案,但需要您编译自己的内核。

正确答案是内核补丁。

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 已经解决了启用暂停恢复的问题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

...现在系统可以正确暂停(并恢复)。

答案2

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

您可以尝试匹配“子系统”&“司机”钥匙,以及“ATTRS{rev}”&ATTRS{模型}属性,然后分配“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

笔记:随着环境{UDISKS_IGNORE}="1"它将忽略 Ubuntu 12.10 和 13.04 的磁盘。
对于 Ubuntu 12.04,变量将是环境{UDISKS_PRESENTATION_HIDE}="1"

希望这可以帮助。

答案3

我为您编写了一个内核补丁,实现了在启动时禁用单个磁盘的功能,这样您就不必费心在 udev 中禁用它,也不必等待初始启动时。

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

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

答案4

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

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

sudo rmmod ahci

要重新加载它,请运行:

sudo modprobe ahci

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

blacklist ahci 

要将 SSD 驱动程序列入黑名单,只需替换系统控制标准差

相关内容