如何在启动过程中跳过/排除一条 SCSI 总线扫描?

如何在启动过程中跳过/排除一条 SCSI 总线扫描?

“Linux debian 3.2.0-0.bpo.3-amd64 #1 SMP Thu Aug 23 07:41:30 UTC 2012 x86_64 GNU/Linux”系统至少有 5 个 SCSI 主机:

root@debian:~# ls /sys/class/scsi_host
host0  host1  host2  host3  host4

root@debian:~# cat /sys/class/scsi_host/host0/proc_name  
mpt2sas
root@debian:~# cat /sys/class/scsi_host/host1/proc_name
ata_piix
root@debian:~# cat /sys/class/scsi_host/host2/proc_name
ata_piix
root@debian:~# cat /sys/class/scsi_host/host3/proc_name
ata_piix
root@debian:~# cat /sys/class/scsi_host/host4/proc_name
ata_piix

mpt2sas SCSI 总线连接有 32 个驱动器。启动时(重新启动后),驱动器大部分处于待机状态(转速下降)。这会导致每个驱动器按顺序旋转。典型驱动器的旋转时间为 8 至 9 秒。因此,重新启动后的启动将花费近 5 分钟。

将内核配置为异步扫描 scsi 总线GRUB_CMDLINE_LINUX="scsi_mod.scan=async"并不会改善重新启动后的启动时间。并且设置scsi_mod.scan=none使系统根本无法启动。

最终目标是通过 USB 启动,这是另一个 scsi_host:

# cat /sys/class/scsi_host/host5/proc_name
usb-storage

如何配置此系统以排除 mpt2sas 或(mpt2sas 和 ata_piix)总线在重新启动后启动期间旋转所有驱动器?

答案1

由于大型阵列位于单独类型(品牌和型号,或者更确切地说:芯片组)的控制器上,并且系统启动过程不需要其上的任何内容,因此您可以通过强制延迟控制器初始化来解决此问题。最简单的方法是将执行内核初始化的内核模块列入黑名单,然后在启动过程的最后阶段手动加载它。

笔记:非常重要的是,只能使用不包含系统正常启动所需的任何内容的控制器来完成此操作。否则,您会发现自己遇到启动失败 - 从服务无法启动或在错误的位置读取/写入文件,到彻底的内核恐慌。在实施这样的计划之前请记住这一点。

首先,找出哪个内核模块处理有问题的控制器。根据问题中提供的信息进行快速谷歌搜索表明这可能确实是该mpt2sas模块。其次,确保代码实际上被编译为模块;类似的事情find "/lib/modules/$(uname -r)" -name 'mpt2sas*' -print会做得很好。 (是的,我知道这-print是默认设置,但我喜欢明确...)使用 验证其作为已加载模块的状态lsmod | grep mpt2sas

然后,将该模块添加到模块黑名单文件中。您可以将其添加到 /etc/modprobe.d/blacklist.conf,或单独的配置文件,例如 /etc/modprobe.d/mpt2sas.conf。只需将以下行添加到这样的文件中即可。

blacklist mpt2sas

这将禁用自动的加载相关模块。我们将利用它仍然可以加载的事实手动使用例如 modprobe - 其中“手动”可以表示“来自脚本”。

在编辑器中打开 /etc/rc.local(在所有其他 rc 脚本之后执行),并在其中的某处添加以下行:

modprobe mpt2sas
mount -a

您可能希望将其放在文件的后面,但显然位于任何exit或类似的指令之前。可能mount -a需要也可能不需要,具体取决于文件系统是否实际上要在引导时安装以及它们是否在内核磁盘分区探测发现时自动安装。如果您愿意的话,您可以先尝试不使用它,并且如果系统不起作用,您可以安全地访问该系统。如果您需要任何特殊的东西来启动 RAID 或类似的东西,那就在modprobe和之间mount。如果任何特定服务需要大型阵列可用,您可以创建一个单独的 rc 脚本来启动该阵列并指定它应在启动任何此类服务之前运行。您可以通过使用类似于 的语法将其包装在子 shell 中,使其在后台执行( commands ) &,但这可能会对结果产生任何显着影响,因为分区探测是在内核中完成的。如果很少访问驱动器,您可以hdparm在安装分区后使用降速驱动器。简而言之,这是您可能想要根据您的特定需求进行定制的部分

然后,通过以 root 身份执行来更新 initramfs update-initramfs -u

如果没有出现任何故障,您现在应该能够访问reboot您的系统并享受延迟磁盘启动和分区探测的好处。

相关内容