Это может произойти, если неправильно определяется геометрия виртуального диска . Сначала попробуйте перезагрузиться, прежде чем продолжить.
Предупреждение:Я не думаю, что это может быть вредно для вашего 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
и напишите новую таблицу разделов для исправления.
Перезагрузитесь, если изменения не обнаружены правильно.
В прошлом я искал нечто подобное -изменение порядка дисков и сетевых карт для монолитного ядра.
Порядок загрузки драйверов определяется во время компиляции -с помощью 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, это компилируется, но ядро сразу падает при загрузке.
Надеюсь, это поможет.
Единственный способ добиться этого без udev — изменить порядок загрузки драйверов ядром. Поскольку вы хотите использовать «монолитное» ядро, это, вероятно, не так просто. Если бы вы загружали драйверы как модули, вы могли бы изменить порядок модулей в соответствии с /etc/modprobe.*
, но это помогает только в том случае, если для дисков требуются разные драйверы. Если вы добавите другой диск с тем же драйвером, у вас снова возникнет та же проблема.
В системах, использующих systemd -udev, больше невозможно изменить имя устройства -на другой sd *, как вы могли раньше (или, возможно, в текущих не -systemd -такие дистрибутивы, как OpenRC на gentoo или alpine или SysVInit на devuan, …)
Почему необходимо, чтобы устройство называлось /dev/sda
? Разве вы не можете использовать /dev/disk/by-*/*
или написать собственные правила udev -для создания собственных символических ссылок? Какой дистрибутив вы используете?
несколько ссылок: