Informatyka · kopie zapasowe

Kopie zapasowe — lekcja planowania ochrony własnych plików

Reguła 3-2-1, kopia pełna i przyrostowa, sumy kontrolne SHA-256 i weryfikacja przywrócenia. Trzy zadania w Pythonie na plikach tymczasowych.

45 minutPoziom podstawowyPliki i rozwiązania

Materiał redakcyjny TablicaPro · liceum i technikum

def suma(sciezka):
    return hashlib.sha256(Path(sciezka).read_bytes()).hexdigest()
Kopia identyczna: True.
Sprawdzona sumami SHA-256.

Dysk ulega awarii, telefon wpada do wody, plik zostaje nadpisany albo zaszyfrowany przez złośliwe oprogramowanie — kopia zapasowa to jedyny sposób, by nie stracić pracy. Ale kopia, której nigdy nie sprawdzono, bywa tylko nadzieją. Na lekcji uczniowie planują ochronę własnych plików według reguły 3-2-1, a potem w Pythonie robią kopię, przywracają ją i sprawdzają sumami kontrolnymi, że jest identyczna z oryginałem.

Scenariusz jest przeznaczony na 45 minut dla klasy znającej pliki, słowniki i funkcje w Pythonie — na przykład po lekcji o plikach tekstowych — oraz podstawy archiwizacji z lekcji o tar. Program działa na plikach tymczasowych i niczego nie zmienia na dysku ucznia.

Przygotowanie stanowisk

Potrzebny jest Python 3 i edytor lub IDLE. Rozpakuj pakiet z sekcji materiałów do osobnego folderu i uruchamiaj skrypty z tego folderu. Program uruchomisz przez Run → Run Module albo poleceniem python start.py, python3 start.py lub py start.py.

Cele i plan lekcji

Po zajęciach uczeń potrafi:

  • zaplanować kopię według reguły 3-2-1 (trzy kopie, dwa nośniki, jedna poza domem);
  • odróżnić kopię pełną od przyrostowej i wskazać zalety i wady obu;
  • obliczyć sumę kontrolną SHA-256 pliku i użyć jej do porównania;
  • zweryfikować przywrócenie i wykryć pliki dodane, zmienione i usunięte od ostatniej kopii.
CzasPraca na lekcji
0–5 minProblem: co zostanie, gdy dysk przestanie działać?
5–15 minReguła 3-2-1, pełna i przyrostowa
15–22 minSumy kontrolne i weryfikacja
22–37 minTrzy zadania w Pythonie
37–42 minWłasny plan kopii — karta pracy
42–45 minPytania kontrolne

Plan kopii

Reguła 3-2-1: przechowuj co najmniej trzy kopie ważnych danych (oryginał i dwie kopie), na dwóch różnych nośnikach (np. dysk komputera i dysk zewnętrzny), z których jedna znajduje się w innym miejscu (inny dom, chmura). Do ustalenia: co kopiujemy, jak często, gdzie przechowujemy, kto jest odpowiedzialny i jak szybko potrzebujemy danych po awarii.

  • Kopia pełna — wszystkie wybrane pliki; najprostsza do przywrócenia, ale zajmuje najwięcej miejsca i czasu.
  • Kopia przyrostowa — tylko pliki zmienione lub dodane od poprzedniej kopii; oszczędza miejsce, ale przywracanie wymaga kopii pełnej i wszystkich przyrostów.

Sumy kontrolne

Funkcja skrótu SHA-256 zamienia zawartość pliku na ciąg 64 znaków szesnastkowych. Zmiana choćby jednego bajtu daje zupełnie inny skrót, a ta sama zawartość — zawsze ten sam. Dlatego porównanie skrótów pliku z oryginału i z kopii pozwala bez czytania ich oczami stwierdzić, czy kopia jest identyczna. Porównując spis (słownik ścieżka → skrót) sprzed i po zmianach, wykrywamy pliki dodane, zmienione i usunięte — to dokładnie to, czego potrzebuje kopia przyrostowa.

