🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
451 lines
9.1 KiB
Markdown
451 lines
9.1 KiB
Markdown
# Dangerous Pi - Image Build Guide
|
|
|
|
Complete guide for building custom Raspberry Pi OS images with pi-gen.
|
|
|
|
## Prerequisites
|
|
|
|
### System Requirements
|
|
|
|
- **Linux or macOS** (tested on Apple Silicon)
|
|
- **Docker** (or alternatives like Podman)
|
|
- **8GB+ RAM** recommended
|
|
- **20GB+ free disk space**
|
|
|
|
### Install Docker
|
|
|
|
```bash
|
|
# macOS
|
|
brew install docker
|
|
|
|
# Ubuntu/Debian
|
|
sudo apt-get install docker.io
|
|
|
|
# Or use Docker Desktop
|
|
```
|
|
|
|
## Setup
|
|
|
|
### 1. Clone pi-gen
|
|
|
|
```bash
|
|
# Clone the official pi-gen repository
|
|
git clone https://github.com/RPi-Distro/pi-gen.git
|
|
cd pi-gen
|
|
|
|
# Checkout arm64 branch (for Pi Zero 2 W)
|
|
git checkout arm64
|
|
```
|
|
|
|
### 2. Copy Dangerous Pi Stage
|
|
|
|
```bash
|
|
# From your dangerous-pi repository
|
|
cp -r /path/to/dangerous-pi/pi-gen/stageDTPM3 /path/to/pi-gen/
|
|
cp /path/to/dangerous-pi/pi-gen/config /path/to/pi-gen/config
|
|
```
|
|
|
|
## Build Methods
|
|
|
|
### Method 1: Full Build (Recommended for First Time)
|
|
|
|
Builds a complete Raspberry Pi OS image with all your customizations.
|
|
|
|
```bash
|
|
cd /path/to/pi-gen
|
|
|
|
# Start full build
|
|
sudo ./build.sh
|
|
```
|
|
|
|
**Build Time**: 1-2 hours
|
|
**Output**: Complete bootable image in `deploy/` directory
|
|
|
|
### Method 2: Quick Build (Development)
|
|
|
|
For rapid iteration when testing changes:
|
|
|
|
```bash
|
|
cd /path/to/pi-gen
|
|
|
|
# Only rebuild your custom stage
|
|
CONTINUE=1 STAGE=stageDTPM3 sudo ./build.sh
|
|
```
|
|
|
|
**Build Time**: 5-10 minutes
|
|
**Use Case**: Testing Dangerous Pi code changes only
|
|
|
|
### Method 3: Using Docker (Recommended)
|
|
|
|
Clean, isolated build environment:
|
|
|
|
```bash
|
|
cd /path/to/pi-gen
|
|
|
|
# Build in Docker container
|
|
./docker-build.sh
|
|
```
|
|
|
|
**Advantages**:
|
|
- No host system pollution
|
|
- Consistent build environment
|
|
- Works on macOS
|
|
|
|
## Build Script Helper
|
|
|
|
Use the provided helper script for easier builds:
|
|
|
|
```bash
|
|
# From dangerous-pi directory
|
|
./build-image.sh full # Full build
|
|
./build-image.sh quick # Incremental build
|
|
./build-image.sh test # Validate scripts
|
|
```
|
|
|
|
**Note**: Update the `PI_GEN_DIR` variable in [build-image.sh](build-image.sh) to point to your pi-gen installation.
|
|
|
|
## Configuration
|
|
|
|
Your build configuration is defined in [pi-gen/config](pi-gen/config):
|
|
|
|
```bash
|
|
IMG_NAME="Proxmark3" # Image name
|
|
RELEASE="trixie" # Debian Trixie
|
|
TARGET_HOSTNAME="Proxmark3" # Hostname
|
|
FIRST_USER_NAME="dt" # Default user
|
|
FIRST_USER_PASS="proxmark3" # Default password
|
|
ENABLE_SSH=1 # SSH enabled
|
|
STAGE_LIST="stage0 stage1 stage2 stageDTPM3"
|
|
```
|
|
|
|
### Customizing the Build
|
|
|
|
Edit `config` to customize:
|
|
|
|
**Change hostname**:
|
|
```bash
|
|
TARGET_HOSTNAME="dangerous-pi"
|
|
```
|
|
|
|
**Change default credentials**:
|
|
```bash
|
|
FIRST_USER_NAME="admin"
|
|
FIRST_USER_PASS="your-secure-password"
|
|
```
|
|
|
|
**Change WiFi country**:
|
|
```bash
|
|
WPA_COUNTRY="GB" # UK
|
|
```
|
|
|
|
**Skip stages** (for faster builds):
|
|
```bash
|
|
# Only include your custom stage (requires base stages)
|
|
STAGE_LIST="stage0 stage1 stage2 stageDTPM3"
|
|
```
|
|
|
|
## Stage Architecture
|
|
|
|
Your custom `stageDTPM3` includes 4 sub-stages that run in order:
|
|
|
|
### Stage 01: Proxmark3
|
|
- Compiles Proxmark3 firmware and client
|
|
- Installs to `/usr/local/bin`
|
|
|
|
### Stage 02: RaspAP (Wireless AP)
|
|
- Configures WiFi access point
|
|
- Default SSID: `raspi-webgui`
|
|
- Default password: `ChangeMe`
|
|
|
|
### Stage 03: ttyd (Web Terminal)
|
|
- Installs web-based terminal
|
|
- Accessible at `http://10.3.141.1:8000/`
|
|
|
|
### Stage 04: Dangerous Pi
|
|
- Installs your custom application
|
|
- Location: `/opt/dangerous-pi`
|
|
- Auto-starts on boot via systemd
|
|
|
|
## Build Output
|
|
|
|
After successful build:
|
|
|
|
```
|
|
pi-gen/
|
|
└── deploy/
|
|
├── image_2025-11-26-Proxmark3.img # Bootable image
|
|
├── image_2025-11-26-Proxmark3.img.zip # Compressed image
|
|
└── build.log # Build logs
|
|
```
|
|
|
|
## Flashing the Image
|
|
|
|
### Using Balena Etcher (Easiest)
|
|
|
|
1. Download [Balena Etcher](https://etcher.balena.io/)
|
|
2. Select your `.img` or `.zip` file
|
|
3. Select your SD card
|
|
4. Click "Flash!"
|
|
|
|
### Using dd (Linux/macOS)
|
|
|
|
```bash
|
|
# Find your SD card device
|
|
lsblk # Linux
|
|
diskutil list # macOS
|
|
|
|
# Flash image (replace /dev/sdX with your device)
|
|
sudo dd if=deploy/image_2025-11-26-Proxmark3.img of=/dev/sdX bs=4M status=progress
|
|
|
|
# Sync and eject
|
|
sync
|
|
sudo eject /dev/sdX
|
|
```
|
|
|
|
**Warning**: Double-check the device path! Using the wrong device will destroy data.
|
|
|
|
## Testing the Image
|
|
|
|
### 1. Boot the Pi
|
|
|
|
1. Insert SD card into Raspberry Pi Zero 2 W
|
|
2. Connect Proxmark3 via USB
|
|
3. Power on the Pi
|
|
4. Wait ~1 minute for first boot
|
|
|
|
### 2. Connect to Access Point
|
|
|
|
```
|
|
SSID: raspi-webgui
|
|
Password: ChangeMe
|
|
Gateway: 10.3.141.1
|
|
```
|
|
|
|
### 3. Run Automated Tests
|
|
|
|
```bash
|
|
# From your development machine
|
|
./test-image.sh 10.3.141.1
|
|
```
|
|
|
|
This will verify:
|
|
- SSH connectivity
|
|
- Service status
|
|
- Hardware access
|
|
- API endpoints
|
|
- Python dependencies
|
|
|
|
### 4. Manual Verification
|
|
|
|
**SSH into device**:
|
|
```bash
|
|
ssh dt@10.3.141.1
|
|
# Password: proxmark3
|
|
```
|
|
|
|
**Check service status**:
|
|
```bash
|
|
sudo systemctl status dangerous-pi.service
|
|
sudo journalctl -u dangerous-pi.service -f
|
|
```
|
|
|
|
**Test API**:
|
|
```bash
|
|
curl http://10.3.141.1:8000/api/health
|
|
curl http://10.3.141.1:8000/api/system/info
|
|
```
|
|
|
|
**Access web interface**:
|
|
- Frontend: http://10.3.141.1:3000 (if frontend running)
|
|
- Backend: http://10.3.141.1:8000/docs (API docs)
|
|
- RaspAP: http://10.3.141.1/ (WiFi management)
|
|
- ttyd: http://10.3.141.1:8000/ (web terminal - port conflict!)
|
|
|
|
## Troubleshooting
|
|
|
|
### Build Fails - Permission Denied
|
|
|
|
```bash
|
|
# Ensure scripts are executable
|
|
chmod +x pi-gen/stageDTPM3/*/00-*.sh
|
|
```
|
|
|
|
### Build Fails - Docker Issues
|
|
|
|
```bash
|
|
# Ensure Docker is running
|
|
docker ps
|
|
|
|
# Clean up old containers
|
|
docker system prune -a
|
|
```
|
|
|
|
### Build Fails - Disk Space
|
|
|
|
```bash
|
|
# Check available space (need 20GB+)
|
|
df -h
|
|
|
|
# Clean up old builds
|
|
sudo rm -rf pi-gen/work pi-gen/deploy
|
|
```
|
|
|
|
### Service Not Starting After Boot
|
|
|
|
**Check logs**:
|
|
```bash
|
|
ssh dt@10.3.141.1
|
|
sudo journalctl -u dangerous-pi.service -n 50
|
|
```
|
|
|
|
**Common issues**:
|
|
1. Port conflict with ttyd (see [PORT_CONFLICT.md](PORT_CONFLICT.md))
|
|
2. Missing Python dependencies
|
|
3. Incorrect file permissions
|
|
4. Environment variables not set
|
|
|
|
**Quick fix**:
|
|
```bash
|
|
# Restart service
|
|
sudo systemctl restart dangerous-pi.service
|
|
|
|
# Check status
|
|
sudo systemctl status dangerous-pi.service
|
|
```
|
|
|
|
### Image Too Large
|
|
|
|
Your current build should be ~600-700MB. If it's larger:
|
|
|
|
**Check what's using space**:
|
|
```bash
|
|
ssh dt@10.3.141.1
|
|
du -sh /* | sort -h | tail -10
|
|
```
|
|
|
|
**Already implemented optimizations**:
|
|
- ✅ Package cache cleanup (`apt-get clean`)
|
|
- ✅ Pip cache cleanup (`pip3 cache purge`)
|
|
- ✅ Auto-remove unused packages
|
|
|
|
### Can't Access Hardware (I2C, GPIO, Serial)
|
|
|
|
**Verify groups**:
|
|
```bash
|
|
ssh dt@10.3.141.1
|
|
groups pi # Should show: i2c bluetooth gpio dialout
|
|
```
|
|
|
|
**If missing**:
|
|
```bash
|
|
sudo usermod -a -G i2c,bluetooth,gpio,dialout pi
|
|
# Log out and back in
|
|
```
|
|
|
|
**Verify devices exist**:
|
|
```bash
|
|
ls -la /dev/i2c* # I2C bus
|
|
ls -la /dev/ttyACM* # Proxmark3
|
|
```
|
|
|
|
## Optimization Tips
|
|
|
|
### Faster Builds
|
|
|
|
1. **Use incremental builds** during development
|
|
2. **Cache compiled binaries** from previous builds
|
|
3. **Use Docker** for consistent environment
|
|
4. **Skip unnecessary stages** in config
|
|
|
|
### Smaller Images
|
|
|
|
Already implemented in your scripts:
|
|
- Package manager cleanup
|
|
- No development packages
|
|
- No man pages
|
|
- Pip cache removal
|
|
|
|
### Build Caching
|
|
|
|
Pi-gen caches build artifacts in `work/` directory:
|
|
|
|
```bash
|
|
# Keep work directory for incremental builds
|
|
# Clean when you want fresh build
|
|
sudo rm -rf work/
|
|
```
|
|
|
|
## Version Management
|
|
|
|
Set version before building:
|
|
|
|
```bash
|
|
echo "1.0.0" > /path/to/dangerous-pi/VERSION
|
|
```
|
|
|
|
This version will be copied into the image at `/opt/dangerous-pi/VERSION`.
|
|
|
|
## Advanced: Custom Stage Development
|
|
|
|
### Script Execution Order
|
|
|
|
For each stage directory (`NN-name/`), pi-gen runs:
|
|
|
|
1. `00-run.sh` - Host-side preparation (optional)
|
|
2. `00-run-chroot.sh` - Chroot installation (required)
|
|
3. `01-run-chroot.sh` - Additional chroot tasks (optional)
|
|
4. `02-run-chroot.sh` - More chroot tasks (optional)
|
|
|
|
### Adding New Stage
|
|
|
|
```bash
|
|
cd pi-gen/stageDTPM3
|
|
|
|
# Create new stage
|
|
mkdir 05-my-feature
|
|
cd 05-my-feature
|
|
|
|
# Create installation script
|
|
cat > 00-run-chroot.sh << 'EOF'
|
|
#!/bin/bash -e
|
|
echo "Installing my feature..."
|
|
apt-get install -y my-package
|
|
EOF
|
|
|
|
chmod +x 00-run-chroot.sh
|
|
```
|
|
|
|
### Stage Best Practices
|
|
|
|
1. **Use `#!/bin/bash -e`** - Exit on error
|
|
2. **Use `$ROOTFS_DIR`** in 00-run.sh for paths
|
|
3. **Clean up** package caches at end
|
|
4. **Set ownership** for files (chown pi:pi)
|
|
5. **Document** in README.md what stage does
|
|
|
|
## Next Steps
|
|
|
|
1. **First build**: Run full build to create base image
|
|
2. **Test hardware**: Flash to SD card and test on Pi Zero 2 W
|
|
3. **Iterate**: Make changes and use quick builds
|
|
4. **Document**: Update configuration for your needs
|
|
5. **Deploy**: Create final production image
|
|
|
|
## Resources
|
|
|
|
- [Pi-gen Documentation](https://github.com/RPi-Distro/pi-gen)
|
|
- [Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/)
|
|
- [Your Project Status](PROJECT_STATUS.md)
|
|
- [Port Conflict Resolution](PORT_CONFLICT.md)
|
|
|
|
## Support
|
|
|
|
For issues with:
|
|
- **pi-gen**: Check official pi-gen repository
|
|
- **Dangerous Pi**: Review logs with `journalctl -u dangerous-pi`
|
|
- **Proxmark3**: See Proxmark3 documentation
|
|
- **RaspAP**: Visit RaspAP website
|
|
|
|
---
|
|
|
|
Happy building! 🚀
|