Вопрос или проблема
Я эмулировал встроенную систему Linux FlyOS.img, которая включает загрузочный сектор DOS/MBR и два раздела. Перед этим я извлек vmlinuz и initrd.img из загрузочного раздела img. Команда qemu была выполнена следующим образом:
qemu-system-aarch64 \
-M virt \
-m 1024 \
-cpu cortex-a53 \
-kernel vmlinuz \
-initrd initrd.img \
-drive file=FlyOS.img,format=raw,if=none,id=drive0 \
-device virtio-blk-device,drive=drive0 \
-append 'root=/dev/mmcblk0p2 noresume rw' \
-nographic
Система действительно загрузила img, но она зависла на несколько секунд при монтировании корневой файловой системы, затем появилось сообщение Alert: device does not exist. Dropping to a shell! и система перешла в initramfs. Я пробовал /dev/vda2, /dev/sda2 и т.д., но ни один из них не работает. Может кто-то помочь мне выяснить точную проблему.
Ответ или решение
Проблема «qemu cannot find root device to mount» часто встречается при работе с эмуляторами, такими как QEMU, и может иметь несколько причин. Рассмотрим ваш случай, когда вы пытаетесь запустить эмуляцию встроенной системы на базе образа FlyOS.img с использованием ядра, извлеченного из загрузочного раздела.
1. Проверьте правильность устройства root
Первой причиной проблемы может быть неправильное указание устройства root. В вашем случае командная строка QEMU использует root=/dev/mmcblk0p2
, что предполагает, что ваше устройство имеет схему разбиения, аналогичную SD-карте, но при использовании виртуального устройства у вас могут быть другие обозначения.
Попробуйте следующие обозначения, в зависимости от конфигурации вашей виртуальной среды:
/dev/vda2
— для виртуального жесткого диска (VirtIO)./dev/sda2
— для стандартного SCSI-устройства.
Для получения списка доступных устройств, попробуйте выполнить в initramfs
команду ls /dev/
. Это может помочь вам найти правильное устройство.
2. Проверьте корректность разбиения образа
Убедитесь, что FlyOS.img
действительно содержит два раздела и что второй раздел (где находится корневая файловая система) правильно прописан. Вы можете использовать инструменты, такие как fdisk
или parted
, для просмотра структуры разделов образа. Выполните следующую команду:
fdisk -l FlyOS.img
Это покажет, как разделы распределены в образе. Убедитесь, что второй раздел совпадает с тем, что вы указываете в root=
.
3. Убедитесь в наличии необходимых драйверов
Так как вы используете VirtIO для устройства, убедитесь, что ваш initramfs содержит необходимые драйверы для работы с VirtIO. В некоторых случаях может потребоваться пересоздать initramfs, включив в него поддержку VirtIO.
4. Посмотрите на конфигурацию ядра
Также стоит проверить, правильно ли скомпилировано ваше ядро vmlinuz
. Оно должно поддерживать необходимые файловые системы (например, ext4, если ваша корневая файловая система на ext4) и драйверы для поддерживаемых устройств.
5. Проверьте параметры QEMU
Параметры запуска QEMU могут повлиять на работоспособность вашей конфигурации. Убедитесь, что все необходимые параметры (такие как -device
и -drive
) заданы корректно и соответствуют архитектуре и типу вашего образа.
Заключение
Если после всех вышеперечисленных проверок проблема остается нерешенной, рекомендуется обратиться к логам запуска для получения более детальной информации о том, что происходит во время процесса загрузки. Логи могут помочь выявить причину ошибки «device does not exist» и позволят более точно диагностировать проблему.
Помните, что работа с виртуальными машинами требует тщательной проверки всех параметров и настроек. Успехов в вашей работе с QEMU и FlyOS!