啟動 linux 核心時更改 SATA 和 RAID 控制器的順序
我有板載 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 控制器上的磁碟(
sda
、sdb
、…),然後是掛在 SATA 控制器上的磁碟(sde
)。我的核心是單片的,沒有可載入的模組。是否可以告訴核心,SATA控制器上的磁碟應該是第一個(
sda
)?什麼影響訂單?這只是一個意外,LSI raid 被首先辨識,還是可以改變?
過去我正在研究類似的東西——改變磁碟和網卡的順序以實現單片核心。
驅動程序的載入順序在編譯期間決定 - 由 initcall_levels (從低到高,
include/linux/init.h
),然後由 Makefile 中的位置決定。我認為使用 initcall_levels 的空間不大 - 依賴項太多。
SATA 4 級
drivers/ata/libata-core.c
在subsys_initcall(ata_init)
MEGASAS 6 級
drivers/scsi/megaraid/megaraid_sas_base.c
在module_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/Makefile
scsi之前移動ataobj-$(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.c
SATA 磁碟成為 /開發/sdastatic int __init megasas_init(void) { int rval; msleep(700); ...
我希望它不會在核心中引起任何問題,它對我有用,但要小心。當然有依賴關係,並非一切皆有可能。例如,我知道當我
drivers/message/fusion/
在 scsi 之前嘗試 mptsas ( ) 時,它會編譯,但核心在啟動時立即崩潰。希望這可以幫助。