Gibt es ein vorgefertigtes QEMU Ubuntu-Image (32 Bit) online?


12

Ich spiele mit QEMU. Hier habe ich einige vorgefertigte Betriebssystem-Images gefunden:

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

Aber sie sind alle für ein 64-Bit-System gedacht, während mein System 32-Bit ist. Weiß jemand, ob ein vorgefertigtes 32-Bit-Bild online ist?

So kann ich sie direkt verwenden und muss mich nicht um die Installation kümmern.

Vielen Dank.


Sind Sie an Land, können Sie nur ein 32-Bit-Betriebssystem haben? Es hängt nur von der CPU ab.
Alvar

@Alvar Ich bin mir nicht ganz sicher. Mein Host ist Fedora 12 mit Kernel 2.6.29. Ich glaube mein Betriebssystem ist 32 Bit. Prozessor ist Intel Core 2 Duo CPU E8400. Ich benutze einfach den Befehl "qemu-kvm -m 1024 img". Img wird von der Website heruntergeladen, die ich gegeben habe. Es hörte gerade bei "Laden der ersten Ramdisk" auf ....
Hao Shen

2
Ja, Ihre CPU ist 64-Bit-kompatibel. Quelle
Alvar

Antworten:


11

Eine schnelle Google-Suche ergab Folgendes (ich habe keine davon ausprobiert) :

Sie können auch vmbuilder (hier als ubuntu-vmbuilder) bezeichnet, um schnell Ubuntu-Images für KVM, VirtualBox usw. zu erstellen.

Als letzten Ausweg können Sie den qemu-imgBefehl verwenden, um Disk-Images von VirtualBox / VMware in ein Format zu konvertieren, das besser für QEMU / KVM geeignet ist (dies ist möglicherweise nicht erforderlich: Ich denke, QEMU / KVM kann mit anderen Image-Typen wie vdi oder vmdk arbeiten).

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

ANMERKUNG : Wenn Sie ein 32-Bit-Betriebssystem verwenden, können Sie keine virtuellen 64-Bit-Maschinen mit KVM ausführen. Da QEMU jedoch ein Emulator ist, sollten Sie damit 64-Bit-VMs auf einem 32-Bit-Betriebssystem ausführen können. Aber der Leistungsaufwand wird wahrscheinlich enorm sein!


8

Diese Antwort enthält detaillierte Schritte für die folgenden Einstellungen:

  • Wolkenbild amd64 und arm64
  • debootstrap amd64 und arm64
  • Desktop-Image amd64

Alles wurde auf einem Ubuntu 18.04-Host für 18.04-Gäste getestet.

Wolkenbild amd64

Die Ubuntu-Cloud-Images sind vorinstallierte Images, mit denen Sie direkt booten können, ohne die übliche Installation des Desktop-Systems durchzuführen. Siehe auch: /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 stromaufwärts .

Nach dem Start von QEMU müssen Sie möglicherweise die Eingabetaste drücken, damit das Startmenü angezeigt wird. Wählen Sie Ubuntudort aus.

Dann heißt es am Anfang des Startvorgangs:

error: no such device: root.

Press any key to continue...

Aber selbst wenn Sie keine Taste drücken, wird der Start nach einer kurzen Zeitüberschreitung fortgesetzt. Stimmen Sie diesen Fehlerbericht ab: https://bugs.launchpad.net/cloud-images/+bug/1726476

Melden Sie sich nach Abschluss des Startvorgangs an mit:

  • Nutzername: ubuntu
  • Passwort: asdfqwer

Das Internet funktioniert normal.

Wolkenbild arm64

TODO: Ich habe festgestellt, dass bei Verwendung dieses Fehlers manchmal ein Fehler auftritt: https://bugs.launchpad.net/cloud-images/+bug/1818197

Sehr ähnlich zu amd64, aber wir brauchen etwas schwarze UEFI-Magie, um es zu booten.

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 stromaufwärts .

debootstrap amd64

Kein vorgefertigtes Image, aber es lädt alle vorgefertigten Pakete herunter, ist also auch schnell, aber auch viel konfigurierbarer und nützlicher.

#!/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 stromaufwärts .

Dies startet ohne Systemfehler oder Warnungen.

Melden Sie sich nun vom Terminal aus mit root/ rootan und überprüfen Sie, ob das Internet mit den folgenden Befehlen funktioniert:

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

Wir haben ncwie unter /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 erläutert verwendet , weil:

Analoge Debian-Version: /unix/275429/creating-bootable-debian-image-with-debootstrap/473256#473256

Erstellen Sie Ihren eigenen Kernel

Da sind wir hier:

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"

Dies erzeugte genau die gleiche Konfiguration und ich glaube, sie verwendete genau den gleichen Quellcode wie das gepackte Ubuntu, das debootstrapheruntergeladen wurde, wie unter: Woher bekomme ich die 11.04-Kernel-.config-Datei?

