mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2026-02-07 21:50:55 +00:00
Add comprehensive Sphinx documentation structure and content
Co-authored-by: r41k0u <76248539+r41k0u@users.noreply.github.com>
This commit is contained in:
45
docs/getting-started/index.md
Normal file
45
docs/getting-started/index.md
Normal file
@ -0,0 +1,45 @@
|
||||
# Getting Started
|
||||
|
||||
Welcome to PythonBPF! This section will help you get started with writing eBPF programs in Python.
|
||||
|
||||
## What You'll Learn
|
||||
|
||||
In this section, you'll learn how to:
|
||||
|
||||
1. **Install PythonBPF** - Set up your development environment with all necessary dependencies
|
||||
2. **Write Your First Program** - Create a simple BPF program to understand the basics
|
||||
3. **Understand Core Concepts** - Learn about decorators, compilation, and program structure
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before you begin, make sure you have:
|
||||
|
||||
* A Linux system (eBPF requires Linux kernel 4.15+)
|
||||
* Python 3.10 or higher
|
||||
* Root or sudo access (required for loading BPF programs)
|
||||
* Basic understanding of Python programming
|
||||
|
||||
## Quick Navigation
|
||||
|
||||
```{toctree}
|
||||
:maxdepth: 1
|
||||
|
||||
installation
|
||||
quickstart
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
After completing the getting started guide, you can:
|
||||
|
||||
* Explore the {doc}`../user-guide/index` for detailed information on features
|
||||
* Check out the {doc}`../api/index` for complete API reference
|
||||
* Browse the [examples directory](https://github.com/pythonbpf/Python-BPF/tree/master/examples) for more complex programs
|
||||
|
||||
## Need Help?
|
||||
|
||||
If you encounter any issues:
|
||||
|
||||
* Check the [GitHub Issues](https://github.com/pythonbpf/Python-BPF/issues) for known problems
|
||||
* Review the [README](https://github.com/pythonbpf/Python-BPF/blob/master/README.md) for additional information
|
||||
* Reach out to the maintainers: [@r41k0u](https://github.com/r41k0u) and [@varun-r-mallya](https://github.com/varun-r-mallya)
|
||||
159
docs/getting-started/installation.md
Normal file
159
docs/getting-started/installation.md
Normal file
@ -0,0 +1,159 @@
|
||||
# Installation
|
||||
|
||||
This guide will walk you through installing PythonBPF and its dependencies.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### System Requirements
|
||||
|
||||
PythonBPF requires:
|
||||
|
||||
* **Linux** - eBPF is a Linux kernel feature (kernel 4.15 or higher recommended)
|
||||
* **Python 3.10+** - Python 3.10 or higher is required
|
||||
* **Root/sudo access** - Loading BPF programs into the kernel requires elevated privileges
|
||||
|
||||
### Required System Packages
|
||||
|
||||
Before installing PythonBPF, you need to install the following system packages:
|
||||
|
||||
#### On Ubuntu/Debian:
|
||||
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y bpftool clang llvm
|
||||
```
|
||||
|
||||
#### On Fedora/RHEL/CentOS:
|
||||
|
||||
```bash
|
||||
sudo dnf install -y bpftool clang llvm
|
||||
```
|
||||
|
||||
#### On Arch Linux:
|
||||
|
||||
```bash
|
||||
sudo pacman -S bpf clang llvm
|
||||
```
|
||||
|
||||
```{note}
|
||||
The `llvm` package provides `llc`, the LLVM compiler that is used to compile LLVM IR to BPF bytecode.
|
||||
```
|
||||
|
||||
## Installing PythonBPF
|
||||
|
||||
### From PyPI (Recommended)
|
||||
|
||||
The easiest way to install PythonBPF is using pip:
|
||||
|
||||
```bash
|
||||
pip install pythonbpf pylibbpf
|
||||
```
|
||||
|
||||
This will install:
|
||||
* `pythonbpf` - The main package for writing and compiling BPF programs
|
||||
* `pylibbpf` - Python bindings for libbpf, used to load and attach BPF programs
|
||||
|
||||
### Development Installation
|
||||
|
||||
If you want to contribute to PythonBPF or work with the latest development version:
|
||||
|
||||
1. Clone the repository:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/pythonbpf/Python-BPF.git
|
||||
cd Python-BPF
|
||||
```
|
||||
|
||||
2. Create and activate a virtual environment:
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
||||
```
|
||||
|
||||
3. Install in development mode:
|
||||
|
||||
```bash
|
||||
pip install -e .
|
||||
pip install pylibbpf
|
||||
```
|
||||
|
||||
4. Install development dependencies:
|
||||
|
||||
```bash
|
||||
make install
|
||||
```
|
||||
|
||||
### Installing Documentation Dependencies
|
||||
|
||||
If you want to build the documentation locally:
|
||||
|
||||
```bash
|
||||
pip install pythonbpf[docs]
|
||||
# Or from the repository root:
|
||||
pip install -e .[docs]
|
||||
```
|
||||
|
||||
## Generating vmlinux.py
|
||||
|
||||
Some examples require access to kernel data structures. To use these features, you need to generate a `vmlinux.py` file:
|
||||
|
||||
1. Install additional dependencies:
|
||||
|
||||
```bash
|
||||
pip install ctypeslib2
|
||||
```
|
||||
|
||||
2. Generate the vmlinux.py file:
|
||||
|
||||
```bash
|
||||
sudo tools/vmlinux-gen.py
|
||||
```
|
||||
|
||||
3. Copy the generated file to your working directory or the examples directory as needed.
|
||||
|
||||
```{warning}
|
||||
The `vmlinux.py` file is kernel-specific. If you upgrade your kernel, you may need to regenerate this file.
|
||||
```
|
||||
|
||||
## Verifying Installation
|
||||
|
||||
To verify that PythonBPF is installed correctly, run:
|
||||
|
||||
```bash
|
||||
python3 -c "import pythonbpf; print(pythonbpf.__all__)"
|
||||
```
|
||||
|
||||
You should see output similar to:
|
||||
|
||||
```
|
||||
['bpf', 'map', 'section', 'bpfglobal', 'struct', 'compile_to_ir', 'compile', 'BPF', 'trace_pipe', 'trace_fields']
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Permission Errors
|
||||
|
||||
If you encounter permission errors when running BPF programs:
|
||||
|
||||
* Make sure you're running with `sudo` or as root
|
||||
* Check that `/sys/kernel/tracing/` is accessible
|
||||
|
||||
### LLVM/Clang Not Found
|
||||
|
||||
If you get errors about `llc` or `clang` not being found:
|
||||
|
||||
* Verify they're installed: `which llc` and `which clang`
|
||||
* Check your PATH environment variable includes the LLVM bin directory
|
||||
|
||||
### Import Errors
|
||||
|
||||
If Python can't find the `pythonbpf` module:
|
||||
|
||||
* Make sure you've activated your virtual environment
|
||||
* Verify installation with `pip list | grep pythonbpf`
|
||||
* Try reinstalling: `pip install --force-reinstall pythonbpf`
|
||||
|
||||
## Next Steps
|
||||
|
||||
Now that you have PythonBPF installed, continue to the {doc}`quickstart` guide to write your first BPF program!
|
||||
236
docs/getting-started/quickstart.md
Normal file
236
docs/getting-started/quickstart.md
Normal file
@ -0,0 +1,236 @@
|
||||
# Quick Start
|
||||
|
||||
This guide will walk you through creating your first BPF program with PythonBPF.
|
||||
|
||||
## Your First BPF Program
|
||||
|
||||
Let's create a simple "Hello World" program that prints a message every time a process is executed on your system.
|
||||
|
||||
### Step 1: Create the Program
|
||||
|
||||
Create a new file called `hello_world.py`:
|
||||
|
||||
```python
|
||||
from pythonbpf import bpf, section, bpfglobal, BPF, trace_pipe
|
||||
from ctypes import c_void_p, c_int64
|
||||
|
||||
@bpf
|
||||
@section("tracepoint/syscalls/sys_enter_execve")
|
||||
def hello_world(ctx: c_void_p) -> c_int64:
|
||||
print("Hello, World!")
|
||||
return c_int64(0)
|
||||
|
||||
@bpf
|
||||
@bpfglobal
|
||||
def LICENSE() -> str:
|
||||
return "GPL"
|
||||
|
||||
b = BPF()
|
||||
b.load()
|
||||
b.attach_all()
|
||||
trace_pipe()
|
||||
```
|
||||
|
||||
### Step 2: Run the Program
|
||||
|
||||
Run the program with sudo (required for BPF operations):
|
||||
|
||||
```bash
|
||||
sudo python3 hello_world.py
|
||||
```
|
||||
|
||||
### Step 3: See it in Action
|
||||
|
||||
Open another terminal and run any command:
|
||||
|
||||
```bash
|
||||
ls
|
||||
echo "test"
|
||||
date
|
||||
```
|
||||
|
||||
You should see "Hello, World!" printed in the first terminal for each command executed!
|
||||
|
||||
Press `Ctrl+C` to stop the program.
|
||||
|
||||
## Understanding the Code
|
||||
|
||||
Let's break down what each part does:
|
||||
|
||||
### Imports
|
||||
|
||||
```python
|
||||
from pythonbpf import bpf, section, bpfglobal, BPF, trace_pipe
|
||||
from ctypes import c_void_p, c_int64
|
||||
```
|
||||
|
||||
* `bpf` - Decorator to mark functions for BPF compilation
|
||||
* `section` - Decorator to specify which kernel event to attach to
|
||||
* `bpfglobal` - Decorator for BPF global variables
|
||||
* `BPF` - Class to compile, load, and attach BPF programs
|
||||
* `trace_pipe` - Utility to read kernel trace output
|
||||
* `c_void_p`, `c_int64` - C types for function signatures
|
||||
|
||||
### The BPF Function
|
||||
|
||||
```python
|
||||
@bpf
|
||||
@section("tracepoint/syscalls/sys_enter_execve")
|
||||
def hello_world(ctx: c_void_p) -> c_int64:
|
||||
print("Hello, World!")
|
||||
return c_int64(0)
|
||||
```
|
||||
|
||||
* `@bpf` - Marks this function to be compiled to BPF bytecode
|
||||
* `@section("tracepoint/syscalls/sys_enter_execve")` - Attaches to the execve syscall tracepoint (called when processes start)
|
||||
* `ctx: c_void_p` - Context parameter (required for all BPF functions)
|
||||
* `print()` - In BPF context, this outputs to the kernel trace buffer
|
||||
* `return c_int64(0)` - BPF functions must return an integer
|
||||
|
||||
### License Declaration
|
||||
|
||||
```python
|
||||
@bpf
|
||||
@bpfglobal
|
||||
def LICENSE() -> str:
|
||||
return "GPL"
|
||||
```
|
||||
|
||||
* The Linux kernel requires BPF programs to declare a license
|
||||
* Most kernel features require GPL-compatible licenses
|
||||
* This is defined as a BPF global variable
|
||||
|
||||
### Compilation and Execution
|
||||
|
||||
```python
|
||||
b = BPF()
|
||||
b.load()
|
||||
b.attach_all()
|
||||
trace_pipe()
|
||||
```
|
||||
|
||||
* `BPF()` - Creates a BPF object and compiles the current file
|
||||
* `b.load()` - Loads the compiled BPF program into the kernel
|
||||
* `b.attach_all()` - Attaches all BPF programs to their specified hooks
|
||||
* `trace_pipe()` - Reads and displays output from the kernel trace buffer
|
||||
|
||||
## Next Example: Tracking Process IDs
|
||||
|
||||
Let's make a more interesting program that tracks which processes are being created:
|
||||
|
||||
```python
|
||||
from pythonbpf import bpf, section, bpfglobal, BPF, trace_pipe
|
||||
from pythonbpf.helper import pid, comm
|
||||
from ctypes import c_void_p, c_int64
|
||||
|
||||
@bpf
|
||||
@section("tracepoint/syscalls/sys_enter_execve")
|
||||
def track_exec(ctx: c_void_p) -> c_int64:
|
||||
process_id = pid()
|
||||
process_name = comm()
|
||||
print(f"Process {process_name} (PID: {process_id}) is starting")
|
||||
return c_int64(0)
|
||||
|
||||
@bpf
|
||||
@bpfglobal
|
||||
def LICENSE() -> str:
|
||||
return "GPL"
|
||||
|
||||
b = BPF()
|
||||
b.load()
|
||||
b.attach_all()
|
||||
trace_pipe()
|
||||
```
|
||||
|
||||
This program uses BPF helper functions:
|
||||
|
||||
* `pid()` - Gets the current process ID
|
||||
* `comm()` - Gets the current process command name
|
||||
|
||||
Run it with `sudo python3 track_exec.py` and watch processes being created!
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Tracepoints
|
||||
|
||||
Tracepoints are predefined hooks in the kernel. Common ones include:
|
||||
|
||||
```python
|
||||
# System calls
|
||||
@section("tracepoint/syscalls/sys_enter_execve")
|
||||
@section("tracepoint/syscalls/sys_enter_clone")
|
||||
@section("tracepoint/syscalls/sys_enter_open")
|
||||
|
||||
# Scheduler events
|
||||
@section("tracepoint/sched/sched_process_fork")
|
||||
@section("tracepoint/sched/sched_switch")
|
||||
```
|
||||
|
||||
### Kprobes
|
||||
|
||||
Kprobes allow you to attach to any kernel function:
|
||||
|
||||
```python
|
||||
@section("kprobe/do_sys_open")
|
||||
def trace_open(ctx: c_void_p) -> c_int64:
|
||||
print("File is being opened")
|
||||
return c_int64(0)
|
||||
```
|
||||
|
||||
### XDP (eXpress Data Path)
|
||||
|
||||
For network packet processing:
|
||||
|
||||
```python
|
||||
from ctypes import c_uint32
|
||||
|
||||
@section("xdp")
|
||||
def xdp_pass(ctx: c_void_p) -> c_uint32:
|
||||
# XDP_PASS = 2
|
||||
return c_uint32(2)
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Always include a LICENSE** - Required by the kernel
|
||||
2. **Use type hints** - Helps PythonBPF generate correct code
|
||||
3. **Return the correct type** - Match the expected return type for your program type
|
||||
4. **Test incrementally** - Start simple and add complexity gradually
|
||||
5. **Check kernel logs** - Use `dmesg` to see BPF verifier messages if loading fails
|
||||
|
||||
## Common Issues
|
||||
|
||||
### Program Won't Load
|
||||
|
||||
If your BPF program fails to load:
|
||||
|
||||
* Check `dmesg` for verifier error messages
|
||||
* Ensure your LICENSE is GPL-compatible
|
||||
* Verify you're using supported BPF features
|
||||
* Make sure return types match function signatures
|
||||
|
||||
### No Output
|
||||
|
||||
If you don't see output:
|
||||
|
||||
* Verify the tracepoint/kprobe is being triggered
|
||||
* Check that you're running with sudo
|
||||
* Ensure `/sys/kernel/tracing/trace_pipe` is accessible
|
||||
|
||||
### Compilation Errors
|
||||
|
||||
If compilation fails:
|
||||
|
||||
* Check that `llc` is installed and in your PATH
|
||||
* Verify your Python syntax is correct
|
||||
* Ensure all imported types are from `ctypes`
|
||||
|
||||
## Next Steps
|
||||
|
||||
Now that you understand the basics, explore:
|
||||
|
||||
* {doc}`../user-guide/decorators` - Learn about all available decorators
|
||||
* {doc}`../user-guide/maps` - Use BPF maps for data storage and communication
|
||||
* {doc}`../user-guide/structs` - Define custom data structures
|
||||
* {doc}`../user-guide/helpers` - Discover all available BPF helper functions
|
||||
* [Examples directory](https://github.com/pythonbpf/Python-BPF/tree/master/examples) - See more complex examples
|
||||
Reference in New Issue
Block a user