acrn-hypervisor/doc/getting-started/getting-started.rst
Shiqing Gao f8de4178e4 doc: update GSG for virtio-gpu dependency libraries
commit 78f702e ("Use libdrm library for drm access") adds the dependency on
libdrm library. GSG needs to be updated accordingly. Otherwise, compilation
error occurs like below:
hw/pci/virtio/virtio_gpu.c:21:10: fatal error: libdrm/drm_fourcc.h: No such file or directory
   21 | #include <libdrm/drm_fourcc.h>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.

Tracked-On: #7464

Signed-off-by: Shiqing Gao <shiqing.gao@intel.com>
2022-05-11 22:00:49 -07:00

794 lines
24 KiB
ReStructuredText

.. _gsg:
.. _rt_industry_ubuntu_setup:
.. _getting-started-building:
Getting Started Guide
#####################
This guide will help you get started with ACRN. We'll show how to prepare a
build environment on your development computer. Then we'll walk through the
steps to set up a simple ACRN configuration on a target system. The
configuration is an ACRN shared scenario and consists of an ACRN hypervisor,
Service VM, and one post-launched User VM as illustrated in this figure:
.. image:: ./images/gsg_scenario-1-0.75x.png
Throughout this guide, you will be exposed to some of the tools, processes, and
components of the ACRN project. Let's get started.
.. _gsg-prereq:
Prerequisites
**************
You will need two machines: a development computer and a target system. The
development computer is where you configure and build ACRN and your application.
The target system is where you deploy and run ACRN and your application.
.. image:: ./images/gsg_host_target.png
Before you begin, make sure your machines have the following prerequisites:
**Development computer**:
* Hardware specifications
- A PC with Internet access (A fast system with multiple cores and 16GB
memory or more will make the builds go faster.)
* Software specifications
- Ubuntu Desktop 20.04 LTS (ACRN development is not supported on Windows.)
**Target system**:
* Hardware specifications
- Target board (see :ref:`hardware_tested`)
- Ubuntu Desktop 20.04 LTS bootable USB disk: download the latest `Ubuntu
Desktop 20.04 LTS ISO image <https://releases.ubuntu.com/focal/>`__ and
follow the `Ubuntu documentation
<https://ubuntu.com/tutorials/create-a-usb-stick-on-ubuntu#1-overview>`__
for creating the USB disk.
- USB keyboard and mouse
- Monitor
- Ethernet cable and Internet access
- A second USB disk with minimum 1GB capacity to copy files between the
development computer and target system (this guide offers steps for
copying via USB disk, but you can use another method if you prefer)
- Local storage device (NVMe or SATA drive, for example)
.. _gsg-target-hardware:
.. rst-class:: numbered-step
Set Up the Target Hardware
**************************
To set up the target hardware environment:
#. Connect the mouse, keyboard, monitor, and power supply cable to the target
system.
#. Connect the target system to the LAN with the Ethernet cable.
Example of a target system with cables connected:
.. image:: ./images/gsg_nuc.png
:scale: 25%
.. _gsg-dev-computer:
.. rst-class:: numbered-step
Prepare the Development Computer
********************************
To set up the ACRN build environment on the development computer:
#. On the development computer, run the following command to confirm that Ubuntu
Desktop 20.04 is running:
.. code-block:: bash
cat /etc/os-release
If you have an older version, see `Ubuntu documentation
<https://ubuntu.com/tutorials/install-ubuntu-desktop#1-overview>`__ to
install a new OS on the development computer.
#. Download the information database about all available package updates for
your Ubuntu release. We'll need it to get the latest tools and libraries used
for ACRN builds:
.. code-block:: bash
sudo apt update
This next command upgrades packages already installed on your system with
minor updates and security patches. This command is optional as there is a
small risk that upgrading your system software can introduce unexpected
issues:
.. code-block:: bash
sudo apt upgrade -y #optional command to upgrade system
#. Install the necessary ACRN build tools:
.. code-block:: bash
sudo apt install -y gcc \
git \
make \
vim \
libssl-dev \
libpciaccess-dev \
uuid-dev \
libsystemd-dev \
libevent-dev \
libxml2-dev \
libxml2-utils \
libusb-1.0-0-dev \
python3 \
python3-pip \
python3.8-venv \
libblkid-dev \
e2fslibs-dev \
pkg-config \
libnuma-dev \
libcjson-dev \
liblz4-tool \
flex \
bison \
xsltproc \
clang-format \
bc \
libpixman-1-dev \
libsdl2-dev \
libegl-dev \
libgles-dev \
libdrm-dev
#. Install Python package dependencies:
.. code-block:: bash
sudo pip3 install lxml xmlschema defusedxml
#. Create a working directory:
.. code-block:: bash
mkdir ~/acrn-work
#. Install the iASL compiler/disassembler used for advanced power management,
device discovery, and configuration (ACPI) within the host OS:
.. code-block:: bash
cd ~/acrn-work
wget https://acpica.org/sites/acpica/files/acpica-unix-20210105.tar.gz
tar zxvf acpica-unix-20210105.tar.gz
cd acpica-unix-20210105
make clean && make iasl
sudo cp ./generate/unix/bin/iasl /usr/sbin
#. Get the ACRN hypervisor and kernel source code. (Because the ``acrn-kernel`` repo
has a lot of Linux kernel history, you can clone the relevant release branch
with minimal history, as shown here.)
.. code-block:: bash
cd ~/acrn-work
git clone https://github.com/projectacrn/acrn-hypervisor.git
cd acrn-hypervisor
git checkout acrn-2022w18.4-180000p
cd ..
git clone --depth 1 --branch acrn-2022w18.4-180000p https://github.com/projectacrn/acrn-kernel.git
.. _gsg-board-setup:
.. rst-class:: numbered-step
Prepare the Target and Generate a Board Configuration File
***************************************************************
In this step, you will use the **Board Inspector** to generate a board
configuration file.
A **board configuration file** is an XML file that stores hardware-specific
information extracted from the target system. The file is used to configure the
ACRN hypervisor, because each hypervisor instance is specific to your target
hardware.
.. important::
Whenever you change the configuration of the board, such as peripherals, BIOS
settings, additional memory, or PCI devices, you must generate a new board
configuration file.
Install OS on the Target
============================
The target system needs Ubuntu Desktop 20.04 LTS to run the Board Inspector
tool.
To install Ubuntu 20.04:
#. Insert the Ubuntu bootable USB disk into the target system.
#. Power on the target system, and select the USB disk as the boot device
in the UEFI
menu. Note that the USB disk label presented in the boot options depends on
the brand/make of the USB drive. (You will need to configure the BIOS to boot
off the USB device first, if that option isn't available.)
#. After selecting the language and keyboard layout, select the **Normal
installation** and **Download updates while installing Ubuntu** (downloading
updates requires the target to have an Internet connection).
.. image:: ./images/gsg_ubuntu_install_01.png
#. Use the check boxes to choose whether you'd like to install Ubuntu alongside
another operating system, or delete your existing operating system and
replace it with Ubuntu:
.. image:: ./images/gsg_ubuntu_install_02.png
#. Complete the Ubuntu installation and create a new user account ``acrn`` and
set a password.
#. The next section shows how to configure BIOS settings.
Configure Target BIOS Settings
===============================
#. Boot your target and enter the BIOS configuration editor.
Tip: When you are booting your target, you'll see an option (quickly) to
enter the BIOS configuration editor, typically by pressing :kbd:`F2` during
the boot and before the GRUB menu (or Ubuntu login screen) appears.
#. Configure these BIOS settings:
* Enable **VMX** (Virtual Machine Extensions, which provide hardware
assist for CPU virtualization).
* Enable **VT-d** (Intel Virtualization Technology for Directed I/O, which
provides additional support for managing I/O virtualization).
* Disable **Secure Boot**. This setting simplifies the steps for this example.
The names and locations of the BIOS settings differ depending on the target
hardware and BIOS version.
Generate a Board Configuration File
=========================================
#. Build the Board Inspector Debian package on the development computer:
a. Move to the development computer.
#. On the development computer, go to the ``acrn-hypervisor`` directory:
.. code-block:: bash
cd ~/acrn-work/acrn-hypervisor
#. Build the Board Inspector Debian package:
.. code-block:: bash
make clean && make board_inspector
When done, the build generates a Debian package in the ``./build``
directory.
#. Copy the Board Inspector Debian package from the development computer to the
target system via USB disk as follows:
a. On the development computer, insert the USB disk that you intend to use to
copy files.
#. Ensure that there is only one USB disk inserted by running the following
command:
.. code-block:: bash
ls /media/$USER
Confirm that only one disk name appears. You'll use that disk name in the following steps.
#. Copy the Board Inspector Debian package to the USB disk:
.. code-block:: bash
cd ~/acrn-work/
disk="/media/$USER/"$(ls /media/$USER)
cp -r acrn-hypervisor/build/acrn-board-inspector*.deb "$disk"/
sync && sudo umount "$disk"
#. Insert the USB disk into the target system.
#. Copy the Board Inspector Debian package from the USB disk to the target:
.. code-block:: bash
mkdir -p ~/acrn-work
disk="/media/$USER/"$(ls /media/$USER)
cp -r "$disk"/acrn-board-inspector*.deb ~/acrn-work
#. Install the Board Inspector Debian package on the target system:
.. code-block:: bash
cd ~/acrn-work
sudo apt install ./acrn-board-inspector*.deb
#. Reboot the system:
.. code-block:: bash
reboot
#. Run the Board Inspector to generate the board configuration file. This
example uses the parameter ``my_board`` as the file name.
.. code-block:: bash
cd ~/acrn-work
sudo board_inspector.py my_board
.. note::
If you get an error that mentions Pstate and editing the GRUB
configuration, reboot the system and run this command again.
#. Confirm that the board configuration file ``my_board.xml`` was generated in
the current directory:
.. code-block:: bash
ls ./my_board.xml
#. Copy ``my_board.xml`` from the target to the development computer via USB
disk as follows:
a. Make sure the USB disk is connected to the target.
#. Copy ``my_board.xml`` to the USB disk:
.. code-block:: bash
disk="/media/$USER/"$(ls /media/$USER)
cp ~/acrn-work/my_board.xml "$disk"/
sync && sudo umount "$disk"
#. Insert the USB disk into the development computer.
#. Copy ``my_board.xml`` from the USB disk to the development computer:
.. code-block:: bash
disk="/media/$USER/"$(ls /media/$USER)
cp "$disk"/my_board.xml ~/acrn-work
sync && sudo umount "$disk"
.. _gsg-dev-setup:
.. rst-class:: numbered-step
Generate a Scenario Configuration File and Launch Script
********************************************************
In this step, you will use the **ACRN Configurator** to generate a scenario
configuration file and launch script.
A **scenario configuration file** is an XML file that holds the parameters of
a specific ACRN configuration, such as the number of VMs that can be run,
their attributes, and the resources they have access to.
A **launch script** is a shell script that is used to configure and create a
post-launched User VM. Each User VM has its own launch script.
First, you will install dependencies, build the ACRN Configurator Debian
package, and install it on your development computer. Then you will use the ACRN
Configurator to generate a scenario configuration file and launch script.
#. On the development computer, install the ACRN Configurator build tools:
.. code-block:: bash
sudo apt install -y libwebkit2gtk-4.0-dev \
build-essential \
curl \
wget \
libssl-dev \
libgtk-3-dev \
libappindicator3-dev \
librsvg2-dev \
python3-venv
#. Install Node.js (npm included) as follows:
a. We recommend using nvm to manage your Node.js runtime. It allows you to
switch versions and update Node.js easily.
.. code-block:: bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
#. Rerun your ``.bashrc`` initialization script and then install the latest
version of Node.js and npm:
.. code-block:: bash
source ~/.bashrc
nvm install node --latest-npm
nvm use node
#. Install and upgrade Yarn:
.. code-block:: bash
npm install --global yarn
#. Install rustup, the official installer for Rust:
.. code-block:: bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
When prompted by the Rust installation script, type ``1`` and press
:kbd:`Enter`.
.. code-block:: console
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1
#. Configure the current shell:
.. code-block:: bash
source $HOME/.cargo/env
#. Install additional ACRN Configurator dependencies:
.. code-block:: bash
cd ~/acrn-work/acrn-hypervisor/misc/config_tools
python3 -m pip install -r requirements.txt
cd configurator
python3 -m pip install -r requirements.txt
yarn
#. Build the ACRN Configurator Debian package:
.. code-block:: bash
cd ~/acrn-work/acrn-hypervisor
make configurator
#. Install the ACRN Configurator:
.. code-block:: bash
sudo apt install -y ~/acrn-work/acrn-hypervisor/build/acrn-configurator_*_amd64.deb
#. Launch the ACRN Configurator:
.. code-block:: bash
acrn-configurator
#. On the left-hand side, look for **Start a new configuration**.
Confirm that the working folder is ``<path to>/acrn-work/MyConfiguration``. Click **Use This Folder**.
TODO add screenshots to Configurator steps
#. Import your board configuration file as follows:
a. Under **Import a board configuration file**, click **Browse for file**.
#. Browse to ``~/acrn-work/my_board.xml`` and click **Open**.
#. Click **Import Board File**.
The ACRN Configurator makes a copy of your board file, changes the file
extension to ``.board.xml``, and saves the file to the working folder.
#. Create a new scenario as follows:
a. Under **Create new or import an existing scenario**, click **Create
Scenario**.
#. In the dialog box, confirm that **Shared (Post-launched VMs only)** is
selected.
#. Confirm that one Service VM and one post-launched VM are selected.
#. Click **Create**.
#. Generate the scenario configuration file and launch script:
a. Under **Configure settings for scenario and launch scripts**, the
scenario's configurable items appear. Feel free to look through all the
available configuration settings. This is where you can change the
settings to meet your application's particular needs. But for now, you will update only a few settings to make this example work.
#. Click the **VM1 Post-launched** tab to access the post-launched VM's
settings.
#. Confirm that the Basic Parameters tab is selected, and scroll down to
**Memory size (MB)**. Change the value to ``1024``. For this example, we
will use Ubuntu 20.04 to boot the post-launched VM. Ubuntu 20.04 needs at
least 1024 MB to boot.
#. Scroll down to **Virtio block device**, click **+**, and enter
``~/acrn-work/ubuntu-20.04.4-desktop-amd64.iso``. This parameter
specifies the VM's OS image and its location on the target system. Later
in this guide, you will save the ISO file to that directory.
#. Click **Save Scenario And Launch Scripts** to generate the scenario
configuration file and launch script.
#. Click the **x** in the upper-right corner to close the ACRN
Configurator.
#. Confirm that the scenario configuration file ``scenario.xml`` appears in your
``acrn-work/MyConfiguration`` directory::
ls ~/acrn-work/MyConfiguration/scenario.xml
#. Confirm that the launch script ``TODO`` appears in the
expected output directory::
ls ~/acrn-work/MyConfiguration/TODO
.. _gsg_build:
.. rst-class:: numbered-step
Build ACRN
***************
#. On the development computer, build the ACRN hypervisor:
.. code-block:: bash
cd ~/acrn-work/acrn-hypervisor
make clean && make BOARD=~/acrn-work/MyConfiguration/my_board.board.xml SCENARIO=~/acrn-work/MyConfiguration/scenario.xml
The build typically takes a few minutes. When done, the build generates a
Debian package in the ``./build`` directory:
.. code-block:: bash
cd ./build
ls *.deb
acrn-my_board-shared-2.7.deb # TODO update file name
The Debian package contains the ACRN hypervisor and tools to ease installing
ACRN on the target.
#. Build the ACRN kernel for the Service VM:
a. If you have built the ACRN kernel before, run the following command to
remove all artifacts from the previous build. Otherwise, an error will
occur during the build.
.. code-block:: bash
make distclean
#. Build the ACRN kernel:
.. code-block:: bash
cd ~/acrn-work/acrn-kernel
cp kernel_config_service_vm .config
make olddefconfig
make -j $(nproc) deb-pkg
The kernel build can take 15 minutes or less on a fast computer, but could
take an hour or more depending on the performance of your development
computer. When done, the build generates four Debian packages in the
directory above the build root directory:
.. code-block:: bash
cd ..
ls *.deb
linux-headers-5.10.78-acrn-service-vm_5.10.78-acrn-service-vm-1_amd64.deb
linux-image-5.10.78-acrn-service-vm_5.10.78-acrn-service-vm-1_amd64.deb
linux-image-5.10.78-acrn-service-vm-dbg_5.10.78-acrn-service-vm-1_amd64.deb
linux-libc-dev_5.10.78-acrn-service-vm-1_amd64.deb
#. Copy all the necessary files generated on the development computer to the
target system by USB disk as follows:
a. Insert the USB disk into the development computer and run these commands:
.. code-block:: bash
disk="/media/$USER/"$(ls /media/$USER)
cp ~/acrn-work/acrn-hypervisor/build/acrn-my_board-shared-2.7.deb "$disk"/ # TODO update file name
cp ~/acrn-work/*acrn-service-vm*.deb "$disk"/
cp ~/acrn-work/my_board/output/launch_user_vm_id3.sh "$disk"/
cp ~/acrn-work/acpica-unix-20210105/generate/unix/bin/iasl "$disk"/
sync && sudo umount "$disk"
Even though our sample default scenario defines six User VMs, we're only
going to launch one of them, so we'll only need the one launch script.
#. Insert the USB disk you just used into the target system and run these
commands to copy the files locally:
.. code-block:: bash
disk="/media/$USER/"$(ls /media/$USER)
cp "$disk"/acrn-my_board-shared-2.7.deb ~/acrn-work # TODO update file name
cp "$disk"/*acrn-service-vm*.deb ~/acrn-work
cp "$disk"/launch_user_vm_id3.sh ~/acrn-work
sudo cp "$disk"/iasl /usr/sbin/
sync && sudo umount "$disk"
.. _gsg-install-acrn:
.. rst-class:: numbered-step
Install ACRN
************
#. Install the ACRN Debian package and ACRN kernel Debian packages using these
commands:
.. code-block:: bash
cd ~/acrn-work
sudo apt install ./acrn-my_board-shared-2.7.deb # TODO update file name
sudo apt install ./*acrn-service-vm*.deb
#. Reboot the system:
.. code-block:: bash
reboot
#. Confirm that you see the GRUB menu with the “ACRN multiboot2” entry. Select
it and proceed to booting ACRN. (It may be autoselected, in which case it
will boot with this option automatically in 5 seconds.)
.. code-block:: console
GNU GRUB version 2.04
────────────────────────────────────────────────────────────────────────────────
Ubuntu
Advanced options for Ubuntu
UEFI Firmware Settings
*ACRN multiboot2
.. _gsg-run-acrn:
.. rst-class:: numbered-step
Run ACRN and the Service VM
******************************
The ACRN hypervisor boots the Ubuntu Service VM automatically.
#. On the target, log in to the Service VM. (It will look like a normal Ubuntu
session.)
#. Verify that the hypervisor is running by checking ``dmesg`` in the Service
VM:
.. code-block:: bash
dmesg | grep -i hypervisor
You should see "Hypervisor detected: ACRN" in the output. Example output of a
successful installation (yours may look slightly different):
.. code-block:: console
[ 0.000000] Hypervisor detected: ACRN
.. _gsg-user-vm:
.. rst-class:: numbered-step
Launch the User VM
*******************
#. Go to the `official Ubuntu website <https://releases.ubuntu.com/focal/>`__ to
get the Ubuntu Desktop 20.04 LTS ISO image
``ubuntu-20.04.4-desktop-amd64.iso`` for the User VM. (The same image you
specified earlier in the ACRN Configurator UI.)
#. Put the ISO file in the path ``~/acrn-work/`` on the target system.
#. Launch the User VM:
.. code-block:: bash
sudo chmod +x ~/acrn-work/launch_user_vm_id3.sh # TODO update file name
sudo ~/acrn-work/launch_user_vm_id3.sh # TODO update file name
#. It may take about one minute for the User VM to boot and start running the
Ubuntu image. You will see a lot of output, then the console of the User VM
will appear as follows:
.. code-block:: console
Ubuntu 20.04.4 LTS ubuntu hvc0
ubuntu login:
#. Log in to the User VM. For the Ubuntu 20.04 ISO, the user is ``ubuntu``, and
there's no password.
#. Confirm that you see output similar to this example:
.. code-block:: console
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.11.0-27-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
0 packages can be updated.
0 updates are security updates.
Your Hardware Enablement Stack (HWE) is supported until April 2025.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
ubuntu@ubuntu:~$
#. This User VM and the Service VM are running different Ubuntu images. Use this
command to see that the User VM is running the downloaded Ubuntu ISO image:
.. code-block:: console
ubuntu@ubuntu:~$ uname -r
5.11.0-27-generic
Then open a new terminal window and use the command to see that the Service
VM is running the ``acrn-kernel`` Service VM image:
.. code-block:: console
acrn@vecow:~$ uname -r
5.10.78-acrn-service-vm
The User VM has launched successfully. You have completed this ACRN setup.
#. (Optional) To shut down the User VM, run this command in the terminal that is
connected to the User VM:
.. code-block:: bash
sudo poweroff
.. _gsg-next-steps:
Next Steps
**************
:ref:`overview_dev` describes the ACRN configuration process, with links to
additional details.