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

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

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

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

3 ответа3

1

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

  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

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

#!/bin/sh

srcDir='/importunt/data'  # Use full path
bkpDir='/backups'         # Use full path

cd "${bkpDir}"

previousDir="$(ls -td -- */ | head -n 1 | awk -F'/' '{print $1}')"   # Get most newest directory
currentDir="$(date '+%Y-%m-%dT%H;%M;%S')"

[ -n "${previousDir}" ] && {
  rsync_opts="-aPvz --safe-links --link-dest=${bkpDir}/${previousDir} --exclude=*.mp3"
} || {
  rsync_opts="-aPvz --safe-links --exclude=*.mp3"
}

mkdir -m 770 "${currentDir}"
rsync  ${rsync_opts}  "${srcDir}" "${bkpDir}"/"${currentDir}"

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

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

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

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

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

0

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .