Wyszukiwanie w witrynie

Zautomatyzowałem kopie zapasowe Linuksa za pomocą prostego skryptu bash i cron (i jest to lepsze niż GUI)


Podsumowanie

  • Stwórz skrypt bash, który kontroluje co, gdzie i kiedy wykonywane są kopie zapasowe.
  • Zaplanować wykonywalny plik backup.sh za pomocą crona oraz przeglądać logi i miejsce docelowe po uruchomieniu.
  • Przetestuj skrypt, używaj absolutnych ścieżek, aby uniknąć błędów podczas cron i w czasie wykonywania, oraz używaj komentarzy do dokumentacji.

Narzędzie takie jak Déjà Dup to prosty i doskonały graficzny sposób na automatyzację tworzenia kopii zapasowych w systemie Linux. Jednak utworzenie własnego skryptu kopii zapasowej jest lepszym, samodzielnym sposobem na zautomatyzowanie tworzenia kopii zapasowych. Daje znacznie większą kontrolę nad tym, co jest kopiowane, gdzie dane są zapisywane i jak często wykonywane są zadania tworzenia kopii zapasowych. To także miłe wprowadzenie do podstaw pisania skryptów. Oto jak stworzyłem prosty skrypt do tworzenia kopii zapasowych i użyłem crona do automatyzacji zadań tworzenia kopii zapasowych.

Tworzenie prostego skryptu kopii zapasowej i jego automatyzacja

Tak długo, jak zmieniasz i aktualizujesz skrypt, używając pełnych ścieżek, miejsce tworzenia kopii zapasowej może być lokalnym folderem, nową partycją dysku lub dyskiem zewnętrznym.

Wybór miejsca docelowego kopii zapasowej

Plan był taki, aby stworzyć prosty skrypt do tworzenia kopii zapasowej, ale chciałem też mieć kopię najważniejszych katalogów Linuksa na wypadek, gdybym kiedykolwiek musiał odzyskać system. Moim miejscem docelowym do tworzenia kopii zapasowej w tym projekcie był pendrive USB o pojemności 128 GB.

Przygotowywanie lokalizacji kopii zapasowej

Niezależnie od tego, czy miejsce kopii zapasowej to pendrive, zewnętrzny dysk twardy, czy nowa partycja, zwróć uwagę na bezwzględne ścieżki katalogów i punkty montowania; będą ci potrzebne, gdy zaczniemy pisać skrypty.

Ten skrypt kopii zapasowej używa rsync, który zazwyczaj jest wstępnie zainstalowany w większości dystrybucji. Sprawdź swoją wersję rsync, a jeśli jej brakuje, użyj menedżera pakietów do zainstalowania go.

Rozpocząłem projekt od utworzenia nowego katalogu o nazwie „Backup” na zamontowanym pendrive'ie USB. Możesz utworzyć ten folder graficznie, nawigując do lokalizacji kopii zapasowej, a następnie używając skrótu Ctrl+SHIFT+N. Ja wybrałem terminal i użyłem poleceń lsblk, cd i mkdir.

lsblk
cd “/media/htg/DATA BACKUP”
mkdir backup
rsync --version
sudo apt update -y && sudo apt install rsync




Decydowanie, co należy wykonać kopię zapasową i tworzenie skryptu backup.sh

W celach odzyskiwania systemu zdecydowałem się wykonać kopię zapasową katalogu zawierającego skonsolidowane pliki osobiste oraz niezbędne katalogi systemu Linux, takie jak /home, etc, /var, /usr/local, /root i /opt. Większość edytorów tekstu w terminalu Linux obsługuje podstawowe skrypty. Użyłem nano, aby utworzyć i zapisać prosty skrypt backup.sh bin bash w katalogu domowym. Skopiuj i wklej poniższy skrypt do wybranego edytora tekstu w terminalu:

#!/bin/bash
# This bash script backs up Linux recovery directories and personal files
# Preserves ownership, permissions, timestamps, ACLs, and xattrs

set -euo pipefail

#------------This is the CONFIG script-----------

HOSTNAME="$(hostname)"
DATE="$(date +%F)"
BACKUP_ROOT="/media/htg/DATA BACKUP/Backup"
DEST_DIR="$BACKUP_ROOT/archives/${HOSTNAME}_${DATE}"
LOG_FILE="BACKUP_ROOT/logs/backup_${HOSTNAME}_${DATE}.log"
TMP_DIR="$BACKUP_ROOT/tmp"

#Don't forget to edit the BACKUP_ROOT, DEST_DIR, LOG_FILE and TMP_DIR paths

#Customize  SOURCES=( to include the files and directories you want to back up

SOURCES=(
  "/home"
  "/etc"
  "/var"
  "/root"
  "/opt"
  "/usr/local"
  "/home/htg/Backup"
)

EXCLUDES=(
  "--exclude=/var/cache/"
  "--exclude=/var/tmp/"
  "--exclude=/var/lib/apt/lists/"
  "--exclude=/home/*/.cache/"
  "--exclude=/home/*/Downloads/"
  "--exclude=/var/lib/docker/"
  "--exclude=/var/lib/containers/"
)

# Add these flags for backup summary and progress:
# --info=progress2: Total progress line
# --info=name0: Hide individual filenames
# --stats: Final summary block
# --no-inc-recursive: Better progress accuracy

RSYNC_FLAGS=(-aAXH --numeric-ids --delete  --human-readable --inplace --partial --info=progress2 --info=name0 --stats --no-inc-recursive)

# ---------- PREPARATION ----------
# Create destination folders on the flash drive
mkdir -p "$DEST_DIR" "$TMP_DIR" "$(dirname "$LOG_FILE")"
touch "$LOG_FILE"

# ---------- BACKUP ----------
echo "[$(date)] Starting backup to $DEST_DIR" | tee -a "$LOG_FILE"

for SRC in "${SOURCES[@]}"; do
  echo "[$(date)] Backing up $SRC ..." | tee -a "$LOG_FILE"
  
  # Run rsync and log output
  rsync "${RSYNC_FLAGS[@]}" "${EXCLUDES[@]}" "$SRC" "$DEST_DIR" >>"$LOG_FILE" 2>&1
done

echo "[$(date)] Backup completed" | tee -a "$LOG_FILE"

