Копирование разреженного файла 1 ТБ

У меня есть разреженный файл 1 ТБ, который хранит фактически 32 МБ данных в Linux.

Возможно ли "эффективно" сделать пакет для хранения разреженного файла? Пакет должен быть распакован, чтобы быть разрешенным файлом 1 ТБ на другом компьютере. В идеале "пакет" должен быть около 32 МБ.

Примечание. В качестве возможного решения можно использовать "tar" : https://wiki.archlinux.org/index.php/Sparse_file#Archiving_with_.60tar.27

Однако для разреженного файла размером 1 Тбайт, хотя шарик тангажа может быть небольшим, архивирование разреженного файла займет слишком много времени.

Изменить 1

Я тестировал tar и gzip, и результаты выглядят следующим образом (обратите внимание, что этот разреженный файл содержит данные из 0 байт).

$ du -hs sparse-1
0   sparse-1

$ ls -lha sparse-1
-rw-rw-r-- 1 user1 user1 1.0T 2012-11-03 11:17 sparse-1

$ time tar cSf sparse-1.tar sparse-1

real    96m19.847s
user    22m3.314s
sys     52m32.272s

$ time gzip sparse-1

real    200m18.714s
user    164m33.835s
sys     10m39.971s

$ ls -lha sparse-1*
-rw-rw-r-- 1 user1 user1 1018M 2012-11-03 11:17 sparse-1.gz
-rw-rw-r-- 1 user1 user1   10K 2012-11-06 23:13 sparse-1.tar

1TB файл разреженный-1, который содержит 0 байтовых данных, может быть заархивирован "tar" до шарика 10KB tar или сжат gzip в файл размером 1 ГБ. gzip занимает около 2-х раз больше времени, чем используется tar.

Из сравнения "tar" кажется лучше gzip.

Однако, 96 минут слишком длинны для разреженного файла, содержащего данные из 0 байта.

Изменить 2

rsync кажется завершенным копированием файла за время больше tar, но меньше gzip:

$ time rsync --sparse sparse-1 sparse-1-copy

real    124m46.321s
user    107m15.084s
sys     83m8.323s

$ du -hs sparse-1-copy 
4.0K    sparse-1-copy

Следовательно, tar + cp или scp должен быть быстрее, чем непосредственно rsync для этого крайне редкого файла.

Изменить 3

Благодаря @mvp для указания функциональности SEEK_HOLE в новом ядре. (Я ранее работал над ядром Linux 2.6.32).

