Lunatik

Getting started

Install dependencies (here for Debian/Ubuntu, to be adapted to one’s distribution):

sudo apt install git build-essential lua5.5 dwarves clang llvm libelf-dev linux-headers-$(uname -r) linux-tools-common linux-tools-$(uname -r) pkg-config libpcap-dev m4

Install dependencies (here for Arch Linux):

sudo pacman -S git lua clang llvm m4 libpcap pkg-config base-devel pahole libelf linux-tools linux-headers

The command line tool runs under /usr/bin/lua5.5, and the build calls lua5.5. Ubuntu packages Lua 5.5 from 26.04 and Debian from testing. Where the distribution does not carry it yet, build the interpreter from source:

curl -sSLO https://www.lua.org/ftp/lua-5.5.1.tar.gz
tar xf lua-5.5.1.tar.gz && make -C lua-5.5.1
sudo install -m 0755 lua-5.5.1/src/lua /usr/bin/lua5.5

The lua-readline package is optional. When installed, the REPL gains line editing and command history:

sudo apt install lua-readline  # Debian/Ubuntu

Compile and install Lunatik:

LUNATIK_DIR=~/lunatik  # to be adapted
mkdir "${LUNATIK_DIR}" ; cd "${LUNATIK_DIR}"
git clone --depth 1 --recurse-submodules https://github.com/luainkernel/lunatik.git
cd lunatik
sudo make btf_install
make
sudo make install

sudo make btf_install copies the running kernel’s BTF, /sys/kernel/btf/vmlinux, into the headers the modules build against. Without it the modules are built with no BTF of their own: xdp and tc, and scx on a kernel with sched_ext, still load, but log missing module BTF in the kernel log and leave their kfunc unregistered, so an eBPF program that calls one, such as bpf_luaxdp_run, fails to load.

Check the install

sudo lunatik load      # loads the modules
sudo lunatik status    # one line per module: <module> is loaded
sudo lunatik -V        # the version of the loaded Lunatik

After a kernel upgrade

The modules are installed for one kernel release, under /lib/modules/$(uname -r), so on a new kernel sudo lunatik fails with lunatik: couldn't create /dev/lunatik. Install the new kernel’s headers and tools, then rebuild:

sudo apt install linux-headers-$(uname -r) linux-tools-$(uname -r)  # Debian/Ubuntu
make clean
sudo make btf_install
make
sudo make install

On Debian and Ubuntu, a kernel hook can do this on every upgrade: tools/Readme.md installs tools/debian_kernel_postinst_lunatik.sh as /etc/kernel/postinst.d/zz-update-lunatik. The hook builds its own clone of master under /opt/lunatik, not your checkout. It downloads the kernel sources to build resolve_btfids and bpftool, and replaces /usr/sbin/bpftool with the one it built; it builds xdp-loader from xdp-tools under /opt/xdp-tools. A failure in it fails the kernel package’s configuration.

Uninstall

sudo lunatik unload
sudo make uninstall

Run sudo make ebpf_uninstall too if you installed the eBPF programs with sudo make ebpf_install, and remove /etc/kernel/postinst.d/zz-update-lunatik if you installed the hook.

OpenWRT

Install Lunatik from our package feed.

First steps

 sudo lunatik # execute Lunatik REPL
 Lunatik 5.1  Copyright (C) 2023-2026 Ring Zero Desenvolvimento de Software LTDA.
 > return 42 -- execute this line in the kernel
 42

Next, run a script or browse the examples.

Edit this page on GitHub