Apakah ada gambar Ubuntu QEMU prebuilt (32bit) online?


12

Saya bermain dengan QEMU. Di sini saya menemukan beberapa gambar OS prebuilt:

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

Tetapi semuanya dimaksudkan untuk sistem 64-bit sedangkan sistem saya 32 bit. Adakah yang tahu jika ada gambar prebuilt 32-bit online?

Jadi saya bisa langsung menggunakannya dan tidak perlu repot dengan pemasangannya.

Terima kasih.


Apakah Anda pantai Anda hanya dapat memiliki sistem operasi 32-bit? Itu hanya tergantung pada CPU.
Alvar

@ Alvar Saya tidak yakin. Tuan rumah saya adalah Fedora 12 dengan kernel 2.6.29. Saya percaya OS saya 32 bit. Prosesornya adalah Intel Core 2 Duo CPU E8400. Saya hanya menggunakan perintah "qemu-kvm -m 1024 img". Img diunduh dari situs web yang saya berikan. Itu hanya berhenti di "memuat ramdisk awal" ....
Hao Shen

2
Ya, CPU Anda memiliki kompatibilitas 64-bit. Sumber
Alvar

Jawaban:


11

Pencarian Google cepat mengungkapkan hal berikut (Saya belum mencoba salah satu dari mereka) :

Anda juga dapat menggunakan vmbuilder (disebut di sini ubuntu-vmbuilder) untuk membuat gambar Ubuntu dengan cepat ke KVM, VirtualBox, dll.

Sebagai upaya terakhir, Anda dapat menggunakan qemu-imgperintah untuk mengonversi gambar disk dari VirtualBox / VMware ke format yang lebih cocok untuk QEMU / KVM (ini mungkin tidak diperlukan: Saya pikir QEMU / KVM dapat bekerja dengan jenis gambar lain seperti vdi atau vmdk).

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

CATATAN : Jika Anda menggunakan OS 32bit Anda tidak dapat menjalankan mesin virtual 64bit dengan KVM. Tetapi QEMU adalah sebuah emulator, jadi itu harus membiarkan Anda menjalankan 64bit vm pada sistem operasi 32bit. Tetapi overhead kinerja mungkin akan sangat besar!


9

Jawaban ini berisi langkah-langkah terperinci untuk pengaturan berikut:

  • gambar cloud amd64 dan arm64
  • debootstrap amd64 dan arm64
  • gambar desktop amd64

Semua diuji pada host Ubuntu 18,04 yang menargetkan 18,04 tamu.

Gambar cloud amd64

Ubuntu cloud image adalah gambar yang sudah diinstal sebelumnya yang memungkinkan Anda untuk boot langsung tanpa melakukan instalasi sistem desktop biasa. Lihat juga: /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 hulu .

Setelah QEMU dimulai, Anda mungkin harus menekan enter agar menu boot dapat ditampilkan. Pilih Ubuntudari sana.

Kemudian, awal boot mengatakan:

error: no such device: root.

Press any key to continue...

tetapi bahkan jika Anda tidak menekan tombol apa pun, booting berlanjut setelah batas waktu singkat. Govote laporan bug ini: https://bugs.launchpad.net/cloud-images/+bug/1726476

Setelah boot selesai, login dengan:

  • nama pengguna: ubuntu
  • kata sandi: asdfqwer

Internet berfungsi normal.

Arm gambar cloud64

TODO: Saya perhatikan ada bug yang terjadi kadang-kadang saat menggunakan ini: https://bugs.launchpad.net/cloud-images/+bug/1818197

Sangat mirip dengan amd64, tetapi kita memerlukan sihir hitam UEFI untuk mem-boot.

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 hulu .

debootstrap amd64

Bukan gambar yang dibuat sebelumnya, tetapi mengunduh semua paket yang dibuat sebelumnya, jadi ini juga cepat, tetapi juga jauh lebih dapat dikonfigurasi dan berguna.

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

Ini mem-boot tanpa kesalahan atau peringatan systemd.

Sekarang dari terminal, login dengan root/ root, dan kemudian periksa apakah Internet berfungsi dengan perintah berikut:

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

Kami menggunakan ncsebagaimana dijelaskan di /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 karena:

Versi Debian analog: /unix/275429/creating-bootable-debian-image-with-debootstrap/473256#473256

Bangun kernel Anda sendiri

Karena kita ada di sini:

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"

