O que está acontecendo é que você está tentando inicializar o Linux da maneira "Obsoleta". É aí que o initrd
é um ramdisk ao contrário de um arquivo compactado do cpio 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 então executa /linuxrc
nele. Muito provavelmente no seu caso, não existe tal arquivo. Quando /linuxrc
(que deveria fazer o que for necessário para ativar o dispositivo de bloco para o sistema de arquivos raiz real) é encerrado, o kernel monta o sistema de arquivos raiz real.
As mensagens acima mostram que ele monta o disco de RAM com sucesso (1,0: 1 é para ram
, então /dev/ram0
) mas não o sistema de arquivos raiz real / dev / sda1 (8,1: 8 é sd
, 1 é a1
). Presumivelmente, uma vez que você não especificou uma linha de comando do kernel ( -append
), esse /dev/sda1
vem de um CONFIG_CMDLINE passado no tempo de compilação do kernel ou usando rdev
.
Se o seu disk.img estiver destinado a conter um sistema de arquivos raiz, digamos, uma pequena distribuição Linux com /sbin/init
..., você provavelmente desejará escrevê-lo:
kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0'
Em seguida, o kernel trataria o disco da RAM como o sistema de arquivos raiz real (embora você ainda possa usar pivot_root
para outro).
Para poder ver as mensagens do kernel com mais facilidade, recomendo usar a saída serial:
kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0"
Como alternativa, você poderia usar um init ramfs em vez de um disco de inicialização:
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
(desde que busybox
seja a versão estaticamente vinculada) e você terá um shell e outros utilitários do busybox nesse kernel).
Observe que o kernel agora executa /init
em oposição a /linuxrc
ou /sbin/init
nesse modo.