GNU/Linux >> Znalost Linux >  >> Linux

Kopírování 1TB řídkého souboru

Uvědomuji si, že tato otázka je velmi stará, ale zde je aktualizace, která může být užitečná pro ostatní, kteří si sem najdou cestu stejným způsobem jako já.

Naštěstí je vynikající odpověď mvp nyní zastaralá. Podle poznámek k vydání GNU tar bylo SEEK_HOLE/SEEK_DATA přidáno ve verzi 1.29, vydané 2016-05-16. (A vzhledem k tomu, že GNU tar v. 1.30 je nyní standardem ve stabilní verzi Debianu, je bezpečné předpokládat, že verze tar ≥ 1.29 je dostupná téměř všude.)

Takže způsob, jak nyní zacházet s řídkými soubory, je archivovat je pomocí libovolného tar (GNU nebo BSD) nainstalovaného na vašem systému a to samé pro extrahování.

Navíc pro řídké soubory, které skutečně obsahují nějaká data, pokud se vyplatí použít kompresi (tj. data jsou dostatečně komprimovatelná, aby ušetřila podstatnou část místa na disku, a úspora místa na disku se vyrovná pravděpodobně značnému času a zdrojům procesoru, které jsou nutné k jejich komprimaci) :

  • tar -cSjf <archive>.tar.bz2 /path/to/sparse/file jak využije funkci SEEK_HOLE tar k rychlé a efektivní archivaci řídkého souboru, tak použije bzip2 ke kompresi skutečných dat.
  • tar --use-compress-program=pbzip2 -cSf <archive>.tar.bz2 /path/to/sparse/file , jak bylo zmíněno v marcinově komentáři, udělá totéž, zatímco také pomocí více jader pro úlohu komprese.

Na mém malém domácím serveru se čtyřjádrovým procesorem Atom pomocí pbzip2 vs bzip2 zkrátil čas přibližně o 25 nebo 30 %.

S kompresí nebo bez ní získáte archiv, který nepotřebuje žádné speciální zacházení s řídkými soubory, zabírá přibližně „skutečnou“ velikost původního řídkého souboru (nebo méně, pokud je komprimován) a lze jej bez obav přesouvat. o nekonzistenci mezi schopnostmi různých utilit pro řídké soubory. Například:cp automaticky detekuje řídké soubory a udělá správnou věc, rsync bude správně zpracovávat řídké soubory, pokud použijete -S příznak a scp nemá žádnou volbu pro řídké soubory (spotřebuje kopírování šířky pásma nuly pro všechny díry a výsledná kopie bude neřídký soubor, jehož velikost je „zdánlivá“ velikost originálu); ale všechny samozřejmě zvládnou archiv tar v pohodě – ať už obsahuje řídké soubory nebo ne – bez jakýchkoliv speciálních příznaků.

Další poznámky

  1. Při extrahování tar automaticky detekuje archiv vytvořený pomocí -S takže to není třeba specifikovat.
  2. Archiv vytvořený pomocí pbzip2 je uložen po kouscích. To má za následek, že archiv je o něco větší, než kdyby bzip2 se používá, ale také to znamená, že extrakce může být vícevláknová, na rozdíl od archivu vytvořeného pomocí bzip2 .
  3. pbzip2 a bzip2 budou spolehlivě extrahovat navzájem své archivy bez chyby nebo poškození.

Krátká odpověď: Použijte bsdtar nebo GNU tar (verze 1.29 nebo novější) k vytváření archivů a GNU tar (verze 1.26 nebo novější) a extrahujte je do jiného pole.

Dlouhá odpověď: Aby to fungovalo, existují určité požadavky.

Za prvé, Linux musí mít alespoň jádro 3.1 (Ubuntu 12.04 nebo novější by stačilo), takže podporuje SEEK_HOLE funkce.

Pak potřebujete nástroj tar, který podporuje toto systémové volání. GNU tar podporuje jej od verze 1.29 (vydáno 2016/05/16, mělo by být přítomno ve výchozím nastavení od Ubuntu 18.04), nebo bsdtar od verze 3.0.4 (dostupné od Ubuntu 12.04) - nainstalujte jej pomocí sudo apt-get install bsdtar .

Zatímco bsdtar (který používá libarchive ) je úžasný, bohužel není moc chytrý, pokud jde o rozbalování - hloupě vyžaduje mít na cílovém disku alespoň tolik volného místa, jako je velikost netarovaného souboru, bez ohledu na díry. GNU tar efektivně rozbalí takové řídké archivy a nebude tuto podmínku kontrolovat.

Toto je protokol z Ubuntu 12.10 (linuxové jádro 3.5):

$ dd if=/dev/zero of=1tb seek=1T bs=1 count=1
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.000143113 s, 7.0 kB/s

$ time bsdtar cvfz sparse.tar.gz 1tb 
a 1tb

real    0m0.362s
user    0m0.336s
sys 0m0.020s

# Or, use gnu tar if version is later than 1.29:
$ time tar cSvfz sparse-gnutar.tar.gz 1tb
1tb

real    0m0.005s
user    0m0.006s
sys 0m0.000s

$ ls -l
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov  7 01:43 1tb
-rw-rw-r-- 1 autouser autouser           257 Nov  7 01:43 sparse.tar.gz
-rw-rw-r-- 1 autouser autouser           134 Nov  7 01:43 sparse-gnutar.tar.gz
$

Jak jsem řekl výše, bohužel, rozbalit pomocí bsdtar nebude fungovat, pokud nemáte 1 TB volného místa. Nicméně jakákoli verze GNU tar Rozbalit takový sparse.tar funguje dobře :

$ rm 1tb 
$ time tar -xvSf sparse.tar.gz 
1tb

real    0m0.031s
user    0m0.016s
sys 0m0.016s
$ ls -l
total 8
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov  7 01:43 1tb
-rw-rw-r-- 1 autouser autouser           257 Nov  7 01:43 sparse.tar.gz

Linux
  1. Jak extrahovat nebo rozbalit soubor tar.xz v Linuxu

  2. Jak udělat soubor řídký?

  3. tar:krátké čtení

  1. Co jsou řídké soubory v Linuxu

  2. Aktualizace jednoho souboru v komprimovaném taru

  3. Jak extrahovat soubor filename.tar.gz

  1. tar -C se vzorem souboru zástupných znaků

  2. Jak převedu tar.bz2 na tar.gz?

  3. Extrahujete soubor *.tar.bz2?