rsyncPolecenie: rsync -aE --delete ~/Documents/ /Volumes/Backup/Documents/
-E to część specyficzna dla macOS, a jej pominięcie po cichu gubi rozszerzone atrybuty i rozwidlenia zasobów.
-a to tryb archiwum: rekurencja i zachowanie uprawnień, właściciela, znaczników czasu i dowiązań symbolicznych. Tę flagę zna każdy.-E zachowuje rozszerzone atrybuty i rozwidlenia zasobów macOS. Są tam tagi Findera, flagi kwarantanny, własne ikony i sporo metadanych aplikacji. Bez tej flagi znikają, a nic Ci o tym nie mówi.--delete usuwa pliki z miejsca docelowego, gdy znikną ze źródła. To robi z kopii lustro i nad tą flagą warto się najbardziej zastanowić.-v pokazuje wynik, -n robi próbę na sucho. Polecenie z --delete za pierwszym razem zawsze uruchamiaj na próbę.~/Documents kopiuje folder do miejsca docelowego, co daje /Volumes/Backup/Documents/Documents. ~/Documents/ kopiuje jego zawartość, a o to prawie zawsze chodzi. W poleceniu, które zawiera też --delete, pomyłka usuwa wszystko inne, co było w miejscu docelowym.--exclude dla rzeczy, których nie warto kopiować: --exclude '.DS_Store', --exclude 'node_modules', --exclude 'Library/Caches'.macOS ma wersję rsync, która do tego wystarcza. Jeśli chcesz nowszej, prosto od twórców, ma ją Homebrew, a jej obsługa ACL na macOS jest lepsza.
rsync sprawia, że miejsce docelowe wygląda jak źródło. To kopia, a kopia to nie historia. Dokument usunięty w zeszły wtorek zniknie z kopii przy następnym uruchomieniu. Tak samo dobra wersja pliku, który potem nadpisałeś, i wszystko, do czego ransomware dotarł przed uruchomieniem zadania.
Pominięcie --delete tego nie naprawia. Dostajesz miejsce docelowe, które gromadzi każdy plik, jaki kiedykolwiek miałeś, nadal z dokładnie jedną wersją każdego, i bez sposobu, by stwierdzić, co jest aktualne.
--link-destStandardowa sztuczka to tworzenie przy każdym uruchomieniu nowego katalogu z datą i tworzenie twardych dowiązań niezmienionych plików do poprzedniego, więc identyczne pliki nic nie kosztują:
DEST=/Volumes/Backup
TODAY=$(date +%F)
rsync -aE --delete \
--link-dest="$DEST/latest" \
~/Documents "$DEST/$TODAY"
ln -snf "$DEST/$TODAY" "$DEST/latest"
Teraz każdy folder z datą wygląda jak pełna kopia, a miejsce zajmują tylko zmienione pliki. Mniej więcej na tym pomyśle zbudowany jest Time Machine.
Dwa zastrzeżenia. Twarde dowiązania oznaczają, że kopie nie są niezależne: uszkodzenie bloku pod spodem dotyka każdej migawki, która go współdzieli. I potrzebny jest system plików z obsługą twardych dowiązań, więc działa to na dysku zewnętrznym, a w większości folderów w chmurze nie.
rsync niczego nie szyfruje w spoczynku. Jeśli miejscem docelowym jest folder w chmurze lub dysk, który opuszcza budynek, szyfruj przed zapisem:
tar -cJf - ~/Documents | openssl enc -aes-256-cbc -pbkdf2 -out /Volumes/Backup/documents.tar.xz.enc
To jedno nieprzejrzyste archiwum: bez kopiowania przyrostowego, bez przywracania jednego pliku bez rozpakowania całości i z jednym hasłem między Tobą a wszystkim. Ten kompromis ma znaczenie i to w tym miejscu większość osób przestaje składać rozwiązanie samodzielnie.
cron wciąż istnieje na macOS, ale wspierana droga to launchd. Plik plist w ~/Library/LaunchAgents/ z StartCalendarInterval uruchamia Twój skrypt codziennie. macOS poprosi o Pełny dostęp do dysku dla tego, co go uruchamia, bo czytanie Dokumentów i Biurka jest chronione.
Cokolwiek zaplanujesz, niech zapisuje wynik tam, gdzie go naprawdę zobaczysz, i sprawdzaj, czy kopia jest świeża:
find /Volumes/Backup -type f -newermt '-7 days' | head
Ciche zadanie to właśnie sposób, w jaki to zawodzi. Nie zatrzymuje się z błędem na ekranie, tylko w nocy cztery miesiące temu.
Polecenia powyżej obsługują kopiowanie. Nie obsługują tego, czego naprawdę chcesz w dniu, gdy coś pójdzie źle: wersji, które przetrwają uruchomienie lustra, szyfrowania, które wciąż pozwala przywrócić jeden plik, odczytu, który sprawdza każdy fragment z jego hashem, i czegoś, co powie Ci, że dysku nie widziano od tygodnia.
Każda z tych rzeczy to weekend pisania skryptów, a potem musisz je utrzymywać. Copy Shelter to ten sam pomysł z tymi częściami wbudowanymi i jest darmowy dla jednego miejsca.
rsync gubi tagi Findera?Bo samo -a nie przenosi rozszerzonych atrybutów na macOS. Dodaj -E. Jeśli potrzebujesz też ACL, użyj -A i rozważ wersję z Homebrew, która obsługuje je pewniej niż systemowa.
Tak, albo do zamontowanego udziału w /Volumes, albo przez SSH bezpośrednio do NAS. Przez SSH jest szybciej i nie zależy od tego, czy udział jest zamontowany, a wiele NAS-ów ma wbudowany rsync.
sudo?Nie dla własnego folderu domowego. Musisz jednak dać Pełny dostęp do dysku Terminalowi lub temu, co uruchamia launchd, zanim macOS pozwoli mu czytać Dokumenty, Biurko i Pobrane rzeczy.
--delete jest niebezpieczne?Robi dokładnie to, o co prosisz, i to jest niebezpieczne. Za pierwszym razem zrób próbę z -n i upewnij się, że ścieżka docelowa jest dobra: literówka z --delete wskazującym zły katalog usuwa tam pliki.
Tak, do tego służy rsync. Uruchom go ponownie, a przeniesie tylko to, czego brakuje lub co się zmieniło. Dodaj --partial, by częściowo przesłany duży plik został zachowany i dokończony.
Dalej: jak sprawdzić, czy kopię naprawdę da się odczytać.