bootc-docs/upgrade/examples-and-troubleshooting.md
robojerk 526f1c1afd Initial commit: Comprehensive Debian bootc documentation
- Complete documentation for all bootc commands and subcommands
- Debian-specific adaptations and workarounds
- Manual installation methods to bypass bootc reliability issues
- Technical guides with Rust source code analysis
- Flowcharts and external command references
- Hidden command documentation (bootc internals, state, etc.)
- Composefs integration analysis
- Base image creation guides (with and without bootc binary)
- Management scripts and automation
- Comprehensive troubleshooting and examples
2025-09-15 14:02:28 -07:00

662 lines
11 KiB
Markdown

# bootc upgrade - Examples and Troubleshooting
## Practical Examples
### 1. Basic Update Operations
#### Check for Updates
```bash
# Check if updates are available
bootc upgrade --check
# Expected output:
# Update available for: quay.io/myorg/debian-bootc:latest
# Version: 1.2.3
# Digest: sha256:abc123...
```
#### Download Updates
```bash
# Download and stage updates
bootc upgrade
# Expected output:
# Update available for: quay.io/myorg/debian-bootc:latest
# Version: 1.2.3
# Digest: sha256:abc123...
# Staging update...
# Update staged successfully
```
#### Apply Updates
```bash
# Apply updates and reboot
bootc upgrade --apply
# Expected output:
# Update available for: quay.io/myorg/debian-bootc:latest
# Version: 1.2.3
# Digest: sha256:abc123...
# Staging update...
# Update staged successfully
# Rebooting system...
```
### 2. Automated Update Scripts
#### Simple Update Script
```bash
#!/bin/bash
# update-system.sh
set -e
echo "Checking for updates..."
if bootc upgrade --check; then
echo "Updates available, applying..."
bootc upgrade --apply --soft-reboot=auto
else
echo "System is up to date"
fi
```
#### Advanced Update Script
```bash
#!/bin/bash
# advanced-update.sh
set -e
# Configuration
IMAGE_SOURCE="quay.io/myorg/debian-bootc:latest"
LOG_FILE="/var/log/bootc-updates.log"
MAX_RETRIES=3
# Logging function
log() {
echo "$(date): $1" | tee -a "$LOG_FILE"
}
# Update function
update_system() {
local retry_count=0
while [ $retry_count -lt $MAX_RETRIES ]; do
log "Attempting update (attempt $((retry_count + 1)))"
if bootc upgrade --check; then
log "Updates available, applying..."
if bootc upgrade --apply --soft-reboot=auto; then
log "Update applied successfully"
return 0
else
log "Update failed, retrying..."
retry_count=$((retry_count + 1))
sleep 30
fi
else
log "No updates available"
return 0
fi
done
log "Update failed after $MAX_RETRIES attempts"
return 1
}
# Main execution
log "Starting update process"
update_system
log "Update process completed"
```
### 3. CI/CD Integration
#### GitHub Actions
```yaml
name: Update System
on:
schedule:
- cron: '0 2 * * *' # Daily at 2 AM
workflow_dispatch:
jobs:
update:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup SSH
uses: webfactory/ssh-agent@v0.7.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Update System
run: |
ssh -o StrictHostKeyChecking=no user@${{ secrets.HOST_IP }} '
bootc upgrade --check
if [ $? -eq 0 ]; then
bootc upgrade --apply --soft-reboot=auto
fi
'
```
#### GitLab CI
```yaml
stages:
- update
update_system:
stage: update
script:
- ssh user@$HOST_IP 'bootc upgrade --check'
- ssh user@$HOST_IP 'bootc upgrade --apply --soft-reboot=auto'
only:
- schedules
- web
```
#### Jenkins Pipeline
```groovy
pipeline {
agent any
stages {
stage('Update System') {
steps {
script {
sh '''
ssh user@${HOST_IP} 'bootc upgrade --check'
if [ $? -eq 0 ]; then
ssh user@${HOST_IP} 'bootc upgrade --apply --soft-reboot=auto'
fi
'''
}
}
}
}
triggers {
cron('0 2 * * *') // Daily at 2 AM
}
}
```
### 4. Monitoring and Alerting
#### Update Monitoring Script
```bash
#!/bin/bash
# monitor-updates.sh
# Configuration
WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
HOSTNAME=$(hostname)
# Check for updates
check_updates() {
if bootc upgrade --check > /dev/null 2>&1; then
return 0 # Updates available
else
return 1 # No updates
fi
}
# Send notification
send_notification() {
local message="$1"
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"$HOSTNAME: $message\"}" \
"$WEBHOOK_URL"
}
# Main monitoring loop
while true; do
if check_updates; then
send_notification "Updates available for $HOSTNAME"
# Wait longer after finding updates
sleep 3600 # 1 hour
else
# Check more frequently when no updates
sleep 300 # 5 minutes
fi
done
```
#### Prometheus Metrics
```bash
#!/bin/bash
# prometheus-metrics.sh
# Create metrics file
METRICS_FILE="/var/lib/prometheus/node-exporter/bootc-updates.prom"
# Check update status
if bootc upgrade --check > /dev/null 2>&1; then
UPDATES_AVAILABLE=1
else
UPDATES_AVAILABLE=0
fi
# Write metrics
cat > "$METRICS_FILE" << EOF
# HELP bootc_updates_available Whether updates are available
# TYPE bootc_updates_available gauge
bootc_updates_available $UPDATES_AVAILABLE
EOF
```
### 5. Systemd Integration
#### Update Service
```ini
# /etc/systemd/system/bootc-update.service
[Unit]
Description=Update bootc system
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/update-system.sh
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
```
#### Update Timer
```ini
# /etc/systemd/system/bootc-update.timer
[Unit]
Description=Update bootc system daily
Requires=bootc-update.service
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
```
#### Enable and Start
```bash
# Enable and start timer
sudo systemctl enable bootc-update.timer
sudo systemctl start bootc-update.timer
# Check status
sudo systemctl status bootc-update.timer
sudo systemctl list-timers bootc-update.timer
```
## Troubleshooting Guide
### 1. Common Issues
#### No Updates Available
**Problem**: `bootc upgrade --check` shows no updates
**Possible Causes**:
- System is already up to date
- Registry connectivity issues
- Image source not configured
- Authentication problems
**Solutions**:
```bash
# Check current status
bootc status
# Verify image source
bootc edit
# Test registry connectivity
podman pull quay.io/myorg/debian-bootc:latest
# Check authentication
podman login quay.io
```
#### Update Fails to Download
**Problem**: `bootc upgrade` fails during download
**Possible Causes**:
- Network connectivity issues
- Registry authentication problems
- Insufficient disk space
- Registry rate limiting
**Solutions**:
```bash
# Check network connectivity
ping quay.io
# Check disk space
df -h
# Check authentication
podman login quay.io
# Retry with verbose output
RUST_LOG=debug bootc upgrade
```
#### Update Fails to Apply
**Problem**: `bootc upgrade --apply` fails
**Possible Causes**:
- Staged update corrupted
- Insufficient disk space
- Bootloader configuration issues
- System compatibility problems
**Solutions**:
```bash
# Check staged status
bootc status
# Verify system compatibility
bootc upgrade --check
# Check system logs
journalctl -u bootc-fetch-apply-updates.service
# Try rollback
bootc rollback
```
#### Soft Reboot Fails
**Problem**: `--soft-reboot=required` fails
**Possible Causes**:
- Soft reboot not supported
- Insufficient memory
- Kernel compatibility issues
- Hardware limitations
**Solutions**:
```bash
# Check soft reboot support
bootc upgrade --apply --soft-reboot=required
# Use auto mode (fallback to regular reboot)
bootc upgrade --apply --soft-reboot=auto
# Use regular reboot
bootc upgrade --apply
```
### 2. Debug Commands
#### Enable Debug Logging
```bash
# Enable debug output
RUST_LOG=debug bootc upgrade --check
# Enable trace output
RUST_LOG=trace bootc upgrade --check
# Save debug output to file
RUST_LOG=debug bootc upgrade --check 2>&1 | tee debug.log
```
#### Check System Status
```bash
# Check current status
bootc status
# Check status in JSON format
bootc status --json
# Check system configuration
bootc edit
# Check system logs
journalctl -u bootc-fetch-apply-updates.service
```
#### Verify Image Integrity
```bash
# Check image source
bootc edit
# Verify image exists
podman pull quay.io/myorg/debian-bootc:latest
# Check image labels
podman inspect quay.io/myorg/debian-bootc:latest | jq '.[0].Config.Labels'
```
### 3. Recovery Procedures
#### Rollback from Failed Update
```bash
# Check current status
bootc status
# Rollback to previous version
bootc rollback
# Verify rollback
bootc status
# Check system logs
journalctl -u bootc-fetch-apply-updates.service
```
#### Reset System State
```bash
# Check for local modifications
bootc status
# Reset local modifications (if any)
rpm-ostree reset
# Check status again
bootc status
# Try update again
bootc upgrade --check
```
#### Manual Image Switch
```bash
# Switch to different image
bootc switch quay.io/myorg/debian-bootc:v1.0
# Check status
bootc status
# Apply update
bootc upgrade --apply
```
### 4. Performance Issues
#### Slow Update Downloads
**Problem**: Updates take too long to download
**Solutions**:
```bash
# Check network speed
speedtest-cli
# Use local registry mirror
bootc switch registry.local/myorg/debian-bootc:latest
# Check disk I/O
iostat -x 1
# Use quiet mode
bootc upgrade --quiet
```
#### High Memory Usage
**Problem**: Update process uses too much memory
**Solutions**:
```bash
# Check memory usage
free -h
# Check swap usage
swapon -s
# Monitor during update
htop
# Use check mode first
bootc upgrade --check
```
#### Disk Space Issues
**Problem**: Insufficient disk space for updates
**Solutions**:
```bash
# Check disk usage
df -h
# Clean up old deployments
ostree admin cleanup
# Check OSTree usage
ostree admin status
# Free up space
sudo apt autoremove
sudo apt autoclean
```
### 5. Network Issues
#### Registry Connectivity
**Problem**: Cannot connect to registry
**Solutions**:
```bash
# Test connectivity
ping quay.io
# Check DNS resolution
nslookup quay.io
# Test with curl
curl -I https://quay.io
# Check firewall
sudo ufw status
```
#### Authentication Issues
**Problem**: Registry authentication fails
**Solutions**:
```bash
# Login to registry
podman login quay.io
# Check credentials
cat ~/.docker/config.json
# Test authentication
podman pull quay.io/myorg/debian-bootc:latest
# Check token expiration
podman logout quay.io
podman login quay.io
```
#### Proxy Configuration
**Problem**: Updates fail behind proxy
**Solutions**:
```bash
# Configure proxy for podman
mkdir -p ~/.config/containers
cat > ~/.config/containers/containers.conf << EOF
[containers]
http_proxy = "http://proxy.example.com:8080"
https_proxy = "http://proxy.example.com:8080"
no_proxy = "localhost,127.0.0.1"
EOF
# Test proxy
podman pull quay.io/myorg/debian-bootc:latest
```
### 6. Advanced Troubleshooting
#### System Logs Analysis
```bash
# Check bootc logs
journalctl -u bootc-fetch-apply-updates.service -f
# Check system logs
journalctl -f
# Check kernel logs
dmesg | tail -50
# Check boot logs
journalctl -b
```
#### Network Diagnostics
```bash
# Check network interfaces
ip addr show
# Check routing table
ip route show
# Check DNS configuration
cat /etc/resolv.conf
# Test DNS resolution
dig quay.io
```
#### System Health Check
```bash
# Check system resources
htop
# Check disk health
sudo smartctl -a /dev/sda
# Check memory
free -h
# Check CPU
lscpu
```
This comprehensive examples and troubleshooting guide provides practical solutions for common bootc upgrade issues and integration patterns.