Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/avisi-group/captive
The Captive Hypervisor
https://github.com/avisi-group/captive
Last synced: 2 months ago
JSON representation
The Captive Hypervisor
- Host: GitHub
- URL: https://github.com/avisi-group/captive
- Owner: avisi-group
- License: mit
- Created: 2019-07-23T09:16:54.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2022-11-04T09:32:04.000Z (about 2 years ago)
- Last Synced: 2024-08-02T01:24:02.376Z (6 months ago)
- Language: C++
- Size: 3.77 MB
- Stars: 39
- Watchers: 7
- Forks: 7
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# captive
The Captive Hypervisor[![CI](https://github.com/tspink/captive/actions/workflows/ci.yml/badge.svg)](https://github.com/tspink/captive/actions/workflows/ci.yml)
Captive only works on Linux with KVM support. You will need to have the appropriate permissions
on the `/dev/kvm` device to use it.## Getting started
Check out the repository and compile:$ git clone https://github.com/tspink/captive
$ cd captive
$ makeYou will get a bunch of warnings about variables that are set but not used - these come from the
auto-generated DBT/JIT compiler, and are harmless.This should have built the captive hypervisor executable, configured for AArch64 virtualisation as `captive/bin/captive`
## Kernel and User-space
You will also need an AArch64 kernel and user-space to try running with.### Kernel
You can build a Linux kernel from source quite easily:$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux
$ git checkout v5.2
$ export ARCH=arm64
$ make defconfig
$ makeWhich should have built `arch/arm64/boot/Image`. Alternatively, you can download an example kernel from:
https://groups.inf.ed.ac.uk/card-project/captive/arm64-kernel-image (approx. 25 Mb)
or
https://github.com/fmckeogh/captive/releases/download/0.0.0/kernel (build by Dockerfile)
### User-space
The user-space is provided to the guest operating system as a block device, so captive requires a file that
represents the contents of the block device.Captive has been tested with an Arch Linux Arm64 userspace, but also with a lighter buildroot-based
userspace.An example userspace built by the Docker image can be found at https://github.com/fmckeogh/captive/releases/download/0.0.0/rootfs.ext2
Please consult the appropriate guides from e.g. https://archlinuxarm.org/platforms/armv8/generic for a fully fledged user-space, or from here https://buildroot.org/ for a lightweight userspace.
You should end up with a single file representing a block device that contains a file system containing
a user-space.## Running Captive
Once you have built captive, have your Linux kernel and arm64 userspace, you can run captive with the
following command (assuming you're in the top of the captive build directory).$ bin/captive --block-dev-file \
--engine arch/arm64.arch \
--device-tree ./captive-platform.dtb \
--kernel \
--platform virtThis will start captive with the provided userspace in the block device, and by booting the provided
Linux kernel. The device tree is a stripped down tree that includes a virtio block device and network
device.See the next section for how to use the network.
## Docker
Captive can be ran inside Docker using the supplied `Dockerfile`. Executing
```bash
$ docker build . -t captive
```will build an image containing Captive, an ARM64 kernel, and a userspace image. Compilation can take a while; make yourself a coffee. Future rebuilds will be cached by Docker. The userspace and kernel are built using older toolchain and Linux versions as more modern versions use instructions not supported by the current ARM64 GenSim model.
Execute
```bash
$ docker run -i --privileged captive
```to run it in interactive, privileged mode (required for access to KVM).
## Networking
Captive can support networking by means of a TAP device.To boot with networking support, two more command-line options need to be added:
--mac-address 020000000001 \
--tap-device### Setting up a TAP device
Coming soon: a helper script!