Existe alguma imagem pré-construída do QEMU Ubuntu (32 bits) online?

12

Eu estou jogando com QEMU. Aqui encontrei algumas imagens pré-construídas do sistema operacional:

http://docs.openstack.org/trunk/openstack-compute/admin/content/starting-images.html

Mas todos eles são voltados para um sistema de 64 bits enquanto o meu sistema é de 32 bits. Alguém sabe se existe alguma imagem pré-construída de 32 bits online?

Para que eu possa usá-los diretamente e não precisar me preocupar com a instalação.

Obrigado.

Hao Shen
fonte
Você está em terra, só pode ter um sistema operacional de 32 bits? Depende apenas da CPU.
Alvar
@ Alvar Não tenho muita certeza. Meu host é o Fedora 12 com o kernel 2.6.29. Eu acredito que meu sistema operacional é de 32 bits. O processador é o CPU Intel Core 2 Duo E8400. Eu apenas uso o comando "qemu-kvm -m 1024 img". Img é baixado do site que eu dei. Ele só parou em "carregar disco RAM inicial" ....
Hao Shen
2
Sim, sua CPU possui compatibilidade de 64 bits. Fonte
Alvar

Respostas:

11

Uma rápida pesquisa no Google revelou o seguinte (eu não tentei nenhum deles) :

Além disso, você pode usar o vmbuilder (referido aqui ubuntu-vmbuilder) para criar rapidamente imagens do Ubuntu para KVM, VirtualBox, etc.

Como último recurso, você pode usar o qemu-imgcomando para converter imagens de disco do VirtualBox / VMware em um formato mais adequado ao QEMU / KVM (isso pode não ser necessário: acho que o QEMU / KVM pode funcionar com outros tipos de imagem como vdi ou vmdk).

$ qemu-img convert -f [vdi|vmdk|...] -O qcow2 OriginalImage NewImage

NOTA : Se você estiver usando um sistema operacional de 32 bits, não poderá executar máquinas virtuais de 64 bits com o KVM. Mas o QEMU é um emulador, portanto, você deve executar 64 bits de VM em um sistema operacional de 32 bits. Mas a sobrecarga de desempenho provavelmente será enorme!

Salem
fonte
9

Esta resposta contém etapas detalhadas para as seguintes configurações:

  • imagem em nuvem amd64 e arm64
  • debootstrap amd64 e arm64
  • imagem da área de trabalho amd64

Tudo foi testado em um host Ubuntu 18.04 voltado para convidados 18.04.

Imagem em nuvem amd64

As imagens da nuvem Ubuntu são imagens pré-instaladas que permitem inicializar diretamente sem a instalação usual do sistema de desktop. Consulte também: /server/438611/what-are-ubuntu-cloud-images

#!/usr/bin/env bash

sudo apt-get install cloud-image-utils qemu

# This is already in qcow2 format.
img=ubuntu-18.04-server-cloudimg-amd64.img
if [ ! -f "$img" ]; then
  wget "https://cloud-images.ubuntu.com/releases/18.04/release/${img}"

  # sparse resize: does not use any extra space, just allows the resize to happen later on.
  # /superuser/1022019/how-to-increase-size-of-an-ubuntu-cloud-image
  qemu-img resize "$img" +128G
fi

user_data=user-data.img
if [ ! -f "$user_data" ]; then
  # For the password.
  # /programming/29137679/login-credentials-of-ubuntu-cloud-server-image/53373376#53373376
  # /server/920117/how-do-i-set-a-password-on-an-ubuntu-cloud-image/940686#940686
  # /ubuntu/507345/how-to-set-a-password-for-ubuntu-cloud-images-ie-not-use-ssh/1094189#1094189
  cat >user-data <<EOF
#cloud-config
password: asdfqwer
chpasswd: { expire: False }
ssh_pwauth: True
EOF
  cloud-localds "$user_data" user-data
fi

qemu-system-x86_64 \
  -drive "file=${img},format=qcow2" \
  -drive "file=${user_data},format=raw" \
  -device rtl8139,netdev=net0 \
  -enable-kvm \
  -m 2G \
  -netdev user,id=net0 \
  -serial mon:stdio \
  -smp 2 \
  -vga virtio \
;

