QEMU

Work in class will take place in a virtual environment using qemu.

Before starting work, create your own disk image based on the base image prepared for classes, using the following command:

qemu-img create -f qcow2 -o backing_file=/home/students/inf/PUBLIC/ZSO/zso2019.qcow2 zso2019_cow.qcow2

Students working on their own computers can download the base image (compressed with xz) at:

http://students.mimuw.edu.pl/ZSO/PUBLIC-SO/zso2019.qcow2.xz

The image thus created is a copy-on-write image: it only stores changes from the base image, saving disk space if multiple copies exist. Although the use of COW will not reduce disk usage when working on your own computer, it is still recommended due to the ability to easily restore the original state in case of problems with the file system.

To be able to use file sharing between a virtual machine and a host (recommended), you must also create the hshare directory.

Tu start qemu, run the following command:

qemu-system-x86_64 <options>

The following qemu options can be useful for classes:

-device virtio-scsi-pci,id=scsi0 -drive file=zso2019_cow.qcow2,if=none,id=drive0 -device scsi-hd,bus=scsi0.0,drive=drive0
Connects the hard disk image through a virtual block device. Required.
-enable-kvm
Enables hardware virtualization using KVM, significantly accelerating operation. Requires support from the host operating system: the driver kvm-intel or kvm-amd must be loaded, and qemu must have access to the /dev/kvm device.
-smp <number of processors>
Sets the number of processors in the virtual machine. It is recommended to set this option on the number of host processors, if we are the only user and use hardware virtualization.
-net nic,model=virtio -net user
Creates a virtual Ethernet network, connects it to a virtual machine using a virtual network device, and connects to the host TCP/IP stack by masquerading. Recommended.
-m 1G -balloon virtio
Allows for dynamic memory allocation by the guest, up to the 1GB limit. Recommended.
-fsdev local,id=hshare,path=hshare/,security_model=none -device virtio-9p-pci,fsdev=hshare,mount_tag=hshare
Connects the hshare/ directory on the host over the 9p protocol to the virtual machine, allowing it to be easily mounted. Using the image prepared for classes, the exported catalog will be automatically visible in the guest system as /host. Recommended.
-chardev stdio,id=cons,signal=off -device virtio-serial-pci -device virtconsole,chardev=cons

Connects the terminal on which qemu works to the guest. Unfortunately, due to limitations of the virtio protocol, the terminal size information is not automatically passed on to the guest. To use full-screen programs in this way, you must manually correct this by executing the command within the guest OS

stty rows <number of rows> cols <number of columns>

The right number of rows and columns for the terminal can be determined by entering the following command on the host system:

stty size

Recommended.

-soundhw hda

Enables sound card emulation. Recommended for the second task.

-usb -device usb-mouse

Changes emulated mouse interface from PS/2 to USB. Recommended for the second task.
-display none
Disables the graphical qemu interface. Recommended when working over a network. It is then necessary to use the virtconsole option (or any other option that allows you to log in to the machine).
-kernel <file> -append <options>
Runs the linux kernel directly from the given file with the given options instead of going ahead of the standard boot process. Sometimes useful.
-gdb tcp::<port>
Allows you to connect to qemu via gdb (the gdb command is target remote localhost:<port>) and debug the kernel in this way. Sometimes useful.
-S
In combination with the -gdb option, it causes qemu to start in a suspended state, allowing you to set breakpoints etc. by gdb before the system is started.

If you use qemu with a graphical interface, you can access the qemu monitor console by Ctrl+Alt+2 (return via Ctrl+Alt+1). This console allows, among others, for connecting new virtual devices while qemu is running and forcing off / resetting the system (system_reset and quit commands).

Using virtual machines other than qemu is not possible – one of the tasks will require writing a device driver for a simulated device provided in the form of a modified version of qemu.

Environment inside the image

The system installed in the image is debian 8.7, with minor modifications. You can log in using the login root and the password root. If you need to use an unprivileged account (eg for testing), you can use the account zso (password zso).

The image contains one ext4 partition with a grub2 bootloader installed, and the kernel in version 4.20.8 (that is, the one to be used in the classroom).

Useful commands:

apt-get install <package name>
software installation.
apt-cache search <character string>
searching the software database
screen

terminal multiplexer, useful when working with virtconsole, useful key combinations:

  • Ctrl-A Ctrl-C: creates a new sub-term
  • Ctrl-A Ctrl-W: sub-terminal list
  • Ctrl-A <number>: goes to sub-term number 0-9, respectively
  • Ctrl-A Ctrl-N: goes to the next sub-terminal
  • Ctrl-A Ctrl-P: goes to the previous sub-terminal
  • Ctrl-A ?: list of key bindings
poweroff
shuts down the system and turns off qemu

If qemu was run with the appropriate -net option, the system will have access to the external network. The host system is available at IP 10.0.2.2. However, access from the external network to the guest network is not possible (to enable this, you would use -net tap instead of -net user, which requires root privileges and is much more complicated). Instead, it is recommended to use the option virtio-9p-pci (for file sharing) and virtconsole (for copy/paste support and a meaningful terminal).

If the virtio-9p-pci option was used, the shared directory (hshare/ on the host system) is available as /hshare. Note, however, that the 9p protocol does not properly support the full UNIX file system semantics, which can cause problems for some applications. It is impossible to compile of the kernel inside the mounted directory, due to faulty handling of the rename() call.

When using virtconsole, remember to set the correct size of the terminal. If we use the same size of the terminal all the time, it is worth adding the appropriate stty calls to, for example, the .bash_profile file.

If it is not possible to use qemu with KVM support, it is worth performing tasks that require more computing power (eg kernel compilation) on the host computer.

Warnings

qemu without KVM is slow. The system can take 1-2 minutes to start (compared to a few seconds with KVM). What’s more, the system used does not write anything on virtconsole until it is fully operational – no output for a long time when using -display none therefore does not mean that the system has crashed.

Using qemu on students, and especially doing time-consuming activities on it, is a very bad idea - it is very slow, and what’s more, it will be interrupted after an hour by the processor time limit. It’s better to use one of the computers in labs or your own machine.

Using ssh to log in to a virtual machine is possible, using port forwarding with port 22, but remember to change the password on the root and zso accounts first.

When using a copy-on-write image, be careful never to modify the base image – any change will make the copy-on-write image useless. It’s best to set 444 permissions on it as soon as it’s downloaded and decompressed.