Configuração:
- MacOS arm64 M1 Apple Silicon como host
- Live USB com Ubuntu 20.04 amd64 em um sistema de arquivos squashfs como convidado
- Emulador QEMU no sistema operacional host
Quero retirar o sistema operacional do squashfs e inicializá-lo em uma máquina virtual AMD64 emulada no meu Mac. Consegui extrair o sistema operacional Ubuntu. Montei o squashfs e copiei o conteúdo em um arquivo img que criei usando dd. Copiei a imagem no mac mas quando tento inicializar a VM diz "Nenhum dispositivo inicializável".
Aqui estão os comandos que usei, de uma máquina virtual Linux compatível
mount -t squashfs -o loop /path/to/filesystem.squashfs /sqshfs/mount/point
Criei uma imagem vazia e fiz um ext4 fs
dd if=/dev/zeroes of=image.img bs=1M count=15000
mkfs.ext4 image.img
montei e copiei os arquivos
mount -t auto image.img /img/mount/point
cp -r /sqshfs/mount/point/* /img/mount/point
agora na imagem eu tenho essas pastas
total 112
drwxr-xr-x 2 root root 4096 Jan 10 02:37 bin
drwxr-xr-x 3 root root 4096 Jan 10 02:37 boot
drwxr-xr-x 4 root root 4096 Jan 10 02:37 dev
drwxr-xr-x 147 root root 12288 Jan 10 02:37 etc
drwxr-xr-x 3 root root 4096 Jan 10 02:37 home
lrwxrwxrwx 1 root root 33 Jan 10 02:37 initrd.img -> boot/initrd.img-5.4.0-150-generic
lrwxrwxrwx 1 root root 33 Jan 10 02:37 initrd.img.old -> boot/initrd.img-5.4.0-148-generic
drwxr-xr-x 23 root root 4096 Jan 10 02:37 lib
drwxr-xr-x 2 root root 4096 Jan 10 02:37 lib64
drwx------ 2 root root 16384 Jan 10 02:36 lost+found
drwxr-xr-x 2 root root 4096 Jan 10 02:37 media
drwxr-xr-x 2 root root 4096 Jan 10 02:37 mnt
drwxr-xr-x 5 root root 4096 Jan 10 02:37 opt
drwxr-xr-x 2 root root 4096 Jan 10 02:37 proc
drwx------ 3 root root 4096 Jan 10 02:37 root
drwxr-xr-x 2 root root 4096 Jan 10 02:37 run
drwxr-xr-x 2 root root 12288 Jan 10 02:37 sbin
drwxr-xr-x 2 root root 4096 Jan 10 02:37 snap
drwxr-xr-x 2 root root 4096 Jan 10 02:37 srv
drwxr-xr-x 2 root root 4096 Jan 10 02:37 sys
drwxr-xr-t 2 root root 4096 Jan 10 02:37 tmp
drwxr-xr-x 11 root root 4096 Jan 10 02:38 usr
drwxr-xr-x 15 root root 4096 Jan 10 02:38 var
lrwxrwxrwx 1 root root 30 Jan 10 02:38 vmlinuz -> boot/vmlinuz-5.4.0-150-generic
lrwxrwxrwx 1 root root 30 Jan 10 02:38 vmlinuz.old -> boot/vmlinuz-5.4.0-148-generic
converti o img em qcow2
qemu-img convert -f raw -O qcow2 -c image.img image.qcow2
e configurei o QEMU da seguinte maneira
qemu-system-x86_64 \
-name TEST \
-cpu qemu64-v1 \
-smp cpus=4,sockets=1,cores=4,threads=1 \
-machine pc-q35-7.2,vmport=off,i8042=off,hpet=off \
-accel tcg,thread=multi,tb-size=1024 \
-m 4096 \
-drive file=/Users/steve/VMs/image.qcow2 \
-boot menu=on
Quando tento inicializar a VM diz "Nenhum dispositivo inicializável". Sou muito novo no QEMU e sei que falta alguma coisa nesta configuração, mas deveria pelo menos tentar inicializar o kernel. GUIA?
Você não disse ao QEMU para encontrar o kernel e o initramfs diretamente e especificou
machine pc-q35-7.2
.Olhando para o código-fonte , um dos padrões para esse tipo de sistema é
firmware=bios-256k.bin
, o que significa que o sistema executará SeaBIOS, tentará inicializar como um sistema x86 clássico baseado em BIOS e procurará um Master Boot Record.Como você copiou os arquivos de uma imagem do sistema de arquivos para outra, quaisquer blocos de inicialização (que estão incorporados diretamente na imagem e não fazem parte de nenhum arquivo ) não estão presentes. Além disso, sua
image.qcow2
imagem é de um único sistema de arquivos, equivalente a apenas executá-mkfs.ext4 /dev/sda
lo sem particioná-lo primeiro. Portanto, não há tabela de partições nem registro mestre de inicialização (que está localizado fora de qualquer partição).Você poderia facilmente copiar os arquivos kernel e initramfs da imagem:
e adicione as opções do QEMU
-kernel /Users/steve/VMs/vmlinux-5.4.0-150-generic -initrd /Users/steve/VMs/initrd.img-5.4.0-150-generic
para fornecê-las diretamente ao QEMU para inicialização.Seu próximo obstáculo é que você precisaria especificar a localização do sistema de arquivos raiz para o kernel, uma vez que quaisquer UUIDs do sistema de arquivos raiz incorporados na imagem initramfs não estão mais corretos porque o sistema de arquivos não é mais o original. Portanto, você pode adicionar uma opção QEMU para especificar uma linha de comando do kernel como
-append root=/dev/sda
(imagem não particionada, lembra?) e esperar que o kernel não seja reduzido para suportar apenas squashfs para o tipo de sistema de arquivos raiz.Além disso, uma inicialização direta como essa pode não permitir que o kernel obtenha qualquer informação de configuração que normalmente receberia do BIOS, portanto, algumas coisas podem ser instáveis.
Você pode achar que seria melhor configurar uma imagem de disco particionada adequada com um gerenciador de inicialização adequado incorporado no MBR, mas pelo menos a inicialização direta da imagem do kernel será fácil de tentar. E quem sabe? Pode funcionar!