本仓库包含附属于hvisor的命令行工具及内核模块,命令行工具中还包含了Virtio守护进程,用于提供Virtio设备。命令行工具以及内核模块需要单独编译后,在管理虚拟机root linux上使用。整个仓库结构为:
hvisor-tool
-tools: 包含命令行工具以及Virtio守护进程
-driver: hvisor对应的内核模块
以下操作均在x86主机的目录hvisor-tool
下,进行交叉编译。
- 编译命令行工具及内核模块
make all ARCH=<arch> LOG=<log> KDIR=/path/to/your-linux
其中,<arch>
应该为arm64
和riscv
之一。
<log>
为LOG_TRACE
、LOG_DEBUG
、LOG_INFO
、LOG_WARN
、LOG_ERROR
、LOG_FATAL
之一。
/path/to/your-linux
为root linux的kernel源码目录。具体的编译选项请见Makefile、tools/Makefile、driver/Makefile。
例如,要编译面向arm64
的命令行工具,可以执行:
make all ARCH=arm64 LOG=LOG_WARN KDIR=~/linux
即可在tools/hvisor
和driver/hvisor.ko
,将其复制到root linux的根文件系统,使用即可。
使用命令行工具、Virtio守护进程之前,需要加载内核模块,便于用户态程序与Hyperviosr进行交互:
insmod hvisor.ko
卸载内核模块的操作为:
rmmod hvisor.ko
在root linux中,使用命令行工具可以创建、关闭其他虚拟机。
- 前置条件
注意:由于Root Linux需要将Non root linux镜像和dtb文件加载到Non root linux所在的物理内存区域,因此需要对Root Linux的设备树进行修改:
-
内存节点要包含Non root linux的物理内存区域,例如:
// Root linux原先的设备树: memory@50000000 { device_type = "memory"; reg = <0x0 0x50000000 0x0 0x40000000>; }; // Non Root linux的设备树 memory@90000000 { device_type = "memory"; reg = <0x0 0x90000000 0x0 0x40000000>; }; // 修改后的Root Linux的设备树: memory@50000000 { device_type = "memory"; reg = <0x0 0x50000000 0x0 0x80000000>; };
-
加入reserved-memory节点,将Non Root Linux的内存区域设置为保留内存,防止Root Linux进行使用,例如:
reserved-memory { #address-cells = <0x02>; #size-cells = <0x02>; ranges; nonroot@90000000 { no-map; reg = <0x00 0x90000000 0x00 0x40000000>; }; };
注意,加入reserved-memory节点后,Root Linux的内核启动参数bootargs不需要包含mem=1G
这样的信息。
- 启动新的虚拟机
hvisor-tool通过一个配置文件启动一个新的虚拟机:
./hvisor zone start <vm_config.json>
<vm_config.json>
是描述一个虚拟机配置的文件,例如nxp_linux.json。
注意:如果想通过命令行而非配置文件启动新虚拟机,请转到hvisor-tool_old。命令行的启动方式会逐渐被配置文件取代,请升级为最新的hvisor-tool。
- 关闭id为1的虚拟机:
./hvisor zone shutdown -id 1
- 打印当前所有虚拟机的信息:
./hvisor zone list
Virtio守护进程可为虚拟机提供Virtio MMIO设备,目前支持三种设备:Virtio-blk、Virtio-net和Virtio-console设备。
- 前置条件
要使用Virtio守护进程,需要在Root Linux的设备树中增加一个名为hvisor_device
的节点,例如:
hvisor_device {
compatible = "hvisor";
interrupt-parent = <0x01>;
interrupts = <0x00 0x20 0x01>;
};
这样,当hvisor向Root Linux注入中断号为32+0x20
的中断时,便会进入hvisor.ko
中注册的中断处理函数,唤醒Virtio守护进程。
- Virtio设备的启动和创建
在Root Linux上,执行以下示例指令:
nohup ./hvisor virtio start virtio_cfg.json &
其中virtio_cfg.json
是一个描述Virtio设备的JSON文件,例如virtio_cfg.json。该示例文件会依次执行:
- 首先创建一个Virtio-blk设备,id为1的虚拟机会通过一片MMIO区域与该设备通信,这片MMIO区域的起始地址为
0xa003c00
,长度为0x200
。同时设置设备中断号为78,对应磁盘镜像为rootfs2.ext4
。 - 之后创建一个Virtio-console设备,用于id为1的虚拟机主串口的输出。root linux需要执行
screen /dev/pts/x
命令进入该虚拟控制台,其中x
可通过nohup.out的输出信息查看。 - 由于
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设备。 nohup ... &
说明该命令会创建一个守护进程。
- 关闭Virtio设备
执行该命令即可关闭Virtio守护进程及所有创建的设备:
pkill hvisor
更多信息,例如root linux的环境配置,可参考:在hvisor上使用Virtio设备