Я скомпилировал ядро Linux и хотел отладить его в QEMU. Я создал файл для загрузки с помощью команд
$ qemu-img create -f raw disk.img 200M
$ mkfs.ext2 -F disk.img
# mkdir /mnt/rootfs
# mount -o loop disk.img /mnt/rootfs
Затем я сделал qemu -kernel bzImage -initrd disk.img
и получил экран ниже, на котором написано:
Kernel panic - not syncing: VFS: unable to mount root fs on unknown block
Что я сделал не так и что я могу сделать, чтобы это исправить?
linux-kernel
qemu
initrd
Coder404
источник
источник
Ответы:
Ядро говорит вам, что оно не знает, какое устройство содержит корневую файловую систему. Ваше крепление петли не обязательно. (Размонтируйте его, прежде чем продолжить).
Попробуйте команду как
qemu -kernel bzImage -hda disk.img -append root=/dev/sda
-hda disk.img
Параметр указывает QEMU для имитации дискового устройства на основе вашегоdisk.img
.-append root=/dev/sda
Переключатель используется QEMU , чтобы сообщить ядру о его корневом устройстве. Это делается путем добавленияroot=/dev/sda
к командной строке ядра. Вы можете сравнить это с командной строкой ядра вашего собственного ядра, выполнивcat /proc/cmdline
(Это безопасно). Тамroot
тоже должен быть параметр.источник
umount /mnt/rootfs
init
вinitrd
. Здесь вы передаетеdisk.img
как жесткий диск,initrd
который не имеет смысла.-initrd
том, что не должно быть там.Происходит то, что вы пытаетесь загрузить Linux «устаревшим» способом. Вот где
initrd
находится виртуальный диск, а не сжатый архив cpio, распакованный ядром в ramfs, и со старым способом переключения на конечное устройство.В этом режиме ядро монтирует disk.img как виртуальный диск в качестве корневой файловой системы, а затем запускается
/linuxrc
там. Скорее всего в вашем случае такого файла нет. Когда/linuxrc
происходит выход (который должен делать все необходимое для запуска блочного устройства для настоящей корневой файловой системы), тогда ядро монтирует настоящую корневую файловую систему.Сообщения выше показывают , что монтирует баран диск успешно (1,0: 1 для
ram
, так/dev/ram0
) , но не файловой системы вещественного корня / DEV / sda1 (8,1: 8sd
, 1a1
). Предположительно, поскольку вы не указали командную строку ядра (-append
), это/dev/sda1
происходит из CONFIG_CMDLINE, переданного во время компиляции ядра или с использованиемrdev
.Если ваш disk.img должен содержать корневую файловую систему, скажем, небольшой дистрибутив Linux с
/sbin/init
..., то вы, вероятно, захотите написать вместо него:Тогда ядро будет рассматривать RAM-диск как настоящую корневую файловую систему (хотя вы все еще можете
pivot_root
можете использовать другую).Чтобы было легче видеть сообщения ядра, я бы рекомендовал использовать последовательный вывод:
В качестве альтернативы вы можете использовать init ramfs вместо init ramdisk:
(при условии
busybox
статически связанная версия), и вы получите оболочку и другие утилиты busybox в этом ядре).Обратите внимание , что ядро теперь работает
/init
в противоположность/linuxrc
или/sbin/init
в этом режиме.источник
CONFIG_BLK_DEV_INITRD=y
Эта опция конфигурации ядра также требуется. Включает поддержку initrd в ядре Linux.
К счастью, Buildroot устанавливает его по умолчанию для нас, когда
BR2_TARGET_ROOTFS_CPIO=y
он предоставляется.Затем вы передаете CPIO в QEMU с
qemu -initrd
опцией. Моя полная команда QEMU:Вот минималистичный полностью автоматизированный пример Buildroot + QEMU: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b3868a3b009f2ab44fa6d3db3d174930b3cf7b69#initrd
источник