# ---------- VERIFY ----------
echo "[$(date)] Listing destination sizes:" | tee -a "$LOG_FILE"
du -sh "$DEST_DIR"/* 2>/dev/null | tee -a "$LOG_FILE"

exit 0

Edytuj skrypt, zamieniając BACKUP_ROOT, DEST_DIR, LOG_FILE i TMP_DIR na swoje pełne ścieżki, następnie zapisz i wyjdź; w nano użyj Ctrl+O+Enter i Ctrl+X. Kolejna część polega na użyciu polecenia chmod, aby uczynić skrypt wykonalnym, oraz polecenia ls, aby potwierdzić uprawnienia do wykonywania (szukaj -x).

nano ~/backup.sh
chmod +x ~/backup.sh
ls -l ~/backup.sh

Testowanie skryptu kopii zapasowej i automatyzowanie go za pomocą zadań cron

Chociaż wszystkie strategie tworzenia kopii zapasowych ostatecznie zawodzą, testowanie systemów i skryptów kopii zapasowych może zmniejszyć ryzyko katastrofalnej utraty danych. Umożliwia wykrycie błędów, które mogłyby spowodować awarię procesu, i jest prostym, ale kluczowym krokiem, który chroni integralność każdego procesu tworzenia kopii zapasowej. W niektórych systemach może być konieczne użycie polecenia sudo, aby przetestować działanie skryptu.

~/backup.sh
sudo ~/backup.sh

Skrypt nie uruchomi się pomyślnie, jeśli napotka błędy, ale system je wyświetli, i stamtąd możesz przystąpić do rozwiązywania problemów. Jeśli wszystko jest w porządku, zobaczysz komunikaty „Rozpoczynanie tworzenia kopii zapasowej” i „Tworzenie kopii zapasowej /home..”. Jeśli przejdziesz do miejsca docelowego kopii zapasowej, powinieneś zobaczyć niektóre katalogi, które zostały zbackupowane.




Jeśli wykonujesz kopię zapasową dużej ilości danych na zewnętrzny dysk, proces może potrwać trochę czasu. Dopóki nie pojawi się komunikat o błędzie, bądź cierpliwy, nawet jeśli wydaje się, że terminal się zawiesił.

Po przetestowaniu skryptu i potwierdzeniu, że działa, użyłem crona do zaplanowania jego uruchamiania o 20:00, polecenia ls do sprawdzenia zaplanowanego zadania kopii zapasowej oraz polecenia systemctl do sprawdzenia stanu usługi cron.

sudo crontab -e
0 20 * * * /usr/bin/bash /home/htg/backup.sh >> "/media/htg/DATA BACKUP/Backup/logs/cron_backup.log" 2>&1
sudo crontab -l
ls -l /home/htg/backup.sh
systemctl status cron




W tym momencie udało mi się pomyślnie stworzyć i przetestować mój skrypt kopii zapasowej oraz użyć cron do jego automatyzacji. Ostatnim krokiem było potwierdzenie procesu tworzenia kopii zapasowej i sprawdzenie logów po godzinie 20:00 następnego dnia.

3 lekcje, których nauczyłem się w trudny sposób

Tworzenie tego skryptu kopii zapasowej było zabawnym i edukacyjnym doświadczeniem. Projekt ten nauczył mnie trzech lekcji, które pozostały ze mną do dziś.

Zawsze testuj skrypty tworzące kopie zapasowe

Nie przetestowałem mojego pierwszego skryptu kopii zapasowej. Zgadniesz, co się stało? Dokładnie tak: kiedy uruchomiłem testową kopię zapasową, skrypt się nie powiódł. Trochę zajęło mi dojście do tego, że popsułem zmienną powłoki; wpisałem DATE+"$ (date +%F) ” zamiast DATE="$ (date +%F) ”, co spowodowało błąd ‘command not found’ w linii 10.




Testowanie skryptów kopii zapasowych pozwala wychwycić błędy składni i problemy z uprawnieniami, które mogą powodować błędy podczas wykonywania. To również dobra praktyka.

Używaj absolutnych ścieżek

Ponieważ cron jest rygorystyczny, a błędy mogą spowodować niepowodzenie zadania cron, wyrob sobie nawyk używania pełnych, absolutnych ścieżek katalogów i plików w swoim skrypcie. Minimalizuje to błędy, usprawnia tworzenie kopii zapasowych i może pomóc zmniejszyć liczbę błędów wykonania.

Skomentuj swój scenariusz

Komentowanie swojego skryptu jest jak zostawianie notatek dla przyszłego siebie (i innych osób), które wyjaśniają zamysł stojący za konkretną częścią lub sekcją skryptu. W skryptach bash symbolem powszechnie stosowanym do komentowania jest znak #. Mogłeś zauważyć kilka komentarzy w moim skrypcie bash.

Rozważ przykład, w którym musisz zmienić skrypt 6 miesięcy po jego utworzeniu. Bez komentarzy istnieje duże ryzyko, że błędnie edytujesz istotne części i zepsujesz swój skrypt, ponieważ nie masz już świeżych wspomnień o jego treści.


Tak właśnie zautomatyzowałem kopie zapasowe Linuksa za pomocą prostego skryptu bash i trzy lekcje, których nauczyłem się w trudny sposób. Chociaż tworzenie skryptów nie jest najłatwiejszym sposobem automatyzacji kopii zapasowych, jest to zabawne i pouczające, zwłaszcza jeśli chcesz nauczyć się podstaw skryptowania w bashu.

Powiązane artykuły