监狱:基于Linux的分区管理程序

2020-12-04 20:25:52

Jailhouse是基于Linux的分区管理程序。除了Linux之外,它还可以运行金属应用程序或(适应的)操作系统。为此,它配置硬件平台的CPU和设备虚拟化功能的方式都不是这些称为“单元”的域。在这里,会以无法接受的方式互相干扰。

监狱是针对简单性而不是功能丰富性进行优化的。与KVM或Xen等基于Linux的全功能虚拟机管理程序不同,Jailhouse不支持CPU,RAM或设备等资源的过度使用。它执行noscheduling,并仅虚拟化软件中对平台必不可少且不能在硬件中进行分区的那些资源。

一旦启用了Jailhouse,它就会在裸机上运行,​​即,它可以完全控制硬件并且不需要外部支持。但是,与其他裸机管理程序相比,它是由​​普通的Linux系统加载和配置的,其管理界面基于Linux基础架构。因此,您首先启动Linux,然后启用Jailhouse,最后将系统资源的一部分拆分出来,并将其分配给其他单元。

有关如何编写Jailhouse补丁并将其建议用于上游集成的详细信息,请参见贡献文档。

VT-d IOMMU使用情况(DMAR)必须在Linux内核中禁用,例如通过命令行参数:

要利用速度更快的x2APIC,需要在内核中启用中断重新映射(检查CONFIG_IRQ_REMAP)

系统管理程序本身和每个其他单元都需要一块连续的RAM。目前,这必须在启动过程中预先分配。在x86上,通常通过添加

作为虚拟机内核命令行的参数。请注意,如果您打算将此参数放在/ etc / default / grub的GRUB2变量中,那么美元之前需要三个转义字符(例如GRUB_CMDLINE_LINUX_DEFAULT =" memmap = 82M \\\ $ 0x3a000000")。

系统管理程序本身和每个其他单元都需要一块连续的RAM。当前,这必须在引导过程中预先分配。在ARM上,可以通过减少内核看到的内存量(通过mem =内核引导参数)或修改设备树(即保留内存节点)来实现。 。

建议将所有Jailhouse安装在目标计算机上。这将负责内核模块,固件,工具等。只需致电

也支持传统的Linux交叉编译(即ARCH =和CROSS_COMPILE =)和安装(即DESTDIR =)标志。

除了必须在固件搜索路径中可用的虚拟机管理程序映像jailhouse * .bin之外,您还可以从build目录运行Jailhouse。如果您不能或不想使用make install,则可以使用make firmware_install仅安装固件。或自定义固件搜索路径:

Jailhouse需要一个用于整个系统的配置文件,以及一个用于在主要Linux之外的每个附加单元的配置文件。这些.cell文件必须传递到监狱命令行工具以启用管理程序或创建新单元。

可以通过运行以下命令在x86目标系统上创建系统配置:

为了将此转换为所需的二进制格式,请将此文件放置在configs / x86 /目录中。生成系统将从那里获取每个.c文件,并生成一个相应的.cell文件。

当前,没有用于ARM体系结构的配置生成器。因此,必须通过从参考示例开始并检查特定于硬件的数据表,DTS和/ proc条目来手动编写config文件。

根据目标系统的不同,C结构可能需要进行一些调整才能使Jailhouse正常工作或减少Linuxroot单元的所需访问权限。

当前,其他(非根)单元的配置需要手动创建。要研究结构,请使用演示单元配置文件之一作为参考,例如configs / x86 / apic-demo.c或configs / x86 / e1000-demo.c。

注意:您还可以在https://github.com/siemens/jailhouse-images的jailhouse-images侧项目的帮助下构建并执行以下演示步骤。

随附的系统配置qemu-x86.c可用于在x86主机(支持Intel和AMD)上的QEMU / KVM虚拟机中运行Jailhouse。当前,主机端需要Linux 4.4或更高版本。需要QEMU 2.8版或更高版本。

您还需要具有最新内核(已通过> = 3.9测试)的Linux来宾映像,并具有为此内核构建模块的能力。进一步的步骤取决于系统上的CPU类型。

对于Intel CPU:确保kvm-intel模块已加载nested = 1以启用嵌套VMX支持。启动虚拟机,如下所示:

