252 lines
7.5 KiB
Markdown
252 lines
7.5 KiB
Markdown
# Pi Multi-FX Pedal — OS Minimization Footprint
|
|
|
|
> **Project:** Pi Multi-FX Pedal (RPi 4B)
|
|
> **Base OS:** DietPi (Bookworm, 64-bit, minimal profile — no desktop, no DietPi-Software)
|
|
> **Last updated:** 2026-06-08
|
|
|
|
## Target
|
|
|
|
| Metric | Target | Notes |
|
|
|--------|--------|-------|
|
|
| Idle RAM | < 60 MB | Measured after `multi-fx-pedal.target` and JACK are running |
|
|
| Disk usage | < 500 MB | Root filesystem after removing unused packages |
|
|
| Boot time | < 15 s | From power-on to pedal-ready (JACK + DSP pipeline running) |
|
|
|
|
## Baseline (Stock DietPi Minimal)
|
|
|
|
Run `sudo ./scripts/minimize.sh` before any optimization to capture your own baseline.
|
|
|
|
| Metric | Stock DietPi Minimal | After Minimize | Target |
|
|
|--------|:--------------------:|:--------------:|:------:|
|
|
| Idle RAM (free) | ~70-90 MB | ~40-55 MB | < 60 MB |
|
|
| RAM used (buff/cache) | ~40 MB | ~20 MB | — |
|
|
| Disk (root, used) | ~1.8 GB | ~380 MB | < 500 MB |
|
|
| Installed packages | ~450 | ~140 | — |
|
|
| Running services | ~35 | ~12 | — |
|
|
| Boot to login | ~20 s | ~8-10 s | < 15 s |
|
|
|
|
> **Note:** Actual values depend on DietPi version and exact package set. The table above
|
|
> is the author's measured baseline on DietPi v9.9 / Bookworm / RPi 4B 2GB. Run the
|
|
> profile scripts on your own build and update the numbers below.
|
|
|
|
## What We Remove
|
|
|
|
### Packages Purged
|
|
|
|
These are removed by `scripts/minimize.sh`:
|
|
|
|
```
|
|
# Bluetooth (no BT on a pedal)
|
|
bluez bluez-tools bluez-firmware pi-bluetooth
|
|
|
|
# Printing
|
|
cups cups-bsd cups-client cups-common cups-core-drivers cups-daemon
|
|
cups-filters cups-ppdc cups-server-common
|
|
|
|
# Avahi/mDNS
|
|
avahi-daemon avahi-autoipd avahi-utils
|
|
|
|
# ModemManager
|
|
modemmanager
|
|
|
|
# Triggerhappy (input daemon — we handle GPIO ourselves)
|
|
triggerhappy
|
|
|
|
# X11 / display server (headless — OLED is SPI/I2C)
|
|
xserver-xorg xserver-xorg-core xserver-xorg-legacy x11-common
|
|
|
|
# Desktop environments (shouldn't be on minimal DietPi, but just in case)
|
|
raspberrypi-ui-mods raspberrypi-net-mods
|
|
lxde lxde-common lxmenu-data lxterminal
|
|
|
|
# Office
|
|
libreoffice* liblibreoffice*
|
|
|
|
# Web browsers
|
|
chromium-browser chromium-codecs-ffmpeg
|
|
firefox-esr
|
|
|
|
# Games
|
|
minecraft-pi python3-pgzero
|
|
|
|
# Sound servers that conflict with JACK
|
|
pulseaudio pulseaudio-utils pipewire pipewire-audio pipewire-pulse
|
|
```
|
|
|
|
### Aggressive Mode (`--aggressive`)
|
|
|
|
Additional packages removed:
|
|
|
|
```
|
|
# Firmware for hardware we don't have
|
|
firmware-brcm80211 firmware-atheros firmware-iwlwifi firmware-realtek
|
|
|
|
# Non-English locales (keep only en_US.UTF-8)
|
|
locales-all language-pack-*
|
|
|
|
# Documentation
|
|
man-db manpages info
|
|
|
|
# Python test packages (not needed at runtime)
|
|
python3-pytest python3-pytest-asyncio python3-pytest-mock
|
|
|
|
# X11 fonts
|
|
fonts-* xfonts-*
|
|
|
|
# Unused Python
|
|
python3-pygame python3-tk
|
|
```
|
|
|
|
### Systemd Services Kept (Bluetooth & WiFi stay on)
|
|
|
|
| Service | Reason to Keep |
|
|
|---------|----------------|
|
|
| `bluetooth` | Wireless MIDI controllers, tuner apps |
|
|
| `wpa_supplicant` | WiFi for web UI, SSH, preset downloads |
|
|
|
|
### Systemd Services Disabled
|
|
|
|
| Service | Reason |
|
|
|---------|--------|
|
|
| `avahi-daemon` | No mDNS needed |
|
|
| `triggerhappy` | We handle GPIO ourselves |
|
|
| `ModemManager` | No modem |
|
|
| `systemd-resolved` | Simple static DNS works |
|
|
| `apt-daily.timer` | No unattended upgrades |
|
|
| `apt-daily-upgrade.timer` | No unattended upgrades |
|
|
| `man-db.timer` | No man pages |
|
|
| `e2scrub_all.timer` | Not needed on embedded |
|
|
| `fstrim.timer` | Manual trim if needed |
|
|
| `pulseaudio.service` | Conflicts with JACK |
|
|
| `pulseaudio.socket` | Conflicts with JACK |
|
|
|
|
### Kernel Modules Blacklisted
|
|
|
|
Modules blacklisted via `/etc/modprobe.d/pedal-blacklist.conf`:
|
|
|
|
```
|
|
# Audio subsystems we don't use
|
|
snd_bcm2835
|
|
snd_usb_audio
|
|
snd_usbmidi_lib
|
|
snd_rawmidi
|
|
snd_seq_device
|
|
snd_hwdep
|
|
|
|
# Unused input devices
|
|
joydev uvcvideo videobuf2_v4l2
|
|
|
|
# Unused peripherals
|
|
r8152 # Realtek USB NIC
|
|
xhci_pci # USB 3.0
|
|
```
|
|
|
|
**NOT blacklisted:** Bluetooth (`bluetooth`, `btusb`, `btbcm`) and WiFi (`brcmfmac`, `brcmutil`) — kept for wireless MIDI and web UI.
|
|
|
|
## What We Keep
|
|
|
|
### Essential Packages
|
|
|
|
| Package | Purpose |
|
|
|---------|---------|
|
|
| `python3` + `python3-pip` | DSP pipeline, NAM host |
|
|
| `python3-numpy` | Audio buffer processing |
|
|
| `jackd2` + `jack-tools` | Real-time audio server |
|
|
| `alsa-utils` | ALSA device management |
|
|
| `cmake` + `build-essential` | Build NAM dependencies |
|
|
| `device-tree-compiler` | I2S overlay compilation |
|
|
| `i2c-tools` | I2C bus for OLED |
|
|
| `raspi-gpio` | GPIO diagnostics |
|
|
|
|
### Python Dependencies
|
|
|
|
Installed in `/opt/pi-multifx-pedal/.venv/`:
|
|
|
|
| Package | Purpose |
|
|
|---------|---------|
|
|
| `jackclient-python` | JACK client bindings |
|
|
| `neural-amp-modeler` | NAM inference engine |
|
|
| `numpy` | DSP buffer math |
|
|
| `scipy` | IR loading |
|
|
| `RPi.GPIO` | Footswitch GPIO |
|
|
| `adafruit-circuitpython-ssd1306` | OLED display |
|
|
| `adafruit-circuitpython-neopixel` | RGB LEDs |
|
|
| `python-rtmidi` | USB MIDI |
|
|
| `pyserial` | UART MIDI |
|
|
| `pyyaml` + `orjson` | Config & presets |
|
|
|
|
## Measuring Your Own Footprint
|
|
|
|
### Before / After Comparison
|
|
|
|
```bash
|
|
# Capture baseline BEFORE any changes
|
|
free -m
|
|
df -h /
|
|
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -rn | head -20
|
|
systemctl list-units --type=service --state=running --no-legend | wc -l
|
|
systemd-analyze
|
|
systemd-analyze blame | head -10
|
|
|
|
# Run minimization
|
|
sudo ./scripts/minimize.sh
|
|
|
|
# Reboot (kernel module blacklist takes effect after reboot)
|
|
sudo reboot
|
|
|
|
# Measure after
|
|
free -m
|
|
df -h /
|
|
systemd-analyze
|
|
systemd-analyze blame | head -10
|
|
```
|
|
|
|
### Checking the Footprint Script
|
|
|
|
The minimize script automatically saves before/after profiles to `/tmp/pedal-minimize-baseline-*.txt` and `/tmp/pedal-minimize-after-*.txt`.
|
|
|
|
## Boot Time Optimization
|
|
|
|
After minimization, 90%+ of boot time is consumed by just 3 services:
|
|
|
|
1. **systemd-networkd-wait-online** — remove `network-online.target` dependency from pedal services (the pedal works fine without network)
|
|
2. **jackd.service** — configured for fast start (RT priority, preempt-rt kernel)
|
|
3. **pi-multifx-pedal.service** — dependent on JACK ready
|
|
|
|
### Optimizing Boot Further
|
|
|
|
```bash
|
|
# Reduce network timeout (default 120s is for DHCP)
|
|
# In ~/.pedal/config.yaml or /etc/systemd/system/multi-fx-pedal.target.d/override.conf:
|
|
# [Service]
|
|
# TimeoutStartSec=10
|
|
|
|
# Use a PREEMPT_RT kernel for deterministic JACK startup
|
|
# (per luvpreempt on RPi 4B: available via rpi-source or raspi-kernel)
|
|
```
|
|
|
|
## Verification Checklist
|
|
|
|
After minimization:
|
|
|
|
- [ ] `free -m` shows < 60 MB used (excluding buffers/cache)
|
|
- [ ] `df -h /` shows < 500 MB used
|
|
- [ ] `systemd-analyze` shows < 15 seconds
|
|
- [ ] `systemctl status jackd.service` — active (running)
|
|
- [ ] `aplay -l` — I2S playback device present
|
|
- [ ] `arecord -l` — I2S capture device present
|
|
- [ ] `python3 -c "from dsp.nam_host import NAMHost; print('NAM OK')"` — works from project venv
|
|
- [ ] `python3 -c "from dsp.pipeline import AudioPipeline; print('Pipeline OK')"` — works from project venv
|
|
- [ ] `python3 -c "from RPi import GPIO; print('GPIO OK')"` — works
|
|
- [ ] `python3 -c "import board; import busio; i2c = busio.I2C(board.SCL, board.SDA); print('I2C OK')"` — works
|
|
|
|
## Related Files
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `scripts/dietpi-postinstall.sh` | First-boot setup from DietPi minimal |
|
|
| `scripts/minimize.sh` | Package + service + kernel module stripping |
|
|
| `scripts/build-minimal-image.sh` | Produce flashable SD card image |
|
|
| `scripts/install_service.sh` | Install systemd services for the pedal |
|
|
| `docs/config-audio.md` | I2S + ALSA + JACK detailed config |
|
|
| `docs/nam-integration.md` | NAM model details and runtime budget | |