Jeśli uruchomię tar -cvf
katalog o rozmiarze 937 MB, aby utworzyć łatwą do pobrania kopię głęboko zagnieżdżonej struktury folderów, czy ryzykuję zapełnienie dysku, biorąc pod uwagę następujące df -h
dane wyjściowe:
/dev/xvda1 7.9G 3.6G 4.3G 46% /
tmpfs 298M 0 298M 0% /dev/shm
Powiązane pytania:
- Jeśli dysk może się zapełnić, dlaczego np. Co Linux (Amazon AMI) i / lub
tar
będzie robił pod maską? - Jak mogę dokładnie ustalić te informacje bez pytania?
tar
disk-usage
codecowboy
źródło
źródło
--totals
opcją. Tak czy inaczej, jeśli zapełnisz dysk, możesz po prostu usunąć archiwum, imho. Aby sprawdzić wszystkie dostępne opcje, możesz przejśćtar --help
.Odpowiedzi:
tar -c data_dir | wc -c
bez kompresjilub
tar -cz data_dir | wc -c
z kompresją gziplub
tar -cj data_dir | wc -c
z kompresją bzip2wypisze rozmiar archiwum, które zostanie utworzone w bajtach, bez zapisywania na dysku. Następnie możesz porównać to z ilością wolnego miejsca na urządzeniu docelowym.
Możesz sprawdzić rozmiar samego katalogu danych, w przypadku niepoprawnego założenia jego rozmiaru, za pomocą następującego polecenia:
du -h --max-depth=1 data_dir
Jak już odpowiedziano, tar dodaje nagłówek do każdego rekordu w archiwum, a także zaokrągla rozmiar każdego rekordu do wielokrotności 512 bajtów (domyślnie). Koniec archiwum jest oznaczony przez co najmniej dwa kolejne rekordy wypełnione zerami. Tak więc zawsze jest tak, że nieskompresowany plik tar jest większy niż same pliki, liczba plików i sposób ich wyrównania do granic 512 bajtów determinuje wykorzystanie dodatkowej przestrzeni.
Oczywiście, same systemy plików używają rozmiarów bloków, które mogą być większe niż zawartość pojedynczego pliku, więc bądź ostrożny tam, gdzie je rozpakowujesz, system plików może nie być w stanie pomieścić wielu małych plików, nawet jeśli ma wolne miejsce większe niż rozmiar tar!
https://en.wikipedia.org/wiki/Tar_(computing)#Format_details
źródło
-f -
do tar jest zbędne, ponieważ możesz po prostu-f
całkowicie pominąć argument, aby zapisać wynik na stdout (tjtar -c data_dir
.).Rozmiar pliku tar będzie wynosił 937 MB plus rozmiar metadanych potrzebnych dla każdego pliku lub katalogu (512 bajtów na obiekt) oraz dopełnienie dodane w celu wyrównania plików do granicy 512 bajtów.
Bardzo przybliżone obliczenia mówią nam, że kolejna kopia twoich danych pozostawi ci 3,4 GB wolnego miejsca. W 3,4 GB mamy miejsce na około 7 milionów rekordów metadanych, przy założeniu braku dopełniania, lub mniej, jeśli założymy, że dopełnianie wynosi średnio 256 bajtów na plik. Więc jeśli masz miliony plików i katalogów do tarowania, możesz napotkać problemy.
Możesz złagodzić problem przez
z
lubj
tar
tar
jak zwykły użytkownik, aby zarezerwowane miejsce na/
partycji nie zostało zmienione, jeśli zabraknie miejsca.źródło
tar
sam może zgłaszać rozmiar swoich archiwów z--test
opcją:Powyższe polecenie nie zapisuje nic na dysk i ma tę dodatkową zaletę, że wyświetla listę indywidualnych rozmiarów każdego pliku zawartego w archiwum. Dodanie różnych
z/j/xz
operandów po obu stronach|pipe
poradzi sobie z kompresją.WYDAJNOŚĆ:
Nie jestem do końca pewien swojego celu, ale jeśli chcesz pobrać archiwum, może to być bardziej istotne:
Lub po prostu skopiować za pomocą
tar
:źródło
tar
następnie skopiować drzewo na dysku lokalnym w strumieniu bez zapisywania czegokolwiek na dysku zdalnym wcale, po którym można go usunąć ze zdalnym hostem i przywrócić go później. Prawdopodobnie powinieneś dodać-z
do kompresji, jak wskazuje goldilocks, aby zaoszczędzić na przepustowości w trakcie transferu.-i
tak, przepraszam!Przeprowadziłem wiele badań w tym zakresie. Możesz wykonać test na pliku z liczbą słów, ale nie da ci tego samego numeru jak
du -sb adir
.du
liczy każdy katalog jako 4096 bajtów itar
liczy katalogi jako 0 bajtów. Musisz dodać 4096 do każdego katalogu:musisz dodać wszystkie postacie. Dla czegoś, co wygląda tak:
Nie jestem pewien, czy jest to idealne, ponieważ nie próbowałem dotkniętych plików (pliki 0 bajtów) lub plików, które mają 1 znak. To powinno cię przybliżyć.
źródło
-cvf
nie obejmuje żadnej kompresji, więc zrobienie tego w folderze ~ 1 GB spowoduje utworzenie pliku tar ~ 1 GB (odpowiedź Fluba zawiera więcej szczegółów na temat dodatkowego rozmiaru pliku tar, ale pamiętaj, że nawet jeśli jest 10 000 plików, to tylko 5 MB). Ponieważ masz 4 GB wolnego miejsca, nie, nie zapełnisz partycji.Większość osób uważa, że „łatwiej” jest synonimem „mniejszego” pod względem pobierania, więc powinieneś użyć tutaj kompresji.
bzip2
myślę, że teraz powinien być dostępny w dowolnym systemie z / w tar, więc myślę, że włączeniej
przełączników jest prawdopodobnie najlepszym wyborem.z
(gzip
) jest być może jeszcze bardziej powszechne i istnieją inne (mniej wszechobecne) możliwości z większą liczbą squashów.Jeśli masz na myśli, że
tar
tymczasowo wykorzystuje dodatkowe miejsce na dysku do wykonania zadania, jestem pewien, że nie robi tego z kilku powodów, z których jeden pochodzi z czasów, gdy napędy taśm były formą podstawowej pamięci, a dwie z nich mają musiałem ewoluować przez dziesięciolecia (i jestem pewien, że nie jest konieczne stosowanie tymczasowej przestrzeni pośredniej, nawet jeśli wymagana jest kompresja).źródło
Jeśli prędkość jest ważna i kompresja nie jest potrzebna, można zahaczyć syscall obwolut używanych przez
tar
użyciemLD_PRELOAD
, aby zmienićtar
go obliczyć dla nas. Reimplementując kilka z tych funkcji w celu zaspokojenia naszych potrzeb (obliczając rozmiar potencjalnej wyjściowej danych smoły), jesteśmy w stanie wyeliminować wiele z nichread
iwrite
jest to wykonywane przy normalnym działaniutar
. To sprawia, że jesttar
znacznie szybszy, ponieważ nie musi kontekstowo przełączać się w jądro tam iz powrotem tak blisko, a tylkostat
żądany plik / folder (pliki) wejściowy musi zostać odczytany z dysku zamiast z rzeczywistych danych pliku.Poniższy kod zawiera implementacje
close
,read
orazwrite
funkcji POSIX. MakroOUT_FD
kontroluje, którego deskryptora pliku będziemytar
używać jako pliku wyjściowego. Obecnie jest ustawiony na standardowe wyjście.read
został zmieniony tak, aby zwracał wartość sukcesucount
bajtów zamiast wypełnienia bufora danymi, biorąc pod uwagę, że rzeczywiste dane nie zostały odczytane, buf nie zawierałby prawidłowych danych do przekazania na kompresję, a zatem gdyby zastosowano kompresję, obliczilibyśmy niepoprawne rozmiar.write
został zmieniony, aby sumowaćcount
bajty wejściowe do zmiennej globalnejtotal
i zwracać wartość sukcesucount
bajtów tylko wtedy, gdy deskryptor pliku jest zgodnyOUT_FD
, w przeciwnym razie wywołuje pierwotne opakowanie pozyskane przez,dlsym
aby wykonać wywołanie systemowe o tej samej nazwie.close
nadal wykonuje wszystkie oryginalne funkcje, ale jeśli deskryptor pliku pasuje do OUT_FD, wie, żetar
próbowano zapisać plik tar, więctotal
numer jest ostateczny i wypisuje go na standardowe wyjście.Benchmark porównujący rozwiązanie, w którym dostęp do dysku odczytu i wszystkie wywołania systemowe normalnej operacji tar wykonywane są przeciwko
LD_PRELOAD
rozwiązaniu.Powyższy kod, podstawowy skrypt do budowania powyższego jako biblioteka współdzielona oraz skrypt
LD_PRELOAD
wykorzystujący go w „ technice” znajduje się w repozytorium: https://github.com/G4Vi/tarsizeKilka informacji na temat korzystania z LD_PRELOAD: https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/
źródło