Y a-t-il une image Ubuntu QEMU préconstruite (32 bits) en ligne?

12

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

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 une image préconstruite 32 bits en ligne?

Je peux donc les utiliser directement et ne pas avoir à me soucier de l'installation.

Merci.

Hao Shen
la source
Rivage - vous que vous ne pouvez avoir un système d'exploitation 32 bits? Il est seulement en fonction de la CPU.
Alvar
@Alvar Je ne suis pas tout à fait sûr. Mon hôte est Fedora 12 avec le noyau 2.6.29. Je crois que mon système d'exploitation est 32 bits. Le processeur est Intel Core 2 Duo CPU E8400. Je viens d' utiliser la commande "qemu-kvm -m 1024 img". Img est téléchargé à partir du site que j'ai donné. Il vient de s'arrêter à « ramdisk chargement » ....
Hao Shen
2
Oui votre CPU compatibilité 64 bits. Source
Alvar

Réponses:

11

Une recherche rapide sur Google a révélé ce qui suit (je ne l' ai pas essayé l' un d'entre eux) :

, Vous pouvez également utiliser vmbuilder (Référé ici ubuntu-vmbuilder) pour créer rapidement des images Ubuntu pour KVM, VirtualBox, etc.

En dernier recours, vous pouvez utiliser la qemu-imgcommande d'images de disque de conversion de VirtualBox / VMware à un format plus adapté à QEMU / KVM (ce ne peut 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

REMARQUE : Si vous utilisez un système d' exploitation 32 bits , vous ne pouvez pas exécuter 64bit machines virtuelles avec KVM. Mais QEMU est un émulateur, il devrait donc vous Courons 64bit vm sur un système d'exploitation 32 bits. Mais les frais généraux de performance sera probablement énorme!

Salem
la source
9

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

  • l'image nuage AMD64 et arm64
  • debootstrap AMD64 et arm64
  • l'image de bureau AMD64

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

Cloud Image amd64

Les images nuage Ubuntu sont des images pré-installées qui permettent de démarrer directement votre sans faire l'installation du système de bureau ordinaire. Voir aussi: /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 \
;

En amont GitHub .

Après QEMU commence, vous pourriez avoir à entrer pour frapper le menu de démarrage à afficher. Sélectionnez à Ubuntupartir 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 court délai. Allez voter ce rapport de bug: https://bugs.launchpad.net/cloud-images/+bug/1726476

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

  • Nom d'utilisateur: ubuntu
  • mot de passe: asdfqwer

Internet fonctionne normalement.

Image de nuage arm64

TODO: J'ai remarqué qu'un bogue se produit parfois lors de l'utilisation de ceci: https://bugs.launchpad.net/cloud-images/+bug/1818197

Très similaire à amd64, mais nous avons besoin d'un peu de magie noire UEFI pour qu'il démarre.

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 \
;

En amont GitHub .

debootstrap amd64

Pas une image prédéfinie, mais elle télécharge tous les packages prédéfinis, elle est donc également 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
  # /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 \
;

En amont GitHub .

Cela démarre sans aucune erreur ou avertissement systemd.

À partir du terminal, connectez-vous avec root/ root, puis vérifiez que 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 cela est expliqué à /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 parce que:

Analogue la version Debian: /unix/275429/creating-bootable-debian-image-with-debootstrap/473256#473256

Construire 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"

Ce produit exactement la même config et je crois même utilisé le code source exacte que l'Ubuntu packagée debootstraptéléchargé pendant que explicitée à Où puis - je obtenir le fichier du noyau 11,04?

Ensuite, je patché 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 la reconstruction:

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 cependant pas été très rapide, alors peut-être y a-t-il 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 deux étapes debootstrap:

  • d'abord avec --foreignjuste télécharger les packages
  • puis nous installons QEMU statique dans le chroot
  • puis nous faisons l'installation du package en --second-stageutilisant l'émulation du mode utilisateur QEMU +binfmt_misc

Voir aussi: Qu'est-ce que debootstrap - deuxième étape 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 vide indique qu'il y a une erreur sérieuse avec le pilote de disque, après un peu d'essayer l'option manquante est:

CONFIG_VIRTIO_BLK=y

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

J'ai essayé d'utiliser d'autres types de disques, mais virtio est la seule valeur valide pour -drive if=when -M virt, qui est le type de machine saner 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 faire un nettoyage à chaque fois que je veux juste modifier un fichier?

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

A FAIRE: 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

# /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 .

Image de bureau

Voir: Comment exécuter le bureau Ubuntu sur QEMU?

Cela nécessite de passer par le programme d'installation manuellement, mais c'est la chose la plus stable que vous puissiez faire, et tout à fait correcte si vous voulez simplement obtenir une machine virtuelle à usage interactif de temps en temps.

Pour aarch64, je n'ai pas encore fait fonctionner le bureau, mais peut-être gardez-vous un œil sur: Comment exécuter Ubuntu 16.04 ARM dans QEMU?

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
la source
1
J'ai un peu modifié votre script: gist.github.com/lnyng/8342947a1d5455303fd8730c9ca35da0 La principale modification consiste à créer une unité systemh dhclient pour éviter d'installer network-manager, ce qui nécessite de nombreuses bibliothèques liées à l'interface utilisateur (environ 300 + Mo pour mon installation).
lyang
@lyang merci! Vous m'avez permis de ne pas réapprendre correctement systemd :-)
Ciro Santilli 6 病毒 审查 六四 事件 法轮功
@lyang quand je l'ai essayé pour arm64 comme expliqué dans la réponse mise à jour, j'obtiens l'erreur:, dhclient.service: Can't open PID file /var/run/dhclient.pid (yet?) after start: No such file or directorydes indices? Après le démarrage, je peux touch /var/run/a.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
Semble être une erreur d'autorisation. Peut-être changer le chemin pid vers d'autres endroits comme /tmp/dhclient.pid? Ou supprimez-le tout simplement si nous ne voulons pas vraiment tuer ce processus ...
lyang
0

Reportez-vous à http://cloud-images.ubuntu.com/ qui contient des images cloud qui peuvent être utilisées avec qemu / kvm.

Dilip Renkila
la source
1
Comment utilisez-vous ces images, alors? Plus précisément: comment vous connectez-vous?
Frederick Nord
vous pouvez ajouter vos clés ssh via cloud-init
Dilip Renkila
0

https://www.turnkeylinux.org/ existe depuis des lustres. Ils ont un énorme catalogue téléchargeable, des «appliances» prédéfinies 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 éliminer un problème, je vais fréquemment télécharger leurs images, les convertir en cow2 et les utiliser.

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

Mark Stinson
la source