QEMU/Linux guest
This article describes the setup of a Gentoo Linux guest using QEMU.
Configuration
Host
To create a disk image for the virtual machine, run:
user $qemu-img create -f qcow2 Gentoo-VM.img 15GDownload a minimal Gentoo LiveCD from here.
Since QEMU requires a lot of options, it would be a good idea to put them into a shell script, e.g.:
start_Gentoo_VM.sh<syntaxhighlight lang="bash">#!/bin/bash
exec qemu-system-x86_64 -enable-kvm \
-cpu host \
-drive file=Gentoo-VM.img,if=virtio \
-netdev user,id=vmnic,hostname=Gentoo-VM \
-device virtio-net,netdev=vmnic \
-device virtio-rng-pci \
-m 512M \
-smp 2 \
-monitor stdio \
-name "Gentoo VM" \
$@</syntaxhighlight>
Change the path to your disk image Gentoo-VM.img in the script. You can add more options when calling the script. To boot the disk image, run:
user $./start_Gentoo_VM.sh -boot d -cdrom install-amd64-minimal-20120621.isoInstall the guest per the Gentoo Handbook. See the guest section for optimum support. After the installation start the script without the additional options.
Headless server
If running on a headless server, you will need to tweak the settings a bit
start_Gentoo_VM.sh<syntaxhighlight lang="bash">#!/bin/bash
exec qemu-system-x86_64 -enable-kvm \
-cpu host \
-drive file=Gentoo-VM.img,if=virtio \
-netdev user,id=vmnic,hostname=Gentoo-VM \
-device virtio-net,netdev=vmnic \
-device virtio-rng-pci \
-m 512M \
-smp 2 \
-nographic \
-name "Gentoo VM" \
$@</syntaxhighlight>
and when prompted at boot time to select the kernel, you should input
start_Gentoo_VM.sh<syntaxhighlight lang="bash">boot: gentoo console=ttyS0</syntaxhighlight>
Guest
Hard drive
The VirtIO hard drive is mapped to /dev/vda. Where the handbook refers to /dev/sdaX, always use /dev/vdaX when configuring the guest.
Kernel
If you use genkernel do not build the VirtIO drivers as modules, compile them into the kernel.
Processor type and features --->
[*] Linux guest support --->
[*] Enable Paravirtualization code
[*] KVM Guest support (including kvmclock)
Device Drivers --->
[*] Virtio drivers --->
<*> PCI driver for virtio devices
[*] Block devices --->
<*> Virtio block driver
SCSI device support --->
[*] SCSI low-level drivers --->
[*] virtio-scsi support
[*] Network device support --->
[*] Network core driver support
<*> Virtio network driver
Graphics support --->
<*> Virtio GPU driver
Character devices --->
<*> Hardware Random Number Generator Core support --->
<*> VirtIO Random Number Generator support
As an alternative, use these commands after emerging the kernel sources:
As of kernel 5.10, the kvmconfig option to make has been removed.
(chroot) livecd / #cd /usr/src/linux(chroot) livecd /usr/src/linux #make defconfig(chroot) livecd /usr/src/linux #make kvmconfigGRUB
For a minimal grub BIOS install:
(chroot) livecd / #echo 'GRUB_PLATFORMS="pc"' >> /etc/portage/make.conf
(chroot) livecd / #echo 'sys-boot/grub -fonts -nls -themes' > /etc/portage/package.use/grub
(chroot) livecd / #emerge --ask sys-boot/grub:2Optional: to make the guest work in the headless mode, add these lines:
/etc/default/grub<syntaxhighlight lang="bash">GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0" GRUB_TERMINAL=console</syntaxhighlight>
and uncomment the following:
/etc/inittab<syntaxhighlight lang="bash"># SERIAL CONSOLES s0:12345:respawn:/sbin/agetty -L 115200 ttyS0 vt100</syntaxhighlight>
Install grub on the guest disk:
(chroot) livecd / #grub-install /dev/vdaInstalling for i386-pc platform. Installation finished. No error reported.
Configure grub for the kernel build earlier:
(chroot) livecd / #grub-mkconfig -o /boot/grub/grub.cfgGenerating grub.cfg ... Found linux image: /boot/vmlinuz-4.9.16-gentoo done
Advanced
Optional post install guest IPv6 setup
For IPv6 networking see the IPv6 subarticle.
Run images as service
To conveniently configure, start and stop a Linux (or any other) guest, check out this great init script.
Mount guest image
To access the guest disk from the host (and e.g. chroot into the guest), use a "Network Block Device":
root # modprobe nbd max_part=16 root # qemu-nbd -c /dev/nbd0 Gentoo-VM.img root # mount /dev/nbd0p4 /mnt/gentooMake any changes required and clean up:
root # umount /mnt/gentoo root # qemu-nbd -d /dev/nbd0Troubleshooting
Boot hangs at syslog-ng
If the guest boots slow, or if the boot hangs on * Checking your configfile (/etc/syslog-ng/syslog-ng.conf) or there are syslog messages like [ 1.264763] random: dbus-deamon: uninitialized urandom read (12 bytes read) or [ 12.667558] random: crng init done (12 seconds after booting), this is likely due to the lack of entropy. A way to fix this is to enable the "VirtIO Random Number Generator support" (HW_RANDOM_VIRTIO=y) in the guest kernel and boot with the QEMU virtio-rng-pci device.
Another way to solve this is to enable "Trust the CPU manufacturer to initialize Linux's CRNG" (RANDOM_TRUST_CPU=y) in the guest kernel. However, there are security concerns with this approach.