изменить порядок контроллеров SATA и RAID при загрузке ядра Linux

Это может произойти, если неправильно определяется геометрия виртуального диска . Сначала попробуйте перезагрузиться, прежде чем продолжить.

Предупреждение:Я не думаю, что это может быть вредно для вашего USB-ключа, но если вы не хотите рисковать, сначала проверьте форматирование в Windows.

В этом руководстве предполагается, что вы пользуетесь автомобилем /dev/sdb, адаптируйте его к своим потребностям.
В терминале найдите в выводе dmesgтакую ​​строкуsd 5:0:0:0: [sdb] 62545920 512-byte logical blocks: (32.0 GB/29.8 GiB)
Это говорит вам:

  • Количество секторов (логических блоков):62545920
  • Размер сектора:512байт
  • Реальный размер носителя:32.0 GB/29.8 GiB

Теперь вычислите точный размер носителя в байтах:62545920 * 512 = 32023511040 bytes = 30540 MiB(29,82 ГБ ).
Затем найдите правильную комбинацию CHS, ведущую кC * H * S = 62545920
Или, если вы чувствуете лень, с размером блока 512 байт это должно работать:C=30540(размер в МиБ! ), H=64иS=32

Наконец, запустите sudo fdisk -C 30540 -H 64 -S 32и напишите новую таблицу разделов для исправления.
Перезагрузитесь, если изменения не обнаружены правильно.

2
24.10.2020, 05:51
2 ответа

В прошлом я искал нечто подобное -изменение порядка дисков и сетевых карт для монолитного ядра.

Порядок загрузки драйверов определяется во время компиляции -с помощью initcall _уровней (от низшего к высшему, include/linux/init.h), а затем позиции в Makefile.

Я не думаю, что есть много места для игры с уровнями initcall _-слишком много зависимостей.

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перемещение ata перед scsi

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

следует сначала изменить порядок хост-контроллеров (SATA ). Проверить по

ls -l /sys/class/scsi_host/
lsscsi

Но даже при наличии SATA в качестве host0 диски на контроллере LSI были найдены во-первых, я не уверен, как работает асинхронный зонд SCSI, но добавление небольшая задержка (напр. 700 мс )где-то в начале megasas_init()в drivers/scsi/megaraid/megaraid_sas_base.cсделал диск SATA /dev/sda

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

Я надеюсь, что это не вызовет проблем в ядре, у меня это сработало, но осторожный. Конечно есть зависимости, не все возможно. Например Я знаю, что когда я пробовал mptsas(drivers/message/fusion/)до scsi, это компилируется, но ядро ​​сразу падает при загрузке.

Надеюсь, это поможет.

3
18.03.2021, 22:55

Единственный способ добиться этого без udev — изменить порядок загрузки драйверов ядром. Поскольку вы хотите использовать «монолитное» ядро, это, вероятно, не так просто. Если бы вы загружали драйверы как модули, вы могли бы изменить порядок модулей в соответствии с /etc/modprobe.*, но это помогает только в том случае, если для дисков требуются разные драйверы. Если вы добавите другой диск с тем же драйвером, у вас снова возникнет та же проблема.

В системах, использующих systemd -udev, больше невозможно изменить имя устройства -на другой sd *, как вы могли раньше (или, возможно, в текущих не -systemd -такие дистрибутивы, как OpenRC на gentoo или alpine или SysVInit на devuan, …)

Почему необходимо, чтобы устройство называлось /dev/sda? Разве вы не можете использовать /dev/disk/by-*/*или написать собственные правила udev -для создания собственных символических ссылок? Какой дистрибутив вы используете?

несколько ссылок:

1
18.03.2021, 22:55

Теги

Похожие вопросы