web-dev-qa-db-fra.com

Existe-t-il une image QEMU Ubuntu (32 bits) préconfigurée en ligne?

Je joue avec QEMU. Ici, j'ai trouvé des images prédéfinies du système d'exploitation:

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

Mais ils sont tous destinés à un système 64 bits alors que mon système est 32 bits. Est-ce que quelqu'un sait s'il y a des images pré-construites 32 bits en ligne?

Je peux donc les utiliser directement et ne pas avoir à s’inquiéter de l’installation.

Merci.

11
Hao Shen

Une recherche rapide sur Google a révélé ce qui suit (je n’ai essayé aucun d’eux) :

En outre, vous pouvez utiliser vmbuilder (désigné ici par ubuntu-vmbuilder) pour créer rapidement des images Ubuntu sur KVM, VirtualBox, etc.

En dernier recours, vous pouvez utiliser la commande qemu-img pour convertir les images de disque de VirtualBox/VMware vers un format plus adapté à QEMU/KVM (cela peut ne pas être nécessaire: je pense que QEMU/KVM peut fonctionner avec d'autres types d'images comme vdi ou vmdk) .

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

NOTE: Si vous utilisez un système d'exploitation 32 bits, vous ne pouvez pas exécuter de machine virtuelle 64 bits avec KVM. Mais QEMU est un émulateur, il devrait donc vous permettre d’exécuter des machines virtuelles 64 bits sur un système d’exploitation 32 bits. Mais les frais généraux seront probablement énormes!

10
Salem

Cette réponse contient des étapes détaillées pour les configurations suivantes:

  • image en nuage AMD64 et arm64
  • debootstrap AMD64 et arm64
  • image de bureau AMD64

Tout a été testé sur un hôte Ubuntu 18.04 ciblant 18.04 invités.

Image de nuage AMD64

Les images en nuage Ubuntu sont des images préinstallées qui vous permettent de démarrer directement sans effectuer l’installation habituelle du système de bureau. Voir aussi: https://serverfault.com/questions/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.
  # https://superuser.com/questions/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.
  # https://stackoverflow.com/questions/29137679/login-credentials-of-ubuntu-cloud-server-image/53373376#53373376
  # https://serverfault.com/questions/920117/how-do-i-set-a-password-on-an-ubuntu-cloud-image/940686#940686
  # https://askubuntu.com/questions/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 en amont .

Après le démarrage de QEMU, vous devrez peut-être appuyer sur Entrée pour afficher le menu de démarrage. Sélectionnez Ubuntuà partir de là.

Ensuite, le début du démarrage dit:

error: no such device: root.

Press any key to continue...

mais même si vous n'appuyez sur aucune touche, le démarrage se poursuit après un bref délai. Allez consulter ce rapport de bogue: https://bugs.launchpad.net/cloud-images/+bug/1726476

Une fois le démarrage terminé, connectez-vous avec:

  • nom d'utilisateur: ubuntuname__
  • mot de passe: asdfqwername__

Internet fonctionne normalement.

Image en nuage arm64

TODO: J'ai remarqué qu'il y avait un bogue qui arrivait parfois quand on utilisait ceci: https://bugs.launchpad.net/cloud-images/+bug/1818197

Très similaire à AMD64, mais nous avons besoin de la magie noire UEFI pour pouvoir démarrer.

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 en amont .

debootstrap___ AMD64

Il ne s'agit pas d'une image prédéfinie, mais il télécharge tous les packages préconfigurés. Il est donc rapide, mais aussi beaucoup plus configurable et utile.

#!/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
  # https://askubuntu.com/questions/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 en amont .

Cela démarre sans erreurs ni avertissements systemd.

Maintenant, depuis le terminal, connectez-vous avec rootname__/rootname__, puis vérifiez que l'Internet fonctionne avec les commandes suivantes:

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

Nous avons utilisé nccomme expliqué à la section https://stackoverflow.com/questions/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 car:

Version Debian analogue: https://unix.stackexchange.com/questions/275429/creating-bootable-debian-image-with-debootstrap/473256#473256

Construisez votre propre noyau

Depuis que nous sommes ici:

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"

Cela produisit exactement la même configuration et je crois qu’il utilisait exactement le même code source que le paquet Ubuntu que debootstrapa téléchargé comme expliqué à: Où puis-je obtenir le fichier .config du noyau 11.04?

Puis je l'ai corrigé avec:

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();

et reconstruire:

fakeroot debian/rules build-generic

et il a imprimé mon message lors du démarrage:

I'VE HACKED THE LINUX KERNEL!!!

La reconstruction n'a pas été très rapide, alors peut-être qu'il y a une meilleure commande? J'ai juste attendu qu'il dise:

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

et est allé de l'avant avec la course.

debootstrap arm64

La procédure était similaire à celle de l’AMD64, mais avec les différences suivantes:

1)

Nous devons faire un debootstrapen deux étapes:

  • d'abord avec --foreign pour télécharger les packages
  • puis nous installons QEMU static dans le chrootname__
  • puis nous faisons l’installation du paquet avec --second-stage en utilisant l’émulation en mode utilisateur QEMU + binfmt_misc

Voir aussi: Qu'est-ce que debootstrap --second-stage pour

2) le démarrage du noyau par défaut échoue à la fin avec:

[    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)

La liste des partitions vides indique qu'il y a une grave erreur avec le pilote de disque. Après un peu d'essais, l'option manquante est:

CONFIG_VIRTIO_BLK=y

Je pense que cela fonctionne lorsque j'utilise l'ISO parce que les modules doivent être chargés à partir de l'initrd.

J'ai essayé d'utiliser d'autres types de disque, mais virtio est la seule valeur valide pour -drive if= quand -M virt, qui est le type d'ordinateur le plus sain de nos jours.

Par conséquent, nous devons recompiler notre propre noyau avec cette option activée, comme expliqué ici: Lors de la compilation croisée du noyau, comment puis-je l'empêcher de nettoyer chaque fois que je veux modifier un fichier?

Les développeurs Ubuntu devraient transformer cette CONFIG ypar défaut! C'est très utile!

TODO: le réseau ne fonctionne pas, le message d'erreur est:

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.

Voici le script entièrement automatisé:

#!/usr/bin/env bash

# https://askubuntu.com/questions/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
  # https://askubuntu.com/questions/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 .

Image de bureau

Voir: Comment utiliser Ubuntu Desktop sur QEMU?

Il faut passer par le programme d’installation manuellement, mais c’est la chose la plus stable que vous puissiez faire, et tout à fait acceptable si vous voulez juste obtenir un VM à usage interactif fonctionnant de temps à autre.

Pour aarch64, je n'ai pas encore utilisé le bureau mais gardez un œil sur: Comment faire fonctionner Ubuntu 16.04 ARM dans QEMU?

https://www.turnkeylinux.org/ existe depuis très longtemps. Ils ont un énorme catalogue téléchargeable, prédéfini, comme des images dans de nombreux formats (ova, iso, vdmk, openstack, xen). Ils peuvent même lancer une image directement dans AWS pour vous.

Lorsque je veux commencer à explorer une pile particulière ou que je dois résoudre un problème, je télécharge souvent l'une de leurs images, la convertis en vache2 et l'utilise.

Vous pouvez également récupérer des images de https://app.vagrantup.com/boxes/search ou https://virtualboxes.org/images/ et les convertir également.

0
Mark Stinson