Rsync, który obsługuje ruchy rozsądnie

10

Z powodzeniem korzystam z rsync do synchronizacji katalogów domowych między laptopem a netbookiem (oba używają ext4 z Linuksem). Moim jedynym problemem jest to, że od czasu do czasu lubię całkowicie reorganizować niektóre katalogi, a rsync traktuje to jako usuwanie i tworzenie nowych plików, co czyni je bardzo powolnymi i nieefektywnymi.

Czy ktoś wie o dobrym oprogramowaniu, które dobrze obsługuje przenoszenie plików?

Przekonałem się, że unison powinien być w stanie to zrobić, ale wydaje się, że nie działa w praktyce. Testowałem unison , synchronizując dwa lokalne katalogi, każdy z dużym plikiem, i nadal wykrywa mój ruch jako usunięcie + tworzenie i działał nawet wolniej niż rsync .

Co więcej, jeśli dobrze pamiętam z mojego spojrzenia na kod źródłowy unisona kilka miesięcy temu, próbowałem zrobić coś takiego, jak robienie sum sha - i nie chcę, żeby moje idealne rozwiązanie generowało sha sumy - to zbyt wolno na duże pliki / katalogi. Chciałbym coś, co zauważy takie rzeczy jak:

„Wygląda na to, że ostatni źródłowy odpowiednik tego pliku został usunięty i gdzie indziej w drzewie źródłowego katalogu znajduje się nowy plik, który ma tę samą datę, rozmiar i numer i-węzła, więc zakładam, że był to ruch i przesuń odpowiednio jego docelowy odpowiednik zamiast usuwać i kopiować ”.

Ważne jest dla mnie to, że mogę szybko zsynchronizować te maszyny.

Jakieś sugestie?

PSkocik
źródło

Odpowiedzi:

6

Powinieneś rzucić okiem na rdiff-backup, który wykonuje rsyncponiżej, ale z dodatkową inteligencją, której potrzebujesz (i sprawia, że ​​przyrostowe kopie zapasowe są w stanie wycofać, ale możesz skonfigurować, aby je wyłączyć).

Najnowsze wydanie jest stare (2009), ale jest to znak stabilności.

Zelda
źródło
2
Ktoś tego próbował?
mgła
3

Unison robi, co chcesz, ale tylko do zdalnej synchronizacji. Spróbuj użyć ssh://localhost/path/to/dirjako jednego z korzeni.

Unison opiera swoje decyzje na zawartości pliku, nie śledzi numerów i-węzłów.

Gilles „SO- przestań być zły”
źródło
1

Pliki rsync można obsługiwać przeniesionymi i zmienionymi nazwami plików, jeśli systemy plików w katalogu źródłowym i docelowym obsługują twarde łącza. Chodzi o to, aby rsync zrekonstruował twarde linki przed rzeczywistym transferem. Możesz znaleźć dobre wyjaśnienie tutaj

Skończyło się na prostym rozwiązaniu, które tworzy ukryte drzewo twardych linków w katalogu źródłowym / docelowym, podstawowy skrypt może wyglądać tak:

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

Mam przykładowy skrypt na GitHub . Ale radzę przeprowadzić dużą ilość testów przed użyciem tej metody w produkcji.

dparoli
źródło
0

Jeśli chcesz synchronizować pliki między wieloma komputerami, możesz po prostu użyć scentralizowanego systemu kontroli wersji, takiego jak Subversion (lub FSVS, który używa SVN jako backendu). Zaletą jest to, że wszystko w twoim / home (które dodajesz do kontroli wersji) jest następnie wersjonowane i może być łatwo zsynchronizowane z innymi komputerami lub przywrócone.

tgharold
źródło
0

lsyncd obsługuje również przeniesione pliki z zachowaniem rsync + ssh, chociaż nieco wadliwe (dostaję około 15% ruchów traktowanych jako usuwanie / kopiowanie, ale nie wiem dlaczego). Przez większość czasu działa.

Wsparcie NK
źródło