https://github.com/syswonder/hvisor-tool
hvisor tool for root linux, includes CLI, Virtio daemon and hvisor kernel module
https://github.com/syswonder/hvisor-tool
Last synced: about 2 months ago
JSON representation
hvisor tool for root linux, includes CLI, Virtio daemon and hvisor kernel module
- Host: GitHub
- URL: https://github.com/syswonder/hvisor-tool
- Owner: syswonder
- Created: 2024-05-23T02:34:59.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2026-04-22T07:21:10.000Z (about 2 months ago)
- Last Synced: 2026-04-22T09:29:25.094Z (about 2 months ago)
- Language: C
- Homepage:
- Size: 567 KB
- Stars: 14
- Watchers: 4
- Forks: 24
- Open Issues: 3
-
Metadata Files:
- Readme: README-zh.md
Awesome Lists containing this project
README
# README
README:[中文](./README-zh.md) | [English](./README.md)
本仓库包含附属于[hvisor](https://github.com/syswonder/hvisor)的命令行工具及内核模块,命令行工具中还包含了Virtio守护进程,用于提供Virtio设备。命令行工具以及内核模块需要单独编译后,在管理虚拟机root linux-zone0上使用。整个仓库结构为:
```
hvisor-tool
-tools: 包含命令行工具以及Virtio守护进程
-driver: hvisor对应的内核模块
-examples: 不同运行环境下的配置文件示例
```
## 编译步骤
以下操作均在x86主机的目录`hvisor-tool`下,进行交叉编译。
* 编译命令行工具及内核模块
```bash
make all ARCH= LOG= KDIR=/path/to/your-linux LIBC=[gnu/musl] VIRTIO_GPU=[y/n] ROOT=/path/to/target_rootfs
```
其中,``应该为`arm64`和`riscv`之一。
``为`LOG_TRACE`、`LOG_DEBUG`、`LOG_INFO`、`LOG_WARN`、`LOG_ERROR`、`LOG_FATAL`之一,用来控制Virtio守护进程的日志输出等级。
`/path/to/your-linux`为root linux的kernel源码目录。具体的编译选项请见[Makefile](./Makefile)、[tools/Makefile](./tools/Makefile)、[driver/Makefile](./driver/Makefile)。
`LIBC`指定编译`hvisor-tool`时使用的`libc`库,可为`gnu`或`musl`。
例如,要编译面向`arm64`的命令行工具,可以执行:
```bash
make all ARCH=arm64 LOG=LOG_WARN KDIR=~/linux
```
即可在`tools/hvisor`和`driver/hvisor.ko`,将其复制到root linux的根文件系统,使用即可。
## 使用步骤
### 内核模块
使用命令行工具、Virtio守护进程之前,需要在zone0上加载内核模块,便于用户态程序与Hypervisor进行交互:
```
insmod hvisor.ko
```
卸载内核模块的操作为:
```
rmmod hvisor.ko
```
### 命令行工具
在root linux-zone0中,使用命令行工具可以创建、关闭其他虚拟机。
* 启动新的虚拟机
hvisor-tool通过一个配置文件启动一个新的虚拟机:
```
./hvisor zone start
```
``是描述一个虚拟机配置的文件,例如:
* [在QEMU-aarch64上启动zone1](./examples/qemu-aarch64/with_virtio_blk_console/zone1_linux.json):可参考[这里](./examples/qemu-aarch64/with_virtio_blk_console/README.md)了解如何配置并在zone1上启动一个linux。
* [在NXP-aarch64上启动zone1](./examples/nxp-aarch64/zone1_linux.json):使用该文件直接启动zone1时,需首先启动Virtio守护进程,对应的配置文件为[virtio_cfg.json](./examples/nxp-aarch64/virtio_cfg.json)。
* 关闭id为1的虚拟机:
```
./hvisor zone shutdown -id 1
```
* 打印当前所有虚拟机的信息:
```
./hvisor zone list
```
### Virtio守护进程
Virtio守护进程可为虚拟机提供Virtio MMIO设备,目前支持四种设备:Virtio-blk、Virtio-net、Virtio-console和Virtio-gpu设备。
#### 前置条件
要使用Virtio守护进程,需要在**Root Linux的设备树**中增加一个名为`hvisor_virtio_device`的节点,例如:
```dts
hvisor_virtio_device {
compatible = "hvisor";
interrupt-parent = <0x01>;
interrupts = <0x00 0x20 0x01>;
};
```
这样,当hvisor向Root Linux注入中断号为`32+0x20`的中断时,便会进入`hvisor.ko`中注册的中断处理函数,唤醒Virtio守护进程。
如果`32+0x20`号中断已经被某个设备占用了,除了修改上述设备树节点,还需要修改hvisor主仓库中`IRQ_WAKEUP_VIRTIO_DEVICE`变量。对arm来说,如果`interrupts`中填写的值为`0xa`则`IRQ_WAKEUP_VIRTIO_DEVICE`需要为`32+0xa`;如果是riscv架构,则不需要增加32,使二者相等即可。
#### Virtio设备的启动和创建
在Root Linux上,执行以下示例指令:
```c
// 注意要先启动守护进程,再启动各个zones
nohup ./hvisor virtio start virtio_cfg.json &
./hvisor zone start
```
其中 `&` 说明该命令会在后台运行。由于 Virtio 守护进程使用 `syslog` 记录日志,使用以下命令查看 `hvisor-tool` 的日志:
* **对于使用 `systemd` 的系统:**
```bash
journalctl -t hvisor-tool -f
```
* **对于没有 `systemd` 的系统(日志由 `rsyslog` 处理):**
```bash
tail -f /var/log/syslog | grep hvisor-tool
```
`virtio_cfg.json` 则是一个描述Virtio设备的JSON file,例如[virtio_cfg.json](./examples/nxp-aarch64/virtio_cfg.json)。该示例文件会依次执行:
1. 地址空间映射
首先将id为1的虚拟机`zone1`的RAM内存区域通过mmap映射到Virtio守护进程的地址空间。
2. 创建Virtio-blk设备
创建一个Virtio-blk设备,`zone1`会通过一片MMIO区域与该设备通信,这片MMIO区域的起始地址为`0xa003c00`,长度为`0x200`。同时设置设备中断号为78,对应磁盘镜像为`rootfs2.ext4`。
3. 创建Virtio-console设备
创建一个Virtio-console设备,用于`zone1`主串口的输出。root linux需要执行`screen /dev/pts/x`命令进入该虚拟控制台,其中`x`可通过syslog日志查看。
如要退回到主控制台,按下快捷键`ctrl+a+d`。如果在qemu中,则需要按下`ctrl+a ctrl+a+d`。如要再次进入虚拟控制台,执行`screen -r [SID]`,其中SID为该screen会话的进程ID。
4. 创建Virtio-net设备
由于`net`设备的`status`属性为`disable`,因此不会创建Virtio-net设备。如果`net`设备的`status`属性为`enable`,那么会创建一个Virtio-net设备,MMIO区域的起始地址为`0xa003600`,长度为`0x200`,设备中断号为75,MAC地址为`00:16:3e:10:10:10`,由id为1的虚拟机使用,连接到名为`tap0`的Tap设备。
5. 创建Virtio-gpu设备
要使用virtio-gpu设备,需要在hvisor-tool编译命令中加入`VIRTIO_GPU=y`字段,同时还需安装`libdrm`并进行其他配置,具体请见[hvisor-book](https://hvisor.syswonder.org/chap04/subchap03/VirtIO/GPUDevice.html)和[配置文件示例](./examples/qemu-aarch64/with_virtio_gpu/README.md)。配置文件中如果`gpu`设备`status`属性为`enable`,则会创建一个 Virtio-gpu 设备,其 MMIO 区域从 `0xa003400` 开始,长度为 `0x200`,中断号为 74。默认的扫描输出(scanout)尺寸为宽度 `1280px`,高度 `800px`。
#### 关闭Virtio设备
执行该命令即可关闭Virtio守护进程及所有创建的设备:
```
pkill hvisor-virtio
```