Ядро Linux не находит initrd правильно

Я скомпилировал ядро ​​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 и получил экран ниже

Мой экран QEMU

Что я сделал не так, и что я могу сделать, чтобы исправить это?

  • ssh от хоста до гостя, используя qemu
  • Не удается получить Qemu через SSH
  • Как улучшить производительность 2D-графики с помощью Android-x86, работающего на KVM?
  • Действительно легкий вес для VM без расширений
  • Изменение файлов внутри моментального снимка (файл qemu img)
  • Почему QEMU не может использовать память буферов памяти Linux?
  • Как загружать ядро ​​EFI с помощью QEMU (kvm)?
  • Как я могу вкрутить в файловую систему с другой архитектурой?
  • 2 Solutions collect form web for “Ядро Linux не находит initrd правильно”

    Ядро сообщает вам, что он не знает, какое устройство содержит корневую файловую систему. Ваша петля не нужна. (Отключите его, прежде чем продолжить).

    Попробуйте выполнить команду типа

    qemu -kernel bzImage -hda disk.img -append root=/dev/sda

    Параметр -hda disk.img сообщает qemu моделировать дисковое устройство на основе вашего disk.img .

    Переключатель -append root=/dev/sda используется qemu, чтобы сообщить ядру о его корневом устройстве. Это делается путем добавления root=/dev/sda в root=/dev/sda ядра. Вы можете сравнить это с командной строкой ядра вашего собственного ядра, выполнив cat /proc/cmdline (это безопасно). Вы должны увидеть и root параметр.

    Что происходит, так это то, что вы пытаетесь загрузить Linux в «устаревшем» виде. Именно здесь initrd является ramdisk, а не сжатым архивом cpio, распакованным ядром в ramfs, и старым способом переключения на конечное устройство.

    В этом режиме ядро ​​монтирует disk.img как ramdisk в качестве корневой файловой системы, а затем выполняет /linuxrc там. Скорее всего, в вашем случае нет такого файла. Когда /linuxrc (который должен делать все, что необходимо для создания блочного устройства для реальной корневой файловой системы), выходит, тогда ядро ​​монтирует настоящую корневую файловую систему.

    Вышеприведенные сообщения показывают, что он успешно монтирует диск ram (1,0: 1 для ram , поэтому /dev/ram0 ), но не настоящая корневая файловая система / dev / sda1 (8,1: 8 – sd , 1 – a1 ). Предположительно, поскольку вы не указали командную строку ядра ( -append ), что /dev/sda1 происходит из CONFIG_CMDLINE, переданного во время компиляции ядра или с помощью rdev .

    Если ваш disk.img предназначен для размещения корневой файловой системы, например, небольшого дистрибутива Linux с /sbin/init …, то вы, вероятно, захотите написать ее вместо этого:

     kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0` 

    Затем ядро ​​будет обрабатывать диск ram как реальную корневую файловую систему (хотя вы все равно можете pivot_root к другому).

    Чтобы легче видеть сообщения ядра, я бы рекомендовал использовать последовательный вывод:

     kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0" 

    В качестве альтернативы вы можете использовать ramfs init вместо init ramdisk:

     mkdir -p RAMFS/{bin,dev} cd RAMFS/bin cp /bin/busybox . "$PWD/busybox" --install . cd .. cp -a /dev/{null,tty,zero,console} dev printf '%s\n' "#! /bin/sh" "exec /bin/sh" > init chmod +x init find . | cpio -oHnewc | gzip > ../initramfs.gz cd .. kvm -kernel kernel.img -initrd initramfs.gz 

    (при условии, что busybox является статически связанной версией), и вы получите оболочку и другие утилиты busybox в этом ядре).

    Обратите внимание, что теперь ядро ​​запускает /init в отличие от /linuxrc или /sbin/init в этом режиме.

    Linux и Unix - лучшая ОС в мире.