Esiste un'immagine QEMU Ubuntu preconfezionata (32 bit) online?


12

Sto giocando con QEMU. Qui ho trovato alcune immagini del sistema operativo predefinite:

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

Ma sono tutti pensati per un sistema a 64 bit mentre il mio sistema è a 32 bit. Qualcuno sa se ci sono immagini precompilate a 32 bit online?

Quindi posso usarli direttamente e non ho bisogno di preoccuparmi dell'installazione.

Grazie.


Sei a terra puoi avere solo un sistema operativo a 32 bit? Dipende solo dalla CPU.
Alvar,

@Alvar Non ne sono del tutto sicuro. Il mio host è Fedora 12 con il kernel 2.6.29. Credo che il mio sistema operativo sia a 32 bit. Il processore è la CPU Intel Core 2 Duo E8400. Uso solo il comando "qemu-kvm -m 1024 img". Img viene scaricato dal sito Web che ho fornito. Si è appena fermato al "caricamento del ramdisk iniziale" ....
Hao Shen,

2
Sì, la tua CPU ha una compatibilità a 64 bit. Fonte
Alvar,

Risposte:


11

Una rapida ricerca su Google ha rivelato quanto segue (non ne ho provato nessuno) :

Inoltre, puoi usare vmbuilder (indicato qui come ubuntu-vmbuilder) per creare rapidamente immagini Ubuntu su KVM, VirtualBox, ecc.

Come ultima risorsa, puoi usare il qemu-imgcomando per convertire le immagini del disco da VirtualBox / VMware in un formato più adatto a QEMU / KVM (questo potrebbe non essere necessario: penso che QEMU / KVM possa funzionare con altri tipi di immagini come vdi o vmdk).

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

NOTA : se si utilizza un sistema operativo a 32 bit, non è possibile eseguire macchine virtuali a 64 bit con KVM. Ma QEMU è un emulatore, quindi dovrebbe consentirti di eseguire VM a 64 bit su un sistema operativo a 32 bit. Ma il sovraccarico delle prestazioni sarà probabilmente enorme!


9

Questa risposta contiene passaggi dettagliati per le seguenti configurazioni:

  • immagine nuvola amd64 e arm64
  • debootstrap amd64 e arm64
  • immagine desktop amd64

Tutto è stato testato su un host Ubuntu 18.04 destinato a ospiti 18.04.

Immagine nuvola amd64

Le immagini cloud di Ubuntu sono immagini preinstallate che ti consentono di avviare direttamente senza eseguire la solita installazione del sistema desktop. Vedi anche: /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 a monte .

Dopo l'avvio di QEMU, potrebbe essere necessario premere Invio per visualizzare il menu di avvio. Seleziona Ubuntuda lì.

Quindi, l'inizio dell'avvio dice:

error: no such device: root.

Press any key to continue...

ma anche se non si preme alcun tasto, l'avvio continua dopo un breve timeout. Vai a votare questo bug report: https://bugs.launchpad.net/cloud-images/+bug/1726476

Al termine dell'avvio, accedi con:

  • nome utente: ubuntu
  • parola d'ordine: asdfqwer

Internet funziona normalmente.

Immagine nuvola arm64

TODO: Ho notato che a volte si verifica un bug durante l'utilizzo di questo: https://bugs.launchpad.net/cloud-images/+bug/1818197

Molto simile ad amd64, ma abbiamo bisogno di un po 'di magia nera UEFI per l'avvio.

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 a monte .

debootstrap amd64

Non un'immagine prefabbricata, ma scarica tutti i pacchetti predefiniti, quindi è anche veloce, ma anche molto più configurabile e 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 \
;

GitHub a monte .

Questo si avvia senza errori o avvisi di systemd.

Ora dal terminale, accedi con root/ root, quindi controlla che Internet funzioni con i seguenti comandi:

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

Abbiamo usato nccome spiegato in /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 perché:

Versione Debian analoga: /unix/275429/creating-bootable-debian-image-with-debootstrap/473256#473256

Crea il tuo kernel

Dal momento che siamo qui:

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"