Najważniejsza zasada

Kopia, z której nie próbowano przywrócić danych, nie jest sprawdzoną kopią. Weryfikację (odczyt kopii i porównanie sum) wykonuje się regularnie, a nie dopiero w razie awarii. Kopię przechowywaną na stale podłączonym dysku może zaszyfrować ten sam wirus co oryginał — dlatego jedna kopia powinna być odłączona od komputera.

Zadania

Zadanie 1. Kopia pełna. Utwórz w katalogu tymczasowym trzy pliki (dwa tekstowe i jeden binarny). Napisz kopia_pelna(zrodlo, plik_zip), która pakuje je do archiwum ZIP i zwraca spis ścieżka → SHA-256. Wypisz liczbę plików i ich nazwy.

Zadanie 2. Przywracanie. Napisz przywroc(plik_zip, cel), rozpakuj kopię do nowego katalogu i sprawdź, czy spis przywróconych plików jest identyczny z oryginalnym.

Zadanie 3. Zmiany. Zmień jeden plik, dodaj nowy i usuń jeden. Napisz zmiany(stary_spis, nowy_spis) zwracającą listy dodanych, zmienionych i usuniętych plików i wypisz, ile plików obejmie kopia przyrostowa.

Dla chętnych: napisz własny plan kopii dla swojego komputera według reguły 3-2-1: co kopiujesz, gdzie, jak często i jak sprawdzisz przywrócenie.

Rozwiązanie i wyniki

import hashlib
import tempfile
import zipfile
from pathlib import Path


def suma(sciezka):
    return hashlib.sha256(Path(sciezka).read_bytes()).hexdigest()


def spis(katalog):
    katalog = Path(katalog)
    return {p.relative_to(katalog).as_posix(): suma(p) for p in sorted(katalog.rglob("*")) if p.is_file()}


def kopia_pelna(zrodlo, plik_zip):
    with zipfile.ZipFile(plik_zip, "w", zipfile.ZIP_DEFLATED) as z:
        for sciezka in spis(zrodlo):
            z.write(Path(zrodlo) / sciezka, sciezka)
    return spis(zrodlo)


def przywroc(plik_zip, cel):
    with zipfile.ZipFile(plik_zip) as z:
        z.extractall(cel)


def zmiany(stary_spis, nowy_spis):
    dodane = sorted(set(nowy_spis) - set(stary_spis))
    usuniete = sorted(set(stary_spis) - set(nowy_spis))
    zmienione = sorted(n for n in set(stary_spis) & set(nowy_spis) if stary_spis[n] != nowy_spis[n])
    return dodane, zmienione, usuniete


with tempfile.TemporaryDirectory() as tmp:
    tmp = Path(tmp)
    zrodlo = tmp / "dane"
    (zrodlo / "dokumenty").mkdir(parents=True)
    (zrodlo / "zdjecia").mkdir()
    (zrodlo / "dokumenty" / "plan.txt").write_text("Spotkanie w srode\n", encoding="utf-8")
    (zrodlo / "dokumenty" / "notatki.txt").write_text("notatki\n", encoding="utf-8")
    (zrodlo / "zdjecia" / "a.bin").write_bytes(bytes(range(256)))

    # Zadanie 1: kopia pelna i spis sum kontrolnych
    spis_1 = kopia_pelna(zrodlo, tmp / "kopia-2027-01-10.zip")
    print("Plikow w kopii:", len(spis_1))
    print(sorted(spis_1))

    # Zadanie 2: przywracanie i weryfikacja
    przywrocone = tmp / "przywrocone"
    przywroc(tmp / "kopia-2027-01-10.zip", przywrocone)
    print("Kopia identyczna z oryginalem:", spis(przywrocone) == spis_1)

    # Zadanie 3: zmiany od ostatniej kopii (kopia przyrostowa)
    (zrodlo / "dokumenty" / "plan.txt").write_text("Spotkanie w piatek\n", encoding="utf-8")
    (zrodlo / "dokumenty" / "nowy.txt").write_text("nowy plik\n", encoding="utf-8")
    (zrodlo / "dokumenty" / "notatki.txt").unlink()
    dodane, zmienione, usuniete = zmiany(spis_1, spis(zrodlo))
    print("dodane:", dodane)
    print("zmienione:", zmienione)
    print("usuniete:", usuniete)
    print("Kopia przyrostowa obejmie:", len(dodane) + len(zmienione), "pliki")

