Managing Unikraft Ecosystem
kraft is installed, you can use it to manage dependencies for applications, including finding and retrieving existing applications, libraries, platforms and architectures.
Libraries are additional software components that will be linked with Unikraft for the final image.
Each unikernel image is using its specific libraries.
They are typically common libraries (such as OpenSSL or LWIP) that have been ported on top of Unikraft.
The libraries, also called external libraries are located in specialized repositories in the Unikraft organization, those whose names start with
The application is the actual application code.
It typically provides the
main() function (or equivalent) and is reliant on Unikraft and external libraries.
The avalaible applications that have been ported on top of Unikraft are located in repositories in the Unikraft organization, those whose names start with
An important role of the core Unikraft component is providing support for different platforms and architectures. A platform is the virtualization / runtime environment used to run the resulting unikernel image.
Unikraft directories structure
By default, all components pulled by
kraft are saved to
~/.unikraft/ directory, which is also the default value for the
UK_WORKDIR environment variable used by
This is the usual layout of the
|-- apps - This is where you would normally place existing app builds |-- archs - Here we place our custom arch's files |-- libs - This is where the build system looks for external library pool sources |-- plats - The files for our custom plats are placed here `-- unikraft - The core source code of the Unikraft Unikernel
If you want to keep your unikraft components in a different location, you can do that and export the environment variable
Apart from that, there are also environment variables available for the above subdirectories:
||The directory for Unikraft’s core source code||
||The directory of all the external Unikraft libraries||
||The directory of all the template applications||
You can find a list of all aplication, libraries and platforms by using:
$ kraft list
You can see the component name, current version, release date and the time of the last check.
All the components already avalaible on your system, in your
UK_WORKDIR directory will be shown green.
All the other components will be colored red.
APPLICATIONS VERSION RELEASED LAST CHECKED helloworld 0.6 22 Jan 22 17 hours ago httpreply 0.6 02 Dec 21 17 hours ago python3 0.6 2 days ago 17 hours ago duktape 0.6 02 Dec 21 17 hours ago helloworld-cpp 0.6 02 Dec 21 17 hours ago
You can add origins for kraft to use in the
.kraftrc file, under
If you create a new library using the
kraft lib command shown below, you can add the new local library to the
.kraftrc file by using:
$ kraft lib add ~/path/to/local/lib $ kraft list update
You can check that everything worked fine and view basic informations about the new library by using:
$ kraft list show LIBNAME
You can manually add URLs, git, git+ssh and wildcards in the
[list] origins = [ "https://github.com/unikraft/unikraft.git", "https://github.com/unikraft/plat-*", "https://github.com/unikraft/app-*", "https://github.com/unikraft/lib-*", ]
After every update to
$ kraft list update
You may get the following error when running
GitHub rate limit exceeded. You can tell kraft to use a personal access token by setting the UK_KRAFT_GITHUB_TOKEN environmental variable.
In this case, create a GitHub personal access token and use the following command:
$ UK_KRAFT_GITHUB_TOKEN=<your_GitHub_token_here> kraft list update
kraft list command
Usage: kraft list [OPTIONS] COMMAND [ARGS]... Retrieves lists of available architectures, platforms, libraries and applications supported by unikraft. Use this command if you wish to determine (and then later select) the possible targets for your unikraft application. By default, this subcommand will list all possible targets. Options: -i, --installed Display only installed components. -c, --core Display information about Unikraft's core repository. -p, --plats List supported platforms. -l, --libs List supported libraries. -a, --apps List supported application runtime execution environments. -d, --show-local Show local source path. -n, --paginate Paginate output. -t, --this Show the components for this application (default is cwd). --this=PATH Show the components for this application. -j, --json Return output as JSON. -h, --help Show this message and exit. Commands: add Add a remote manifest or repository. pull Pull the remote component to disk. remove Remove a remote manifest or repository. show Show a unikraft component. update Update the list of remote components.
If you want to initiate an existing application, you can use:
$ kraft init -t TEMPLATE_NAME [TARGET_NAME]
kraft init command
Usage: kraft init [OPTIONS] [NAME] Initializes a new unikraft application. Start here if this is your first time using (uni)kraft. Options: -t, --template NAME Use an existing application as a template. -p, --plat PLAT Target platform. -m, --arch ARCH Target architecture. -w, --workdir PATH Specify an alternative directory for the application [default is cwd]. -M, --with-makefile Create a Unikraft compatible Makefile. -D, --no-deps Do not download additional dependencies for application components. -d, --dump Dump dependencies into project directory. -F, --force Overwrite any existing files. -h, --help Show this message and exit.
You can retreive, build and run an existing appliication from the list above by using only one command:
$ kraft up -t TEMPLATE_NAME TARGET_NAME
kraft up command
Usage: kraft up [OPTIONS] NAME Configures, builds and runs an application for a selected architecture and platform. Options: -w, --workdir PATH Specify an alternative directory for the application [default is cwd]. -t, --template NAME Use an existing application as a template. [required] -p, --plat TEXT Target platform. -m, --arch TEXT Target architecture. -i, --initrd TEXT Provide an init ramdisk. -B, --background Run in background. -P, --paused Run the application in paused state. -g, --gdb INTEGER Run a GDB server for the guest on specified port. -d, --dbg Use unstriped unikernel -n, --virtio-nic TEXT Attach a NAT-ed virtio-NIC to the guest. -b, --bridge TEXT Attach a NAT-ed virtio-NIC an existing bridge. -V, --interface TEXT Assign host device interface directly as virtio- NIC to the guest. -D, --dry-run Perform a dry run. -M, --memory INTEGER Assign MB memory to the guest. -s, --cpu-sockets INTEGER Number of guest CPU sockets. -c, --cpu-cores INTEGER Number of guest cores per socket. -F, --force Overwrite any existing files in current working directory. -j, --fast Use all CPU cores to build the application. -M, --with-makefile Create a Unikraft compatible Makefile. -h, --help Show this message and exit.
You can also use kraft to manage Unikraft libraries. You can add and remove libraries from the project:
$ kraft lib add NAME $ kraft lib remove NAME
Or you can initialize a new Unikraft library using:
$ kraft lib init [OPTIONS] [NAME]
kraft lib command
Usage: kraft lib [OPTIONS] COMMAND [ARGS]... Unikraft library sub-commands are useful for maintaining and working directly with Unikraft libraries. Options: -h, --help Show this message and exit. Commands: add Add a library to the project. bump Update a library's version (experimental). init Initialize a new Unikraft library. remove Remove a library from the project.