hvisor管理工具
hvisor通过一个管理虚拟机Root Linux来管理整个系统。Root Linux通过一套管理工具为用户提供启动和关闭虚拟机、启动和关闭Virtio守护进程的服务。管理工具中,包含一个命令行工具和内核模块。其中命令行工具用于解析并执行用户输入的命令,内核模块用于命令行工具、Virtio守护进程与Hypervisor之间的通信。管理工具的仓库地址为:hvisor-tool。
启动虚拟机
用户输入以下命令,可以在Root Linux上为hvisor创建一个新的虚拟机。
./hvisor zone start [vm_name].json
命令行工具首先会解析[vm_name].json文件内容,将虚拟机配置写入zone_config结构体。并根据文件中指定的镜像和dtb文件,将其内容通过read函数读入临时内存。为了将镜像和dtb文件加载到指定的物理内存地址,hvisor.ko内核模块提供hvisor_map函数,可以将一片物理内存区域映射到用户态虚拟地址空间。
当命令行工具对/dev/hvisor执行mmap函数时,内核会调用hvisor_map函数,以实现用户虚拟内存到指定物理内存的映射。之后通过内存拷贝函数,即可将镜像和dtb文件的内容从临时内存移动到用户指定的物理内存区域。
加载好镜像后,命令行工具对/dev/hvisor调用ioctl,指定操作码为HVISOR_ZONE_START,之后内核模块会通过Hypercall通知Hypervisor,并传入zone_config结构体对象的地址,通知Hypervisor启动虚拟机。
关闭虚拟机
用户输入命令:
./hvisor shutdown -id [vm_id]
即可关闭ID为vm_id的虚拟机。该命令会对/dev/hvisor调用ioctl,指定操作码为HVISOR_ZONE_SHUTDOWN,之后内核模块会通过Hypercall通知Hypervisor,传入vm_id,通知Hypervisor关闭虚拟机。
启动Virtio守护进程
用户输入命令:
nohup ./hvisor virtio start [virtio_cfg.json] &
即可根据virtio_cfg.json中规定的Virtio设备信息,创建Virtio设备,并初始化相关的数据结构。目前支持三种Virtio设备的创建,包括Virtio-net、Virtio-block、Virtio-console设备。
由于命令行参数中包含nohup和&,该命令会以守护进程的形式存在,守护进程的所有输出被重定向到nohup.out。守护进程的输出包含六个等级,从低到高分别是LOG_TRACE, LOG_DEBUG, LOG_INFO,LOG_WARN,LOG_ERROR,LOG_FATAL。编译命令行工具时可指定LOG级别,例如LOG为LOG_INFO时,等于或高于LOG_INFO的输出将被记录到日志文件,而log_trace和log_debug将不会输出。
Virtio设备创建后,Virtio守护进程会轮询请求提交队列,获取其他虚拟机的Virtio请求。长时间没有请求时,会自动进入休眠状态。
关闭Virtio守护进程
用户输入命令:
pkill hvisor
即可关闭Virtio守护进程。Virtio守护进程在启动时,会注册SIGTERM信号的信号处理函数virtio_close。当执行pkill hvisor时,会向名为hvisor的进程发送信号SIGTERM,此时守护进程会执行virtio_close,回收资源,关闭各个子线程,最后推出