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.
| Czas | Praca na lekcji |
|---|---|
| 0–5 min | Problem: co zostanie, gdy dysk przestanie działać? |
| 5–15 min | Reguła 3-2-1, pełna i przyrostowa |
| 15–22 min | Sumy kontrolne i weryfikacja |
| 22–37 min | Trzy zadania w Pythonie |
| 37–42 min | Własny plan kopii — karta pracy |
| 42–45 min | Pytania 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
| Objaw | Co sprawdzić |
|---|---|
| Kopia „identyczna” mimo zmian pliku | Porównano same nazwy lub rozmiary zamiast skrótów. |
| Brak plików w kopii | Pominięto podkatalogi (rglob("*")) albo katalogi zamiast plików. |
| Różne sumy dla tego samego pliku | Plik 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 dysku | Awaria dysku zniszczy obie; kopia powinna być na osobnym nośniku. |
| Przywrócenie nigdy nie było testowane | Dodaj do planu regularne sprawdzanie odtworzenia. |
| Hasło lub dane w kopii niezaszyfrowanej na zewnętrznym nośniku | Kopię z danymi osobowymi należy zaszyfrować. |
Pytania kontrolne i punktacja
- Co oznacza reguła 3-2-1?
- Czym różni się kopia przyrostowa od pełnej?
- 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
- Pakiet Informatyka: materiały do lekcji, rozwiązanie i karta pracy
- Karta pracy ucznia — otwórz i wydrukuj
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 →