]> rtime.felk.cvut.cz Git - jailhouse.git/blob - README.md
cc29adea7d5f154a76180fa7fe305120d7b217c4
[jailhouse.git] / README.md
1 JAILHOUSE
2 =========
3
4 Jailhouse is a partitioning Hypervisor based on Linux. It is able to run
5 bare-metal applications or (adapted) operating systems besides Linux. For this
6 purpose it configures CPU and device virtualization features of the hardware
7 platform in a way that none of these domains, called "cells" here, can
8 interfere with each other in an unacceptable way.
9
10 Jailhouse is optimized for simplicity rather than feature richness. Unlike
11 full-featured Linux-based hypervisors like KVM or Xen, Jailhouse does not
12 support overcommitment of resources like CPUs, RAM or devices. It performs no
13 scheduling and only virtualizes those resources in software, that are essential
14 for a platform and cannot be partitioned in hardware.
15
16 Once Jailhouse is activated, it runs bare-metal, i.e. it takes full control
17 over the hardware and needs no external support. However, in contrast to other
18 bare-metal hypervisors, it is loaded and configured by a normal Linux system.
19 Its management interface is based on Linux infrastructure. So you boot Linux
20 first, then you enable Jailhouse and finally you split off parts of the
21 system's resources and assign them to additional cells.
22
23
24 WARNING: This is work in progress! Don't expect things to be complete in any
25 dimension. Use at your own risk. And keep the reset button in reach.
26
27
28 Community
29 ---------
30
31 Project home:
32
33  - https://github.com/siemens/jailhouse
34
35 Source code:
36
37  - https://github.com/siemens/jailhouse.git
38  - git@github.com:siemens/jailhouse.git
39
40 Mailing list:
41
42   - jailhouse-dev@googlegroups.com
43
44   - Subscription:
45     - jailhouse-dev+subscribe@googlegroups.com
46     - https://groups.google.com/forum/#!forum/jailhouse-dev/join
47
48   - Archives
49     - http://news.gmane.org/gmane.linux.jailhouse
50
51 Continuous Integration:
52
53   - https://travis-ci.org/siemens/jailhouse
54
55   - Status:
56     - ![](https://travis-ci.org/siemens/jailhouse.svg?branch=master) on master
57     - ![](https://travis-ci.org/siemens/jailhouse.svg?branch=next) on next
58
59
60 Requirements (preliminary)
61 --------------------------
62
63 x86 architecture:
64
65   - Intel system:
66
67     - support for 64-bit and VMX, more precisely
68       - EPT (extended page tables)
69       - unrestricted guest mode
70       - preemption timer
71
72     - Intel IOMMU (VT-d) with interrupt remapping support
73       (except when running inside QEMU)
74
75   - or AMD system:
76
77     - support for 64-bit and SVM (AMD-V), and also
78       - NPT (nested page tables); required
79       - Decode Assists; recommended
80
81     - AMD IOMMU (AMD-Vi) is unsupported now but will be required in future
82
83   - at least 2 logical CPUs
84
85   - x86-64 Linux kernel (tested against >= 3.14)
86     - VT-d IOMMU usage (DMAR) has to be disabled in the Linux kernel, e.g. via
87       the command line parameter:
88
89           intel_iommu=off
90
91     - To exploit the faster x2APIC, interrupt remapping needs to be on in the
92       kernel (check for CONFIG_IRQ_REMAP)
93
94
95 Build & Installation
96 --------------------
97
98 Simply run make, optionally specifying the target kernel directory:
99
100     make [KDIR=/path/to/kernel/objects]
101
102 Except for the hypervisor image `jailhouse*.bin` that has to be available in the
103 firmware search path (invoke `make firmware_install` for this), you can run
104 Jailhouse from the build directory. Alternatively, install everything on the
105 target machine by calling `make install` from the top-level directory.
106
107
108 Configuration
109 -------------
110
111 Jailhouse requires one configuration file for the complete system and one for
112 each additional cell beside Linux. The configuration is currently being
113 defined manually by filling C structures. To study the structure, use
114 configs/qemu-vm.c for a system configuration and configs/apic-demo.c for a cell
115 configuration as reference. The build system will pick up every .c file from
116 the configs/ directory and generate a corresponding .cell file. .cell files can
117 then be passed to the jailhouse command line tool for enabling the hypervisor
118 and creating new cells.
119
120
121 Demonstration in QEMU/KVM
122 -------------------------
123
124 The included system configuration qemu-vm.c can be used to run Jailhouse in
125 QEMU/KVM virtual machine on x86 hosts (Intel and AMD are supported). Currently
126 it requires Linux 3.18 or newer on the host side (Intel is fine with 3.17).
127 QEMU is required in a recent version (2.1) as well if you want to use the
128 configuration file included in the source tree.
129
130 You also need a Linux guest image with a recent kernel (tested with >= 3.9) and
131 the ability to build a module for this kernel. Further steps depend on the type
132 of CPU you have on your system.
133
134 For Intel CPUs: Make sure the kvm-intel module was loaded with nested=1 to
135 enable nested VMX support. Start the virtual machine as follows:
136
137     qemu-system-x86_64 -machine q35 -m 1G -enable-kvm -smp 4 \
138         -cpu kvm64,-kvm_pv_eoi,-kvm_steal_time,-kvm_asyncpf,-kvmclock,+vmx,+x2apic \
139         -drive file=LinuxInstallation.img,id=disk,if=none \
140         -device ide-hd,drive=disk -serial stdio -serial vc \
141         -device intel-hda,addr=1b.0 -device hda-duplex
142
143 For AMD CPUs: Make sure the kvm-amd module was loaded with nested=1 to enable
144 nested SVM support. Start the virtual machine as follows:
145
146     qemu-system-x86_64 -machine q35 -m 1G -enable-kvm -smp 4 \
147         -cpu host,-kvm_pv_eoi,-kvm_steal_time,-kvm_asyncpf,-kvmclock,+svm,+x2apic \
148         -drive file=LinuxInstallation.img,id=disk,if=none \
149         -device ide-hd,drive=disk -serial stdio -serial vc \
150         -device intel-hda,addr=1b.0 -device hda-duplex
151
152 Inside the VM, make sure that jailhouse-*.bin, generated by the build process,
153 are available for firmware loading (typically /lib/firmware), see above for
154 installation steps.
155
156 The hypervisor requires a contiguous piece of RAM for itself and each
157 additional cell. This currently has to be pre-allocated during boot-up. So you
158 need to add
159
160     memmap=66M$0x3b000000
161
162 as parameter to the command line of the virtual machine's kernel. Reboot the
163 guest and load jailhouse.ko. Then enable Jailhouse like this:
164
165     jailhouse enable /path/to/qemu-vm.cell
166
167 Next you can create a cell with a demonstration application as follows:
168
169     jailhouse cell create /path/to/apic-demo.cell
170     jailhouse cell load apic-demo /path/to/apic-demo.bin -a 0xf0000
171     jailhouse cell start apic-demo
172
173 apic-demo.bin is left by the built process in the inmates/demos/x86 directory.
174 This application will program the APIC timer interrupt to fire at 10 Hz,
175 measuring the jitter against the PM timer and displaying the result on the
176 console. Given that this demonstration runs in a virtual machine, obviously
177 no decent latencies should be expected.
178
179 After creation, cells are addressed via the command line tool by providing
180 their names or their runtime-assigned IDs. You can obtain information about
181 active cells this way:
182
183     jailhouse cell list
184
185 Cell destruction is performed by specifying the configuration file of the
186 desired cell. This command will destroy the apic-demo:
187
188     jailhouse cell destroy apic-demo
189
190 Note that the first destruction or shutdown request on the apic-demo cell will
191 fail. The reason is that this cell contains logic to demonstrate an ordered
192 shutdown as well as the ability of a cell to reject shutdown requests.
193
194 The apic-demo cell has another special property for demonstration purposes: As
195 long as it is running, no cell reconfigurations can be performed - the
196 apic-demo locks the hypervisor in this regard. In order to destroy another cell
197 or create an additional one, shut down the apic-demo first.
198
199     jailhouse cell shutdown apic-demo  # call again if error is returned
200
201 To demonstrate the execution of a second, non-Linux cell, issue the following
202 commands:
203
204     jailhouse cell create /path/to/pci-demo.cell
205     jailhouse cell load pci-demo /path/to/pci-demo.bin -a 0xf0000
206     jailhouse cell start pci-demo
207
208 The pci-demo will use the second serial port provided by QEMU. You will find
209 its output in a virtual console of the QEMU window. The purpose of this demo is
210 to show basic PCI device configuration and MSI handling.
211
212 While cell configurations are locked, it is still possible, though, to reload
213 the content of existing cell (provided they accept their shutdown first). To
214 reload and restart the tiny-demo, issue the following commands:
215
216     jailhouse cell start apic-demo
217     jailhouse cell load pci-demo /path/to/pci-demo.bin -a 0xf0000
218     jailhouse cell start pci-demo
219
220 Finally, Jailhouse is can be stopped completely again:
221
222     jailhouse disable  # call again on error due to running apic-demo
223
224 All non-Linux cells running at that point will be destroyed, and resources
225 will be returned to Linux.
226
227
228 Setup on Banana Pi ARM board
229 ----------------------------
230
231 The Banana Pi is a cheap Raspberry-Pi-like ARM board with an Allwinner A20 SoC
232 (dual-core Cortex-A7). It runs mainline Linux kernels and U-Boot and is
233 comparably well hackable. Further information can be found on
234 http://linux-sunxi.org.
235
236 For Jailhouse, U-Boot currently requires a few additional patches that can be
237 retrieved from https://github.com/siemens/u-boot/commits/sunxi.
238
239 The Linux kernel version should be at least 3.19-rcX. The configuration used
240 for continuous integration builds can serve as reference, see
241 `ci/kernel-config-banana-pi`. The kernel has to be booted with the following
242 additional parameters, e.g. by adjusting the U-Boot environment accordingly:
243
244     mem=958M vmalloc=512M
245
246 The recommended cross-toolchain is available from Linaro, see
247 http://www.linaro.org/downloads.
248
249 Before building Jailhouse, copy the configuration header file
250 `ci/jailhouse-config-banana-pi.h` to `hypervisor/include/jailhouse/config.h`.
251 Then run make:
252
253     make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- \
254          KDIR=/path/to/arm-kernel/objects
255
256 Binaries can be installed directly to the target root file system if it is
257 mounted on the host:
258
259     make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- \
260          KDIR=/path/to/arm-kernel/objects DESTDIR=/mount-point install
261
262 Cell configurations and demo inmates will not be installed this way and have to
263 be transferred manually as needed. Make sure you have `configs/bananapi.cell`
264 and, as desired, the inmates configs (`configs/bananapi-*.cell`) and binaries
265 (`inmates/demos/arm/*.bin`) available on the target.
266
267 Jailhouse and inmates are started on ARM just like on x86. The only difference
268 is that inmates have to be loaded at offset 0. Just leave out the `-a`
269 parameter when invoking `jailhouse cell load`.