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

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

我有一台三星笔记本电脑,主板上焊接了 30GB ExpressCache SanDisk SSD。SSD 坏了(当我尝试以某种方式访问​​它时,会出现大量错误),但它仍然在内核启动时被探测到,我看到了它的分区,ubuntu 的 unity 在应用程序抽屉中显示未安装的驱动器图标,最糟糕的是,我无法暂停笔记本电脑,因为向 ssd 设备发送暂停命令失败。我尝试传递 sdb=noprobe 内核参数,但它似乎在 3.8.0 内核(Ubuntu 13.04)中早已过时了。如何在最近的内核中禁用 sata 设备?

答案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为了更好的衡量。

答案2

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

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

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

答案3

我对此进行了研究,并找到了一个可以在 Ubuntu 上轻松实现的解决方案。该发行版使用 kmod,因此下面的操作应该可以很好地在该发行版以及使用 kmod 的任何发行版上运行。

根据你使用的驱动程序,你需要黑名单如果您想禁用所有 SATA 设备,请执行此操作。尝试lsmod | grep sata找出您正在使用的驱动程序。然后在您的文件中/etc/modprobe.d/创建一个新文件,将echo blacklist (module) > blacklist.conf其添加到黑名单中。使用重建您的 initramfsmkinitramfs以使其生效。重新启动。

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

相关内容