Есть ли какой-нибудь готовый образ QEMU Ubuntu (32bit) онлайн?
Я играю с QEMU. Здесь я нашел несколько готовых образов ОС:
http://docs.openstack.org/trunk/openstack-compute/admin/content/starting-images.html
Но все они предназначены для 64-битной системы, а моя система 32-битная. Кто-нибудь знает, есть ли какой-нибудь 32-битный готовый образ онлайн?
Так что я могу использовать их напрямую и не нужно беспокоиться об установке.
Благодарю.
4 ответа
Быстрый поиск в Google показал следующее (я не пробовал ни одного из них):
Также вы можете использовать vmbuilder(именуемый здесь ubuntu-vmbuilder
) для быстрого создания образов Ubuntu в KVM, VirtualBox и т. д.
В крайнем случае, вы можете использовать qemu-img
Команда для преобразования образов дисков из VirtualBox/VMware в формат, более подходящий для QEMU/KVM (это может не потребоваться: я думаю, что QEMU / KVM может работать с другими типами изображений, такими как vdi или vmdk).
$ qemu-img convert -f [vdi|vmdk|...] -O qcow2 OriginalImage NewImage
NOTE: If you are using a 32bit OS you cannot run 64bit virtual machines with KVM. But QEMU is an emulator, so it should let you run 64bit vm's on a 32bit operating system. But the performance overhead will probably be huge!
Этот ответ содержит подробные шаги для следующих настроек:
- изображение облака amd64 и arm64
- debootstrap amd64 и arm64
- изображение рабочего стола amd64
Все они были протестированы на хосте Ubuntu 18.04 для 18.04 гостей.
Облачное изображение amd64
Облачные образы Ubuntu - это предустановленные образы, которые позволяют загружаться напрямую, без обычной установки настольной системы. Смотрите также: 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://Ask-ubuntu.ru/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 \
;
После запуска QEMU, вам может потребоваться нажать Enter для отображения меню загрузки. Выбрать Ubuntu
оттуда.
Затем начало загрузки говорит:
error: no such device: root.
Press any key to continue...
но даже если вы не нажмете какую-либо клавишу, загрузка продолжится после короткого времени ожидания. Пойдите, проголосуйте за этот отчет об ошибке: https://bugs.launchpad.net/cloud-images/+bug/1726476
После завершения загрузки войдите с помощью:
- Имя пользователя:
ubuntu
- пароль:
asdfqwer
Интернет работает нормально.
Облачное изображение arm64
TODO: Я заметил, что при использовании этого иногда возникает ошибка: https://bugs.launchpad.net/cloud-images/+bug/1818197
Очень похоже на amd64, но нам нужна некоторая черная магия UEFI для его загрузки.
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 \
;
debootstrap
amd64
Не готовый образ, но он загружает все готовые пакеты, поэтому он также быстрый, но гораздо более настраиваемый и полезный.
#!/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://Ask-ubuntu.ru/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 \
;
Это загружается без каких-либо системных ошибок или предупреждений.
Теперь из терминала войдите с root
/ root
, а затем убедитесь, что Интернет работает с помощью следующих команд:
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
Мы использовали nc
как объяснено по адресу https://stackoverflow.com/questions/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497 потому что:
wget
а такжеcurl
не установлены по умолчаниюping
по умолчанию не работает с QEMU: https://unix.stackexchange.com/questions/473448/how-to-ping-from-the-qemu-guest-to-an-external-url
Аналогичная версия Debian: https://unix.stackexchange.com/questions/275429/creating-bootable-debian-image-with-debootstrap/473256
Создайте свое собственное ядро
Так как мы здесь:
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"
Это произвело точно такой же конфиг, и я считаю, что использовал тот же исходный код, что и упакованный Ubuntu, debootstrap
скачал как объяснено на: Где я могу получить файл.config ядра 11.04?
Затем я исправил это:
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();
и восстановить:
fakeroot debian/rules build-generic
и он напечатал мое сообщение во время загрузки:
I'VE HACKED THE LINUX KERNEL!!!
Перестройка была не очень быстрой, так что, может быть, есть лучшая команда? Я просто ждал этого, чтобы сказать:
Kernel: arch/x86/boot/bzImage is ready (#3)
и продолжил бежать.
debootstrap arm64
Процедура была похожа на amd64, но со следующими отличиями:
1)
Мы должны сделать два этапа debootstrap
:
- сначала с
--foreign
просто скачать пакеты - Затем мы устанавливаем QEMU static в
chroot
- Затем мы делаем установку пакета с
--second-stage
используя эмуляцию пользовательского режима QEMU +binfmt_misc
Смотрите также: Что такое debootstrap --second-stage для
2) загрузка ядра по умолчанию заканчивается в конце:
[ 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)
Пустой список разделов указывает, что с драйвером диска произошла серьезная ошибка, после небольшой попытки пропустить параметр:
CONFIG_VIRTIO_BLK=y
Я думаю, что это работает, когда я использую ISO, потому что модули должны загружаться из initrd.
Я пытался использовать диски других типов, но единственное допустимое значение для virtio -drive if=
когда -M virt
, который является более разумным типом машины в настоящее время.
Поэтому мы должны перекомпилировать наше собственное ядро с включенной опцией, как описано здесь: При кросс-компиляции ядра, как я могу остановить его чистоту каждый раз, когда я просто хочу изменить один файл?
Разработчики Ubuntu должны включить этот CONFIG y
по умолчанию! Это очень полезно!
TODO: сеть не работает, сообщение об ошибке:
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.
Вот полностью автоматизированный скрипт:
#!/usr/bin/env bash
# https://Ask-ubuntu.ru/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://Ask-ubuntu.ru/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 \
;
Изображение на рабочем столе
Смотрите: Как запустить рабочий стол Ubuntu на QEMU?
Это требует прохождения установщика вручную, но это самая стабильная вещь, которую вы можете сделать, и это вполне нормально, если вы просто хотите, чтобы виртуальная машина для интерактивного использования работала время от времени.
Что касается aarch64, я еще не получил рабочий стол, возможно, стоит обратить внимание на: Как запустить Ubuntu 16.04 ARM в QEMU?
https://www.turnkeylinux.org/ существует уже много лет. У них есть огромный загружаемый каталог, готовые "устройства", такие как изображения в различных форматах (ova, iso, vdmk, openstack, xen). Они даже могут запустить изображение прямо в AWS для вас.
Когда я хочу начать изучать конкретный стек или мне нужно устранить проблему, я часто загружаю их изображения, конвертирую их в cow2 и использую их.
Вы также можете получить изображения с https://app.vagrantup.com/boxes/search или https://virtualboxes.org/images/ и конвертировать их.
Обратитесь к http://cloud-images.ubuntu.com/ которая содержит изображения облаков, которые можно использовать с qemu/kvm.