krata/DEV.md
Alex Zenla 24c71e9725
feat: oci packer can now use mksquashfs if available (#70)
* feat: oci packer can now use mksquashfs if available

* fix: use nproc in kernel build script for default jobs, and fix DEV.md guide

* feat: working erofs backend
2024-04-15 00:19:38 +00:00

3.5 KiB

Development Guide

Structure

krata is composed of four major executables:

Executable Runs On User Interaction Dev Runner Code Path
kratad host backend daemon ./hack/debug/kratad.sh crates/daemon
kratanet host backend daemon ./hack/debug/kratanet.sh crates/network
kratactl host CLI tool ./hack/debug/kratactl.sh crates/ctl
krataguest guest none, guest init N/A crates/guest

You will find the code to each executable available in the bin/ and src/ directories inside it's corresponding code path from the above table.

Environment

Component Specification Notes
Architecture x86_64 aarch64 support is still in development
Memory At least 6GB dom0 will need to be configured will lower memory limit to give krata guests room
Xen 4.17 Temporary due to hardcoded interface version constants
Debian stable / sid Debian is recommended due to the ease of Xen setup
rustup any Install Rustup from https://rustup.rs

Setup Guide

  1. Install the specified Debian version on a x86_64 host capable of KVM (NOTE: KVM is not used, Xen is a type-1 hypervisor).

  2. Install required packages:

$ apt install git xen-system-amd64 build-essential libclang-dev musl-tools flex bison libelf-dev libssl-dev bc protobuf-compiler libprotobuf-dev squashfs-tools erofs-utils
  1. Install rustup for managing a Rust environment.

Make sure to install the targets that you need for krata:

$ rustup target add x86_64-unknown-linux-gnu
$ rustup target add x86_64-unknown-linux-musl
  1. Configure /etc/default/grub.d/xen.cfg to give krata guests some room:
# Configure dom0_mem to be 4GB, but leave the rest of the RAM for krata guests.
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=4G,max:4G"

After changing the grub config, update grub: update-grub

Then reboot to boot the system as a Xen dom0.

You can validate that Xen is setup by running dmesg | grep "Hypervisor detected" and ensuring it returns a line like Hypervisor detected: Xen PV, if that is missing, the host is not running under Xen.

  1. Clone the krata source code:
$ git clone https://github.com/edera-dev/krata.git krata
$ cd krata
  1. Build a guest kernel image:
$ ./hack/kernel/build.sh
  1. Copy the guest kernel image at target/kernel/kernel-x86_64 to /var/lib/krata/guest/kernel to have it automatically detected by kratad.
  2. Launch ./hack/debug/kratanet.sh and keep it running in the foreground.
  3. Launch ./hack/debug/kratad.sh and keep it running in the foreground.
  4. Run kratactl to launch a guest:
$ ./hack/debug/kratactl.sh launch --attach alpine:latest

To detach from the guest console, use Ctrl + ] on your keyboard.

To list the running guests, run:

$ ./hack/debug/kratactl.sh list

To destroy a running guest, copy it's UUID from either the launch command or the guest list and run:

$ ./hack/debug/kratactl.sh destroy GUEST_UUID