Linuxカーネルの起動時にSATAおよびRAIDコントローラの順序を変更する

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が最初に認識されたのはただ偶然でしょうか、それとも変わることはできますか?

ベストアンサー1

私は過去にも同様の仕事をしてきました。シングルコアのディスクとネットワークカードの順序を変更することでした。

ドライバがロードされる順序は、コンパイル中にinitcall_levels(低いものから高いものまで)include/linux/init.hとMakefileの位置によって決まります。

initcall_levelsを使う余地があまりないと思います。依存関係が多すぎます。

SATAレベルdrivers/ata/libata-core.c 4subsys_initcall(ata_init)

drivers/scsi/megaraid/megaraid_sas_base.cメガサスレベル6 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/Makefilee1000と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プローブがどのように機能するかはわかりませんが、megasas_init() 最初のどこかにわずかな遅延(たとえば700ms)を追加すると、drivers/scsi/megaraid/megaraid_sas_base.cSATAディスク/ dev / sda

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

カーネルに問題がないことを願っています。私には効果がありますが、注意してください。もちろん、依存関係があり、すべてが可能なわけではありません。たとえば、drivers/message/fusion/scsiの前にmptsas()を試すとコンパイルされますが、起動時にカーネルがすぐにクラッシュすることがわかります。

お役に立てば幸いです。

おすすめ記事