| Installation instructions for kvmtool | |
| --------------------------------------- | |
| ========================================================================== | |
| For the impatient: | |
| Just typing "make" should do the trick most of the times. | |
| You will get a binary called "lkvm" which is self-contained. | |
| No extra libraries or files need to be installed. | |
| ========================================================================== | |
| "make install" will copy the compiled file into $HOME/bin, this can be | |
| changed by providing "prefix=" on the make command-line. DESTDIR will be | |
| honoured. | |
| Prerequisites | |
| -------------- | |
| For compilation you will need a recent GNU tool chain (binutils, gcc, make), | |
| also the standard C library. | |
| For deb based systems: | |
| $ sudo apt-get install build-essential | |
| On x86-64 systems you have to add the 32-bit compat headers: | |
| $ sudo apt-get install libc6-dev-i386 | |
| For Fedora based systems: | |
| # yum install glibc-static | |
| For OpenSUSE based systems: | |
| # zypper install glibc-devel-static | |
| Architectures which require device tree (PowerPC, ARM64, RISC-V) also | |
| require libfdt. | |
| deb: $ sudo apt-get install libfdt-dev | |
| Fedora: # yum install libfdt-devel | |
| OpenSUSE: # zypper install libfdt1-devel | |
| Also see "Cross compiling" below. | |
| Optional libraries | |
| ------------------- | |
| By running "make" some checks are invoked that determine the availability | |
| of certain optional libraries. Those are: | |
| - libbfd: enable symbol look-up support in debug mode | |
| - gtk3: enable support for displaying the guest framebuffer in a GTK+-3 window | |
| - vncserver: enable support for exporting the guest framebuffer in a VNC session | |
| - SDL: enable support for displaying the guest framebuffer in a SDL window | |
| - zlib: enable support for compressed QCOW images | |
| - aio: enable support for asynchronous I/O | |
| (Note that a guest framebuffer is currently only supported on x86.) | |
| So for the full glory you would need: | |
| (on a .deb based system): | |
| $ sudo apt-get install binutils-dev libgtk-3-dev libvncserver-dev libsdl2-dev \ | |
| zlib1g-dev libaio-dev | |
| (on RPM based systems): | |
| # $TOOL install binutils-devel gtk3-devel libvncserver-devel SDL-devel \ | |
| zlib-devel libaio-devel | |
| $TOOL is "yum" for Fedora and "zypper" for OpenSUSE. | |
| Cross compiling | |
| ---------------- | |
| The Makefile will honour the CROSS_COMPILE environment variable when calling | |
| the compiler and the linker binary. To trigger cross compilation, also set ARCH | |
| to the Linux name of the architecture. Architectures supported: | |
| - i386 | |
| - x86_64 | |
| - powerpc | |
| - arm64 | |
| - mips | |
| - riscv | |
| If ARCH is not provided, the target architecture will be automatically | |
| determined by running "uname -m" on your host, resulting in a native build. | |
| To cross-compile to arm64 for instance, install a cross-compiler, put the | |
| required libraries in the cross-compiler's SYSROOT and type: | |
| $ make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 | |
| Missing libraries when cross-compiling | |
| --------------------------------------- | |
| The cross-compiler will look for target libraries in its SYSROOT directory, | |
| so you need to put the header and library files (.so) there. | |
| While most cross compiler packages come with the target's glibc already | |
| installed, optional libraries (or libfdt) maybe not. | |
| On multiarch system you should be able to install those be appending | |
| the architecture name after the package (example for ARM64): | |
| $ sudo apt-get install libfdt-dev:arm64 | |
| PowerPC, ARM64 and RISC-V require libfdt to be installed. If you cannot use | |
| precompiled mulitarch packages, you could either copy the required header and | |
| library files from an installed target system into the SYSROOT (you will need | |
| /usr/include/*fdt*.h and /usr/lib64/libfdt-v.v.v.so and its symlinks), or you | |
| can cross-compile the libfdt library yourself: | |
| $ git clone git://git.kernel.org/pub/scm/utils/dtc/dtc.git | |
| $ cd dtc | |
| $ export CC=${CROSS_COMPILE}gcc | |
| $ make libfdt | |
| After compiling libfdt, the library can be installed system-wide: | |
| $ TRIPLET=$($CC -dumpmachine) | |
| $ SYSROOT=$($CC -print-sysroot) | |
| $ sudo make DESTDIR=$SYSROOT PREFIX=/usr LIBDIR=/usr/lib/$TRIPLET install-lib install-includes | |
| This assumes a multiarch-enabled system, if there is no per-arch directory for | |
| libraries, replace the LIBDIR paths above with LIBDIR=/usr/lib or /usr/lib64. | |
| Alternatively, if installing the shared library is not desirable or possible, | |
| you can instruct kvmtool to use the static library when compiling by using the | |
| variable LIBFDT_DIR. LIBFDT_DIR should point to the dtc/libfdt directory. | |
| kvmtool will include the static library LIBFDT_DIR/libfdt.a in the executable, | |
| removing the need for the shared library to be present on the system. | |
| LIBFDT_DIR, when set, takes precedence over the system library. |