如何禁用驱动器的内核探测?


9

我的三星笔记本电脑在mainbord上焊接了30GB ExpressCache SanDisk SSD。SSD死了(当我尝试以某种方式访问​​它时会产生大量错误),但是它仍在内核启动中进行检测,我看到它是分区,ubuntu的统一在应用程序抽屉中显示了未安装的驱动器图标,最糟糕的是我无法暂停笔记本电脑,因为将暂挂命令发送到ssd设备失败。我试图传递sdb = noprobe内核参数,但是看起来它早已在3.8.0内核(Ubuntu 13.04)中被淘汰。如何在最近的内核中禁用sata设备?

Answers:


1

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

正确的答案是内核补丁。

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

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

安装补丁后,添加

 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中回答

您至少可以通过发出命令来解决挂起问题

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

暂停之前。

为了使其自动化,我添加了以下文件:(注意标志,它必须是可执行的)

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

在目录中 /etc/pm/sleep.d/

#!/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

...现在系统正确地挂起(并恢复)。我添加了代码段

if [ -d /sys/block/sdb ]; then
      echo Deleting device sdb 
      echo 1 > /sys/block/sdb/device/delete     
fi

/etc/rc.local过,好措施。


谢谢@ Rmano,echo的东西工作了。但是还不清楚,我应该在哪里放置99_delete_sdb可执行文件?在/etc/rc0.d/也许?
谢尔盖·梅莱欣

对不起---添加了相关信息。
Rmano

5

我去为您编写了一个内核补丁,该内核补丁实现了在引导时禁用单个磁盘的功能,因此您无需费心在udev中禁用它或在初始引导期间等待。

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

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


1
感谢您的努力。也许您可以发表评论(对于那些不太熟悉内核补丁的用户),如何应用补丁以及如何使用它(可能sdb=disable作为内核参数)。
mpy

1
kernel.org/doc/Documentation/applying-patches.txt通常涵盖了应用内核补丁,但是许多发行版都有应用补丁的特定方法。此修补程序更具体地为libata实现了“禁用”强制标志。用户将需要使用libata.force = ID:disable来使用它,其中ID是一个数字或number.number元组,用于标识所讨论的驱动器。
robbat2

我不知道以下说明是否最新:wiki.ubuntu.com/Kernel/BuildYourOwnKernel。我将在本周内尝试...
Rmano

顺便说一句,如果是三星笔记本电脑,则该命令可能应该是“ libata.force = 2.00:disable”(grep iSSD /var/log/syslog应该给您一个提示)。
Rmano 2013年

1
仅供参考,它已合并到3.13版的内核以及稳定的内核树中。但是不接受nodisable选项。
robbat2

0

我对此进行了研究,发现了可以在Ubuntu上轻松实现的解决方案。该发行版使用kmod,因此以下内容在使用kmod的发行版上都可以正常工作。

如果要禁用所有SATA设备,则需要将其列入黑名单,具体取决于所使用的驱动程序。尝试lsmod | grep sata找出正在使用的驱动程序。然后在您/etc/modprobe.d/创建的新文件echo blacklist (module) > blacklist.conf中将其添加到黑名单中。重建initramfs mkinitramfs使其生效。重启。

或者,只需添加modprobe.blacklist=(module)您的内核参数。


1
它将禁用所有sata设备(包括硬盘驱动器),因此我的笔记本电脑将无法启动。而且sata支持被编译到内核中(而不是作为模块),因此我不能将其列入黑名单。
谢尔盖·梅莱欣

好吧,那么就打开笔记本电脑并卸下驱动器...
Hector

不幸的是,我没有足够的能力来完成它-它被焊接在mainbord上,而不是通过sata电缆连接的。我什至不保证笔记本电脑只要将其卸下就可以使用。
谢尔盖·梅莱欣
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.