Intelligente Lösungen
in neuer Dimension

BPFTRACE bauen

Ich würde gerne BPFTRACE für die Systemüberwachung einsetzen. Leider stellt sich heraus, dass Ubuntu-20.04 und 22.04 veraltete Versionen von diesem Werkzeug ausliefern. Dadurch funktionieren viele Beispiele nicht. Hier beschreibe ich, wie ich eine aktuelle Version von BPFTRACE baue.

Doku sichten

Container vorbereiten

  • Neuer 20.04-Container: bpftrace-2004
  • Container für Docker konfigurieren: lxc-enable-docker.sh bpftrace-2004
  • Anmelden: ssh -A ubuntu@bpftrace-2004.lxd

Zusatzpakete installieren

  • sudo apt install git
  • sudo apt install curl (für Nix)

Nix installieren

  • Anmelden am Container – eines der nachfolgenden Verfahren verwenden
    • lxc exec bpftrace-2004 -- sudo -u ubuntu -s
    • ssh -A ubuntu@bpftrace-2004.lxd
    • lxc console bpftrace-2004 –> ENTER –> ubuntu/ubuntu
  • curl https://nixos.org/nix/install >nix-install
  • nix-install sichten
  • sudo mkdir /nix
  • sudo chown ubuntu:ubuntu /nix
  • sh nix-install --no-daemon –> lädt viele Dateien herunter
  • Flake aktivieren:
    • mkdir -p ~/.config/nix
    • `echo “experimental-features = nix-command flakes” >> ~/.config/nix/nix.conf?

Beispielausgaben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ubuntu@bpftrace-2004:~$ sh nix-install --no-daemon
downloading Nix 2.19.3 binary tarball for x86_64-linux from 'https://releases.nixos.org/nix/nix-2.19.3/nix-2.19.3-x86_64-linux.tar.xz' to '/tmp/nix-binary-tarball-unpack.MHkVzgLYjQ'...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 20.6M  100 20.6M    0     0  5965k      0  0:00:03  0:00:03 --:--:-- 5965k
Note: a multi-user installation is possible. See https://nixos.org/manual/nix/stable/installation/installing-binary.html#multi-user-installation
performing a single-user installation of Nix...
copying Nix to /nix/store.................................................
installing 'nix-2.19.3'
building '/nix/store/25296lg19r1zpl2s3pfc4ww214fy36l2-user-environment.drv'...
unpacking channels...
modifying /home/ubuntu/.profile...

Installation finished!  To ensure that the necessary environment
variables are set, either log in again, or type

  . /home/ubuntu/.nix-profile/etc/profile.d/nix.sh

in your shell.

Auschecken

  • Für meinen Fork:
    • REPO=git@github.com:uli-heller/bpftrace.git
    • TAG=0.20.1_uli-release
  • Für Standard-Repo:
    • REPO=git@github.com:bpftrace/bpftrace.git
    • TAG=v0.20.1
  • mkdir build
  • cd build
  • git clone "${REPO}"
  • cd bpftrace
  • git checkout "${TAG}"

Bauen

Standard

1
2
3
4
$ nix build
  # lädt sehr viel Zeugs herunter - 650 MiB --ausgepackt--> 4000 MiB
  # Binary liegt unter result/bin/bpftrace
  # Es läuft nicht unter ubuntu-20.04

Mit altem Compiler

1
2
3
$ nix build .#bpftrace-llvm12
  # Binary liegt unter result/bin/bpftrace
  # Es läuft nicht unter ubuntu-20.04

AppImage

1
2
3
4
5
$ nix build .#appimage
  # AppImage liegt unter result
  # Es ist relativ groß (160M)
  # Es läßt sich nicht komprimieren
  # Ausführung unter ubuntu-20.04 klappt

Leider gibt es oft Fehlermeldungen wie diese:

1
2
3
4
5
6
7
8
9
Attaching 11 probes...
WARNING: Error loading program: tracepoint:syscalls:sys_enter_open (try -v), skipping.
ioctl(PERF_EVENT_IOC_SET_BPF): Bad file descriptor
WARNING: Error loading program: tracepoint:syscalls:sys_enter_openat (try -v), skipping.
ioctl(PERF_EVENT_IOC_SET_BPF): Bad file descriptor
WARNING: Error loading program: tracepoint:syscalls:sys_enter_rename (try -v), skipping.
ioctl(PERF_EVENT_IOC_SET_BPF): Bad file descriptor
WARNING: Error loading program: tracepoint:syscalls:sys_enter_renameat2 (try -v), skipping.
ioctl(PERF_EVENT_IOC_SET_BPF): Bad file descriptor

Mit bpftrace-0.19.1 (ohne AppImage) klappt’s! Quercheck: v0.19.1 als AppImage bauen und damit erneut testen –> funktioniert!

Static: (ENTWURF)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ubuntu@bpftrace-2004:~/build/bpftrace$ git diff
diff --git a/flake.nix b/flake.nix
index 035217ec..6ea91239 100644
--- a/flake.nix
+++ b/flake.nix
@@ -97,6 +97,8 @@
                     xxd
                     zlib
+                    zlib.static
                   ];
 
                 # Release flags
                 cmakeFlags = [
                   "-DCMAKE_BUILD_TYPE=Release"
+                 "-DSTATIC_LIBC=ON"
+                 "-DSTATIC_LINKING=ON"
                 ];
 
                 # Technically not needed cuz package name matches mainProgram, but