Ini menghasilkan konfigurasi yang persis sama dan saya percaya menggunakan kode sumber yang sama persis dengan Ubuntu paket yang debootstrapdiunduh seperti yang dijelaskan di: Di mana saya bisa mendapatkan file .config kernel 11,04?

Lalu saya menambalnya dengan:

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

dan membangun kembali:

fakeroot debian/rules build-generic

dan itu mencetak pesan saya saat boot:

I'VE HACKED THE LINUX KERNEL!!!

Pembangunan kembali tidak terlalu cepat, jadi mungkin ada perintah yang lebih baik? Saya hanya menunggu untuk mengatakan:

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

dan terus berlari.

debootstrap arm64

Prosedurnya mirip dengan amd64, tetapi dengan perbedaan berikut:

1)

Kita harus melakukan dua tahap debootstrap:

  • pertama dengan --foreignhanya mengunduh paket
  • kemudian kita menginstal QEMU statis ke dalam chroot
  • kemudian kita melakukan instalasi paket dengan --second-stagemenggunakan emulasi mode pengguna QEMU +binfmt_misc

Lihat juga: Apa itu debootstrap --second-stage untuk

2) boot kernel default gagal di akhir dengan:

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

Daftar partisi kosong menunjukkan bahwa ada kesalahan serius dengan driver disk, setelah sedikit mencoba opsi yang hilang adalah:

CONFIG_VIRTIO_BLK=y

Saya pikir itu berfungsi ketika saya menggunakan ISO karena modul harus dimuat dari initrd.

Saya mencoba menggunakan jenis disk lain, tetapi virtio adalah satu-satunya nilai yang valid untuk -drive if=kapan -M virt, yang merupakan jenis mesin saner saat ini.

Oleh karena itu kita harus mengkompilasi ulang kernel kita sendiri dengan opsi itu diaktifkan, seperti yang dijelaskan di sini: Ketika mengkompilasi silang kernel, bagaimana saya bisa menghentikannya membuat bersih setiap kali ketika saya hanya ingin memodifikasi satu file?

Ubuntu devs harus mengubah CONFIG ini ysecara default! Itu sangat berguna!

TODO: jaringan tidak berfungsi, pesan kesalahannya adalah:

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.

Berikut ini skrip yang sepenuhnya otomatis:

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

Gambar desktop

Lihat: Bagaimana menjalankan desktop Ubuntu di QEMU?

Memang perlu melalui installer secara manual, tetapi itu adalah hal paling stabil yang dapat Anda lakukan, dan benar-benar baik-baik saja jika Anda hanya ingin mendapatkan VM untuk penggunaan interaktif yang berjalan dari waktu ke waktu.

Untuk aarch64, saya belum membuat desktop berfungsi, tetapi mungkin perlu diperhatikan: Bagaimana menjalankan Ubuntu 16.04 ARM di QEMU?


1
Saya sedikit memodifikasi skrip Anda: gist.github.com/lnyng/8342947a1d5455303fd8730c9ca35da0 Perubahan utama adalah membuat unit systemd dhclient untuk menghindari pemasangan network-manager, yang membutuhkan banyak perpustakaan terkait UI (sekitar 300 + MB untuk instalasi saya).
lyang

@lyang, terima kasih! Anda mengizinkan saya untuk tidak belajar systemd dengan benar sekali lagi :-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

@lyang ketika saya mencobanya untuk arm64 seperti yang dijelaskan dalam jawaban yang diperbarui, saya mendapatkan kesalahan:, dhclient.service: Can't open PID file /var/run/dhclient.pid (yet?) after start: No such file or directoryada petunjuk? Setelah boot saya bisa touch /var/run/a.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Tampaknya ada kesalahan izin. Mungkin mengubah jalur pid ke tempat lain seperti /tmp/dhclient.pid? Atau hapus saja semuanya jika kita tidak benar-benar ingin membunuh proses itu ...
lyang


0

https://www.turnkeylinux.org/ telah ada sejak lama. Mereka memiliki katalog yang sangat besar yang dapat diunduh, "alat" seperti gambar dalam berbagai format (ova, iso, vdmk, openstack, xen). Mereka bahkan dapat meluncurkan gambar tepat di AWS untuk Anda.

Ketika saya ingin mulai mengeksplorasi tumpukan tertentu atau perlu memecahkan masalah, saya sering akan mengunduh gambar mereka, mengubahnya menjadi cow2 dan menggunakannya.

Anda juga dapat mengambil gambar dari https://app.vagrantup.com/boxes/search atau https://virtualboxes.org/images/ dan mengonversinya juga.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.