Je joue avec QEMU. Ici, j'ai trouvé des images prédéfinies du système d'exploitation:
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 des images pré-construites 32 bits en ligne?
Je peux donc les utiliser directement et ne pas avoir à s’inquiéter de l’installation.
Merci.
Une recherche rapide sur Google a révélé ce qui suit (je n’ai essayé aucun d’eux) :
En outre, vous pouvez utiliser vmbuilder (désigné ici par ubuntu-vmbuilder
) pour créer rapidement des images Ubuntu sur KVM, VirtualBox, etc.
En dernier recours, vous pouvez utiliser la commande qemu-img
pour convertir les images de disque de VirtualBox/VMware vers un format plus adapté à QEMU/KVM (cela peut ne 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
NOTE: Si vous utilisez un système d'exploitation 32 bits, vous ne pouvez pas exécuter de machine virtuelle 64 bits avec KVM. Mais QEMU est un émulateur, il devrait donc vous permettre d’exécuter des machines virtuelles 64 bits sur un système d’exploitation 32 bits. Mais les frais généraux seront probablement énormes!
Cette réponse contient des étapes détaillées pour les configurations suivantes:
Tout a été testé sur un hôte Ubuntu 18.04 ciblant 18.04 invités.
Les images en nuage Ubuntu sont des images préinstallées qui vous permettent de démarrer directement sans effectuer l’installation habituelle du système de bureau. Voir aussi: 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://askubuntu.com/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 \
;
Après le démarrage de QEMU, vous devrez peut-être appuyer sur Entrée pour afficher le menu de démarrage. Sélectionnez Ubuntu
à partir 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 bref délai. Allez consulter ce rapport de bogue: https://bugs.launchpad.net/cloud-images/+bug/1726476
Une fois le démarrage terminé, connectez-vous avec:
ubuntu
name__asdfqwer
name__Internet fonctionne normalement.
TODO: J'ai remarqué qu'il y avait un bogue qui arrivait parfois quand on utilisait ceci: https://bugs.launchpad.net/cloud-images/+bug/1818197
Très similaire à AMD64, mais nous avons besoin de la magie noire UEFI pour pouvoir démarrer.
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
___ AMD64Il ne s'agit pas d'une image prédéfinie, mais il télécharge tous les packages préconfigurés. Il est donc 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
# https://askubuntu.com/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 \
;
Cela démarre sans erreurs ni avertissements systemd.
Maintenant, depuis le terminal, connectez-vous avec root
name__/root
name__, puis vérifiez que l'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é nc
comme expliqué à la section https://stackoverflow.com/questions/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 car:
wget
et curl
ne sont pas installés par défautping
ne fonctionne pas à partir de QEMU par défaut: https://unix.stackexchange.com/questions/473448/how-to-ping-from-the-qemu-guest-to-an-external-url =Version Debian analogue: https://unix.stackexchange.com/questions/275429/creating-bootable-debian-image-with-debootstrap/473256#473256
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"
Cela produisit exactement la même configuration et je crois qu’il utilisait exactement le même code source que le paquet Ubuntu que debootstrap
a téléchargé comme expliqué à: Où puis-je obtenir le fichier .config du noyau 11.04?
Puis je l'ai corrigé 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 reconstruire:
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 pas été très rapide, alors peut-être qu'il y a 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.
La procédure était similaire à celle de l’AMD64, mais avec les différences suivantes:
1)
Nous devons faire un debootstrap
en deux étapes:
--foreign
pour télécharger les packageschroot
name__--second-stage
en utilisant l’émulation en mode utilisateur QEMU + binfmt_misc
Voir aussi: Qu'est-ce que debootstrap --second-stage 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 vides indique qu'il y a une grave erreur avec le pilote de disque. Après un peu d'essais, l'option manquante est:
CONFIG_VIRTIO_BLK=y
Je pense que cela fonctionne lorsque j'utilise l'ISO parce que les modules doivent être chargés à partir de l'initrd.
J'ai essayé d'utiliser d'autres types de disque, mais virtio est la seule valeur valide pour -drive if=
quand -M virt
, qui est le type d'ordinateur le plus sain 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 nettoyer chaque fois que je veux modifier un fichier?
Les développeurs Ubuntu devraient transformer cette CONFIG y
par défaut! C'est très utile!
TODO: 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
# https://askubuntu.com/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://askubuntu.com/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 \
;
Voir: Comment utiliser Ubuntu Desktop sur QEMU?
Il faut passer par le programme d’installation manuellement, mais c’est la chose la plus stable que vous puissiez faire, et tout à fait acceptable si vous voulez juste obtenir un VM à usage interactif fonctionnant de temps à autre.
Pour aarch64, je n'ai pas encore utilisé le bureau mais gardez un œil sur: Comment faire fonctionner Ubuntu 16.04 ARM dans QEMU?
https://www.turnkeylinux.org/ existe depuis très longtemps. Ils ont un énorme catalogue téléchargeable, prédéfini, 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 résoudre un problème, je télécharge souvent l'une de leurs images, la convertis en vache2 et l'utilise.
Vous pouvez également récupérer des images de https://app.vagrantup.com/boxes/search ou https://virtualboxes.org/images/ et les convertir également.