Istotnym etapem pracy z każdym systemem jest regularne wykonywanie kopii zapasowej (BackUp) danych/systemu – tak by w każdej chwili w przypadku awarii móc wrócić do jak najbardziej aktualnego stanu sprzed usterki.
Z racji tego, że komputer Raspberry Pi jest wręcz stworzony do różnych „eksperymentów” tym bardziej istotna wydaje się możliwość powrotu do wcześniejszego (np. jeszcze działającego) stanu. I pomoże nam w tym regularna kopia zapasowa…
Spis treści w artykule
Raspberry Pi: Kopia zapasowa systemu
Kopię zapasową (BackUp) w Raspberry Pi zasadniczo można podzielić na dwa rodzaje/typy:
- Kopia karty pamięci w zewnętrznym urządzeniu (np. czytnik)
- Kopia partycji/karty z poziomu Pi
Wersja z wykorzystaniem zewnętrznego urządzenia jest zazwyczaj szybsza, niż ta wykonywana bezpośrednio z Pi, ale wymaga wyłączenia na kilka(naście) minut systemu.
Pewnie w większości przypadków nie jest to problemem, to jednak ja preferuje rozwiązania automatyczne (np. za pomocą CRONa), dzięki temu mamy pewność, że kopia wykonywana jest regularnie.
Kopia karty pamięci w zewnętrznym urządzeniu (czytnik kart pamięci)
Jest to zdecydowanie szybszy sposób, choć w przeciwieństwie do drugiej z opisywanych metod (poniżej) wymaga wyłączenia na czas wykonywania kopii zapasowej Pi i wyjęcia karty pamięci.
Z racji tego, że na co dzień jako komputera głównego używam systemu Windows – opisane programy będą przeznaczone na ten system, choć korzystając z innych programów na innych systemach będzie się to odbywało analogicznie…
Win32 Disk Imager
Program ten był już opisywany przy okazji wgrywania systemu (obrazu systemu) na kartę pamięci, tylko tym razem należy odwrócić kolejność wykonywania czynności (najpierw kopia/BackUp, później przywracanie systemu):
Tworzymy kopię zapasową:
- Wkładamy kartę pamięci wyjętą z Raspberry Pi do czytnika
- Uruchamiamy program Win32 Disk Imager
- Wybieramy lokalizację do zapisania pliku z kopią karty
- Klikamy „Read”
Cała operacja trwa od kilku do kilkunastu minut, zależnie o szybkości i pojemności karty…
Przywracamy z kopii zapasowej
- Wkładamy kartę pamięci wyjętą z Raspberry Pi do czytnika
- Uruchamiamy program Win32 Disk Imager
- Wybieramy zapisany plik z kopią karty
- Klikamy „Write”
Cała operacja również w tym wypadku trwa od kilku do kilkunastu minut, zależnie o szybkości i pojemności karty…
HDD Raw Copy Tool
Tworzenie kopii zapasowej karty
Po uruchomieniu programu w którym mamy listę znalezionych w systemie dysków, oraz możliwość skorzystania z pliku (obrazu):
Z racji tego, że tworzymy kopię zapasową (BackUp) wybieramy właściwa kartę pamięci/czytnik i klikamy „Continue >>>”
W następnym oknie korzystamy z opcji:
- [FILE] Double-click to open file
i wybieramy lokalizację gdzie chcemy zapisać plik z kopią zapasową:
Tu też widać pewną zaletę tego programu nad opisanym wcześniej, tj. możliwość zapisania obrazu karty od razu w formie skompresowanej (*.imgc), co pozwala zaoszczędzić ok 5-6GB w przypadku karty o pojemności 16GB (choć wiele zależy od ilości danych na karcie pamięci).
W ostatnim oknie klikamy „Start” by rozpocząć tworzenie kopii zapasowej:
Również w tym przypadku cała operacja trwa od kilku do kilkunastu minut, zależnie od wielkości i szybkości karty pamięci…
Przywracanie z kopii zapasowej
Cała operacja wygląda prawie identycznie, z tym, że w pierwszy kroku wybieramy plik kopii zapasowej, a w drugim – kartę pamięci/czytnik kart pamięci…
Pamiętajcie, by przed wyjęciem karty prawidłowo wyłączyć system/Pi:
sudo shutdown -h now
Kopia partycji/karty z poziomu Pi
Możemy też wykonać kopię zapasową bezpośrednio z poziomu Raspberry Pi, korzystając np. z polecenia (programu) „dd”.
Tworzenie kopii zapasowej systemu
Kopię (obraz) systemu robimy za pomocą np. takiego polecenia:
sudo dd bs=2M if=/dev/mmcblk0 of=/mnt/dysk_docelowy/20121214.img
Możemy też zrobić kopię konkretnej partycji:
sudo dd bs=2M if=/dev/mmcblk0p1 of=/mnt/dysk_docelowy/20121214_p1.img
sudo dd bs=2M if=/dev/mmcblk0p2 of=/mnt/dysk_docelowy/20121214_p2.img
Gdzie:
- sudo – podniesienie uprawnień
- if – źródło kopii
- /dev/mmcblk0 – oznacza całą kartę pamięci, można też użyć:
- /dev/mmcblk0p1 – dla partycji „boot”
- /dev/mmcblk0p2 – dla partycji systemowej/głównej
- of=/mnt/dysk_docelowy/20121214.img – katalog docelowy kopii, plik obrazu kopii
Listę partycji/dysków możecie sprawdzić np. takimi poleceniami:
cat /etc/fstab
sudo fdisk -l
df -h
Katalogiem docelowym może być np. zasób sieciowy, lub dysk/PenDrive podłączony do Raspberry Pi po USB:
Jak widać – w tym wypadku katalogiem docelowym mógłby być podmontowany zasób (dysk) sieciowy znajdujący się na innym komputerze w sieci LAN.
Najpierw udostępniłem dla konkretnego użytkownika (w tym wypadku „patryk”) na komputerze (nie Pi) odpowiedni zasób, następnie już na Pi utworzyłem 2 katalogi:
sudo mkdir /mnt/pc01
sudo mkdir /mnt/pc01/patryk
- pc01 – komputer 01 (w celach porządkowych)
- pc01/patryk – katalog „patryk” który będzie odpowiadał zasobowi sieciowemu
Następnym krokiem jest zamontowanie udostępnionego zasobu lokalnie na Raspberry Pi „do utworzonego katalogi”:
sudo mount -t cifs -o username=patryk,password=test //IP_komputera/patryk /mnt/pc01/patryk
- Między „//IP_komputera/patryk” a „/mnt/pc01/patryk” znajduje się spacja
- Jeśli w nazwie zasobu występuje spacja, korzystamy z cudzysłowów, „//IP_komputera/patryk 2”
Polecenie wykonania kopii zapasowej całej karty będzie dla tego przykłady wyglądało tak:
sudo dd bs=2M if=/dev/mmcblk0 of=/mnt/pc01/patryk/nazwa_obrazu.img
Analogicznie będzie to wyglądało dla np. pamięci USB podłączonej do Pi, z tym że zmieni się katalog docelowy…
Na koniec można odmontować już „niepotrzebny” zasób:
sudo umount //IP_komputera/patryk
Przywracanie
Jak podpowiada logika wystarczy zamienić „źródło” z „katalogiem/plikiem docelowym”, czyli:
sudo dd bs=2M if=/mnt/pc01/patryk/nazwa_obrazu.img of=/dev/mmcblk0
To jednak nie do końca to może być takie proste… ;-)
Dlatego proponuje Wam do przywrócenia kopii zapasowej – zwłaszcza że wtedy Pi (system) może nie działać – skorzystanie z opisanych wyżej programów, które powinny bez problemu przenieść utworzony za pomocą „dd” plik obraz z powrotem na kartę pamięci.
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01
Dzięki za artykuł. Dobra robota!
Witam, dziękuję za instrukcję. Na jej podstawie przygotowałem sobie następującą komendę:
sudo dd bs=2M if=/dev/mmcblk0 of=/media/backup/Backup_Raspberry/BackupRaspberry_$(date +%F).img
Komenda wywołana ręcznie działa elegancko. Postanowiłem zautomatyzować proces i dodałem w „/etc/crontab/” następujący wpis:
05 4 * * 1 root dd bs=2M if=/dev/mmcblk0 of=/media/backup/Backup_Raspberry/BackupRaspberry_$(date +%F).img
Niestety backup się nie tworzy, sprawdzałem w „/var/log/cron.log” i jest następujący komunikat przy uruchamianiu procesu:
Apr 28 04:05:01 raspberrypi /USR/SBIN/CRON[18512]: (root) CMD (dd bs=2M if=/dev/mmcblk0 of=/media/backup/Backup_Raspberry/BackupRaspberry_$(date +)
Apr 28 04:05:01 raspberrypi /USR/SBIN/CRON[18511]: (CRON) info (No MTA installed, discarding output)
Co może być przyczyną, że to nie działa? Z góry dziękuję za pomoc.
Dziś jestem głównie „mobilnie” (telefon), ale spróbuję… Skoro komenda działa „z palca” to sugeruję – zwłaszcza że poza lepszą kontrolą uprości to samego CRON’a, i pozwoli uniknąć takich „niespodzianek” – stworzyć skrypt z tym poleceniem i dopiero wywołanie tego skryptu dodać do CRON’a.
Wygląda na to, że pomogło. Dziękuję bardzo!
To jeszcze małe wytłumaczenie dlaczego czasem tak się może zdarzyć:
Domyślnie skrypty CRON’a są wykonywane w powłoce „sh”, a do tworzenia komend czesto używamy „bash’a”, co daje większe możliwości (w uproszczeniu: bash wykona wszystko z sh, sh nie wykona wszystkiego z basha).
Teoretycznie nic nie stoi na przeszkodzie by zmienić w skryptach CRON powłokę, w tym celu zmieniamy:
na
Choć – choćby ze względów estetycznych – warto bardziej rozbudowane polecenia (właściwie to są to już skrypty) do oddzielnych plików i je wywoływać z CRON’a.
Witam.
Będę chciał zrobić backup kary w moim raspberry, ale dopiero po powrocie z wyjazdu i już teraz zapytam.
Moja karta jest podzielona na dwie partycje. Na jednej są systemy do zainstalowania, a na drugiej zainstalowany raspbian. Po podłączeniu jej do komputera przez czytnik widać tylko tą z systemami (nazwana jest revocery i ma system plików fat32, jest tam kilka katalogów z różnymi dystrybucjami linuxa). Jednak w zarządzaniu komputerem w menadżerze dysków widać dysk jako całość i wydzielone na nim partycje. Wiem, bo chciałem bezpośredni z karty skasować kilka plików i nie mogłem się do nich dostać, dlatego zapamiętałem to. Pytanie moje jest takie. Czy win32 disk imagerrobi obraz całej karty czy wybranej partycji i czy w ogóle będzie miał dostęp do partycji z systemem?
Witam
Zazwyczaj karta do Raspberry Pi ma 2 partycje – startową (bootowalną) FAT32, ok 64MB i systemową (partycja linuxowa). W pewnych przypadkach partycja startowa może być większa – na niej znajdują się dodatkowe pliki… Ale nie ma to znaczenia – Win32 Disk Imager, HDD Raw Copy Tool, czy choćby „goły” dd zrobią Ci kopię całej karty, nawet tych partycji które są standardowo nieczytelne z poziomu systemu Windows (bardziej precyzyjnie – partycje są widziane, ale system plików nie jest obsługiwany).
To przy okazji dodam, że jeśli chcesz dostać się do plików znajdujących się na partycji linuxowej z poziomu Windowsa – musisz posłużyć się dodatkowym oprogramowaniem, np. bezpłatnym DiskInternals Linux Reader, który obsługuje większość typów partycji na jakie możesz trafić: Ext2/3/4, ReiserFS, Reiser4, HFS, HFS+, FAT, exFAT, NTFS, ReFS, UFS2…
Ok, to już wiem. Kolejne pytanie. Na malinie mam sambę i kilka plików wideo i zdjęć. Czy przed zrobieniem backupa wywalić je? Czy obraz karty będzie przez to mniejszy?
Gdy będziesz robił obraz programem Win32 Disk Imager nie ma znaczenia ile danych będzie na karcie – plik obrazu (ISO) będzie zajmował tyle miejsca, co pojemność karty. Ma to znaczenie jeśli taki obraz później będziesz chciał skompresować, lub będziesz go robił np. za pomocą programu HDD Raw Copy Tool z opcją kompresji – wolna przestrzeń na karcie lepiej się kompresuje…
W przypadku dużych kart (np. 16GB i więcej) można zmniejszyć rozmiar obrazu a tym samym i czas wykonywania kopii zapasowej przez zmniejszenie partycji systemowej (zazwyczaj starczy 4-8GB) i kopiowanie tylko określonej ilości sektorów… Ale to może kiedyś opiszę… :-)
Czekamy! :) To wg mnie będzie ciekawy artykuł.
U mnie jest odwrotnie, po włożeniu karty Windows wykrywa partycję boot a Win32 Disk Imager lub HDD Raw Copy Tool robi backup tylko tej widocznej partycji
To, że Windows widzi Ci tylko partycję „boot” jest jak najbardziej prawidłowe (przynajmniej bez dodatkowego oprogramowania do obsługi partycji linuksowych). Stąd też kopia zapasowa z Raspberry Pi (Raspbian) karty pod Windowsem to obraz całej karty, a nie tylko widocznej partycji startowej.
Z tego, co mi wiadomo, do dziś nie ma dobrego programu do robienie kopii typu Bare Metall działającego systemu linux. Mondo czasami dobrze sobie radzi z systemami x86, ale na arm nie ma paczek.
Powód jest bardzo prosty: dane mogą się zmienić w trakcie backupu oraz cześć może być przechowywana w pamięci.
Najlepszym, najbardziej pewnym i wartościowym sposobem jest dd ale ale „offline”, czyli karty zamontowanej w innym systemie.
Masz rację, że – nie tylko w przypadku Raspberry Pi – kopie zapasowe najlepiej (byłoby) robić podpinając nośnik do innego systemu. Niestety nie jest to wygodne rozwiązanie, a do tego ciężko je zautomatyzować. Jeśli chodzi już o Raspberry Pi, to czasem robię kopię „offline” karty SD, ale zazwyczaj korzystam z dd na działającym systemie. Mam świadomość, że w pewnym okolicznościach, być może, potencjalnie… ale na razie zawsze było OK.
Klonowanie zamontowanej partycji z użyciem dd to bardzo zły pomysł.
Ryzykujemy uszkodzeniem systemu plików w backupie, Jeśli w trakcie procesu jakiś plik lub katalog zostanie zapisany lub zmodyfikowany.
Taki backup magazynu danych czy zewnętrznego dysku można zaryzykować. Ale partycji root? Nie polecam. Wystarczy, że w trakcie procesu system będzie zapisywał logi (a tak się dzieje przecież praktycznie cały czas w trakcie działania systemu).
No popatrz… to ja z kolegami od kilku już lat – od czasu Pi pierwszej generacji, jak tylko dało się kupić, jeszcze „na zapisy” – tak robimy i działa (nie, nie tylko robienie, ale i przywracanie ;-)). Jak to ponoć mawiał Albert Einstein:
Ale tak na poważnie, to masz rację – zresztą chyba o tym też wspomniałem w artykule – jeśli mamy taką możliwość, to oczywiście lepiej wykonać obraz karty offline. Ale słowem kluczem jest tutaj – jeśli… ;-)
Witam,
Potrzebuje przenieść system raspberry z rty 64 Gb na np. 16GB. Robiąc to przez ww. wymienione programy kopiują mi całą kartę 64, a chciałbym tylko pliki które są używane przez system aby zmieściły mi się na 16GN. Jakiś pomysł?
Jeśli danych jest mniej niż 16GB możesz zmniejszyć rozmiar głównej partycji, i wtedy zrobić backup „do określonego momentu”, lub skorzystać z Linuxa na komputerze (może być np. Debian w wersji Live CD) i polecenia rsync (dane z głównej partycji na karcie SD 64GB na wcześniej przygotowaną kartę 16GB).
Mam w swoich notatkach materiały do poradnika na temat przenoszenia w Raspberry Pi systemy na mniejszą kartę pamięci (sam kiedyś potrzebowałem wykonać taką operację). Ale jak tak patrzę na już opublikowane artykuły, to właściwie wszystko już jest:
Mam udostępniony folder do backupa na dysku D np. D:/Dokumenty/Backup i jak to wpisać tutaj aby zamontowało? sudo mount -t cifs -o username=tomos,password=haslo //192.168.100.2/tomos /mnt/pc01/tomos
Zachęcam do zapoznania się z artykułem „dyski USB i zasoby sieciowe (LAN) w systemie Linux (Debian/Ubuntu) na przykładzie Raspberry Pi”, gdzie całościowo został omówiony ten temat :-)
Kopia się tworzy ale trwa to strasznie długo. Z tego co widzę to skopiowało się już więcej danych z karty niż jest używane na RsPi
Robisz obraz za pomocą dd? Jeśli tak, to obraz będzie wielkością odpowiadał używanej karcie. Możesz ew wskazać ile ma kopiować (ostrożnie z tym) lub zrzucać wybrane partycje.
Tak za pomocą dd. Jeśli ma wszystko działać to wole nie rozdzielać tego na partycje.
Tak (bez rozdzielania) jest najbezpieczniej, do tego taki obraz zazwyczaj świetnie się kompresuje. Raz na jakiś czas – na wszelki wypadek – warto zrobić też kopię offline, czyli karta do zewnętrznego czytnika.
Mam zrobioną kopie na dysku ale czy to normalne że przy próbie otwarcia obrazu na Windowsie pojawia się komunikat „Plik obrazu dysku jest uszkodzony”? Jakaś inna struktura, która jest nieobsługiwana przez Windows?
O ile partycja boot to zwykłe FAT16, to już reszta to Linux (EXT3/4) lub nawet RAW, stąd problem. Zerknij na programy OSFMount, DiskInternals Linux Reader, powinny pomóc.
Chciałbym jeszcze wiedzieć czy zrobiłem poprawnie skrypt uruchamiający backu w cronie
#!/bin/bash
#Kopia zapasowa systemu
sudo dd bs=2M if=/dev/mmcblk0 of=/mnt/pc01/tomos/raspberrypi_backup.img
W cronie ustawione:
5 4 * * 1 /home/pi/backup.sh
Zasadniczo jest OK, ale… za każdym razem jest używana taka sama nazwa pliku, co jest ryzykowne (chyba trzeba go skasować przed tworzeniem nowego, a zarazem jak coś pójdzie nie tak, to tracisz wcześniejsze wersje). Dlatego może lepiej dać jakąś zmienną do nazwy pliku (np. data i godzina), lub używać naprzemiennie 2-3 nazw. Ja korzystam z czegoś w stylu (uprościłem na potrzeby tego komentarza):
Tak będzie poprawnie jeśli ma zapisywać mi do udostępnionego folderu na PC?
[code]#!/bin/sh
sudo sync; sync;
sudo sh -c „echo 3 > /proc/sys/vm/drop_caches”
data=”$(date +”%Y%m%d”)”
godzina=”$(date +”%H%M%S”)”
plik=”/192.168.100.2/tomos/rpi_backup_mmcblk0_”$data”-„$godzina”.img”
sudo dd bs=2M if=/dev/mmcblk0 of=$plik[/code]
Jeśli ma to być zasób sieciowy to raczej na początki „//” a nie „/”, choć najbezpieczniej/najpewniej byłoby pewnie go zamontować lokalnie przed wykonaniem kopii, i odmonotwać na koniec…
To utworzę skrypt, który montuje lokalizacje sieciową przed kopią (w cronie – kilka minut przed kopią) i to samo z odmontowaniem.
A nie lepiej montowanie/odmontowanie dodać bezpośrednio do skryptu kopii zapasowej? Ew. jeśli koniecznie dodatkowy skrypt (bp np. chcesz by z niego korzystały również inne skrypty) to wywoływany bezpośrednio ze skryptu, z parametrem ON/OFF…
Mógłbyś pokazać to na przykładzie tego skryptu?
#!/bin/sh
sudo sync; sync;
sudo sh -c „echo 3 > /proc/sys/vm/drop_caches”
data=”$(date +”%Y%m%d”)”
godzina=”$(date +”%H%M%S”)”
plik=”//192.168.100.2/tomos/rpi_backup_mmcblk0_”$data”-„$godzina”.img”
sudo dd bs=2M if=/dev/mmcblk0 of=$plik
Na przykład przed przedostatnią linijkę dodajesz „sudo mount…”, a na sam koniec „sudo unmount…” (te same polecenia, co byś dawał w skrypcie do montowania/demontowania zasobu).
Już wszystko rozumiem. Dziękuje za pomoc :)
Jeszcze jedno pytanie. Mam podłączony dysk zewnętrzny Seagate GoFlex do maliny. Czy wszystko robie w ten sam sposób tylko zmieniam lokalizacje kopii? Jak ma się sprawa z montowaniem i odmontowaniem jeśli dysk będzie podpięty 24/7? Moge pominąć te linijki w skrypcie?
Jeśli dysk będzie podpięty na stałe, to raczej też będzie cały czas zamontowany. W takim przypadku nie montujesz go dodatkowo w skrypcie, tylko korzystasz ze ścieżki lokalnej do niego.
Pojawił się problem. Przy próbie uruchomienia skryptu mam taki komunikat „dd: nie udało się otworzyć '/media/pi/tomos/rspi3-backup20181017-110751.img’: System plików wyłącznie do odczytu”. Mam na tym dysku też kopie zdjęć/filmów itp. Jak teraz bezpiecznie zmienic uprawnienia do zapisu i odczytu?
Ponownie odsyłam do artykułu „dyski USB i zasoby sieciowe (LAN) w systemie Linux (Debian/Ubuntu) na przykładzie Raspberry Pi”, gdzie całościowo został omówiony temat montowana dysków/zasobów w systemie Linux :-)
Mam jeszcze pytanie odnośnie SSH. Jak zmienić kodowanie w konsoli aby na ekranie przed logowaniem (issue.net) pojawiała się polska czcionka? W PuTTY mam ustawione UTF-8 i wszędzie na serwerze mam zdefiniowany polski język a mimo to w tym jednym miejscu mi to nie działa. Chodzi o banner który wyświetla się po wpisaniu nazwy użytkownika w konsoli przed logowaniem.
Nigdy aż tak mocno się w to nie zagłębiałem, więc raczej nie bardzo tutaj pomogę. Zwłaszcza, że rzadko kiedy używam systemu na VPSie po polsku.
Prośba od początkującego – czy mógłby Pan zrobić poradnik jak wykonać backup (obraz dysku) systemu zainstalowanego na dysku SSD. Mam Raspberry Pi 3B+ i system na dysku SSD 120 Giga, nie mam wcale karty SD – jak zrobić backup tego systemu – mam robić obraz 120 Giga? Cały system zajmuje może 8 Giga. Nigdzie nie znalazłem takiego poradnika.
Nie wiem z jakich powodów system jest na SSD. Jeśli dlatego, że tak się złożyło, ale miejsca jest sporo wolnego, to można rozważyć zmniejszenie partycji systemowej. Wtedy można klonować za pomocą dd partycję systemową, lub robić kopię plików na drugą partycję, utworzoną na wolnej przestrzeni, np. za pomocą programu Rsync. Albo kopiujemy cały dysk, albo pliki. Obraz jest wygodniej w razie odtwarzania, ale wymaga to więcej miejsca. Nawet jeśli użyć kompresji.
Jeśli natomiast dysk SSD jest dlatego, że tam są jeszcze jakieś dodatkowe pliki (np. filmy czy muzyka), to tym bardziej Rsync z wykluczeniami.
Przywracałem dzisiaj kopie z karty 16GB na nową kartę 32GB a system i tak wykrywa 16GB. Czy tak ma być? Wszystko działa ale pamięci tyle samo co było.
Tak, jest to normalne, bo robiąc kopię, zrobiłeś obraz partycji, a one miały tyle ile miały. Najprościej będzie, jak uruchomisz raspi-config i tam jest opcja w stylu „Expand root partition to fill SD Card”, która rozszerzy automatycznie rozmiar partycji na pełną pojemność karty.
Dziękuje za szybką odpowiedź :) Pozdrawiam
Byłaby jeszcze szybsza, ale chciałem Ci dać czas na potwierdzenie subskrypcji komentarzy ;-) Również pozdrawiam.