Если я запускаю tar -cvf
каталог размером 937 МБ, чтобы создать легко загружаемую копию глубоко вложенной структуры папок, рискну ли я заполнить диск при следующих df -h
выводах:
/dev/xvda1 7.9G 3.6G 4.3G 46% /
tmpfs 298M 0 298M 0% /dev/shm
Смежные вопросы:
- Если диск может заполниться, почему, то есть, что Linux (Amazon AMI) и / или
tar
будет делать под капотом? - Как я могу точно определить эту информацию сам, не спрашивая снова?
tar
disk-usage
codecowboy
источник
источник
--totals
опцией. В любом случае, если вы заполните диск, вы можете просто удалить архив, imho. Чтобы проверить все доступные варианты, вы можете пройтиtar --help
.Ответы:
tar -c data_dir | wc -c
без сжатияили
tar -cz data_dir | wc -c
со сжатием gzipили
tar -cj data_dir | wc -c
со сжатием bzip2напечатает размер архива, который будет создан в байтах, без записи на диск. Затем вы можете сравнить это с количеством свободного места на целевом устройстве.
Вы можете проверить размер самого каталога данных, если было сделано неверное предположение о его размере, с помощью следующей команды:
du -h --max-depth=1 data_dir
Как уже было сказано, tar добавляет заголовок к каждой записи в архиве, а также округляет размер каждой записи до 512 байт (по умолчанию). Конец архива отмечен как минимум двумя последовательными записями, заполненными нулями. Поэтому всегда случается, что у вас будет несжатый tar-файл, размер которого больше самих файлов, а количество файлов и то, как они выровнены по границам 512 байт, определяет используемое дополнительное пространство.
Конечно, сами файловые системы используют размеры блоков, которые могут быть больше, чем содержимое отдельного файла, поэтому будьте осторожны, когда вы распаковываете его, файловая система может не вместить много маленьких файлов, даже если у нее есть свободное пространство больше размера tar!
https://en.wikipedia.org/wiki/Tar_(computing)#Format_details
источник
-f -
с tar является излишним, поскольку вы можете просто полностью пропустить-f
аргумент, чтобы записать результат в стандартный вывод (т.е.tar -c data_dir
).Размер вашего tar-файла составит 937 МБ плюс размер метаданных, необходимых для каждого файла или каталога (512 байт на объект), и добавлены отступы для выравнивания файлов по границе 512 байт.
Очень грубый расчет говорит нам, что из другой копии ваших данных у вас останется 3,4 ГБ. В 3,4 ГБ у нас есть место для примерно 7 миллионов записей метаданных, при условии отсутствия заполнения, или меньше, если вы предполагаете, что в среднем заполнение составляет 256 байтов на файл. Так что если у вас есть миллионы файлов и каталогов для tar, у вас могут возникнуть проблемы.
Вы можете смягчить проблему путем
z
илиj
вариантыtar
tar
как обычный пользователь, чтобы зарезервированное пространство в/
разделе не было затронуто, если у вас заканчивается свободное место.источник
tar
сам может сообщить о размере своих архивов с--test
опцией:Приведенная выше команда ничего не записывает на диск и имеет дополнительное преимущество перечисления отдельных размеров файлов каждого файла, содержащегося в архиве. Добавление различных
z/j/xz
операндов к любой из сторон|pipe
будет обрабатывать сжатие, как вы.ВЫХОД:
Не совсем уверен в вашей цели, но если вы хотите скачать tarball, это может быть ближе к делу:
Или просто скопировать с
tar
:источник
tar
он скопирует дерево на ваш локальный диск в потоке, ничего не сохранив на удаленном диске, после чего вы можете удалить его с удаленного хоста и восстановить его позже. Вы, вероятно, должны добавить-z
для сжатия, как указывает goldilocks, чтобы сэкономить на пропускной способности в середине передачи.-i
правильно, извините!Я провел много исследований по этому вопросу. Вы можете выполнить тест файла с количеством слов, но он не даст вам тот же номер, что и
du -sb adir
.du
считает каждый каталог 4096 байт, аtar
каталог - 0 байт. Вы должны добавить 4096 к каждому каталогу:тогда вы должны добавить все символы. Для чего-то, что выглядит так:
Я не уверен, что это идеально, так как я не пробовал файлы, к которым прикоснулись (файлы по 0 байт) или файлы, которые имеют 1 символ. Это должно приблизить вас.
источник
-cvf
не включает в себя сжатие, поэтому в папке ~ 1 ГБ файл tar будет ~ 1 ГБ (в ответе Flub содержится более подробная информация о дополнительном размере в файле tar, но обратите внимание, что даже при наличии 10 000 файлов это только 5 МБ). Поскольку у вас есть 4+ ГБ свободного места, нет, вы не будете заполнять раздел.Большинство людей считают «проще» синонимичным с «меньшим» с точки зрения загрузки, поэтому вам следует использовать сжатие здесь.
bzip2
я думаю, что сейчас она должна быть доступна в любой системе с tar, поэтому включениеj
в ваши коммутаторы, вероятно, лучший выбор.z
(gzip
), возможно, даже более распространен, и есть другие (менее вездесущие) возможности с большим количеством сквоша.Если вы имеете в виду,
tar
использует ли дополнительное дисковое пространство временно для выполнения задачи, я почти уверен, что это не так по нескольким причинам, одна из которых относится ко времени, когда ленточные накопители были формой первичного хранилища, а две - это у меня были десятилетия развития (и я уверен, что нет необходимости использовать временное промежуточное пространство, даже если используется сжатие).источник
Если скорость важна, а сжатие не требуется, вы можете перехватить использованные оболочки syscall,
tar
используяLD_PRELOAD
изменения,tar
чтобы рассчитать их для нас. Реализовав некоторые из этих функций в соответствии с нашими потребностями (вычисляя размер потенциальных выходных данных tar), мы можем устранить многие из них,read
иwrite
это выполняется при нормальной работеtar
. Это делаетtar
намного быстрее, так как ему не нужно переключаться между ядрами назад и вперед в ядре, и толькоstat
с запрошенного входного файла / папок нужно читать с диска вместо фактических данных файла.Ниже код включает в себя варианты реализации
close
,read
иwrite
функции POSIX. МакросOUT_FD
определяет, какой дескриптор файла мы ожидаемtar
использовать в качестве выходного файла. В настоящее время установлено значение stdout.read
был изменен, чтобы просто возвращать значение успешногоcount
байта вместо заполнения buf данными, учитывая, что фактические данные не были прочитаны, buf не будет содержать действительных данных для передачи на сжатие, и, таким образом, если сжатие использовалось, мы вычислили бы неправильное размер.write
был изменен, чтобы суммировать входныеcount
байты в глобальной переменнойtotal
и возвращать значение успехаcount
байтов, только если дескриптор файла совпадаетOUT_FD
, в противном случае он вызывает исходную оболочку, полученную через,dlsym
для выполнения системного вызова с тем же именем.close
все еще выполняет все свои первоначальные функции, но если дескриптор файла совпадает с OUT_FD, он знает, чтоtar
завершена попытка записи файла tar, поэтомуtotal
число является окончательным и выводит его на стандартный вывод.Сравнительный анализ решения, при котором доступ к диску чтения и все системные вызовы обычной операции tar выполняются с
LD_PRELOAD
решением.Приведенный выше код, базовый сценарий сборки для сборки вышеупомянутого в виде разделяемой библиотеки и сценарий с «
LD_PRELOAD
техникой» с его использованием предоставлен в репозитории: https://github.com/G4Vi/tarsize.Некоторая информация об использовании LD_PRELOAD: https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/
источник