我有一台三星笔记本电脑 (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
可以完成此任务的样式的命令行参数。
我已经尝试了下面提出的所有技巧udev
和libata:force
内核参数,但没有成功。具体来说,以下内容不起作用:
添加到以下
/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"
也没有很多中间解决方案 --- 这使得磁盘在启动后无法访问,但在启动时会被探测,并且在挂起时仍然检查 --- 导致挂起失败。
编辑系统文件
/lib/udev/rules.d/60-persistent-storage.rules
(和udisks
,udisks2
)更改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"
同样,这会产生一些效果,从用户空间屏蔽磁盘,但磁盘对内核仍然可见。
使用所有可能的参数组合(嗯,很多)启动
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
(SSD 数据来自http://ubuntuforums.org/showthread.php?t=1935699&p=11739579#post11739579)。
答案1
libata
根本没有 noprobe 选项;那是一个遗留的 IDE 选项...
但我去写了一个内核修补为你实现它。它应该非常容易地适用于许多内核(上面的行是添加的 2013-05-21/v3.10-rc1*,但可以安全地手动应用而不需要该行)。
更新补丁现在是上游(至少在 3.12.7 稳定内核中)。它位于随 Ubuntu 14.04(基于 3.13-stable)分发的标准内核中。
安装补丁后,添加
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
上面第一行中的数字。
答案2
硬件问题有物理硬件解决方案。您是否考虑过拆焊或切断驱动器的电源?
编辑:好吧,如果这不是人们之前使用它来热插硬盘的选项。您可以使用它来禁用您的驱动器。
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
...现在系统正确挂起(并恢复)。
答案3
BIOS
该设备是否未通过您的 BIOS 以任何方式显示?
通常,硬盘驱动器配置为“自动”模式,我会检查并确保这些设备处于禁用状态,甚至达到仅显式启用一个硬盘驱动器并禁用其他所有设备的程度。
内核启动选项
通常,您可以通过使用可以作为开关传递给 Linux 内核的不同引导选项来禁用各种子系统被引导 Linux 内核自动检测。
这里列出了大多数(如果不是全部)选项:
Linux 简明书籍
你可能想浏览一下 O'Reilly 的书,Linux 内核简述, 具体来说,第 7 章:定制内核。
这本书由作者 Greg Kroah-Hartman 在他的个人网站上免费提供。整本书也可以下载。
答案4
Linux 检查锁定的方法:(sudo hdparm -I /dev/sdX
使用 X = a..z ;当然,您必须知道您的驱动器是什么设备)。在(大)输出的末尾,您必须能够在最后 10 行中读取:*not* locked
。