Как я могу определить, заставит ли рабочий tar диск заполняться

Я понял то, что я забыл, когда я спросил друга. В цикле я установил a global variable для местоположения. В for loop Я забыл добавлять cd $folder перед процессом zip, который заставил это архивировать папку и содержание.

22
11.04.2014, 00:55
6 ответов
[12196]tar -c data_dir | wc -c[12197]без сжатия[12198]или[12199]tar -cz data_dir | wc -c[12200]с gzip компрессией[12201]или[12202]tar -cj data_dir | wc -c[12203]с bzip2 компрессией[12204]распечатает размер архива, который будет создан в байтах, без записи на диск. Затем вы можете сравнить это с объемом свободного места на целевом устройстве.[12205]Вы можете проверить размер самого каталога данных, в случае если было сделано неверное предположение о его размере, командой:[12206]du -h --max depth=1 data_dir[12207]Как уже было сказано, tar добавляет заголовок к каждой записи в архиве, а также округляет размер каждой записи до кратного 512 байт (по умолчанию). Конец архива помечается как минимум двумя последовательно заполненными нулевыми записями. Таким образом, всегда получается, что несжатый tar-файл больше, чем сами файлы, количество файлов и то, как они выравниваются по границам 512 байт, определяет используемое лишнее пространство. [12208]Конечно, сами файловые системы используют размер блоков, который может быть больше, чем содержимое отдельного файла, так что будьте осторожны, когда вы его распаковываете, файловая система может не вместить много маленьких файлов, даже если в ней есть свободное место больше, чем размер tar![12209]https://en.wikipedia.org/wiki/Tar_(computing)#Format_details[12210]
24
27.01.2020, 19:42
[1131294] Размер вашего tar-файла будет 937MB плюс размер метаданных, необходимых для каждого файла или каталога (512 байт на объект), а также добавлена подкладка для выравнивания файлов по границе 512 байт. [12175] Очень грубое вычисление говорит нам о том, что еще одна копия ваших данных оставит вам 3,4 Гб бесплатно. В 3,4 ГБ у нас есть место примерно для 7 миллионов записей метаданных, в предположении отсутствия подкладки, или меньше, если предположить, что в среднем на файл приходится 256 байт подкладки. Таким образом, если у вас есть миллионы файлов и каталогов для tar, вы можете столкнуться с проблемами. [12176] Вы можете смягчить проблему с помощью [12177] сжатия на лету, используя опции [1131894]z[1131895] или [1131896]j[1131897] для [1131898]tar[12178], выполняя [1131900]tar[1131901] как обычный пользователь, чтобы зарезервированное пространство на разделе [1131902]/[1131903] не было тронуто, если у вас не хватает места. [12179]
6
27.01.2020, 19:42
[12180]tar[1131778] сам может сообщить о размере своих архивов с помощью опции [1131779]--test[1131780]:[12181]Вышеприведенная команда ничего не записывает на диск и имеет дополнительное преимущество, заключающееся в перечислении индивидуальных файловых размеров каждого файла, содержащегося в тарболе. Добавление различных [1131781]z/j/xz[1131782] операндов в любую из сторон [1131783]|pipe[1131784] будет работать с компрессией так, как вы хотите. [12182]OUTPUT:[12183]Не совсем уверен в вашем назначении, но если это для загрузки тарбола, то это может быть что-то большее:[12184]Или просто скопировать с [1131785]tar[1131786]: [12185]
2
27.01.2020, 19:42
[12186]-cvf[1131788] не включает в себя никакого сжатия, поэтому при копировании в папку ~1 ГБ получится tar-файл размером ~1 ГБ (ответ Flub содержит более подробную информацию о дополнительном размере tar-файла, но обратите внимание, что даже если есть 10,000 файлов, это всего 5 МБ). Так как у вас есть 4+ Гб бесплатно, нет, вы не заполните раздел.[12187]легко загружаемая копия[12188]Большинство людей посчитали бы "легким" синонимом "меньшего" размера в плане загрузки, так что вам следует использовать некоторую компрессию здесь. Я думаю, что [1131791]bzip2[1131792] должен быть доступен на любой системе w/ tar, так что включение [1131793]j[1131794] в ваши ключи, вероятно, лучший выбор. [1131795]z[1131796] ([1131797]gzip[1131798]), пожалуй, еще более распространена, и есть другие (менее вездесущие) возможности с большим количеством сквоша. [12189] Если вы имеете в виду, использует ли [1131799]tar[1131800] дополнительное дисковое пространство временно при выполнении задачи, то я уверен, что это происходит не по нескольким причинам, одна из которых восходит ко времени, когда ленточные накопители были формой первичного хранилища, а две - это время, когда у него были десятилетия (и я уверен, что нет необходимости использовать временное промежуточное пространство, даже если речь идет о сжатии). [1131319]
1
27.01.2020, 19:42

