Raspberry Pi: Fuld Automatisk Cloud Backup til Google Drive
Af: Kasper Gyldenlev Damholdt | Struer
Løsningen opretter et komplet, levende OS-image (`.img`) af Raspberry Pi'en på et ext4-formateret eksternt USB-mellemlager og uploader det hver nat til Google Drive via **Rclone**. Scriptet roterer filerne automatisk, så der altid bevares præcis **3 friske backups** i skyen uden at fylde drevet op.
Projektoverblik & Arkitektur
Når man kører kritiske tjenester som Docker, Nginx eller Home Assistant på en Raspberry Pi, er det afgørende med en komplet katastrofe-gendannelsesplan (Disaster Recovery)[cite: 1, 6].
Ved hjælp af værktøjet image-backup skabes en komprimeret kopi af hele systemets partitionstabel og filsystem, mens Pi'en er i drift. Derefter synkroniserer rclone filen direkte op i Google Drive.
Hardware & Software Krav
- Eksternt mellemlager: USB-stik eller ekstern SSD (min. 32-120 GB) formateret med
ext4. - Google Konto: Gratis eller betalt Google Drive med min. 30-45 GB ledig plads.
- Værktøjer:
image-backup,rclone,cron.
Trin-for-Trin Opsætningsguide
Trin 1: Klargør USB-drev & Mount i `/etc/fstab`
Find USB-drevet med lsblk og formater det til ext4 for at undgå filstørrelsesgrænser:
# Formater USB-partitionen (ERSTAT sdb1 MED DIT DREV)
sudo mkfs.ext4 -F /dev/sdb1
# Opret mount-punkt og monter
sudo mkdir -p /mnt/backup
sudo mount /dev/sdb1 /mnt/backup
# Find PARTUUID for automatisk mount ved genstart
sudo blkid /dev/sdb1
Tilføj derefter drevet til `/etc/fstab`:
# Åbn fstab
sudo nano /etc/fstab
# Indsæt følgende linje i bunden (erstat med dit PARTUUID):
PARTUUID=DIT-PARTUUID-HER /mnt/backup ext4 defaults,noatime 0 2
Trin 2: Installer image-backup scriptet
cd ~
wget https://raw.githubusercontent.com/seamusdemora/RonR-RPi-image-utils/master/image-backup
chmod +x image-backup
sudo mv image-backup /usr/local/bin/
Trin 3: Installer og konfigurer Rclone mod Google Drive
# 1. Installer Rclone
sudo apt update && sudo apt install rclone -y
# 2. Start konfiguration
rclone config
*I guiden vælges `n` (New remote), navn: `googledrive`, vælg Google Drive i listen, og vælg Full Access (`1`). Ved headless SSH godkendelse køres `.\rclone authorize "drive"` på en Windows PC for at få et token.*
Trin 4: Opret den første baseline `.img`-fil (Vigtigt!)
For at initialisere filen skal image-backup køres interaktivt uden sti-argumenter første gang:
sudo image-backup
# Besvar promptne i terminalen:
# 1. Image file to create? -> /mnt/backup/pi_backup.img
# 2. Initial image file ROOT filesystem size (MB)? -> Tryk Enter (Standard)
# 3. Added space for incremental updates (MB)? -> 1000
# 4. Create /mnt/backup/pi_backup.img (y/n)? -> y
Trin 5: Kopier Rclone konfiguration til Root
Da automatisk backup kører under root via cron, skal konfigurationsfilen kopieres:
sudo mkdir -p /root/.config/rclone
sudo cp /home/xdia/.config/rclone/rclone.conf /root/.config/rclone/
sudo chmod 600 /root/.config/rclone/rclone.conf
Trin 6: Opret det samlede Backup & Retention Script
Opret scriptet /usr/local/bin/nightly_drive_backup.sh:
sudo nano /usr/local/bin/nightly_drive_backup.sh
Indsæt koden:
#!/bin/bash
# Variable
LOCAL_DIR="/mnt/backup"
LOCAL_FILE="pi_backup.img"
REMOTE_DIR="googledrive:RaspberryPi_Backups"
DATE=$(date +%Y-%m-%d)
DEST_FILE="pi_backup_${DATE}.img"
# 1. Opdater det lokale image inkrementelt via image-backup
/usr/local/bin/image-backup "${LOCAL_DIR}/${LOCAL_FILE}" >/dev/null 2>&1
# 2. Upload og omdøb filen til Google Drive
/usr/bin/rclone copy "${LOCAL_DIR}/${LOCAL_FILE}" "${REMOTE_DIR}" --no-traverse
# 3. Giv filen dags dato i navnet på Google Drive
/usr/bin/rclone moveto "${REMOTE_DIR}/${LOCAL_FILE}" "${REMOTE_DIR}/${DEST_FILE}" >/dev/null 2>&1
# 4. Retention Policy: Slet backups på Google Drive der er ældre end 3 døgn
/usr/bin/rclone delete "${REMOTE_DIR}" --min-age 3d --include "pi_backup_*.img"
Gør scriptet eksekverbart:
sudo chmod +x /usr/local/bin/nightly_drive_backup.sh
Trin 7: Automatisering via Cron (Kl. 03:00)
sudo crontab -e
# Tilføj følgende linje i bunden:
0 3 * * * /usr/local/bin/nightly_drive_backup.sh >/dev/null 2>&1
Kritiske Faldgruber & Fejlhandling
⚠️ FAT32 Filstørrelsesgrænse
Hvis USB-stikket er formateret som FAT32, vil oprettelsen fejle med File too large når imaget krydser 4 GB. **Løsning:** Formater altid mellemlageret med ext4.
⚠️ Manglende rclone.conf hos Root
Når scriptet kører fra cron som root, fejler Rclone med didn't find section in config file. **Løsning:** Kopier altid rclone.conf til /root/.config/rclone/.
⚠️ Direkte Kørsel uden Baseline
At kalde image-backup /mnt/backup/pi_backup.img direkte før filen findes, resulterer i directory not found. **Løsning:** Kør ren sudo image-backup første gang.
Ofte Stillede Spørgsmål (FAQ)
Hvordan gendannes en backup ved SD-kort eller diskfejl?
Hent `.img`-filen ned fra Google Drive til din PC. Åbn **Raspberry Pi Imager** eller **BalenaEtcher**, vælg 'Use Custom Image', vælg `.img`-filen og flash direkte til et nyt SD-kort eller en ny SSD.
Hvorfor tager det lokale image kun få minutter at opdatere hver nat?
Når baseline-imaget først er oprettet, kører `image-backup` inkrementelt. Den opdaterer kun de ændrede blocks inde i `.img`-filen, hvilket sparer unødig slid på drevet.