Introduction to qemu
qemu is a full virtualization
solution for Linux on x86 hardware containing virtualization
extensions (Intel VT or AMD-V).
Note
Development versions of BLFS may not build or run some packages
properly if LFS or dependencies have been updated since the most
recent stable versions of the books.
Package Information
-
Download (HTTP): https://download.qemu.org/qemu-9.1.1.tar.xz
-
Download MD5 sum: 29c6954d8d2cb0b8cac59335cd62fbd2
-
Download size: 126 MB
-
Estimated disk space required: 2.3 GB (451 MB installed)
-
Estimated build time: 1.2 SBU (add 1.2 SBU for tests, both
using parallelism=4)
Qemu Dependencies
Required
GLib-2.82.2 and Pixman-0.43.4
Recommended
alsa-lib-1.2.12, dtc-1.7.1, libslirp-4.8.0, and SDL2-2.30.8
Note
If dtc-1.7.1 is not installed, the building system
will attempt to download a copy of dtc source code from the
Internet.
Optional
pipewire-1.2.5 or PulseAudio-17.0 (can be used instead of
alsa-lib), BlueZ-5.78, cURL-8.10.1,
Cyrus SASL-2.1.28, Fuse-3.16.2, GnuTLS-3.8.7.1,
GTK+-3.24.43, keyutils-1.6.3, libaio-0.3.113,
libusb-1.0.27, libgcrypt-1.11.0, libjpeg-turbo-3.0.1, libseccomp-2.5.5, libssh2-1.11.1, libpng-1.6.44,
libtasn1-4.19.0, Linux-PAM-1.6.1,
LZO-2.10, Nettle-3.10, Mesa-24.2.5, VTE-0.78.1,
capstone, ceph, daxctl, JACK, glusterfs, libbpf,
libcacard,
libcap-ng,
libdw,
libiscsi, libnfs,
libpmem,
libssh,
libu2f-emu,
lzfse,
netmap, numactl, rdma-core, SELinux, snappy,
spice, usbredir, and
VDE
Optional (Runtime)
Systemd-256.5
Optional (for building the documentation)
sphinx_rtd_theme-3.0.1
Note
This optional dependencies list is not comprehensive. See the
output of ./configure
--help for a more complete list.
Editor Notes: https://wiki.linuxfromscratch.org/blfs/wiki/qemu
Installation of qemu
The udev rule of LFS only allows the root
user, the users owning a local login
session supported by the optional runtime dependency Systemd-256.5, or the users in the
kvm
group to use the KVM device. As
the root
user, add any
non-root
users that might use the
KVM device either without Systemd-256.5 installed or remotely (via
a SSH connection) to the kvm
group:
usermod -a -G kvm <username>
Install qemu by running the
following commands:
Note
Qemu is capable of running many targets. The build process is
also capable of building multiple targets at one time in a comma
delimited list assigned to --target-list
. Run ./configure --help to get a
complete list of available targets.
if [ $(uname -m) = i686 ]; then
QEMU_ARCH=i386-softmmu
else
QEMU_ARCH=x86_64-softmmu
fi
mkdir -vp build &&
cd build &&
../configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--target-list=$QEMU_ARCH \
--audio-drv-list=alsa \
--disable-pa \
--enable-slirp \
--docdir=/usr/share/doc/qemu-9.1.1 &&
unset QEMU_ARCH &&
make
qemu uses ninja as a subprocess when
building. To run the tests, issue: ninja test.
Now, as the root
user:
make install
Change the permissions and ownership of a helper script, which is
needed when using the “bridge” network device (see below). Again as
the root
user, issue:
Note
You need to add any users who might use the “bridge” network device
into the kvm
group even if
Systemd-256.5 is installed.
chgrp kvm /usr/libexec/qemu-bridge-helper &&
chmod 4750 /usr/libexec/qemu-bridge-helper
Note
For convenience you may want to create a symbolic link to run the
installed program. For instance (as the root
user):
ln -sv qemu-system-`uname -m` /usr/bin/qemu
Using Qemu
Since using qemu means using a virtual computer, the steps to set
up the virtual machine are in close analogy with those to set up a
real computer. You'll need to decide about CPU, memory, disk, USB
devices, network card(s), screen size, etc. Once the “hardware” is decided,
you'll have for example to choose how to connect the machine to
internet, and/or to install an OS. In the following, we show basic
ways of performing those steps. But qemu is much more than this,
and it is strongly advised to read the qemu documentation in
/usr/share/doc/qemu-9.1.1/qemu-doc.html
.
Note
It is standard practice to name the computer running qemu
“host” and
the emulated machine running under qemu the “guest.” We'll use
those notations in the following.
Note
The following instructions assume the optional symbolic link,
qemu
, has been created.
Additionally, qemu
should be run in a graphical environment. But it is possible to
use qemu “headless” or through SSH. See the
documentation for the various possibilities.
Disk
A virtual disk may be set up in the following way:
VDISK_SIZE=50G
VDISK_FILENAME=vdisk.img
qemu-img create -f qcow2 $VDISK_FILENAME $VDISK_SIZE
The virtual disk size and filename should be adjusted as desired.
The actual size of the file will be less than specified, but will
expand as needed, so it is safe to put a high value.
Operating System
To install an operating system, download an iso image from your
preferred Linux distribution. For the purposes of this example,
we'll use Fedora-16-x86_64-Live-LXDE.iso
in the current
directory. Run the following:
qemu -enable-kvm \
-drive file=$VDISK_FILENAME \
-cdrom Fedora-16-x86_64-Live-LXDE.iso \
-boot d \
-m 1G
Follow the normal installation procedures for the chosen
distribution. The -boot
option specifies the boot order of drives as a string of drive
letters. Valid drive letters are: a, b (floppy 1 and 2), c (first
hard disk), d (first CD-ROM). The -m
option is the amount of memory to
use for the virtual machine. The choice depends on the load of the
host. Modern distributions should be comfortable with 1GB. The
-enable-kvm
option allows
hardware acceleration. Without this switch, the emulation is much
slower.
Defining the virtual hardware
The virtual machine hardware is defined by the qemu command line.
An example command is given below:
qemu -enable-kvm \
-smp 4 \
-cpu host \
-m 1G \
-drive file=$VDISK_FILENAME \
-cdrom grub-img.iso \
-boot order=c,once=d,menu=on \
-net nic,netdev=net0 \
-netdev user,id=net0 \
-device ac97 \
-vga std \
-serial mon:stdio \
-name "fedora-16"
Meaning of the command line options
-enable-kvm
: enable full
KVM virtualization support. On some hardware, it may be necessary
to add the undocumented -machine
smm=off
option in order to enable KVM.
-smp <N>
: enable
symmetric multiprocessing with <N> CPUs.
-cpu <model>
:
simulate CPU <model>. the list of supported models can be
obtained with -cpu help
.
-drive
file=<filename>
: defines a virtual disk whose
image is stored in <filename>
.
-cdrom grub-img.iso
:
defines an iso formatted file to use as a cdrom. Here we use a grub
rescue disk, which may turn handy when something goes wrong at boot
time.
-boot
order=c,once=d,menu=on
: defines the boot order for the
virtual BIOS.
-net
nic,netdev=<netid>
: defines a network card
connected to the network device with id <netid>.
-netdev
user,id=<netid>
: defines the network “user” device. This is a
virtual local network with addresses 10.0.2.0/24, where the host
has address 10.0.2.2 and acts as a gateway to internet, and with a
name server at address 10.0.2.3, and an smb server at address
10.0.2.4. A builtin DHCP server can allocate addresses between
10.0.2.15 and 10.0.2.31.
-soundhw <model>
:
defines the soundcard model. The list may be obtained with
-soundhw help
.
-vga <type>
: defines
the type of VGA card to emulate. For -vga std
, if you are building a Linux
kernel for the guest, it's recommended to enable CONFIG_DRM_BOCHS
(as a part of the kernel or a
kernel module) to drive all the features of the emulated VGA card,
and CONFIG_FB
to display the Linux
console on it. The other <type>
values are not tested by the editors and may require additional
dependencies.
-serial mon:stdio
: sends
the serial port of the guest (/dev/ttyS0
on linux guests), multiplexed with the
qemu monitor, to the standard input and output of the qemu process.
-name <name>
: sets
the name of the guest. This name is displayed in the guest window
caption. It may be useful if you run several guests at the same
time.
-drive
if=pflash,format=raw,readonly=on,file=/usr/share/qemu/edk2-x86_64-code.fd
:
Load a pre-built EDK2 UEFI firmware, instead of the default PC
BIOS. Use this option if you want to boot the guest OS with UEFI.
-drive file=<filename>,if=virtio
:
Provide Virtio interface to the guest kernel for accessing the disk
image, instead of simulating a real disk hardware. This can improve
disk I/O performance, but it requires a Virtio driver in guest
kernel. Use it instead of a plain -drive
if the guest kernel supports Virtio. To
build a Linux kernel with Virtio support for the guest, use
make defconfig && make
kvm_guest.config to create an initial kernel
configuration with the Virtio drives enabled, then make your
customization. And, if the guest kernel is Linux, the virtual disks
using Virtio interface will be named vdx
in the devtmpfs, instead of sdx
.
-net
nic,netdev=net0,model=virtio-net-pci
: Provide Virtio
interface to the guest kernel for accessing the network interface,
instead of simulating a real network interface card. This can
improve network I/O performance, but it requires a Virtio driver in
guest kernel. Use it instead of a plain -net
if the guest kernel supports Virtio.
Controlling the Emulated Display
To set the resolution of the emulated display for a Xorg server
running in the guest Linux system, read the section called “Fine Tuning
Display Settings”.
Networking
The above solution for networking allows the guest to access the
local network through the host (and possibly to access internet
through the local routers), but the converse is not true. Not even
the host can access the guest, unless port forwarding is enabled.
And in the case several guests are running, they cannot communicate
with each other. Other network devices can be used for this
purpose. For example, there is the “socket” device, which
allows several guests to share a common virtual network. In the
following, we describe in more details how to set up the
“bridge”
device, which allows the guests to appear as if connected to the
local network. All the commands below should be run as the
root
user.
Allow the host to forward IP packets:
sysctl -w net.ipv4.ip_forward=1
To make this permanent, add the command to /etc/sysctl.d/60-net-forward.conf:
cat >> /etc/sysctl.d/60-net-forward.conf << EOF
net.ipv4.ip_forward=1
EOF
Set up a required configuration file:
install -vdm 755 /etc/qemu &&
echo allow br0 > /etc/qemu/bridge.conf
In the qemu command line above, replace the switch -netdev user,...
with -netdev bridge,...
.