# StratoVirt
StratoVirt is an enterprise-level virtualization platform for cloud data centers
in the computing industry. It implements a set of architecture that supports
three scenarios: virtual machines, containers, and serverless computing.

StratoVirt has competitive advantages in light weight and low noise, software
and hardware coordination, and Rust language-level security.

StratoVirt reserves interface and design for importing more features, even
evaluates to standard virtualization.

## How to start

### Preparation
Before building StratoVirt, make sure that Rust language and Cargo have already
been installed. If not, you can find installation guidance via following link:

https://www.rust-lang.org/tools/install

And it will get smaller memory overhead if you prepare musl toolchain for rust.

### Build StratoVirt
To build StratoVirt, clone the project and build it first:
```sh
$ git clone https://gitee.com/openeuler/stratovirt.git
$ cd stratovirt
$ make build
```
Now you can find StratoVirt binary in `target/release/stratovirt`.

### Run a VM with StratoVirt
To run StratoVirt quickly, requires
* A PE or bzImage (only x86_64) format Linux kernel
* An EXT4 filesystem, raw format rootfs disk image

You can get kernel and rootfs image from the following link:

https://repo.openeuler.org/openEuler-21.03/stratovirt_img/

For standard VM, firmware file of EDK2 which follows UEFI is required.

```shell
# If the socket of qmp exists, remove it first.

# Start microvm
$ ./target/release/stratovirt \
    -machine microvm \
    -kernel /path/to/kernel \
    -append "console=ttyS0 root=/dev/vda reboot=k panic=1" \
    -drive file=/path/to/rootfs,id=rootfs,readonly=off \
    -device virtio-blk-device,drive=rootfs,id=rootfs \
    -qmp unix:/path/to/socket,server,nowait \
    -serial stdio

# Start standard VM on x86_64
$ ./target/release/stratovirt \
    -machine q35 \
    -kernel /path/to/kernel \
    -append "console=ttyS0 root=/dev/vda reboot=k panic=1" \
    -drive file=/path/to/firmware,if=pflash,unit=0,readonly=true \
    -device pcie-root-port,port=0x0,addr=0x1.0x0,bus=pcie.0,id=pcie.1 \
    -drive file=/path/to/rootfs,id=rootfs,readonly=off \
    -device virtio-blk-pci,drive=rootfs,bus=pcie.1,addr=0x0.0x0,id=blk-0 \
    -qmp unix:/path/to/socket,server,nowait \
    -serial stdio
```

The detailed guidance of making rootfs, compiling kernel and building StratoVirt
can be found in [StratoVirt QuickStart](./docs/quickstart.md).

StratoVirt supports much more features, the detailed guidance can be found in
[Configuration Guidebook](docs/config_guidebook.md).

## Design

To get more details about StratoVirt's core architecture design, refer to
[StratoVirt design](./docs/design.md).

## How to contribute
We welcome new contributors! And we are happy to provide guidance and help for
new contributors. StratoVirt follows Rust formatting conventions, which can be
found at:

https://github.com/rust-dev-tools/fmt-rfcs/tree/master/guide
https://github.com/rust-lang/rust-clippy

You can get more information about StratoVirt at:

https://gitee.com/openeuler/stratovirt/wikis

If you find a bug or have some ideas, please send an email to the
[virt mailing list](https://mailweb.openeuler.org/postorius/lists/virt.openeuler.org/)
or submit an [issue](https://gitee.com/openeuler/stratovirt/issues).

## Licensing
StratoVirt is licensed under the Mulan PSL v2.