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()を試すとコンパイルされますが、起動時にカーネルがすぐにクラッシュすることがわかります。

お役に立てば幸いです。

答え2

udevなしでこれを達成する唯一の方法は、カーネルがロードするドライバの順序を変更することです。 「モノリシック」カーネルを使用しようとしているので、これは簡単ではないかもしれません。ドライバをモジュールにロードする場合は、各モジュールの順序を変更できますが、/etc/modprobe.*これはディスクに別のドライバが必要な場合にのみ役立ちます。同じドライバを使用して別のディスクを追加すると、同じ問題が再発生します。

systemd-udevを使用するシステムでは、デバイス名を以前とは異なるsd *に変更することはできません(またはgentooやalpineのOpenRCやdevuanのSysVInitなどの現在の非システムディストリビューションでは可能です)。

なぜデバイス名を指定するのですか/dev/sda/dev/disk/by-*/*独自のudevルールを使用または作成して独自のシンボリックリンクを作成することはできませんか?どのディストリビューションを使用していますか?

いくつかのリンク:

関連情報