Как хранить большие объемы маленьких файлов

273
sharpener

Давайте выполним следующую задачу:

  • резервное копирование большого количества (например, 500 ГБ) небольших файлов (от нескольких КБ до 1 МБ) в Linux
  • резервное хранилище в основном только для чтения
  • хранилище достаточно быстрое для доступа к определенным файлам в обычном режиме просмотра каталогов / файлов, в идеале через встроенную или подключаемую функцию в обычных файловых менеджерах (таких как mc, TotalCommander (через samba) или около того)
  • хранилище должно быть в идеале одним файлом (может быть эффективно перемещено в NAS или около того)
  • сжатие не требуется
  • Добавление файла (ов) может быть дорогостоящей операцией (даже первоначальная инициализация хранилища)

Я попробовал старый tar, но «открытие» индекса для 500G кажется бесконечным, поэтому мне, вероятно, придется извлечь его целиком. Есть ли, например, какой-нибудь способ, как ddчасть файловой системы в образ, а затем смонтировать его?

Какие-нибудь мысли?

0

3 ответа на вопрос

1
davidgo

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

  1. Первым шагом является создание «блочного устройства» - вы можете использовать ddдля этого (например dd if=/dev/zero of=/path/to/file.name bs=100M count=6000) или другой инструмент ( fallocate, truncate).
  2. Затем вы форматируете устройство, используя что-то вроде mkfs.ext4 /path/to/file.name.
  3. Далее смонтировать его - mkdir /mntpoint; moint /path/to/file.name /mntpoint.
  4. Скопируйте файлы в /mntpointнужный вам инструмент - например rsnapshot, rsyncили просто старый cp.
  5. Размонтируйте, когда вы закончите - убедитесь, что вы не в /mntpointкаталоге umount /mntpoint,.
0
Alex

Я делаю это в тех случаях, когда нужен быстрый доступ к резервному содержимому - добавочное резервное копирование rsyncс --link-dest=опцией.
Он работает довольно быстро, не влияет на предыдущие резервные копии, которые вы можете иметь столько, сколько хотите, и резервное копирование не занимает много места, так как резервные копии - это жесткие ссылки на существующие файлы. В этом случае доступ к резервному копированию является мгновенным, и фактическая передача файлов занимает несколько секунд даже для огромного количества файлов, поскольку rsyncкопируются только новые файлы.

#!/bin/sh  srcDir='/importunt/data' # Use full path bkpDir='/backups' # Use full path  cd "$"  previousDir="$(ls -td -- */ | head -n 1 | awk -F'/' '')" # Get most newest directory currentDir="$(date '+%Y-%m-%dT%H;%M;%S')"  [ -n "$" ] && { rsync_opts="-aPvz --safe-links --link-dest=$/$ --exclude=*.mp3" } || { rsync_opts="-aPvz --safe-links --exclude=*.mp3" }  mkdir -m 770 "$" rsync $ "$" "$"/"$" 

В основном такое решение создает точный моментальный снимок, поэтому восстановление файлов довольно простое.

Не страшно, если вы используете duна /backupsдиректории, когда она показывает увеличение размера на каждом обновлении, если вы будете использовать dfвы увидите, что фактическое пространство не уменьшается. Вот как жесткие ссылки рассчитывают на Linux и FreeBSD, так что не беспокойтесь. Чтобы убедиться, что я не соврал, вы можете проверить inode для некоторого файла в инкрементном резервном копировании с помощью ls -i file. Вы обнаружите, что один и тот же файл во всех каталогах имеет один и тот же индекс, что означает rsyncдублирование только имен файлов с жесткими ссылками, но все они указывают на один и тот же контент.

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

Сценарий выше является упрощенным примером. Если содержимое в инкрементном резервном копировании предполагается редактировать, вам не следует использовать механизм ls -tдля обнаружения самого нового предыдущего каталога в резервном хранилище, а вместо этого сохранить его $в некоторый файл и восстановить $при последующем вызове.

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

0
Attie

tarне хранит краткий индекс в одной точке файла (например, Zip) - вместо этого он объявляет каждую сущность с данными сущности, следовательно, « кажется, что она бесконечна » - вам нужно прочитать весь файл, чтобы получить список всех сущность внутри него.

Если вы хотите иметь легкий доступ к индексу, вы можете просто захватить выходные данные tar -cvи сохранить их вместе с архивом.

tar -cv -f ./test.tar ./to_backup/ \ > index.txt 

В качестве альтернативы, если вам нужна дополнительная информация, вы можете использовать tar -cT $, которая принимает список файлов от $. Таким образом, вы можете использовать, findчтобы собрать имена файлов, записать детали каждого файла в ваш « индекс » и создать имя файла stdoutдля tarархивирования.

find ./to_backup/ -type f \ | tee index.txt \ | tar -cT /dev/stdin \ > ./test.tar 

Без сжатия очень легко добавлять файлы в tarархив ( tarрасшифровывается как « Архив ленты » ... перетасовка данных на ленту болезненна). Формат файла с кратким индексом будет сложнее добавлять файлы на более позднем этапе, хотя обычно это возможно.

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