Container for OSFC Workshops - jljusten/tianocore GitHub Wiki

Container for OSFC Workshops

This document describes how to install the container used for the following workshops at OSFC 2018:

These containers are intended to simplify installation of tools and code across a variety of Linux distributions. If possible, please test the container installation prior to arriving at OSFC.

Install the Container

You can download the container here.

After downloading the container, install Docker if you have not done that already.

Install Docker

Follow these instructions, based on distribution:

Once Docker is installed, follow the post-install steps.

Before starting a Docker container, confirm that your user has been added to the docker group. This step is required.

Install the Local EDK II Docker Image

The container can be installed locally with the docker load command. This assumes you have saved the docker image file as edk2-ubuntu.docker.

$> docker load -i edk2-ubuntu.docker

Run the Container

To make sure code is available after exiting the container, please bind a working directory under home (~/) to a directory in the container. This example uses ~/workspace. Please note: the container assumes user id and group id are both 1000. This is the default on most distros.

$> mkdir ~/workspace
$> cd ~/workspace
$> docker run --name edk2 --rm -it -v "$(pwd):/home/dockeruser/workspace" -e DISPLAY -v $HOME/.Xauthority:/home/dockeruser/.Xauthority --net=host edk2-ubuntu /bin/bash

The container will start in the EDK II workspace directory.

[edk2-ubuntu] workspace #

Understanding the Container

The EDK II container is based on Ubuntu 16.04 and contains tools required for compiling tools and code. Example: ACPI tools are installed in ~/bin and $PATH.

The following options are used when running the container:

Option Explanation
--rm Automatically remove the container when it exits
-t Allocate a pseudo-TTY
-i Keep STDIN open even if not attached (interactive)
-v Bind mount a volume
-e Set environment variables
--net=host Share the network stack with the host

The workspace is bound to the local home directory, so all work is saved outside the container (even after exit). X11 info is forwarded to enable proper execution of QEMU, and the network stack is shared with the host for X11 forwarding. Networking is helpful for remote access (SSH), but it does remove network isolation from the container.

OpenSUSE Notes

If you are running OpenSUSE, X11 forwarding does not work by default. This can be resolved by executing the following command prior to running the container:

$> xhost local:root

There is also a DNS issue when using gdb debugging with openSUSE. When connecting to the QEMU target, use localhost instead of the hostname:

$> (gdb) target remote 127.0.0.1:1234

SSH Notes

git can be used to commit/push code to remote repos outside the container. Performing these operations inside the container requires forwarding the SSH socket to the container. To enable this feature, add the following lines to the docker run command:

-v "$SSH_AUTH_SOCK:/tmp/ssh_auth_sock"
-e "SSH_AUTH_SOCK=/tmp/ssh_auth_sock"

Opening Multiple Shell Windows

Opening multiple shell windows does not require running the docker run command multiple times. Simply use docker exec with the name of the running container:

# After `docker run`
$> docker exec -it edk2 bash

OVMF Walkthrough

This example runs OVMF (x86-64) inside of the container.

First, clone EDK II into the workspace, build BaseTools, and edit the target config file. Note the -j option enables multithreaded build (4 threads in this example).

git clone https://github.com/tianocore/edk2.git
cd edk2
. ./edksetup.sh
make -C BaseTools -j 4

Expected output:

-------------------------------------------------------------------
Ran 263 tests in 0.597s
OK
make[1]: Leaving directory '/home/dockeruser/workspace/edk2/BaseTools/Tests'
make: Leaving directory '/home/dockeruser/workspace/edk2/BaseTools'

Now edit Conf/target.txt with the following values:

ACTIVE_PLATFORM       = OvmfPkg/OvmfPkgX64.dsc  
TARGET_ARCH           = X64  
TOOL_CHAIN_TAG        = GCC5  

The build command can now be executed without command line parameters:

build

The build process generates a binary UEFI firmware image:

Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd

Now run QEMU using the compiled firmware image:

qemu-system-x86_64 -pflash Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd -net none

More Info

For more information or examples on building EDK II and writing applications, please refer to the EDK II Wiki.

Support Questions

IRC – stephano (freenode or OFTC)

Email: [email protected]