GitHub upstream .

Depois que o QEMU for iniciado, talvez seja necessário pressionar Enter para que o menu de inicialização seja exibido. Selecione a Ubuntupartir daí.

Então, o início da inicialização diz:

error: no such device: root.

Press any key to continue...

mas mesmo se você não pressionar nenhuma tecla, a inicialização continuará após um curto tempo limite. Voto positivo neste relatório de bug: https://bugs.launchpad.net/cloud-images/+bug/1726476

Quando a inicialização terminar, faça o login com:

  • nome do usuário: ubuntu
  • senha: asdfqwer

Internet funciona normalmente.

Arm64 da imagem em nuvem

TODO: Percebi que há um erro que ocorre algumas vezes ao usar isso: https://bugs.launchpad.net/cloud-images/+bug/1818197

Muito semelhante ao amd64, mas precisamos de alguma magia negra UEFI para inicializar.

sudo apt-get install cloud-image-utils qemu-system-arm qemu-efi

# Get the image.
img=ubuntu-18.04-server-cloudimg-arm64.img
if [ ! -f "$img" ]; then
  wget "https://cloud-images.ubuntu.com/releases/18.04/release/${img}"
  qemu-img resize "$img" +128G
fi

# For the password.
user_data=user-data.img
if [ ! -f "$user_data" ]; then
  cat >user-data <<EOF
#cloud-config
password: asdfqwer
chpasswd: { expire: False }
ssh_pwauth: True
EOF
  cloud-localds "$user_data" user-data

  # Use the EFI magic. Picked up from:
  # https://wiki.ubuntu.com/ARM64/QEMU
  dd if=/dev/zero of=flash0.img bs=1M count=64
  dd if=/usr/share/qemu-efi/QEMU_EFI.fd of=flash0.img conv=notrunc
  dd if=/dev/zero of=flash1.img bs=1M count=64
fi

qemu-system-aarch64 \
  -M virt \
  -cpu cortex-a57 \
  -device rtl8139,netdev=net0 \
  -m 4096 \
  -netdev user,id=net0 \
  -nographic \
  -smp 4 \
  -drive "if=none,file=${img},id=hd0" \
  -device virtio-blk-device,drive=hd0 \
  -drive "file=${user_data},format=raw" \
  -pflash flash0.img \
  -pflash flash1.img \
;

GitHub upstream .

debootstrap amd64

Não é uma imagem pré-criada, mas faz o download de todos os pacotes pré-criados, por isso também é rápida, mas também muito mais configurável e útil.

#!/usr/bin/env bash

set -eux

debootstrap_dir=debootstrap
root_filesystem=debootstrap.ext2.qcow2

sudo apt-get install \
  debootstrap \
  libguestfs-tools \
  qemu-system-x86 \
;

if [ ! -d "$debootstrap_dir" ]; then
  # Create debootstrap directory.
  # - linux-image-generic: downloads the kernel image we will use under /boot
  # - network-manager: automatically starts the network at boot for us
  sudo debootstrap \
    --include linux-image-generic \
    bionic \
    "$debootstrap_dir" \
    http://archive.ubuntu.com/ubuntu \
  ;
  sudo rm -f "$root_filesystem"
fi

linux_image="$(printf "${debootstrap_dir}/boot/vmlinuz-"*)"

if [ ! -f "$root_filesystem" ]; then
  # Set root password.
  echo 'root:root' | sudo chroot "$debootstrap_dir" chpasswd

  # Remount root filesystem as rw.
  cat << EOF | sudo tee "${debootstrap_dir}/etc/fstab"
/dev/sda / ext4 errors=remount-ro,acl 0 1
EOF

  # Automaticaly start networking.
  # Otherwise network commands fail with:
  #     Temporary failure in name resolution
  # /ubuntu/1045278/ubuntu-server-18-04-temporary-failure-in-name-resolution/1080902#1080902
  cat << EOF | sudo tee "$debootstrap_dir/etc/systemd/system/dhclient.service"