Примечание: требуется версия bsdtar >= 3.0.4 (здесь: http://ask.fclose.com/4/how-to-efficiently-archive-a-very-large-sparse-file?show=299#c299).

В новом выпуске ядра и Fedora (17), tar и cp эффективно разрешает разреженный файл очень.

[[email protected] tmp]$ ls -lh pmem-1 

-rw-rw-r-- 1 zma zma 1.0T Nov  7 20:14 pmem-1
[[email protected] tmp]$ time tar cSf pmem-1.tar pmem-1

real    0m0.003s
user    0m0.003s
sys 0m0.000s
[[email protected] tmp]$ time cp pmem-1 pmem-1-copy

real    0m0.020s
user    0m0.000s
sys 0m0.003s
[[email protected] tmp]$ ls -lh pmem*
-rw-rw-r-- 1 zma zma 1.0T Nov  7 20:14 pmem-1
-rw-rw-r-- 1 zma zma 1.0T Nov  7 20:15 pmem-1-copy
-rw-rw-r-- 1 zma zma  10K Nov  7 20:15 pmem-1.tar
[[email protected] tmp]$ mkdir t
[[email protected] tmp]$ cd t
[[email protected] t]$ time tar xSf ../pmem-1.tar 

real    0m0.003s
user    0m0.000s
sys 0m0.002s
[[email protected] t]$ ls -lha
total 8.0K
drwxrwxr-x   2 zma  zma  4.0K Nov  7 20:16 .
drwxrwxrwt. 35 root root 4.0K Nov  7 20:16 ..
-rw-rw-r--   1 zma  zma  1.0T Nov  7 20:14 pmem-1

Я использую ядро ​​3.6.5:

[[email protected] t]$ uname -a
Linux office.zhiqiangma.com 3.6.5-1.fc17.x86_64 #1 SMP Wed Oct 31 19:37:18 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Ответы

Ответ 1

Краткий ответ: Используйте bsdtar или GNU tar (версия 1.29 или более поздняя) для создания архивов, а GNU tar (версия 1.26 или более поздняя) - для их извлечения в другом окне.

Длинный ответ: Есть некоторые требования, чтобы это работало.

Во-первых, Linux должен быть как минимум с ядром 3.1 (подойдет Ubuntu 12.04 или новее), поэтому он поддерживает функциональность SEEK_HOLE.

Затем вам нужна утилита tar, которая может поддерживать этот системный вызов. GNU tar поддерживает его начиная с версии 1.29 (выпущенной 2016/05/16, он должен присутствовать по умолчанию начиная с Ubuntu 18.04) или bsdtar начиная с версии 3.0.4 (доступно с Ubuntu 12.04) - установите его с помощью sudo apt-get install bsdtar.

В то время как bsdtar (который использует libarchive) потрясающий, к сожалению, он не очень умен, когда дело доходит до разметки - глупо требуется иметь как минимум столько же свободного места на целевом диске, сколько размер файла без изменений, без учета дыр, GNU tar эффективно разархивирует такие редкие архивы и не будет проверять это условие.

Это журнал из Ubuntu 12.10 (ядро Linux 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
$

Как я уже говорил выше, к сожалению, распаковка с bsdtar не будет работать, если у вас нет 1 ТБ свободного места. Тем не менее, любая версия GNU tar прекрасно справляется с распаковкой sparse.tar:

$ 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

Ответ 3

Я понимаю, что этот вопрос очень старый, но здесь есть обновление, которое может быть полезно для других, которые находят здесь свой путь так же, как я.

К счастью, mvp отличный ответ сейчас устарел. Согласно примечаниям к выпуску GNU tar, SEEK_HOLE/SEEK_DATA был добавлен в версии 1.29, выпущенной 2016-05-16. (А поскольку сейчас GNU tar v. 1.30 является стандартным в стабильной Debian, можно предположить, что версия tar ≥ 1.29 доступна почти везде.)

Таким образом, способ обработки разреженных файлов теперь состоит в том, чтобы заархивировать их в зависимости от того, какой tar (GNU или BSD) установлен в вашей системе, и то же самое для извлечения.

Кроме того, для разреженных файлов, которые на самом деле содержат некоторые данные, стоит ли использовать сжатие (т.е. данные достаточно сжимаемы, чтобы сэкономить существенное дисковое пространство, а экономия дискового пространства стоит, вероятно, значительного времени и ресурсов ЦП, необходимых для его сжатия) :

  • tar -cSjf <archive>.tar.bz2 /path/to/sparse/file оба будут использовать возможности tar SEEK_HOLE для быстрого & эффективно архивировать разреженный файл и использовать bzip2 для сжатия фактических данных.
  • tar --use-compress-program=pbzip2 -cSf <archive>.tar.bz2 /path/to/sparse/file, как упоминается в комментарии marcin, будет делать то же самое, одновременно используя несколько ядер для задачи сжатия.

На моем маленьком домашнем сервере с четырехъядерным процессором Atom использование pbzip2 против bzip2 сократило время примерно на 25 или 30%.

С или без сжатия, это даст вам архив, который не требует специальной обработки разреженных файлов, занимает приблизительно "реальный" размер исходного разреженного файла (или меньше, если сжат), и может перемещаться, не беспокоясь о несоответствие между разреженными возможностями файлов различных утилит. Например: cp автоматически обнаруживает разреженные файлы и делает правильные вещи, rsync будет правильно обрабатывать разреженные файлы, если вы используете флаг -S, а scp не имеет опции для разреженных файлов (он будет использовать копирование полосы пропускания). нули для всех отверстий и полученная копия будет не разреженным файлом, размер которого равен "кажущемуся" размеру оригинала); но все они, конечно, прекрасно справятся с архивом tar - независимо от того, содержит он разреженные файлы или нет - без каких-либо специальных флагов.

Дополнительные примечания

  1. При извлечении tar автоматически обнаружит архив, созданный с помощью -S, поэтому указывать его не нужно.
  2. Архив, созданный с помощью pbzip2, хранится в блоках. Это приводит к тому, что архив немного больше, чем при использовании bzip2, но также означает, что извлечение может быть многопоточным, в отличие от архива, созданного с помощью bzip2.
  3. pbzip2 и bzip2 будут надежно извлекать архивы друг друга без ошибок или повреждений.

Ответ 4

Вы определенно ищете инструмент сжатия, например tar, lzma, bzip2, zip или rar. Согласно этому сайту, lzma довольно быстр, но при этом имеет неплохую степень сжатия:

http://blog.terzza.com/linux-compression-comparison-gzip-vs-bzip2-vs-lzma-vs-zip-vs-compress/

Вы также можете настроить соотношение скорости и качества сжатия, установив уровень сжатия на что-то низкое, немного экспериментируйте, чтобы найти уровень, который лучше всего работает

http://linux.die.net/man/1/unlzma