Files
kata-containers/src/agent
Jianyong Wu 06d3049349 agent: fix race condition when test watcher
create_tmpfs won't pass as the race condition in watcher umount. quote
James's words here:

1. Rust runs all tests in parallel.
2. Mounts are a process-wide, not a per-thread resource.
The only test that calls watcher.mount() is create_tmpfs().
However, other tests create BindWatcher objects.
3. BindWatcher's drop() implementation calls self.cleanup(),
which calls unmount for the mountpoint create_tmpfs() asserts.
4. The other tests are calling unmount whenever a BindWatcher goes
out of scope.

To avoid that issue, let the tests using BindWatcher in watcher and
sandbox.rs run sequentially.

Fixes: #2809
Signed-off-by: Jianyong Wu <jianyong.wu@arm.com>
2021-11-05 11:34:52 +08:00
..
2021-06-30 22:39:50 +08:00
2021-07-14 13:59:41 +02:00
2021-03-31 23:51:20 +02:00

Kata Agent in Rust

This is a rust version of the kata-agent.

In Denver PTG, we discussed about re-writing agent in rust:

In general, we all think about re-write agent in rust to reduce the footprint of agent. Moreover, Eric mentioned the possibility to stop using gRPC, which may have some impact on footprint. We may begin to do some POC to show how much we could save by re-writing agent in rust.

After that, we drafted the initial code here, and any contributions are welcome.

Features

Feature Status
OCI Behaviors
create/start containers
signal/wait process
exec/list process
I/O stream
Cgroups
Capabilities, rlimit, readonly path, masked path, users
container stats (stats_container)
Hooks
Agent Features & APIs
run agent as init (mount fs, udev, setup lo)
block device as root device
Health API
network, interface/routes (update_container)
File transfer API (copy_file)
Device APIs (reseed_random_device, , online_cpu_memory, mem_hotplug_probe, set_guet_data_time)
VSOCK support
virtio-serial support ✖️
OCI Spec validator
Infrastructures
Debug Console
Command line
Tracing ✖️

Getting Started

Build from Source

The rust-agent needs to be built statically and linked with musl

Note: skip this step for ppc64le, the build scripts explicitly use gnu for ppc64le.

$ arch=$(uname -m)
$ rustup target add "${arch}-unknown-linux-musl"
$ sudo ln -s /usr/bin/g++ /bin/musl-g++

ppc64le-only: Manually install protoc, e.g.

$ sudo dnf install protobuf-compiler

Download the source files in the Kata containers repository and build the agent:

$ GOPATH="${GOPATH:-$HOME/go}"
$ dir="$GOPATH/src/github.com/kata-containers"
$ git -C ${dir} clone --depth 1 https://github.com/kata-containers/kata-containers
$ make -C ${dir}/kata-containers/src/agent

Run Kata CI with rust-agent

$sudo -E PATH=$PATH -E GOPATH=$GOPATH integration/containerd/shimv2/shimv2-tests.sh

Mini Benchmark

The memory of RssAnon consumed by the go-agent and rust-agent as below: go-agent: about 11M rust-agent: about 1.1M