[Unit]
Description=DHCP Client
Documentation=man:dhclient(8)
Wants=network.target
Before=network.target
[Service]
Type=forking
PIDFile=/var/run/dhclient.pid
ExecStart=/sbin/dhclient -4 -q
[Install]
WantedBy=multi-user.target
EOF
  sudo ln -sf "$debootstrap_dir/etc/systemd/system/dhclient.service" \
    "${debootstrap_dir}/etc/systemd/system/multi-user.target.wants/dhclient.service"

  # Why Ubuntu, why.
  # https://bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
  sudo chmod +r "${linux_image}"

  # Generate image file from debootstrap directory.
  # Leave 1Gb extra empty space in the image.
  sudo virt-make-fs \
    --format qcow2 \
    --size +1G \
    --type ext2 \
    "$debootstrap_dir" \
    "$root_filesystem" \
  ;
  sudo chmod 666 "$root_filesystem"
fi

qemu-system-x86_64 \
  -append 'console=ttyS0 root=/dev/sda' \
  -drive "file=${root_filesystem},format=qcow2" \
  -enable-kvm \
  -serial mon:stdio \
  -m 2G \
  -kernel "${linux_image}" \
  -device rtl8139,netdev=net0 \
  -netdev user,id=net0 \
;

GitHub upstream .

Isso é inicializado sem nenhum erro ou aviso do sistema.

Agora, no terminal, efetue login com root/ roote verifique se a Internet funciona com os seguintes comandos:

printf 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n' | nc example.com 80
apt-get update
apt-get install hello
hello

Usamos nccomo explicado em /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 porque:

Versão análoga do Debian: /unix/275429/creating-bootable-debian-image-with-debootstrap/473256#473256

Crie seu próprio kernel

Desde que estamos aqui:

git clone git://kernel.ubuntu.com/ubuntu/ubuntu-bionic.git
cd ubuntu-bionic
# Tag matches the working kernel that debootstrap downloaded for us.
git checkout Ubuntu-4.15.0-20.21
fakeroot debian/rules clean
debian/rules updateconfigs
fakeroot debian/rules build-generic
linux_image="$(pwd)/debian/build/build-generic/arch/x86_64/boot/bzImage"

Isso produziu exatamente a mesma configuração e acredito que tenha usado exatamente o mesmo código-fonte do Ubuntu empacotado que foi debootstrapbaixado conforme explicado em: Onde posso obter o arquivo .config do kernel 11.04?

Então eu o remendei com:

diff --git a/init/main.c b/init/main.c
index b8b121c17ff1..542229349efc 100644
--- a/init/main.c
+++ b/init/main.c
@@ -516,6 +516,8 @@ asmlinkage __visible void __init start_kernel(void)
        char *command_line;
        char *after_dashes;

+ pr_info("I'VE HACKED THE LINUX KERNEL!!!");
+
        set_task_stack_end_magic(&init_task);
        smp_setup_processor_id();
        debug_objects_early_init();

e reconstruir:

fakeroot debian/rules build-generic

e ele imprimiu minha mensagem durante a inicialização:

I'VE HACKED THE LINUX KERNEL!!!

A reconstrução não foi muito rápida, então talvez haja um comando melhor? Eu apenas esperei que ele dissesse:

Kernel: arch/x86/boot/bzImage is ready  (#3)

e foi em frente com a corrida.

debootstrap arm64

O procedimento foi semelhante ao do amd64, mas com as seguintes diferenças:

1)

Nós devemos fazer uma etapa dois debootstrap:

  • primeiro com --foreignapenas baixar os pacotes
  • então instalamos o QEMU estático no chroot
  • então fazemos a instalação do pacote --second-stageusando a emulação do modo de usuário QEMUbinfmt_misc

Veja também: O que é debootstrap --segundo estágio para

2) a inicialização padrão do kernel falha no final com:

[    0.773665] Please append a correct "root=" boot option; here are the available partitions:
[    0.774033] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

A lista de partições vazia indica que há um erro sério no driver do disco, depois de tentar um pouco a opção que falta:

CONFIG_VIRTIO_BLK=y

Eu acho que funciona quando eu uso o ISO porque os módulos devem ser carregados a partir do initrd.

Tentei usar outros tipos de disco, mas o virtio é o único valor válido para -drive if=when -M virt, que é o tipo de máquina mais inteligente atualmente.

Portanto, devemos recompilar nosso próprio kernel com essa opção ativada, conforme explicado aqui: Ao compilar o kernel, como posso impedi-lo de limpar toda vez que apenas quero modificar um arquivo?

