nip/docs/gentoo-nix-guide.md

674 lines
12 KiB
Markdown

# Using Nix Packages on Gentoo
## Overview
This guide shows Gentoo users how to use NIP to access Nix's vast package repository while keeping their Gentoo system intact. This is perfect for:
- Accessing packages not in Portage
- Getting newer versions of software
- Testing packages before creating ebuilds
- Using binary packages for faster installation
## Why Use Nix on Gentoo?
**Advantages:**
- ✅ Access to 80,000+ packages from Nixpkgs
- ✅ Binary packages (no compilation needed)
- ✅ Isolated installation (no conflicts with Portage)
- ✅ Multiple versions of the same package
- ✅ Reproducible builds
- ✅ Easy rollback
**NIP Integration:**
- ✅ Automatic Nix installation
- ✅ Clean GoboLinux-style organization
- ✅ Unified `/System/Links/` for all packages
- ✅ Works alongside Portage seamlessly
## Quick Start
### 1. Install NIP
```bash
# Clone repository
git clone https://git.maiwald.work/Nexus/NexusToolKit
cd NexusToolKit/nip
# Build and install
./build.sh
sudo ./install.sh
```
### 2. Install Your First Nix Package
```bash
# NIP will automatically offer to install Nix if needed
nip install firefox --source=nix
# Or explicitly install Nix first
nip bootstrap install nix
```
### 3. Verify Installation
```bash
# Check Nix is installed
nip bootstrap list
# Check Firefox is installed
nip list
which firefox
```
## Automatic Nix Installation
When you try to install a Nix package, NIP automatically detects if Nix is missing and offers installation options:
```bash
$ nip install firefox --source=nix
⚠️ Nix not found
NIP can help you set up Nix:
1. 🚀 Install minimal Nix via NIP (recommended)
• Lightweight standalone nix-build binary
• Minimal Nix store
• ~50MB download, ~100MB installed
• Isolated in ~/.nip/bootstrap/nix/
2. 📦 Use containerized environment
• Requires Podman/Docker
• Completely isolated builds
• ~200MB download
3. 🔧 Install full Nix manually
• Follow: https://nixos.org/download.html
4. 🔄 Try a different source
• nip install firefox --source=gentoo
Choose option (1-4) or 'q' to quit: 1
📦 Installing minimal Nix...
✅ Nix installed successfully
📦 Installing firefox from Nix...
✅ firefox installed to /Programs/Firefox/120.0/
```
## Installation Methods
### Method 1: Minimal Nix (Recommended)
**Best for:** Most Gentoo users
```bash
nip bootstrap install nix
```
**What you get:**
- Standalone `nix-build` binary
- Minimal Nix store
- Installed to `~/.nip/bootstrap/nix/`
- No system modifications
- ~100MB total
**Advantages:**
- ✅ Quick installation
- ✅ No conflicts with Portage
- ✅ Easy to remove
- ✅ Sufficient for most packages
### Method 2: Container-Based
**Best for:** Maximum isolation
```bash
# Install Podman
emerge --ask app-containers/podman
# Use container for Nix packages
nip install firefox --source=nix --container
```
**Advantages:**
- ✅ Complete isolation
- ✅ No Nix installation needed
- ✅ Rootless with Podman
- ✅ Clean host system
### Method 3: Full Nix Installation
**Best for:** Heavy Nix users
```bash
# Install Nix manually
curl -L https://nixos.org/nix/install | sh
# Use with NIP
nip install firefox --source=nix
```
**Advantages:**
- ✅ Full Nix functionality
- ✅ Access to all Nix features
- ✅ Can use nix-shell, nix-env, etc.
## Common Workflows
### Installing Binary Packages
```bash
# Install from Nix (binary, fast)
nip install firefox --source=nix
nip install vscode --source=nix
nip install chromium --source=nix
# List installed packages
nip list
```
### Building from Source
```bash
# Build from Gentoo (source, customizable)
nip build vim +python+ruby --source=gentoo
# Build from Nix (source, reproducible)
nip build vim --source=nix
```
### Mixing Sources
```bash
# System packages from Portage
emerge --ask dev-lang/python
# Development tools from Nix
nip install nodejs --source=nix
nip install rust --source=nix
# Custom builds from Gentoo
nip build ffmpeg +vaapi+lto --source=gentoo
```
### Testing Packages
```bash
# Try a package from Nix before creating an ebuild
nip install some-new-tool --source=nix
# If you like it, keep it or create an ebuild
# If not, easily remove it
nip remove some-new-tool
```
## Package Management
### Installing Packages
```bash
# Install from Nix
nip install <package> --source=nix
# Install specific version (if available)
nip install firefox@120.0 --source=nix
# Install multiple packages
nip install firefox chromium vscode --source=nix
```
### Listing Packages
```bash
# List all installed packages
nip list
# List only Nix packages
nip list --source=nix
# Show package details
nip info firefox
```
### Removing Packages
```bash
# Remove a package
sudo nip remove firefox
# Remove multiple packages
sudo nip remove firefox chromium vscode
```
### Updating Packages
```bash
# Update a package
nip update firefox --source=nix
# Update all packages
nip update --all
```
## Integration with Portage
### Coexistence
NIP and Portage work together seamlessly:
```bash
# Portage packages go to /usr
emerge --ask firefox
# NIP packages go to /Programs
nip install firefox --source=nix
# Both are accessible via PATH
which firefox # Shows /System/Links/Executables/firefox
```
### Priority
By default, NIP packages take priority in PATH:
```
PATH=/System/Links/Executables:/usr/bin:...
```
To prefer Portage packages, adjust your PATH in `~/.bashrc`:
```bash
export PATH=/usr/bin:/System/Links/Executables:$PATH
```
### Checking Sources
```bash
# See where a package comes from
nip info firefox
# List all sources
nip sources
```
## Directory Structure
```
/Programs/ # NIP packages
├── Firefox/120.0/ # From Nix
├── VSCode/1.85.0/ # From Nix
└── Vim/9.0/ # From Gentoo build
/System/Links/ # Unified symlinks
├── Executables/
│ ├── firefox -> /Programs/Firefox/120.0/bin/firefox
│ ├── code -> /Programs/VSCode/1.85.0/bin/code
│ └── vim -> /Programs/Vim/9.0/bin/vim
├── Libraries/
└── Headers/
~/.nip/bootstrap/nix/ # Minimal Nix installation
├── bin/nix-build
├── store/
└── config/
/var/nip/ # NIP data
├── cas/ # Content-addressable storage
├── cache/ # Download cache
└── db/packages.json # Package database
```
## Configuration
### User Configuration
Edit `~/.nip/config`:
```
# Prefer Nix for binary packages
default-source = "nix"
# Bootstrap preferences
bootstrap-auto-install = true
bootstrap-preferred-method = "recipe"
# Nix-specific settings
nix-binary-cache = true
nix-substituters = "https://cache.nixos.org"
```
### System Configuration
Edit `/etc/nip/nip.conf` (requires root):
```
# System-wide settings
programs-dir = "/Programs"
links-dir = "/System/Links"
# Source priorities (lower = tried first)
nix-priority = 10
gentoo-priority = 20
```
## Advanced Usage
### Using Nix Channels
```bash
# Update Nix channel
nix-channel --update
# List available packages
nix-env -qaP | grep firefox
# Install via nix-env (alternative to NIP)
nix-env -iA nixpkgs.firefox
```
### Nix Expressions
```bash
# Build from Nix expression
nip build --source=nix --expr '(import <nixpkgs> {}).firefox'
# Use custom Nix file
nip build --source=nix --file ./my-package.nix
```
### Binary Caching
```bash
# Enable binary cache
nip config set nix-binary-cache true
# Use custom cache
nip config set nix-substituters "https://cache.nixos.org https://my-cache.example.com"
```
## Troubleshooting
### Nix Not Found
```bash
# Check if Nix is installed
nip bootstrap list
# Install Nix
nip bootstrap install nix
# Verify installation
nip bootstrap info nix
```
### Package Not Found
```bash
# Update Nix channel
nix-channel --update
# Search for package
nix-env -qaP | grep <package>
# Try different package name
nip install <alternative-name> --source=nix
```
### Permission Issues
```bash
# Most operations need root
sudo nip install firefox --source=nix
# Check permissions
ls -la /Programs
ls -la /System/Links
```
### Conflicts with Portage
```bash
# Check which package is active
which firefox
nip info firefox
# Remove NIP version if needed
sudo nip remove firefox
# Or remove Portage version
sudo emerge --unmerge firefox
```
### Nix Store Issues
```bash
# Check Nix store
nix-store --verify --check-contents
# Repair Nix store
nix-store --repair-path /nix/store/...
# Clean up old packages
nix-collect-garbage
```
## Performance Tips
### Use Binary Packages
```bash
# Nix provides pre-built binaries
nip install firefox --source=nix # Fast, binary
nip build firefox --source=gentoo # Slow, source
```
### Enable Caching
```bash
# Enable NIP's binary cache
nip config set binary-cache true
# Enable Nix's binary cache
nip config set nix-binary-cache true
```
### Parallel Operations
```bash
# Install multiple packages in parallel
nip install firefox chromium vscode --source=nix --parallel
```
## Security Considerations
### Verification
```bash
# NIP verifies all downloads with Blake2b checksums
# Nix verifies packages with cryptographic signatures
# Check package integrity
nip verify firefox
```
### Isolation
```bash
# Minimal Nix installation is isolated
ls ~/.nip/bootstrap/nix/
# Container builds provide additional isolation
nip install firefox --source=nix --container
```
### Updates
```bash
# Keep Nix updated
nip bootstrap update nix
# Update packages
nip update --all --source=nix
```
## Comparison: Portage vs Nix
| Feature | Portage | Nix (via NIP) |
|---------|---------|---------------|
| Package Count | ~20,000 | ~80,000 |
| Installation | Source | Binary |
| Speed | Slow | Fast |
| Customization | High (USE flags) | Medium |
| Reproducibility | Medium | High |
| Rollback | Limited | Easy |
| Isolation | System-wide | Per-package |
| Disk Usage | Lower | Higher |
**Best Practice:** Use both!
- Portage for system packages and custom builds
- Nix for quick binary installations and testing
## Migration Guide
### From Pure Gentoo
```bash
# Keep using Portage for system packages
emerge --ask @world
# Add Nix for additional packages
nip install firefox vscode --source=nix
# Gradually migrate packages as needed
```
### From NixOS
```bash
# Install NIP on Gentoo
./build.sh && sudo ./install.sh
# Import your Nix packages
nip import-nix-profile
# Continue using familiar Nix commands
nix-env -iA nixpkgs.firefox
```
## Best Practices
### 1. Use Portage for System Packages
```bash
# System essentials via Portage
emerge --ask sys-kernel/gentoo-sources
emerge --ask sys-apps/systemd
```
### 2. Use Nix for User Applications
```bash
# User applications via Nix
nip install firefox chromium vscode --source=nix
```
### 3. Use Gentoo Builds for Optimization
```bash
# Performance-critical apps with custom flags
nip build ffmpeg +vaapi+lto+cpu-native --source=gentoo
```
### 4. Keep Both Updated
```bash
# Update Portage
emerge --sync
emerge --update --deep --newuse @world
# Update Nix
nip bootstrap update nix
nip update --all --source=nix
```
## Examples
### Development Environment
```bash
# System compiler from Portage
emerge --ask sys-devel/gcc
# Development tools from Nix
nip install nodejs rust python --source=nix
# IDE from Nix
nip install vscode --source=nix
```
### Media Workstation
```bash
# Optimized media tools from Gentoo
nip build ffmpeg +vaapi+lto --source=gentoo
nip build obs-studio +pipewire --source=gentoo
# Additional tools from Nix
nip install gimp inkscape --source=nix
```
### Server Setup
```bash
# Core services from Portage
emerge --ask nginx postgresql
# Additional services from Nix
nip install grafana prometheus --source=nix
```
## Getting Help
### Documentation
- [NIP Documentation](../README.md)
- [Bootstrap Guide](bootstrap-guide.md)
- [Nix Manual](https://nixos.org/manual/nix/stable/)
### Commands
```bash
# NIP help
nip --help
nip bootstrap --help
# Nix help
nix-env --help
nix-build --help
```
### Support
- Issues: https://git.maiwald.work/Nexus/NexusToolKit/issues
- Wiki: https://git.maiwald.work/Nexus/NexusToolKit/wiki
## Summary
Using Nix on Gentoo via NIP gives you:
**Best of both worlds** - Portage's customization + Nix's convenience
**80,000+ packages** - Access to Nixpkgs repository
**Fast installation** - Binary packages, no compilation
**Clean integration** - No conflicts with Portage
**Easy management** - Simple NIP commands
**Automatic setup** - NIP handles Nix installation
**Get started:**
```bash
nip install firefox --source=nix
```
That's it! NIP handles everything else automatically.