Ciò ha prodotto la stessa identica configurazione e credo che abbia usato lo stesso identico codice sorgente del pacchetto Ubuntu che è stato debootstrapscaricato come spiegato in: Dove posso trovare il file .config del kernel 11.04?

Poi l'ho patchato con:

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 ricostruire:

fakeroot debian/rules build-generic

e ha stampato il mio messaggio durante l'avvio:

I'VE HACKED THE LINUX KERNEL!!!

La ricostruzione non è stata molto veloce, quindi forse c'è un comando migliore? Ho solo aspettato che dicesse:

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

e sono andato avanti con la corsa.

debootstrap arm64

La procedura era simile a quella di amd64, ma con le seguenti differenze:

1)

Dobbiamo fare due fasi debootstrap:

  • prima --foreigndi tutto basta scaricare i pacchetti
  • quindi installiamo QEMU statico in chroot
  • quindi eseguiamo l'installazione del pacchetto --second-stageutilizzando l'emulazione modalità utente QEMU +binfmt_misc

Vedi anche: A cosa serve debootstrap - secondo stadio

2) l'avvio del kernel predefinito non riesce alla fine con:

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

L'elenco delle partizioni vuoto indica che si è verificato un errore grave con il driver del disco, dopo un po 'di provare l'opzione mancante è:

CONFIG_VIRTIO_BLK=y

Penso che funzioni quando uso ISO perché i moduli devono essere caricati da initrd.

Ho provato ad usare altri tipi di disco, ma virtio è l'unico valore valido per -drive if=quando -M virt, che è il tipo di macchina più igienico al giorno d'oggi.

Pertanto, dobbiamo ricompilare il nostro kernel con quell'opzione abilitata, come spiegato qui: Quando si esegue la compilazione incrociata del kernel, come posso impedirne la pulizia ogni volta che voglio solo modificare un file?

Gli sviluppatori Ubuntu dovrebbero trasformare questo CONFIG ydi default! E 'molto utile!

TODO: la rete non funziona, il messaggio di errore è:

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.

Ecco lo script completamente automatizzato:

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

Immagine del desktop

Vedi: Come eseguire il desktop Ubuntu su QEMU?

Richiede di eseguire manualmente l'installazione, ma è la cosa più stabile che puoi fare, e va benissimo se vuoi solo avere una VM per l'uso interattivo in esecuzione di volta in volta.

Per aarch64, non ho fatto funzionare il desktop ma forse tenere d'occhio: Come eseguire Ubuntu 16.04 ARM in QEMU?


1
Ho modificato un po 'il tuo script: gist.github.com/lnyng/8342947a1d5455303fd8730c9ca35da0 La modifica principale consiste nel creare un'unità systemd dhclient per evitare l'installazione di network-manager, che richiede molte librerie relative all'interfaccia utente (circa 300 + MB per la mia installazione).
lyang,

@lyang grazie! Mi hai permesso di non imparare di nuovo correttamente il sistema :-)
Ciro Santilli 6 病毒 审查 六四 事件 法轮功

@lyang quando l'ho provato per arm64 come spiegato nella risposta aggiornata, ottengo l'errore: dhclient.service: Can't open PID file /var/run/dhclient.pid (yet?) after start: No such file or directoryqualche indizio? Dopo l'avvio sono in grado di farlo touch /var/run/a.
Ciro Santilli 8 病毒 审查 六四 事件 法轮功

Sembra essere un errore di autorizzazione. Forse cambiando il percorso pid in altri posti come /tmp/dhclient.pid? O rimuoverlo del tutto se non ci interessa davvero uccidere quel processo ...
lyang,


0

https://www.turnkeylinux.org/ è stato intorno per le età. Hanno un enorme catalogo scaricabile, "appliance" premade come immagini in numerosi formati (ova, iso, vdmk, openstack, xen). Possono persino lanciare un'immagine direttamente in AWS per te.

Quando voglio iniziare a esplorare un particolare stack o devo eliminare un problema, spesso eseguo il download delle loro immagini, lo converto in un cow2 e lo utilizzo.

Puoi anche prendere immagini da https://app.vagrantup.com/boxes/search o https://virtualboxes.org/images/ e convertirle.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.