Os desenvolvedores do Ubuntu devem ativar este CONFIG ypor padrão! É muito útil!

TODO: a rede não está funcionando, a mensagem de erro é:

root@ciro-p51:~# systemctl status dhclient.service
root@ciro-p51:~# cat f
● dhclient.service - DHCP Client
   Loaded: loaded (/etc/systemd/system/dhclient.service; enabled; vendor preset: enabled)
   Active: failed (Result: protocol) since Sun 2018-01-28 15:58:42 UTC; 2min 2s ago
     Docs: man:dhclient(8)
  Process: 171 ExecStart=/sbin/dhclient -4 -q (code=exited, status=0/SUCCESS)

Jan 28 15:58:40 ciro-p51 systemd[1]: Starting DHCP Client...
Jan 28 15:58:42 ciro-p51 dhclient[171]: No broadcast interfaces found - exiting.
Jan 28 15:58:42 ciro-p51 systemd[1]: dhclient.service: Can't open PID file /var/run/dhclient.pid (yet?) after start: No such file or directory
Jan 28 15:58:42 ciro-p51 systemd[1]: dhclient.service: Failed with result 'protocol'.
Jan 28 15:58:42 ciro-p51 systemd[1]: Failed to start DHCP Client.

Aqui está o script totalmente automatizado:

#!/usr/bin/env bash

# /ubuntu/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171

set -eux

debootstrap_dir=debootstrap
root_filesystem=debootstrap.ext2.qcow2

sudo apt-get install \
  gcc-aarch64-linux-gnu \
  debootstrap \
  libguestfs-tools \
  qemu-system-aarch64 \
  qemu-user-static \
;

if [ ! -d "$debootstrap_dir" ]; then
  sudo debootstrap \
    --arch arm64 \
    --foreign \
    bionic \
    "$debootstrap_dir" \
    http://ports.ubuntu.com/ubuntu-ports \
  ;
  sudo mkdir -p "${debootstrap_dir}/usr/bin"
  sudo cp "$(which qemu-aarch64-static)" "${debootstrap_dir}/usr/bin"
  sudo chroot "$debootstrap_dir" /debootstrap/debootstrap --second-stage
  sudo rm -f "$root_filesystem"
fi

linux_image="$(printf "${debootstrap_dir}/boot/vmlinuz-"*)"

if [ ! -f "$root_filesystem" ]; then
  # Set root password.
  echo 'root:root' | sudo chroot "$debootstrap_dir" chpasswd

  # Remount root filesystem as rw.
  cat << EOF | sudo tee "${debootstrap_dir}/etc/fstab"
/dev/sda / ext4 errors=remount-ro,acl 0 1
EOF

  # Automaticaly start networking.
  # Otherwise network commands fail with:
  #     Temporary failure in name resolution
  # /ubuntu/1045278/ubuntu-server-18-04-temporary-failure-in-name-resolution/1080902#1080902
  cat << EOF | sudo tee "${debootstrap_dir}/etc/systemd/system/dhclient.service"
[Unit]
Description=DHCP Client
Documentation=man:dhclient(8)
Wants=network.target
Before=network.target

[Service]
Type=forking
PIDFile=/var/run/dhclient.pid
ExecStart=/sbin/dhclient -4 -q

[Install]
WantedBy=multi-user.target
EOF
  sudo ln -sf "${debootstrap_dir}/etc/systemd/system/dhclient.service" \
    "${debootstrap_dir}/etc/systemd/system/multi-user.target.wants/dhclient.service"

  # Why Ubuntu, why.
  # https://bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
  sudo chmod +r "${linux_image}"

  # Generate image file from debootstrap directory.
  # Leave 1Gb extra empty space in the image.
  sudo virt-make-fs \
    --format qcow2 \
    --size +1G \
    --type ext2 \
    "$debootstrap_dir" \
    "$root_filesystem" \
  ;
  sudo chmod 666 "$root_filesystem"
fi

# Build the Linux kernel.
linux_image="$(pwd)/linux/debian/build/build-generic/arch/arm64/boot/Image"
if [ ! -f "$linux_image" ]; then
  git clone --branch Ubuntu-4.15.0-20.21 --depth 1 git://kernel.ubuntu.com/ubuntu/ubuntu-bionic.git linux
  cd linux