Dann habe ich es gepatcht mit:

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

und wieder aufbauen:

fakeroot debian/rules build-generic

und es hat meine Nachricht während des Startvorgangs gedruckt:

I'VE HACKED THE LINUX KERNEL!!!

Der Wiederaufbau war allerdings nicht sehr schnell, also gibt es vielleicht einen besseren Befehl? Ich habe nur darauf gewartet, dass es sagt:

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

und fuhr mit dem Lauf fort.

debootstrap arm64

Die Vorgehensweise war ähnlich wie bei amd64, jedoch mit folgenden Unterschieden:

1)

Wir müssen zwei Stufen machen debootstrap:

  • zuerst mit --foreignnur die Pakete herunterladen
  • dann installieren wir QEMU static in die chroot
  • Anschließend führen wir die Paketinstallation mit der --second-stageQEMU-Benutzermodus-Emulation + durchbinfmt_misc

Siehe auch: Wofür ist debootstrap --second-stage?

2) Der Standard-Kernel-Start schlägt am Ende fehl mit:

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

Die leere Partitionsliste zeigt an, dass ein schwerwiegender Fehler mit dem Festplattentreiber vorliegt. Nach einigem Ausprobieren lautet die fehlende Option:

CONFIG_VIRTIO_BLK=y

Ich denke, es funktioniert, wenn ich die ISO verwende, weil die Module von der initrd geladen werden müssen.

Ich habe versucht, andere Festplattentypen zu verwenden, aber virtio ist der einzig gültige Wert für -drive if=when -M virt, der heutzutage der vernünftigere Maschinentyp ist.

Daher müssen wir unseren eigenen Kernel mit aktivierter Option neu kompilieren, wie hier erläutert: Wie kann ich beim Cross-Kompilieren des Kernels verhindern, dass er jedes Mal sauber wird, wenn ich nur eine Datei ändern möchte?

Ubuntu-Entwickler sollten diese CONFIG ystandardmäßig aktivieren! Es ist sehr nützlich!

TODO: Das Netzwerk funktioniert nicht, die Fehlermeldung lautet:

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.

Hier ist das vollautomatische Skript:

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

Desktop-Image

Siehe: Wie starte ich den Ubuntu-Desktop auf QEMU?

Es ist erforderlich, das Installationsprogramm manuell durchzugehen, aber es ist das stabilste, was Sie tun können, und völlig in Ordnung, wenn Sie nur eine VM für den interaktiven Gebrauch von Zeit zu Zeit ausführen möchten.

Für aarch64 habe ich den Desktop noch nicht zum Laufen gebracht. Achten Sie vielleicht auf Folgendes: Wie wird Ubuntu 16.04 ARM in QEMU ausgeführt?


1
Ich habe Ihr Skript ein wenig geändert: gist.github.com/lnyng/8342947a1d5455303fd8730c9ca35da0 Die Hauptänderung besteht darin, eine dhclient systemd-Einheit zu erstellen, um die Installation des Netzwerkmanagers zu vermeiden, für den viele UI-bezogene Bibliotheken erforderlich sind (ca. 300 + MB für meine Installation).
Lyang

@lyang danke! Du hast mir erlaubt, systemd noch einmal nicht richtig zu lernen :-)
Ciro Santilli 6 改造 中心 法轮功 六四

@lyang Als ich es für arm64 ausprobiert habe, wie in der aktualisierten Antwort erläutert, erhalte ich die Fehlermeldung: Irgendwelche dhclient.service: Can't open PID file /var/run/dhclient.pid (yet?) after start: No such file or directoryHinweise? Nach dem Booten kann ich touch /var/run/a.
Ciro Santilli 事件 改造 中心 法轮功 六四

Scheint ein Berechtigungsfehler zu sein. Vielleicht den PID-Pfad zu anderen Orten wie /tmp/dhclient.pid ändern? Oder es nur ganz entfernt werden, wenn wir nicht wirklich kümmern , diesen Prozess zu töten ...
Lyang


0

https://www.turnkeylinux.org/ gibt es schon seit Ewigkeiten. Sie haben einen riesigen Katalog zum Herunterladen, vorgefertigte "Appliance" -ähnliche Bilder in zahlreichen Formaten (ova, iso, vdmk, openstack, xen). Sie können sogar ein Image direkt in AWS für Sie starten.

Wenn ich einen bestimmten Stapel erkunden möchte oder ein Problem beseitigen muss, lade ich häufig eines ihrer Bilder herunter, konvertiere es in eine Kuh2 und verwende es.

Sie können auch Bilder von https://app.vagrantup.com/boxes/search oder https://virtualboxes.org/images/ abrufen und ebenfalls konvertieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.