Skip to content

Latest commit

 

History

History
161 lines (110 loc) · 5.43 KB

README-zh.md

File metadata and controls

161 lines (110 loc) · 5.43 KB

README

README:中文 | English

本仓库包含附属于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>应该为arm64riscv之一。

<log>LOG_TRACELOG_DEBUGLOG_INFOLOG_WARNLOG_ERRORLOG_FATAL之一。

/path/to/your-linux为root linux的kernel源码目录。具体的编译选项请见Makefiletools/Makefiledriver/Makefile

例如,要编译面向arm64的命令行工具,可以执行:

make all ARCH=arm64 LOG=LOG_WARN KDIR=~/linux

即可在tools/hvisordriver/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的设备树进行修改:

  1. 内存节点要包含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>;
    };
  2. 加入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守护进程可为虚拟机提供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。该示例文件会依次执行:

  1. 首先创建一个Virtio-blk设备,id为1的虚拟机会通过一片MMIO区域与该设备通信,这片MMIO区域的起始地址为0xa003c00,长度为0x200。同时设置设备中断号为78,对应磁盘镜像为rootfs2.ext4
  2. 之后创建一个Virtio-console设备,用于id为1的虚拟机主串口的输出。root linux需要执行screen /dev/pts/x命令进入该虚拟控制台,其中x可通过nohup.out的输出信息查看。
  3. 由于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设备。
  4. nohup ... &说明该命令会创建一个守护进程。
  • 关闭Virtio设备

执行该命令即可关闭Virtio守护进程及所有创建的设备:

pkill hvisor

更多信息,例如root linux的环境配置,可参考:在hvisor上使用Virtio设备