patch -p1 << EOF
diff --git a/debian.master/config/config.common.ubuntu b/debian.master/config/config.common.ubuntu
index 5ff32cb997e9..8a190d3a0299 100644
--- a/debian.master/config/config.common.ubuntu
+++ b/debian.master/config/config.common.ubuntu
@@ -10153,7 +10153,7 @@ CONFIG_VIDEO_ZORAN_ZR36060=m
 CONFIG_VIPERBOARD_ADC=m
 CONFIG_VIRTIO=y
 CONFIG_VIRTIO_BALLOON=y
-CONFIG_VIRTIO_BLK=m
+CONFIG_VIRTIO_BLK=y
 CONFIG_VIRTIO_BLK_SCSI=y
 CONFIG_VIRTIO_CONSOLE=y
 CONFIG_VIRTIO_INPUT=m
EOF
  export ARCH=arm64
  export $(dpkg-architecture -aarm64)
  export CROSS_COMPILE=aarch64-linux-gnu-
  fakeroot debian/rules clean
  debian/rules updateconfigs
  fakeroot debian/rules DEB_BUILD_OPTIONS=parallel=`nproc` build-generic
  cd -
fi

qemu-system-aarch64 \
  -append 'console=ttyAMA0 root=/dev/vda rootfstype=ext2' \
  -device rtl8139,netdev=net0 \
  -drive "file=${root_filesystem},format=qcow2" \
  -kernel "${linux_image}" \
  -m 2G \
  -netdev user,id=net0 \
  -serial mon:stdio \
  -M virt,highmem=off \
  -cpu cortex-a57 \
  -nographic \
;

GitHub Upstream .

Imagem da área de trabalho

Veja: Como executar o desktop Ubuntu no QEMU?

Requer a instalação manual do instalador, mas é a coisa mais estável que você pode fazer, e totalmente bem, se você deseja obter uma VM para uso interativo de tempos em tempos.

Para aarch64, ainda não consegui trabalhar com a área de trabalho, talvez fique de olho em: Como executar o Ubuntu 16.04 ARM no QEMU?

Ciro Santilli adicionou uma nova foto
fonte
1
Modifiquei um pouco o seu script: gist.github.com/lnyng/8342947a1d5455303fd8730c9ca35da0 A principal mudança é criar uma unidade systemh do dhclient para evitar a instalação do gerenciador de rede, que requer muitas bibliotecas relacionadas à interface do usuário (cerca de 300 + MB para a minha instalação).
Lyang
@lyang obrigado! Você me permitiu não aprender o systemd corretamente mais uma vez :-)
Ciro Santilli escreveu:
@lyang quando eu tentei para arm64 como explicado na resposta atualizada, recebo o erro:, dhclient.service: Can't open PID file /var/run/dhclient.pid (yet?) after start: No such file or directoryalguma pista? Após a inicialização eu sou capaz touch /var/run/a.
Ciro Santilli # 8/18
Parece ser um erro de permissão. Talvez alterando o caminho pid para outros lugares como /tmp/dhclient.pid? Ou simplesmente removê-lo completamente se nós realmente não me importo de matar esse processo ...
Lyang
0

Consulte http://cloud-images.ubuntu.com/, que contém imagens em nuvem que podem ser usadas com qemu / kvm.

Dilip Renkila
fonte
1
Como você usa essas imagens, então? Mais precisamente: como você faz login?
Frederick Nord
você pode adicionar suas chaves SSH através de cloud-init
Dilip Renkila
0

https://www.turnkeylinux.org/ existe há séculos. Eles têm um enorme catálogo "dispositivo" pré-fabricado, disponível para download, como imagens em vários formatos (óva, iso, vdmk, openstack, xen). Eles ainda podem iniciar uma imagem na AWS para você.

Quando quero começar a explorar uma pilha específica ou precisar resolver um problema, frequentemente baixo as imagens delas, as converto em cow2 e as uso.

Você também pode pegar imagens em https://app.vagrantup.com/boxes/search ou https://virtualboxes.org/images/ e convertê-las também.

Mark Stinson
fonte