Virtual Machine Setup

Exercises are designed to run on a qemu based virtual machine. In order to run the virtual machine you will need following packages:

  • build-essential
  • qemu-system-x86
  • qemu-system-arm
  • kvm
  • python3

The virtual machine setup uses prebuild Yocto images that it downloads from downloads.yocyoproject.org and a kernel image that it builds itself. The following images are supported:

  • core-image-minimal-qemu
  • core-image-minimal-dev-qemu
  • core-image-sato-dev-qemu
  • core-image-sato-qemu
  • core-image-sato-sdk-qemu

and can be selected from tools/labs/qemu/Makefile.

Starting the VM

The virtual machine scripts are available in tools/labs/qemeu and you can can start the virtual machine by using the boot make target in tools/labs:

~/src/linux/tools/labs$ make boot
ARCH=x86 qemu/qemu.sh -kernel zImage.x86 -device virtio-serial \
             -chardev pty,id=virtiocon0 -device virtconsole,chardev=virtiocon0 \
             -net nic,model=virtio,vlan=0 -net tap,ifname=tap0,vlan=0,script=no,downscript=no\
             -drive file=rootfs.img,if=virtio,format=raw --append "root=/dev/vda console=hvc0" \
             --display none -s
char device redirected to /dev/pts/19 (label virtiocon0)

Note

To show the qemu console use “QEMU_DISPLAY=sdl make boot”. This will show the VGA output and will also give access to the standard keyboard.

Connecting to the VM

Once the machine is booted you can connect to it on the serial port. A link named serial.pts is created to the right emulated serial port and you can use minicom, picocom to connect to the virtual machine from the host:

$ minicom -D serial.pts

Poky (Yocto Project Reference Distro) 2.3 qemux86 /dev/hvc0

qemux86 login: root
root@qemux86:~#

Networking is also setup and you can use ssh to connect to the virtual machine after finding out the allocated IP address:

$ minicom -D serial.pts

Poky (Yocto Project Reference Distro) 2.3 qemux86 /dev/hvc0

qemux86 login: root
root@qemux86:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56
          inet addr:172.20.0.6  Bcast:172.20.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:41 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:7578 (7.4 KiB)  TX bytes:1296 (1.2 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1%134535719/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

$ ssh root@172.20.0.6
The authenticity of host '172.20.0.6 (172.20.0.6)' can't be established.
RSA key fingerprint is SHA256:CW1opJUHi4LDt1lnKjBVv12kXZ4s+8rreMBm5Jsdm00.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.20.0.6' (RSA) to the list of known hosts.
root@qemux86:~#

Attention

The Yocto core-image-minimal-qemu does not include an SSH server, so you will not able to connect via ssh if you are using this image.

Connecting a debugger to the VM kernel

You can connect gdb to the running VM kernel and inspect the state of the kernel by running the gdb target from tools/labs:

$ make gdb
ln -fs /home/tavi/src/linux/vmlinux vmlinux
gdb -ex "target remote localhost:1234" vmlinux
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from vmlinux...done.
Remote debugging using localhost:1234
0xc13cf2f2 in native_safe_halt () at ./arch/x86/include/asm/irqflags.h:53
53asm volatile("sti; hlt": : :"memory");
(gdb) bt
#0  0xc13cf2f2 in native_safe_halt () at ./arch/x86/include/asm/irqflags.h:53
#1  arch_safe_halt () at ./arch/x86/include/asm/irqflags.h:95
#2  default_idle () at arch/x86/kernel/process.c:341
#3  0xc101f136 in arch_cpu_idle () at arch/x86/kernel/process.c:332
#4  0xc106a6dd in cpuidle_idle_call () at kernel/sched/idle.c:156
#5  do_idle () at kernel/sched/idle.c:245
#6  0xc106a8c5 in cpu_startup_entry (state=<optimized out>)
at kernel/sched/idle.c:350
#7  0xc13cb14a in rest_init () at init/main.c:415
#8  0xc1507a7a in start_kernel () at init/main.c:679
#9  0xc10001da in startup_32_smp () at arch/x86/kernel/head_32.S:368
#10 0x00000000 in ?? ()
(gdb)

Rebuild the kernel image

The kernel image is built the first time the VM is started. To rebuild the kernel remove the zImage file and run the zImage target (or start the VM again).