qemu-system-x86_64-机器q35,kernel_irqchip =拆分-m 1G-启用-kvm \ -smp 4-设备intel-iommu,intremap = on,x-buggy-eim = on \ -cpu主机,-kvm-pv- eoi,-kvm-pv-ipi,-kvm-asyncpf,-kvm-steal-time,-kvmclock \-驱动器文件= LinuxInstallation.img,格式=原始| qcow2 | ...,id = disk,if = none \ -设备ide-hd,驱动器=磁盘-串行stdio-串行vc \ -netdev用户,id = net-设备e1000e,addr = 2.0,netdev = net \-设备intel-hda,addr = 1b.0-设备hda-双工

对于AMD CPU:确保kvm-amd模块已加载nested = 1以启用嵌套SVM支持。启动虚拟机,如下所示:

qemu-system-x86_64-机器q35 -m 1G-启用kvm -smp 4 \ -cpu主机,-kvm-pv-eoi,-kvm-pv-ipi,-kvm-asyncpf,-kvm-窃取时间,- kvmclock \-驱动器文件= LinuxInstallation.img,格式=原始| qcow2 | ...,id =磁盘,如果=无\-设备ide-hd,驱动器=磁盘-串行stdio-串行vc \ -netdev用户,id =净-device e1000e,addr = 2.0,netdev = net \ -device intel-hda,addr = 1b.0 -device hda-duplex

在VM内,确保由构建过程生成的jailhouse-*。bin可用于加载固件(通常为/ lib / firmware),有关安装步骤,请参见上文。

监狱QEMU单元配置将阻止guestOS使用串行端口,因此请确保来宾内核命令行没有控制台集登录到串行端口(即,删除任何' console = ttyS0' thegrub配置中的参数)。重新启动来宾并加载jailhouse.ko。然后像这样启用Jailhouse:

apic-demo.bin由inmates / demos / x86目录中的内置进程保留。此应用程序将对APIC定时器中断进行编程,使其以10 Hz的频率触发,从而测量PM定时器的抖动并在控制台上显示结果。鉴于该演示是在虚拟机中运行的,因此显然不应期望有适当的延迟。

创建单元后,可通过提供其名称或运行时分配的ID,通过命令行工具对单元进行寻址。您可以通过以下方式获取有关活动单元的信息:

通过指定所需单元的配置文件来执行单元破坏。此命令将销毁apic-demo:

请注意,对apic-demo单元的第一个销毁或关闭请求将失败。原因是此单元包含用于演示有序关闭的逻辑以及单元拒绝关闭请求的能力。

为了演示的目的,apic-demo单元具有另一个特殊属性:只要它正在运行,就不能执行任何单元重新配置-theapic-demo在这方面锁定了系统管理程序。为了销毁另一个大提琴或创建另一个大提琴,请先关闭该apic-demo。

监狱牢房创建/path/to/pci-demo.cell监狱牢房加载pci-demo /path/to/pci-demo.bin \ -s" con-base = 0x2f8" -a 0x1000牢房单元启动pci-demo

pci-demo将使用QEMU提供的第二个串行端口。您将在QEMU窗口的虚拟控制台中找到其输出。本演示的目的是展示基本的PCI设备配置和MSI处理。

虽然单元配置被锁定,但是仍然有可能重新加载现有单元的内容(前提是它们首先接受关闭状态)。要重新加载并重新启动tiny-demo,请发出以下命令:

监狱牢房启动apic-demo监狱牢房加载pci-demo /path/to/pci-demo.bin \ -s" con-base = 0x2f8" -a 0x1000牢房单元启动pci-demo 到那时为止,所有运行的非Linux单元将被销毁,资源将返回给Linux。 与x86类似,可以在QEMU下的完全仿真的ARM64(aarch64)环境中试用Jailhouse。 需要QEMU 3.0或更高版本。 qemu-system-aarch64 -cpu cortex-a57 -smp 16 -m 1G \-计算机病毒,gic-version = 3,虚拟化=在-nographic \ -netdev用户,id = net-设备virtio-net-device,netdev = 净\-驱动器文件= LinuxInstallation.img,格式=原始| qcow2 | ...,id =磁盘,如果=无\-设备virtio-blk设备,驱动器=磁盘\-内核/ path / to / kernel-image -append" root = / dev / vda1 mem = 768M"