# Uhyve - A minimal hypervisor for Hermit [![crates.io](https://img.shields.io/crates/v/uhyve.svg)](https://crates.io/crates/uhyve) [![Zulip Badge](https://img.shields.io/badge/chat-hermit-57A37C?logo=zulip)](https://hermit.zulipchat.com/) ## Introduction Uhyve is a small hypervisor specialized for the [Hermit kernel](https://github.com/hermitcore/kernel). > [!WARNING] > For the time being, Uhyve provides the unikernel full host file system access with the permissions of the user running Uhyve. > Thus, it should not be used for applications which require isolation from the host system. ## Installation 1. Install the Rust toolchain. The Rust Foundation provides [installation instructions](https://www.rust-lang.org/tools/install). 2. Install Uhyve: ```sh cargo install --locked uhyve ``` ## Requirements ### Linux To check if your system supports virtualization, you can use the following command: ```sh if egrep -c '(vmx|svm)' /proc/cpuinfo > /dev/null; then echo "Virtualization support found"; fi ``` Uhyve on Linux depends on the virtualization solution [KVM (Kernel-based Virtual Machine)](https://www.linux-kvm.org/page/Main_Page). If the following command gives you some output, you are ready to go! ```sh lsmod | grep kvm ``` > [!NOTE] > If the above steps don't work, make sure that you have enabled virtualization in your UEFI/BIOS settings. ### macOS > [!WARNING] > Currently, Uhyve is mainly developed for Linux. > The macOS version has not been tested extensively and does not support all features of the Linux version. You can install Apple's [Xcode Command Line Tools](https://developer.apple.com/xcode/resources) using the following command: ```sh xcode-select --install ``` Additionally, the included hypervisor bases on the [Hypervisor Framework](https://developer.apple.com/documentation/hypervisor) depending on OS X Yosemite (10.10) or newer. To verify if your processor is able to support this framework, run the following in your Terminal: ```sh sysctl kern.hv_support ``` The output `kern.hv_support: 1` indicates virtualization support. Starting with Big Sur, all processes using the Hypervisor API must have the [com.apple.security.hypervisor](https://developer.apple.com/documentation/Hypervisor) entitlement and therefore must be signed. ## Building from source To build from source, simply checkout the code and use `cargo build`: ```sh git clone https://github.com/hermitcore/uhyve.git cd uhyve cargo build --release ``` ### macOS Big Sur: Signing Uhyve `uhyve` can be self-signed using the following command: ```sh codesign -s - --entitlements app.entitlements --force path_to_uhyve/uhyve ``` The file `app.entitlements` must have following content: ```xml com.apple.security.hypervisor ``` For further information, please consult [Apple's Documentation](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_hypervisor). ## Usage ### Running Hermit apps within Uhyve Assuming that you have **installed** Uhyve, run the hypervisor to start the unikernel: ```sh uhyve /path/to/the/unikernel/binary ``` > [!NOTE] > This repository ships a few binaries that can be used for testing. > > If you want to compile Hermit binaries yourself (or create your own), take a look at the following repositories: > - [hermit-os/hermit-rs](https://github.com/hermit-os/hermit-rs) > - [hermit-os/hermit-rs-template](https://github.com/hermit-os/hermit-rs-template) > - [hermit-os/hermit-playground](https://github.com/hermit-os/hermit-playground) ### Configuration Uhyve can be configured using environment variables. The following variables are supported: - `HERMIT_CPUS`: specifies the number of cores the virtual machine may use. - `HERMIT_MEM`: defines the memory size of the virtual machine. The suffixes *M* and *G* can be used to specify a value in megabytes or gigabytes, respectively. - `HERMIT_GDB_PORT=port` activate a gdb server for the application running inside Uhyve. _See below_ By default, the loader initializes a system with one core and 512 MiB RAM. **Example:** the following command starts the demo application in a virtual machine, which has 4 cores and 8GiB memory: ```sh HERMIT_CPUS=4 HERMIT_MEM=8G uhyve /path/to/the/unikernel/binary ``` ### Known issues * Uhyve isn't able to pass more than 128 environment variables to the unikernel. ## Licensing Licensed under either of * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) at your option. Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. --- ## Contributing ### Testing Hermit apps using `cargo run` As mentioned above, the Uhyve repository ships some binaries that can be used for testing purposes. ```sh cargo run -- data/x86_64/rusty_demo cargo run -- data/x86_64/hello_world cargo run -- data/x86_64/hello_c ``` ### Debugging Hermit apps Basic support of (single-core) applications is already integrated into Uhyve. By specifying variable `HERMIT_GDB_PORT=port`, Uhyve is working as gdbserver and is waiting on port `port` for a connection to a gdb. For instance, with the following command Uhyve is waiting on port `6677` for a connection. ```bash HERMIT_GDB_PORT=6677 uhyve /path_to_the_unikernel/hello_world ``` In principle, every gdb-capable IDE should be able to debug Hermit applications. (Eclipse, VSCode, ...) #### Visual Studio Code / VSCodium The repository [hermit-rs](https://github.com/hermitcore/hermit-rs) provides [example configuration files](https://github.com/hermitcore/hermit-rs/tree/master/.vscode) to debug a Hermit application with [Visual Studio Code](https://code.visualstudio.com/), [VSCodium](https://vscodium.com/) or derivatives of [Eclipse Theia](https://theia-ide.org/). ![Debugging Hermit apps](img/vs_code.png)