O que está acontecendo é que você está tentando inicializar o Linux da maneira "Obsoleta". É aí que initrd
existe um ramdisk em oposição a um arquivo cpio compactado descompactado pelo kernel em um ramfs e com a maneira antiga de mudar para o dispositivo final.
Nesse modo, o kernel monta o disk.img como um ramdisk como o sistema de arquivos raiz e depois é executado /linuxrc
nele. Provavelmente no seu caso, não existe esse arquivo. Quando /linuxrc
(que é suposto fazer o que for necessário para abrir o dispositivo de bloco para o sistema de arquivos raiz real) sai, o kernel monta o sistema de arquivos raiz real.
As mensagens acima mostram que ele monta o disco ram com êxito (1,0: 1 é para ram
, portanto /dev/ram0
), mas não o sistema de arquivos raiz real / dev / sda1 (8,1: 8 é sd
, 1 é a1
). Presumivelmente, como você não especificou uma linha de comando do kernel ( -append
), que /dev/sda1
vem de um CONFIG_CMDLINE transmitido no momento da compilação ou uso do kernel rdev
.
Se o seu disk.img deve conter um sistema de arquivos raiz, como por exemplo uma pequena distribuição Linux com /sbin/init
..., provavelmente você deseja escrevê-lo:
kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0`
Então, o kernel trataria o disco ram como o sistema de arquivos raiz real (embora você ainda possa usar pivot_root
outro).
Para poder ver as mensagens do kernel mais facilmente, eu recomendo usar a saída serial:
kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0"
Como alternativa, você pode usar um init ramfs em vez de um 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
(fornecida busybox
é a versão vinculada estaticamente) e você obterá um shell e outros utilitários do busybox nesse kernel).
Observe que o kernel agora roda /init
em oposição a /linuxrc
ou /sbin/init
nesse modo.