nip/docs/arch-linux-guide.md

553 lines
12 KiB
Markdown

# NIP on Arch Linux - Complete Guide
## Overview
This guide shows how to use NIP as your primary package manager on Arch Linux, combining the best of both worlds:
- **Graft Arch packages** - Use existing binary packages from Arch repos
- **Build from Gentoo** - Compile with custom USE flags for optimization
- **Podman containers** - Secure, rootless containerized builds
## Architecture
```
┌─────────────────────────────────────────────────────────────┐
│ NIP Package Manager │
└────────────────┬────────────────────────────────────────────┘
┌────────┼────────┬──────────────┐
│ │ │ │
▼ ▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐
│ Arch │ │ Nix │ │Gentoo│ │ Podman │
│Graft │ │Build │ │Build │ │Container │
└──────┘ └──────┘ └──────┘ └──────────┘
```
## Quick Start
### 1. Install NIP
```bash
# Clone repository
git clone https://git.maiwald.work/Nexus/NexusToolKit.git
cd NexusToolKit/nip
# Build NIP
nim c src/nip.nim
# Install (optional)
sudo cp src/nip /usr/local/bin/
```
### 2. Install Podman (Recommended)
```bash
# On Arch Linux
sudo pacman -S podman
# Configure for rootless
podman system migrate
```
### 3. Bootstrap Gentoo Tools
```bash
# Option 1: Install minimal Gentoo tools
nip bootstrap install gentoo
# Option 2: Use Podman container (fallback)
# NIP will automatically use Podman if tools aren't available
```
## Usage Patterns
### Pattern 1: Graft Arch Packages (Fast)
Use this for standard packages where you don't need customization:
```bash
# Install Firefox from Arch repos
nip install firefox
# This grafts the Arch package into NIP's CAS
# Fast, uses existing binaries
```
**When to use:**
- Standard desktop applications
- System utilities
- Development tools
- Anything where defaults are fine
### Pattern 2: Build from Gentoo (Customized)
Use this when you need specific optimizations or features:
```bash
# Build Firefox with Wayland support
nip build firefox +wayland+lto --source=gentoo
# Build with custom USE flags
nip build vim +python+ruby-lua --source=gentoo
# Build optimized for your CPU
nip build ffmpeg +cpu-native+lto --source=gentoo
```
**When to use:**
- Need specific features (Wayland, PipeWire, etc.)
- Want CPU-specific optimizations
- Need to disable unwanted features
- Building for performance
### Pattern 3: Container Builds (Secure Fallback)
If Gentoo tools aren't installed, NIP automatically uses Podman:
```bash
# NIP detects no Gentoo tools, uses Podman automatically
nip build firefox +wayland --source=gentoo
# Output:
# ⚠️ Gentoo not found
# 🐳 Using Podman container for build
# 📦 Pulling gentoo/stage3:latest...
# 🔨 Building firefox with USE="wayland"...
```
**Advantages:**
- No need to install Gentoo tools
- Isolated builds (security)
- Reproducible
- Clean system
## Practical Examples
### Example 1: Daily Driver Setup
```bash
# Install common apps from Arch (fast)
nip install \
firefox \
chromium \
vscode \
discord \
spotify
# Build optimized tools from Gentoo
nip build vim +python+ruby --source=gentoo
nip build tmux +cpu-native --source=gentoo
nip build ffmpeg +vaapi+vdpau+cpu-native --source=gentoo
```
### Example 2: Development Environment
```bash
# Graft standard tools
nip install \
git \
docker \
kubectl \
terraform
# Build optimized compilers
nip build gcc +lto+pgo --source=gentoo
nip build rust +lto --source=gentoo
```
### Example 3: Multimedia Workstation
```bash
# Graft standard apps
nip install \
gimp \
inkscape \
blender
# Build optimized multimedia stack
nip build ffmpeg +vaapi+nvenc+cpu-native+lto --source=gentoo
nip build mpv +wayland+pipewire --source=gentoo
nip build obs-studio +pipewire+vaapi --source=gentoo
```
## Configuration
### Configure NIP for Arch
Create `~/.config/nip/config`:
```kdl
config {
// Prefer Arch for standard packages
default-source "arch"
// Use Gentoo for builds
build-source "gentoo"
// Enable Podman fallback
container-runtime "podman"
container-fallback true
// Arch-specific settings
arch {
mirror "https://mirror.archlinux.org"
use-pacman-cache true
}
// Gentoo build settings
gentoo {
use-flags "+wayland +pipewire +lto"
makeopts "-j$(nproc)"
cpu-flags "native"
}
// Container settings
container {
runtime "podman"
image "gentoo/stage3:latest"
cache-builds true
}
}
```
### Variant Profiles
Create custom profiles for common configurations:
`~/.config/nip/profiles/desktop.kdl`:
```kdl
profile "desktop" {
description "Desktop workstation profile"
domains {
graphics {
wayland true
x11 false
}
audio {
pipewire true
pulseaudio false
}
optimization {
lto true
pgo false
cpu-native true
}
}
}
```
Use with:
```bash
nip build firefox --profile=desktop
```
## Hybrid Workflow
### Typical Day
```bash
# Morning: Install new app (use Arch)
nip install slack
# Afternoon: Need custom build (use Gentoo)
nip build obs-studio +pipewire+vaapi --source=gentoo
# Evening: Update everything
nip update # Updates both Arch and built packages
```
### When to Use What
| Scenario | Use | Command |
|----------|-----|---------|
| Standard app | Arch graft | `nip install <pkg>` |
| Need feature | Gentoo build | `nip build <pkg> +feature --source=gentoo` |
| Optimization | Gentoo build | `nip build <pkg> +lto+cpu-native --source=gentoo` |
| No Gentoo tools | Container | Automatic fallback to Podman |
| Testing | Container | build <pkg> --container` |
## Container Strategy
### Why Podman?
1. **Rootless** - Runs without root privileges
2. **Secure** - Better isolation than Docker
3. **Compatible** - Drop-in Docker replacement
4. **No daemon** - Simpler architecture
### Container Build Flow
```
1. NIP detects no Gentoo tools
2. Check for Podman/Docker
3. Pull gentoo/stage3 image
4. Mount source directory
5. Run emerge in container
6. Extract built package
7. Install to NIP CAS
```
### Container Images
NIP supports multiple container images:
```bash
# Gentoo (default)
nip build vim --source=gentoo --container
# Gentoo with specific profile
nip build vim --source=gentoo --container-image=gentoo/stage3:desktop
# Custom image
nip build vim --source=gentoo --container-image=myregistry/gentoo:custom
```
## Advanced Usage
### Building Gentoo Tools Natively
If you want to build Gentoo tools natively on Arch:
```bash
# Install dependencies
sudo pacman -S python python-setuptools
# Bootstrap Gentoo Portage
nip bootstrap install gentoo
# This installs:
# - Minimal Portage
# - emerge wrapper
# - Portage snapshot
# Location: ~/.local/share/nip/build-tools/gentoo/
```
### Using Arch Package Cache
NIP can use Arch's package cache to avoid re-downloading:
```bash
# Configure in ~/.config/nip/config
arch {
use-pacman-cache true
pacman-cache-dir "/var/cache/pacman/pkg"
}
```
### Mixing Sources
```bash
# Install base from Arch
nip install firefox
# Build plugin from Gentoo
nip build firefox-wayland-plugin --source=gentoo
# Both coexist in NIP's CAS
```
## Performance Comparison
### Graft (Arch) vs Build (Gentoo)
| Metric | Arch Graft | Gentoo Build | Gentoo Container |
|--------|------------|--------------|------------------|
| Speed | ~5 seconds | ~30 minutes | ~35 minutes |
| Disk | Binary size | Binary size | Binary + image |
| CPU | Minimal | High | High |
| Customization | None | Full | Full |
| Security | Arch trust | Build trust | Container isolation |
### When Speed Matters
```bash
# Fast: Graft from Arch
nip install firefox # 5 seconds
# Slow but optimized: Build from Gentoo
nip build firefox +lto+cpu-native --source=gentoo # 30 minutes
# Compromise: Use binary cache
nip build firefox --source=gentoo --use-cache # 5 seconds if cached
```
## Troubleshooting
### Podman Not Found
```bash
# Install Podman
sudo pacman -S podman
# Configure rootless
podman system migrate
# Test
podman run --rm hello-world
```
### Gentoo Build Fails
```bash
# Check container logs
nip build vim --source=gentoo --verbose
# Try with fresh container
nip build vim --source=gentoo --no-cache
# Use specific Portage snapshot
nip build vim --source=gentoo --portage-snapshot=20251115
```
### Arch Package Not Found
```bash
# Update package database
nip update
# Search for package
nip search vim
# Try different source
nip build vim --source=gentoo
```
## Best Practices
### 1. Use Arch for Most Things
```bash
# Default to Arch for speed
nip install <package>
```
### 2. Build from Gentoo When Needed
```bash
# Only build when you need customization
nip build <package> +feature --source=gentoo
```
### 3. Use Containers for Testing
```bash
# Test builds in containers first
nip build <package> --source=gentoo --container --dry-run
```
### 4. Cache Builds
```bash
# Enable binary cache
nip config set cache.enabled true
# Share cache with team
nip config set cache.server "https://cache.example.com"
```
### 5. Profile Your System
```bash
# Create system profile
nip profile create mysystem
# Use for all builds
nip build <package> --profile=mysystem
```
## Integration with Arch
### Coexistence with Pacman
NIP and Pacman can coexist:
```bash
# Pacman for system packages
sudo pacman -S linux linux-firmware
# NIP for user packages
nip install firefox vim tmux
# No conflicts - NIP uses its own CAS
```
### Migration from Pacman
```bash
# List Pacman packages
pacman -Qq > packages.txt
# Install with NIP
cat packages.txt | xargs nip install
# Optional: Remove Pacman packages
# (Keep system essentials!)
```
## Real-World Workflow
### My Daily Setup (Example)
```bash
# System packages (Pacman)
sudo pacman -S linux base base-devel
# Desktop environment (NIP + Arch)
nip install \
sway \
waybar \
alacritty \
rofi
# Optimized tools (NIP + Gentoo)
nip build vim +python+ruby+lto --source=gentoo
nip build tmux +cpu-native --source=gentoo
nip build ffmpeg +vaapi+cpu-native+lto --source=gentoo
# Development tools (NIP + Arch)
nip install \
git \
docker \
vscode
# Result: Fast installs + optimized tools where it matters
```
## Future Enhancements
### Planned Features
1. **Automatic source selection** - NIP chooses best source
2. **Binary cache** - Share built packages
3. **Build farm** - Distributed builds
4. **Profile templates** - Pre-made configurations
5. **Arch integration** - Better Pacman interop
## Support
For help with NIP on Arch Linux:
- GitHub Issues: https://git.maiwald.work/Nexus/NexusToolKit/issues
- Documentation: https://git.maiwald.work/Nexus/NexusToolKit/wiki
- Community: #nexusos on IRC
## Conclusion
NIP on Arch Linux gives you the best of both worlds:
- **Speed** of binary packages (Arch)
- **Flexibility** of source builds (Gentoo)
- **Security** of containerized builds (Podman)
Start with Arch grafts for speed, build from Gentoo when you need customization, and use containers as a secure fallback. This hybrid approach is practical, efficient, and powerful.
**Welcome to the future of package management!** 🚀