Program wypisze:

Plikow w kopii: 3
['dokumenty/notatki.txt', 'dokumenty/plan.txt', 'zdjecia/a.bin']
Kopia identyczna z oryginalem: True
dodane: ['dokumenty/nowy.txt']
zmienione: ['dokumenty/plan.txt']
usuniete: ['dokumenty/notatki.txt']
Kopia przyrostowa obejmie: 2 pliki

Kopia przyrostowa obejmuje dwa pliki: zmieniony plan.txt i dodany nowy.txt — usunięty notatki.txt trzeba tylko oznaczyć w spisie. Zadanie dla chętnych (rozszerzenie.py) pokazuje, że skrót zmienia się nawet przy zmianie jednej litery (False) i ma zawsze 64 znaki:

False 64

Typowe błędy

ObjawCo sprawdzić
Kopia „identyczna” mimo zmian plikuPorównano same nazwy lub rozmiary zamiast skrótów.
Brak plików w kopiiPominięto podkatalogi (rglob("*")) albo katalogi zamiast plików.
Różne sumy dla tego samego plikuPlik odczytano w trybie tekstowym i zmieniły się końce linii; sumę liczy się z bajtów (read_bytes).
Kopia zapisana obok oryginału na tym samym dyskuAwaria dysku zniszczy obie; kopia powinna być na osobnym nośniku.
Przywrócenie nigdy nie było testowaneDodaj do planu regularne sprawdzanie odtworzenia.
Hasło lub dane w kopii niezaszyfrowanej na zewnętrznym nośnikuKopię z danymi osobowymi należy zaszyfrować.

Pytania kontrolne i punktacja

  1. Co oznacza reguła 3-2-1?
  2. Czym różni się kopia przyrostowa od pełnej?
  3. Jak sprawdzić, że plik w kopii jest identyczny z oryginałem?

Odpowiedzi: Trzy kopie danych, na dwóch różnych nośnikach, z czego jedna poza domem. Przyrostowa obejmuje tylko pliki zmienione lub dodane od poprzedniej kopii, pełna — wszystkie. Porównać sumy kontrolne (np. SHA-256) obu plików.

Proponowana punktacja (razem 10 punktów): zadanie 1 — spis sum SHA-256 2 pkt, kopia ZIP z podkatalogami 1 pkt; zadanie 2 — przywracanie 1 pkt, weryfikacja spisem 2 pkt; zadanie 3 — funkcja zmiany 2 pkt, kopia przyrostowa i wniosek 1 pkt; plan 3-2-1 w pytaniach 1 pkt. Zadanie dla chętnych nie jest wymagane do pełnej oceny.

Materiały do pobrania

Rozpakuj ZIP przed otwarciem plików. Materiały są dostępne bez logowania; publiczne rozwiązanie służy nauce i samodzielnemu sprawdzeniu, a nie poufnemu sprawdzianowi.

Co dalej?

Następny krok to automatyczne kopie o stałych porach, szyfrowanie kopii i odtwarzanie systemu po awarii. Ten materiał rozwija dział o bezpieczeństwie danych w kursie Informatyka w TablicaPro, gdzie znajdziesz prezentacje, ćwiczenia i testy do prowadzenia lekcji.

Źródła techniczne: kopia zapasowa w Wikipedii oraz moduł hashlib w dokumentacji. Zobacz też lekcję o archiwizacji w Linuksie.

Poprowadź kolejne lekcje Informatyka

Pełny kurs: prezentacje, ćwiczenia i testy do pracy z klasą.

Kup dostęp do kursu Informatyka →

Zobacz program kursu