Files
linuxkit/contrib/crosvm
Rolf Neugebauer d2fab1f7cb contrib: Notes and build support for crosvm
crosvm is a VMM written on Rust which can run the device
backends in secomp isolated processes.

This adds build support for crosvm for x86 and arm64 as well
as some instructions on how to run LinuxKit built images on crosvm.

Signed-off-by: Rolf Neugebauer <rolf.neugebauer@docker.com>
2018-04-17 14:51:20 +01:00
..

The Chrome OS Virtual Machine Monitor crosvm is a lightweight VMM written in Rust. It runs on top of KVM and optionally runs the device models in separate processes isolated with seccomp profiles.

Build/Install

The Makefile and Dockerfile compile crosvm and a suitable version of libminijail. To build:

make

You should end up with a crosvm and libminijail.so binaries as well as the seccomp profiles in ./build. Copy libminijail.so to /usr/lib or wherever ldd picks it up. You may also need libcap (on Ubuntu or Debian apt-get install -y libcap-dev).

You may also have to create an empty directory /var/empty.

Use with LinuxKit images

You can build a LinuxKit image suitable for crosvm with the kernel+squashfs build format. For example, using this LinuxKit YAML file (minimal.yml):

kernel:
  image: linuxkit/kernel:4.9.91
  cmdline: "console=tty0 console=ttyS0 console=ttyAMA0"
init:
  - linuxkit/init:v0.3
  - linuxkit/runc:v0.3
  - linuxkit/containerd:v0.3
services:
  - name: getty
    image: linuxkit/getty:v0.3
    env:
      - INSECURE=true
trust:
  org:
    - linuxkit

run:

linuxkit build -output kernel+squashfs minimal.yml

The kernel this produces (minimal-kernel) needs to be converted as crosvm does not grok bzImages. You can convert the LinuxKit kernel image with extract-vmlinux:

extract-vmlinux minimal-kernel > minimal-vmlinux

Then you can run crosvm:

./crosvm run --seccomp-policy-dir=./seccomp/x86_64 \
    --root ./minimal-squashfs.img \
    --mem 2048 \
    --multiprocess \
    --socket ./linuxkit-socket \
    minimal-vmlinux

Known issues

  • With 4.14.x, a BUG_ON() is hit in drivers/base/driver.c. 4.9.x kernels seem to work.
  • Networking does not yet work, so don't include a onboot dhcpd service.
  • poweroff from the command line does not work (crosvm does not seem to support ACPI). So to stop a VM you can use the control socket and: ./crosvm stop ./linuxkit-socket
  • crosvm and its dependencies compile on arm64 but crosvm seems to lack support for setting op the IRQ chip on the system I tested. I got: failed to create in-kernel IRQ chip: CreateGICFailure(Error(19)).