Я провел много исследований по этому вопросу. Вы можете сделать тест на файле с подсчетом слов, но он не даст вам того же числа, что и du -sb adir.

tar -tvOf afile.tar | wc -c

du считает каждый каталог как 4096 байт, а tar считает каталоги как 0 байт. Вы должны добавить 4096 к каждому каталогу:

$(( $(tar -tvOf afile.tar 2>&1 | grep '^d' | wc -l) * 4096)))

затем вы должны добавить все символы. Для чего-то, что выглядит так:

$(( $(tar -tvOf afile.tar 2>&1 | grep '^d' | wc -l) * 4096 + $(tar -xOf afile.tar | wc -c) ))

Я не уверен, что это идеально, поскольку я не пробовал файлы, которые были тронуты (файлы с 0 байтами) или файлы с 1 символом. Это должно приблизить вас к идеалу.

2
27.01.2020, 19:42

Если скорость важна, а сжатие не требуется, вы можете подключить обертки системных вызовов, используемые tar, используя LD_PRELOAD, чтобы изменить tar, чтобы вычислить его для нас. Путем повторной реализации некоторых из этих функций в соответствии с нашими потребностями (расчета размера потенциальных выходных данных tar )мы можем исключить многие readи write, которые выполняются при нормальной работе tar.. Это делает tarнамного быстрее, так как не нужно переключаться между контекстами в ядре почти так же часто, и нужно читать только statзапрошенного входного файла/папки (s ). с диска вместо фактических данных файла.

Приведенный ниже код включает реализации функций close, readи writePOSIX. Макрос OUT_FDопределяет, какой дескриптор файла мы ожидаем, что tarбудет использоваться в качестве выходного файла. В настоящее время он установлен на стандартный вывод.

readбыло изменено, чтобы просто возвращать значение успеха countбайтов вместо заполнения buf данными, учитывая, что фактические данные не были прочитаны, buf не будет содержать действительных данных для передачи в сжатие, и, таким образом, если сжатие было используется, мы рассчитали бы неправильный размер.

writeбыл изменен, чтобы суммировать входные countбайт в глобальную переменную totalи возвращать значение успеха countбайт только , если дескриптор файла соответствует OUT_FD, в противном случае он вызывает исходный оболочка, полученная через dlsymдля выполнения одноименного системного вызова.

closeпо-прежнему выполняет все свои исходные функции, но если дескриптор файла соответствует OUT _FD, он знает, что tarпытается записать tar-файл, поэтому номер totalявляется окончательным и печатает его. в стандартный вывод.

#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include <errno.h>
#include <dlfcn.h>
#include <string.h>

#define OUT_FD 1
uint64_t total = 0;
ssize_t (*original_write)(int, const void *, size_t) = NULL;
int (*original_close)(int) = NULL;
void print_total(void)
{
    printf("%" PRIu64 "\n", total);
}

int close(int fd)
{
    if(! original_close)
    {
        original_close = dlsym(RTLD_NEXT, "close");
    }
    if(fd == OUT_FD)
    {
        print_total();
    }
    return original_close(fd);
}

ssize_t read(int fd, void *buf, size_t count)
{
    return count;
}

ssize_t write(int fd, const void *buf, size_t count)
{
    if(!original_write)
    {
        original_write = dlsym(RTLD_NEXT, "write");
    }
    if(fd == OUT_FD)
    {
        total += count;
        return count;
    }
    return original_write(fd, buf, count);
}

Сравнительный анализ, сравнивающий решение, в котором доступ для чтения к диску и все системные вызовы обычной операции tar выполняются с решением LD_PRELOAD.

$ time tar -c /media/storage/music/Macintosh\ Plus-\ Floral\ Shoppe\ \(2011\)\ \[Flac\]/ | wc -c
332308480
real    0m0.457s
user    0m0.064s
sys     0m0.772s
tarsize$ time./tarsize.sh -c /media/storage/music/Macintosh\ Plus-\ Floral\ Shoppe\ \(2011\)\ \[Flac\]/
332308480
real    0m0.016s
user    0m0.004s
sys     0m0.008s

Приведенный выше код — базовый сценарий сборки для создания вышеуказанной общей библиотеки.и скрипт с "методом LD_PRELOAD" с его использованием предоставлен в репозитории :https://github.com/G4Vi/tarsize

Немного информации об использовании LD _ПРЕДВАРИТЕЛЬНАЯ ЗАГРУЗКА:https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/

0
27.01.2020, 19:42

Теги

Похожие вопросы