Setup
Installation
Host installation
From PyPI
LISA is available on PyPI:
pip install lisa-linux
Note
Some dependencies cannot be fulfilled by PyPI, such as adb
when
working with Android devices. It is the user’s responsability to install
them. Alternatively, the installation from the git repository allows setting
up a full environment.
From GitLab
LISA is hosted on GitLab. The following references are available:
main
branch: Main development branch where pull requests are merged as they come.
release
branch: Branch updated upon release of thelisa-linux
package on PyPI.
vX.Y.Z
tags: One tag per release oflisa-linux
PyPI package.
LISA has a minimum Python version requirement of:
Python >= 3.8
If your distribution does not natively ship with a high-enough version, you can install it manually and provide the name of the Python binary before doing any other action:
export LISA_PYTHON=<name of Python 3 binary>
On Ubuntu, the deadsnakes
PPA provides alternative versions of Python. Note
that Ubuntu splits the Python distribution into multiple packages, which must
all be installed. The list is available inside install_base.sh
and is more
or less:
python3
python3-pip
python3-venv
python3-tk
You might also find a python3.X-full
package that contains everything you
need.
git clone https://gitlab.arm.com/tooling/lisa
# Jump into the cloned repo directory
cd lisa
# This will provide a more accurate changelog when building the doc
git fetch origin refs/notes/changelog
# A few packages need to be installed, like python3 or kernelshark. Python
# modules will be installed in a venv at the next step, without touching
# any system-wide install location.
sudo ./install_base.sh --install-all
# On the first run, it will take care of creating a Python venv and populating it
source init_env
Attention
If you use this installation procedure, make sure to always run
source init_env
before anything else in order to activate the venv.
Otherwise, importing lisa will fail, commands will not be available etc.
Attention
Only Bash and ZSH are officially supported by source
init_env
. Mileage may vary for other shells, up to and including failure
from the first line.
In case the venv becomes unusable for some reason, the lisa-install
shell command available after sourcing init_env
will allow to create a new
clean venv from scratch.
Additional Python packages
lisa-install
will also install the content of
$LISA_HOME/custom_requirements.txt
if the file exists. That allows
re-installing a custom set of packages automatically when the venv needs to
regenerated.
Without automatic venv
Sometimes, LISA needs to operate in an environment setup for multiple tools. In that case, it may be easier to manage manually a venv/virtualenv instead of letting LISA create one for its shell.
Setting export LISA_USE_VENV=0
prior to source init_env
will avoid the
creation and usage of the LISA-managed venv. lisa-install
command can still
be used to install the necessary Python packages, which will honor any
venv-like system manually setup.
Alternatively, lisa
package is packaged according to the usual Python
practices, which includes a setup.py
script, and a
devmode_requirements.txt
file that will install all the shipped packages in
editable mode (including those that are not developped in that repository, but
still included for convenience).
Virtual machine installation
LISA provides a Vagrant recipe which automates the generation of a VirtualBox based virtual machine pre-configured to run LISA. To generate and use such a virtual machine you need:
Once these two components are available on your machine, issue these commands:
git clone https://gitlab.arm.com/tooling/lisa
cd lisa
vagrant up
This last command builds and executes the VM according to the description provided by the Vagrant file available in the root folder of the LISA source tree.
Once the VM installation is complete, you can access that VM with:
vagrant ssh
Important
In order to work around a Vagrant bug, all the dependencies of LISA are installed in non-editable mode inside the VM. This means that using git pull must be followed by a lisa-install if any of the dependencies in external/ are updated.
Target installation
LISA’s “device under test” is called target. In order to be able to run e.g. tests on a target, you will need the provide a minimal environment composed of:
An
adb
orssh
serverFor some tests, a working Python 3 installation
This can be provided by a a regular GNU/Linux or Android distribution, but can also be done with a minimal buildroot environment. The benefits are:
Almost no background task that can create issues when testing the Linux kernel scheduler
Can be used as a in-memory initramfs, thereby avoiding activity of USB or NFS-related kthreads, as it has been the source of issues on some boards with wonky USB support.
Using initramfs has the added advantages of ease of deployment (can be integrated in the kernel image, reducing the amount of assets to flash) and avoids issues related to board state (a reboot fully resets the userspace).
Buildroot image creation is assisted with these commands, available in lisa shell Buildroot commands.
Kernel modules
From Linux v5.3, sched_load_cfs_rq and sched_load_se tracepoints are present in mainline as bare tracepoints without any events in tracefs associated with them.
To help expose these tracepoints (and any additional one we might require in the future) as trace events, an external module is required and is provided under the name of “lisa” in $LISA_HOME/tools/kmodules/lisa
Pre-requisites
CFI
Using the out-of-tree build method for kernels with CONFIG_CFI_CLANG=y as all
Android kernels come by default requires the module to be built with at least
clang-16. This can either be achieved by using the alpine
build environment,
by having it installed on host and using LLVM=1
or forcing the version with
LLVM=-16
in target-conf/kernel/modules/make-variables
.
Kernel symbols needed for reading files on Android product kernels
In order to use some Lisa module features (e.g. the lisa__pixel6_emeter ftrace event) on a product kernel, some symbols forbidden by Google need to be re-enabled.
In order to do that, the kernel will need to be built with:
./update_symbol_list.sh
The script should be included in the product kernel tree. It will ensure that the required symbols are not stripped from the final kernel image and the module does not get rejected.
Enabling a module
LISA Python package will compile and load the module automatically when required for tracing so there is usually no reason to do so manually. The most reliable way to configure LISA for building the module is:
Kernel config (also available under
$LISA_HOME/tools/kmodules/kconfig_fragment.config
):CONFIG_IKHEADERS=y CONFIG_IKCONFIG=y CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO_BTF=y CONFIG_DEBUG_INFO_REDUCED=n CONFIG_BPF_SYSCALL=y CONFIG_FTRACE=yTarget configuration (
lisa.target.TargetConf
):target-conf: kernel: # If this is omitted, LISA will try to download a kernel.org # released tarball. If the kernel has only minor differences with # upstream, it will work, but can also result in compilation # errors due to mismatching headers. src: /home/foobar/linux/ modules: # This is not mandatory but will use a tested chroot to build # the module. If that is omitted, ``CROSS_COMPILE`` will be # used (and inferred if not set). build-env: alpine # It is advised not to set that, but in case overlayfs is # unusable (e.g. inside an LXC or docker container for a CI # system depending on config), this should do the trick. # overlay-backend: copy
Note
If build-env: host
is used (default), ensure that your setup is
ready to compile a kernel. Notably, ensure that you have kernel build
dependencies installed. This can be achieved with
install_base.sh --install-kernel-build-dependencies
(included in
--install-all
)
Automatic route
Once the kernel and LISA’s target have been configured appropriately, the Python API will build and load the module automatically as required (e.g. when ftrace events provided by the module are required).
In order to improve interoperation with other systems, a CLI tool is also provided to load the module easily:
# Compile and load the module. lisa-load-kmod --conf target_conf.yml # Runs "echo hello world" with the module loaded, then unloads it. lisa-load-kmod --conf target_conf.yml -- echo hello world # See # lisa-load-kmod --help for more options.
Note
The module name may be different if it was compiled manually vs compiled via the Python interface due to backward compatiblity constraints.
Manual route
Manual build of the module are not supported. You may be able to hack your way but if you do so, you are on your own. Also keep in mind that you will need to re-implement internal mechanisms of LISA that might change at any time, so you will loose any backward compatibility guarantee.
Build
$LISA_HOME/tools/kmodules/build_module path/to/kernel path/to/kmodule [path/to/install/modules]
This will build the module against the provided kernel tree and install it in
path/to/install/module
if provided otherwise install it in
$LISA_HOME/tools/kmodules
.
Warning
The documentation used to refer to
$LISA_HOME/lisa/_assets/kmodules
rather than
tools/kmodules
. This was an oversight, DO NOT build from
lisa/_assets
. If you still do, any remaining build artifact
could be reused in fresh builds, leading to segfaults and such.
Clean
$LISA_HOME/tools/kmodules/clean_module path/to/kernel path/to/kmodule
Highly recommended to clean when switching kernel trees to avoid unintentional breakage for using stale binaries.
Integrating the module in your kernel tree
This method is not supported. It falls under the category of manual module build.
Updating
Over time, we might change/add some dependencies to LISA. As such, if you
update your LISA repository, you should make sure your locally-installed
packages still match those dependencies. Sourcing init_env
from a
new shell should suffice, which will hint the user if running lisa-install
again is needed.
Note
LISA does not provide any specific mean of keeping a venv up-to-date.
Running lisa-install
will destroy the venv it create and create a new
one afresh, but doing so is the sole responsibility of the user, it will not
happen automatically based on releases of new versions of LISA’s
dependencies.
What next ?
The next step depends on the intended use case, further information at Workflows