Ядро 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

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

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 в этом режиме.

  • Установка qemu-user-static и binfmt-поддержки внутри LXC
  • QEMU с многоканальным звуком (5.1 и так далее)
  • Загрузка grub legacy через qemu с использованием pxe
  • Погрузитесь в исходный код qemu для отслеживания запросов io
  • Libvirt: нет возможности использовать isa bus?
  • Эмулировать отсоединение сетевого кабеля с помощью qemu-kvm
  • virt-manager копировать и вставлять, можно отключить его?
  • QEMU не запускается при выполнении в фоновом режиме внутри сценария оболочки
  • Разрешение Virt-manager Отказано при доступе к пулу NFS
  • Эмуляция Sun UltraSparc IIIi Solaris 5.10
  • Debian 8 устанавливается в гостевой системе QEMU / KVM из-за ошибок ext4-fs / "только для чтения файлов"
  • Linux и Unix - лучшая ОС в мире.