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 규칙을 사용하거나 작성하여 자신만의 심볼릭 링크를 생성 할 수 없나요 ? 어떤 배포판을 사용하고 있습니까?

일부 링크:

관련 정보