Kernel

啟動 linux 核心時更改 SATA 和 RAID 控制器的順序

  • October 26, 2021

我有板載 SATA 控制器,還有一個額外的 RAID 控制器卡:

00:17.0 SATA controller: Intel Corporation Device a282
...
04:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)

當 linux 核心啟動時,首先辨識/列舉連接在 LSI RAID 控制器上的磁碟(sdasdb、…),然後是掛在 SATA 控制器上的磁碟(sde)。

我的核心是單片的,沒有可載入的模組。是否可以告訴核心,SATA控制器上的磁碟應該是第一個(sda)?

什麼影響訂單?這只是一個意外,LSI raid 被首先辨識,還是可以改變?

過去我正在研究類似的東西——改變磁碟和網卡的順序以實現單片核心。

驅動程序的載入順序在編譯期間決定 - 由 initcall_levels (從低到高,include/linux/init.h),然後由 Makefile 中的位置決定。

我認為使用 initcall_levels 的空間不大 - 依賴項太多。

SATA 4 級drivers/ata/libata-core.csubsys_initcall(ata_init)

MEGASAS 6 級 drivers/scsi/megaraid/megaraid_sas_base.cmodule_init(megasas_init)

System.map 中的指針:

ffffffff829545cd t megasas_init
ffffffff8295547c t ata_init
ffffffff829e7688 t __initcall_megasas_init6
ffffffff829e8288 t __initcall_ata_init4

更改 Makefile 中的順序應該是一個選項,例如drivers/net/ethernet/intel/Makefile切換 e1000 和 e1000e 的行將更改 eth0 和 eth1 的順序(使用 net.ifnames=0)

obj-$(CONFIG_E1000) += e1000/
obj-$(CONFIG_E1000E) += e1000e/

所以在drivers/Makefilescsi之前移動ata

obj-$(CONFIG_ATA)               += ata/
obj-y                           += scsi/

應該更改主機控制器的順序(首先是 SATA)。檢查方式

ls -l /sys/class/scsi_host/
lsscsi

但是,即使將 SATA 作為主機 0,首先找到了 LSI 控制器上的磁碟,我不確定非同步 SCSI 探測是如何工作的,但是在開始的某處添加一點延遲(例如 700 毫秒)megasas_init() 使drivers/scsi/megaraid/megaraid_sas_base.cSATA 磁碟成為 /開發/sda

static int __init megasas_init(void)
{
       int rval;
       msleep(700);
...

我希望它不會在核心中引起任何問題,它對我有用,但要小心。當然有依賴關係,並非一切皆有可能。例如,我知道當我drivers/message/fusion/在 scsi 之前嘗試 mptsas ( ) 時,它會編譯,但核心在啟動時立即崩潰。

希望這可以幫助。

引用自:https://unix.stackexchange.com/questions/616131