Mam tu mały dylemat ...
Musiałem przenieść pliki o wartości około 70 GB z jednego serwera na drugi, więc zdecydowałem, że przyspieszenie ich i wysłanie archiwum będzie najszybszym sposobem.
Jednak na serwerze odbierającym pozostało tylko 5 GB miejsca po otrzymaniu archiwum tar.
Czy jest jakiś sposób, aby wyodrębnić smołę „na miejscu”? Nie muszę przechowywać archiwum po rozpakowaniu, więc zastanawiałem się, czy można to zrobić.
Edycja: Należy zauważyć, że archiwum zostało już wysłane i chciałbym uniknąć ponownego wysyłania za pomocą innej metody.
Jeśli druga maszyna ma ssh, polecam rsync jako inną alternatywę, która nie korzysta z pliku tar:
I bądź ostrożny z prowadzącym
/
Edytuj aktualizację
Cóż, widzę, że jest to teraz świetny pikiel, jeśli nie możesz go usunąć i wznowić z rsync. Prawdopodobnie spróbowałbym selektywnego wyciągu i usunięcia ze smoły.
ekstrakt selektywny:
selektywne usuwanie:
Wydaje się jednak, że poświęcisz dużo czasu na kodowanie skryptu dla tego ...
źródło
Zasadniczo potrzebna jest możliwość potokowania pliku do pliku tar i „obcinania” frontu podczas pracy.
Na StackOverflow ktoś zapytał, jak obciąć plik z przodu , ale wydaje się, że nie jest to możliwe. Nadal możesz wypełnić początek pliku zerami w specjalny sposób, aby plik stał się plikiem rzadkim , ale nie wiem, jak to zrobić. Możemy jednak obciąć koniec pliku. Ale tar musi czytać archiwum do przodu, a nie do tyłu.
Rozwiązanie 1
Poziom pośredni rozwiązuje każdy problem. Najpierw odwróć plik na miejscu, a następnie przeczytaj go wstecz (co spowoduje odczytanie oryginalnego pliku do przodu) i obcinaj koniec odwróconego pliku podczas pracy.
Musisz napisać program (c, python, cokolwiek), aby wymienić początek i koniec pliku, fragment po kawałku, a następnie potokować te fragmenty do tar, jednocześnie obcinając plik po kawałku. Jest to podstawa rozwiązania 2, które może być łatwiejsze do wdrożenia.
Rozwiązanie 2
Inną metodą jest podzielenie pliku na małe fragmenty w miejscu , a następnie usunięcie tych fragmentów podczas ich wyodrębniania. Poniższy kod ma wielkość jednego megabajta, dostosuj go w zależności od potrzeb. Większy jest szybszy, ale zajmie więcej pośredniej przestrzeni podczas podziału i podczas ekstrakcji.
Podziel plik archive.tar:
Prześlij te pliki do tar (uwaga: potrzebujemy zmiennej chunkprefix w drugim terminalu):
Ponieważ używamy nazwanego potoku (
mkfifo fifo
), nie musisz potokować wszystkich porcji jednocześnie. Może to być przydatne, jeśli masz mało miejsca. Możesz wykonać następujące kroki:while [ -e … ]; do cat "$chunk…; done
pętli (drugi terminal):tar
polecenia, NIE usuwaj fifo (pierwszego terminala), ale możesz uruchomićsync
, na wszelki wypadek,while [ -e … ]; do cat "$chunk…; done
, ponownie uruchamiając linie.Oczywiście to wszystko haute voltige , najpierw sprawdź, czy wszystko w porządku w archiwum fikcyjnym , bo jeśli popełnisz błąd, to pożegnaj się z danymi .
Nigdy nie dowiesz się, czy pierwszy terminal (
tar
) faktycznie zakończył przetwarzanie zawartości fifo, więc jeśli wolisz, możesz uruchomić to zamiast tego, ale nie będziesz mieć możliwości płynnej wymiany fragmentów na inny dysk:Zrzeczenie się
Pamiętaj, że aby wszystko to działało, twoja powłoka, ogon i obcięcie muszą poprawnie obsługiwać 64-bitowe liczby całkowite (nie potrzebujesz do tego 64-bitowego komputera ani systemu operacyjnego). Mój tak, ale jeśli uruchomisz powyższy skrypt w systemie bez tych wymagań, stracisz wszystkie dane w pliku archive.tar .
W każdym razie coś innego nie działa, i tak stracisz wszystkie dane w pliku archive.tar, więc upewnij się, że masz kopię zapasową danych.
źródło
Jeśli masz pliki obiektów do przeniesienia, spróbuj je rozebrać. Pozwoli to zaoszczędzić znaczną ilość miejsca.
źródło