Estou tentando configurar uma imagem de sistema completa para ARM ( armhf
, armel
ou mesmo aarch64
) baseada no Debian que pode ser executada com QEMU. Infelizmente, todos os exemplos que encontrei na Web iniciam a imagem passando o kernel (e possivelmente o initrd
se requer alguns módulos).
Mas, eu realmente gostaria de iniciar o sistema como é feito com qemu-system-amd64
o , apenas fornecendo a imagem do disco e a imagem do CD-ROM (para iniciar a instalação).
Eu posso entender que não há padrão para -machine
e -cpu
, mas não consigo encontrar nenhuma pista na web sobre como fazer algo como:
#> wget \
http://cdimage.debian.org/.../armhf/iso-cd/debian-testing-armhf-netinst.iso
...
#> qemu-img create -f qcow2 debian-armhf.qcow 20G
...
#> qemu-system-arm -machine vexpress-a9 -cpu cortex-a9 \
-hda debian-armhf.qcow \
-cdrom debian-testing-amd64-netinst.iso \
-boot d
...
#> qemu-system-arm -machine vexpress-a9 -cpu cortex-a9 \
-hda debian-armhf.qcow \
-net nic -net user,hostfwd=tcp::2222-:22
...
Então, eu realmente me pergunto se tal coisa é possível... E se sim, como? E se não, por quê?
Esta é uma ótima pergunta e uma que eu escolhi para me aprofundar um tempo atrás, só que para mim estava usando MIPS/MIP64.
Existem alguns problemas que tornam isso desafiador.
Ao inicializar um host Linux, o Kernel precisa entender o hardware com o qual está trabalhando. Para algumas arquiteturas (como amd64), a descoberta de firmware é tratada pelo BIOS por meio de "Configuração avançada e interface de alimentação" ( ACPI ). Em outros casos isso é tratado por uma interface de firmware extensível ( EFI ) ou mesmo ATAGS como uma solução muito antiga. Na maioria dos sistemas embarcados modernos, o uso do ATAGS foi substituído por um mecanismo chamado "blob de árvore de dispositivos" ( DTB ). Uma série de usuários úteis fez um trabalho muito melhor explicando a diferença do que eu.
O objetivo de tudo isso é ajudar o kernel quanto à configuração do hardware e geralmente funciona em conjunto com o bootloader. No seu caso, escolher entre ARM little endian (
armel
), ARM hard floating point (armhf
) e ARM 64 bit (aarch64
) é uma primeira decisão crítica, pois tem ramificações para a escolha de pacotes compilados, Kernel, etc, pois tudo precisará em conformidade com a "arquitetura do conjunto de instruções" emulada ( ISA ).Entendo que você queira a simplicidade de um disco em branco e uma imagem de CD, mas é por isso que não existem "instaladores" dessa forma para sistemas como o Raspberry Pi*. Quando você baixa uma imagem Raspbian, ela inclui um conjunto estruturado de partições que inclui um gerenciador de inicialização (das uBoot), um blob de árvore de dispositivos para o hardware correspondente e um conjunto básico de pacotes disponíveis com os repositórios de pacotes configurados.
Isso toca em outra curiosidade interessante... Você já olhou para o que aquela imagem ISO está fazendo quando você "instala" o Linux?
Deixe-me usar instaladores baseados no Anaconda (Fedora, RHEL, CentOS, etc) como exemplo.
Quando você inicia a instalação, ele inicializa um sistema ativo mínimo que automaticamente começa a executar o utilitário python Anaconda . O Anaconda então solicita ao usuário que responda a uma série de perguntas, preenche um arquivo de configuração em seu idioma específico de domínio e, em seguida, cria um chroot e executa um conjunto de instalações de pacotes dentro desse chroot.
Isso... de uma forma pequena, é como usar aquela imagem Raspbian.
Então o que isso quer dizer?
Bem, primeiro há respostas que eu recomendaria, dependendo de como você deseja proceder?
Se emular um RPi for suficiente, deixe-me sugerir: Usando QEMU para emular um Raspberry Pi
Se você quiser emular algo mais como um sistema baseado em "nuvem", George Hawkins mantém um Gist com algumas ótimas instruções .
Se você realmente quer ir do zero, o usuário do Debian Aurel32 mantém há anos um conjunto de imagens de base prontas para inicializar , bem como um ótimo artigo em seu blog de um processo semelhante .