Що відбувається, це те, що ви намагаєтеся завантажувати Linux "застарілим" способом. Саме тут initrd
є ramdisk на відміну від стисненого архіву cpio, розпакованого ядром у рамці, та зі старим способом переключення на кінцевий пристрій.
У цьому режимі ядро монтує disk.img як ramdisk як кореневу файлову систему, а потім виконує /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`
Тоді ядро розглядало б оперативні диски як справжню кореневу файлову систему (хоча ви все ще 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
статично пов'язана версія), і ви отримаєте оболонку та інші утиліти зайнятих у цьому ядрі).
Зауважте, що ядро зараз працює /init
на відміну від цього режиму /linuxrc
або /sbin/init
в цьому режимі.