Происходит то, что вы пытаетесь загрузить Linux «устаревшим» способом. Вот гдеinitrd
находится виртуальный диск, а не сжатый архив cpio, распакованный ядром в ramfs, и со старым способом переключения на конечное устройство.
В этом режиме ядро монтирует disk.img как виртуальный диск в качестве корневой файловой системы, а затем запускается /linuxrc
там. Скорее всего в вашем случае такого файла нет. Когда /linuxrc
происходит выход (который должен делать все необходимое для запуска блочного устройства для настоящей корневой файловой системы), тогда ядро монтирует настоящую корневую файловую систему.
Сообщения выше показывают , что монтирует баран диск успешно (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"
В качестве альтернативы вы можете использовать init ramfs вместо 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
в этом режиме.