Создайте резервную копию в формате tar: Как работает архивация

Программа архивирования tar основана на старом методе резервного копирования данных, но и сегодня он не утратил своей убедительности. Название tar — это аббревиатура, означающая Tape Archiver, или архивация ленточных накопителей. Несмотря на то, что сегодня частные пользователи почти не используют ее, программа продолжает оставаться самым популярным инструментом для архивирования на Unix-системах. С помощью программы упаковки можно создавать регулярные, инкрементные резервные копии сервера. Здесь мы объясним, как работает tar и какие команды используются для создания резервных копий.

Как работает tar?

Tar — это программа для архивирования в Linux и родственных системах. Нетипично для такого рода программ, tar не предлагает сжатие по умолчанию. Но программа очень популярна, поскольку предлагает большое преимущество — возможность объединения целых каталогов в один файл. С этой технологией связана история программы: С помощью ленточного накопителя данные успешно переносятся на магнитную ленту. Этим объясняется последовательное, линейное хранение данных в формате tar. Новые файлы прикрепляются к задней части архива. Один из соответствующих файлов также известен как Tarball, поскольку файлы практически «склеены».

Однако для достижения успешного сжатия tar часто используется в сочетании с gzip. Эти две программы прекрасно дополняют друг друга: gzip может сжимать только отдельные файлы. Поэтому обычно сначала используется tar, а затем gzip (или другая программа для сжатия). Таким образом, в итоге создаются файлы .tar.gz или .tzip.

Установите tar

В Ubuntu программа tar уже должна быть предустановлена. Если вы используете другой дистрибутив Linux или Unix, установите полезную программу с:

sudo apt-get install tar tar-doc

Пакет tar-doc является необязательным: он содержит документацию по программе архивации.

Использование tar

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

tar Option File

Опции tar выглядят следующим образом:

Опция Описание Специальная функция  
—help Отображает все опции    
—version Выводит используемую версию tar    
-c Создает новый архив (создать)  
-d Сравнивает файлы в архиве и в файловой системе друг с другом (diff)  
-f Записывает архив в заданный файл или считывает данные из заданного файла (file) Эта опция всегда должна вводиться последней, поскольку все последующие записи интерпретируются как файлы  
-z Сжимает или распаковывает архив непосредственно с помощью gzip gzip должен быть уже установлен  
-Z Сжимает или распаковывает архив непосредственно с помощью compress compress должен быть уже установлен; обратите внимание на капитализацию  
-j Сжимает или распаковывает архив непосредственно с помощью bzip2 bzip2 должен быть уже установлен  
-J Сжимает или распаковывает архив непосредственно с помощью xz xz должен быть уже установлен; обратите внимание на капитализацию  
-k Предотвращает перезапись уже существующих файлов при извлечении из архива    
-p Сохраняет привилегии доступа во время извлечения    
-r Добавляет файл к существующему архиву (воссоздать) Файл прикрепляется к задней части архива; работает только с несжатым архивом  
-t Отображает содержимое архива (таблица)  
-u Прикрепляет только те файлы, которые моложе их соответствующих версий в архиве    
-v Отображает шаги, выполняемые при архивировании (verbose)  
-vv Отображает подробную информацию об архивации (очень подробная)  
-w Каждое действие должно быть подтверждено    
-x Извлекает файлы из архива (извлечь) Файлы остаются в архиве  
-A Присоединяет файлы существующего архива к другому архиву. Обратите внимание на капитализацию  
-C Выводит местоположение, из которого должны быть извлечены файлы Обратите внимание на капитализацию  
-M Создает, отображает или извлекает архив, состоящий из нескольких частей Обратите внимание на капитализацию  
-L Изменяет носитель до определенного размера файла Размер выводится в килобайтах; обратите внимание на капитализацию  
-W Проверяет архив после его записи. Обратите внимание на капитализацию  
-P Архивирует все файлы из корневого каталога Обратите внимание на капитализацию  
—exclude Исключает файлы или папки Указывается после команды создания с помощью —exclude=<File/Folder>  
-X Считывает список с исключенными файлами Требуется ранее созданный список: -X<List>.list; обратите внимание на капитализацию  
-g Создает журнал всех каталогов, включая контрольные суммы.    

При создании tar-архивов у вас также есть возможность создавать подстановочные знаки со звездочкой. Если вы создаете новый архив, всегда указывайте сначала опции, затем имена файлов архива, который вы хотите создать, и, наконец, файлы и папки, которые он должен содержать. В следующем примере создайте архив (-c) из двух текстовых файлов, сожмите его с помощью gzip (-z) и запишите в файл archive.tar.gz (-f):

tar -czf archive.tar.gz example_1.txt example_2.txt

Если вы хотите объединить в архив все текстовые файлы в каталоге, используйте соответствующий подстановочный знак:

tar -cf text_archiv.tar *.txt

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

tar -cf archive.tar --exclude=”/directory1/subdirectory_x” /directory_1

В следующем примере вы извлекаете (-x) сжатый (-z) архив, который мы создали в первом примере, в другой каталог (-C):

tar -xzf archive.tar.gz -C /home/directory1/archive_directory

Чтобы добавить еще один файл в архив (который должен быть несжатым), введите следующую команду:

tar -rf archive.tar example_extra.txt

Как работает резервное копирование tar?

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

Создание простой резервной копии с помощью tar

Для стратегии безопасности имеет смысл создать сценарий резервного копирования для архивации системы вместо того, чтобы просто выполнять архивацию вручную. Таким образом, вы сможете автоматически архивировать несколько каталогов, сжимать их или переносить на внешнее устройство хранения. Для этого важно, чтобы вы были полностью авторизованы для чтения и записи в соответствующих каталогах. Сначала создайте каталог под названием bin в вашем домашнем каталоге (если у вас его еще нет) и создайте в нем скрипт. Вам нужно будет самостоятельно модифицировать приведенный ниже пример скрипта в соответствии с вашими потребностями и структурой каталогов:

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M%S)
BACKUP_DIR="/targetdirectory/backup"
SOURCE="$HOME/sourcedirectory"
tar -cvzpf $BACKUP_DIR/backup-$DATE.tar.gz $SOURCE

Чтобы вы поняли, что именно делает этот скрипт, мы объясним его построчно:

  1. Первая строка — это так называемый Shebang, который сообщает операционной системе, какую программу интерпретатора она должна использовать. В данном случае это bash.
  2. Каждая резервная копия с помощью tar содержит метку времени. Это важно для того, чтобы можно было безопасно отделить несколько резервных копий друг от друга. Переменные имеют следующий формат, например: Год-Месяц-День-ЧасМинутаСекунда, так, например, 2017-09-07-152833.
  3. Здесь указывается каталог, в котором должна быть создана резервная копия. При этом последняя поддиректория не заканчивается на «/».
  4. В этой строке вы указываете, какие каталоги вы хотите включить в архив. Здесь также можно указать несколько каталогов, разделенных только пробелом: SOURCE=»$HOME/sourcedirectory1 $HOME/sourcedirectory2 «. В этой позиции также нет «/» в конце каталогов. В любом случае, обратите внимание, чтобы перед закрывающей кавычкой был пробел.
  5. Последняя строка скрипта, наконец, содержит команду tar:
    • -cvzpf создает архив (-c), шаги отображаются (-v), он сжимается с помощью gzip (-z), права доступа сохраняются (-p), и все выводится в следующий файл (-f). В большинстве случаев параметры -v и -p являются необязательными, и у вас есть возможность добавить дополнительные опции для настройки резервного копирования.
    • В завершение сообщите tar с помощью переменной $SOURCE, что именно должно быть заархивировано. Вполне возможно, что вы также можете исключить каталоги или файлы с помощью —exclude или -X, которые не должны быть включены в резервную копию.
    • $BACKUP_DIR/backup-$DATE.tar.gz обозначает каталог ($BACKUP_DIR) и файл, в котором должна быть сохранена резервная копия. В нашем примере мы даем имя этой резервной копии, за которым следует отметка текущего времени. Имя файла дополняется указанием формата, в котором создается файл. Если вы хотите использовать другое сжатие, не забудьте изменить как формат файла, так и опцию в команде.

Совет

В принципе, в Linux и Unix не играет роли, какое окончание вы даете файлу сценария. Системы считывают тип файла, сравнивая структуру файла с магическим файлом. Он имеет дело с базой данных, обычно находящейся в /etc/magic. В любом случае, стало обычным делом указывать расширения файлов, чтобы вам, как пользователю, было легче за всем следить.

Теперь сохраните файл с именем backup в каталоге bin и добавьте этот путь в переменную PATH:

PATH=$PATH:$HOME/bin

Вам все еще нужно сделать созданный вами сценарий резервного копирования исполняемым:

chmod u+x $HOME/bin/backup

Это делает файл исполняемым только для вас (u). Вы также можете назначить права доступа группе (g), другим (o) или всем (a). Теперь вы закончили и можете запускать сценарий:

sudo backup

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

tar -xzf backup.tar.gz -C /

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

Примечание

При создании архива с абсолютными спецификациями пути tar возвращает сообщение: «tar: remove leading «/» from member names». Это не сообщение об ошибке, а скорее замечание о мерах предосторожности для процесса восстановления: tar делает путь home/subdirectory из /home/subdirectory. Если при извлечении архива вы находитесь не в корневом каталоге, tar создает новую структуру каталогов, например: /home/subdirectory/home/subdirectory. Это уменьшает вероятность случайной перезаписи всей системы. Помните: Unix не спрашивает перед перезаписью. Если вы действительно хотите заменить существующее содержимое, вы должны сначала перейти в корневой каталог. Но это можно обойти с помощью опции -P.    

Что такое инкрементное резервное копирование?

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

Инкрементное резервное копирование всегда требует полного резервного копирования. Сначала нужно один раз заархивировать всю систему (или, по крайней мере, ту часть, которую вы хотите заархивировать). После этого при инкрементном резервном копировании сохраняются только новые или измененные файлы. Это позволяет получить гораздо меньший объем данных, но требует больше усилий при восстановлении. При восстановлении резервной копии вам понадобится последняя полная резервная копия, а также все инкрементные резервные копии, сделанные с тех пор. Если какой-либо файл будет потерян (что сегодня менее вероятно, чем во времена использования магнитных лент), резервная копия будет неполной.

Создание инкрементных резервных копий с помощью tar

С помощью tar можно создавать регулярные инкрементные резервные копии. Вы также можете написать свой собственный сценарий резервного копирования. Например, можно указать, что полная резервная копия должна создаваться раз в месяц, а инкрементная — ежедневно. Следующий сценарий также обеспечивает регулярное перемещение старых резервных копий в папки, отсортированные по дате. В дополнение к tar вам также понадобится cron. Этот демон (программа, работающая в фоновом режиме) позволяет выполнять другие процессы по времени и всегда входит в комплект поставки Ubuntu. Сначала откройте другой текстовый редактор и создайте этот скрипт:

#!/bin/bash
BACKUP_DIR=“/targetdirectory/backup”
ROTATE_DIR=“/targetdirectory/backup/rotate”
TIMESTAMP=“timestamp.dat”
SOURCE=“$HOME/sourcedirectory ”
DATE=$(date +%Y-%m-%d-%H%M%S)
EXCLUDE=“--exclude=/mnt/*--exclude=/proc/*--exclude=/sys/*--exclude=/tmp/*”
cd /
mkdir -p ${BACKUP_DIR}
set -- ${BACKUP_DIR}/backup-??.tar.gz
lastname=${!#}
backupnr=${lastname##*backup-}
backupnr=${backupnr%%.*}
backupnr=${backupnr//?/0}
backupnr=$[10#${backupnr}]
if [ “$[backupnr++]” -ge 30 ]; then
  mkdir -p ${ROTATE_DIR}/${DATE}
  mv ${BACKUP_DIR}/b* ${ROTATE_DIR}/${DATE}
  mv ${BACKUP_DIR}/t* ${ROTATE_DIR}/${DATE}
  backupnr=1
fi

backupnr=0${backupnr}
backupnr=${backupnr: -2}
filename=backup-${backupnr}.tar.gz
tar -cpzf ${BACKUP_DIR}/${filename} -g ${BACKUP_DIR}/${TIMESTAMP} -X $EXCLUDE ${SOURCE}

Для этого сценария резервного копирования мы также объясним шаг за шагом, что происходит:

  • Сначала снова определите интерпретатор.
  • Затем установите переменные. Новыми дополнениями являются каталог для ротации резервных копий (разновидность архива резервных копий) и файл для временной метки.
  • В нашем примере мы показываем, что не всегда имеет смысл брать с собой в резервную копию все каталоги. В данном случае мы исключили содержимое папок mnt, proc, sys и tmp (но не сами папки, отсюда и «*»). Файлы в этих каталогах либо временные, либо создаются заново при каждом запуске системы.
  • Чтобы убедиться, что все пути интерпретируются правильно, скрипт переключается в корневой каталог с помощью команды cd /.
  • Создайте резервный каталог с помощью mkdir, если он еще не существует.
  • Теперь все переменные введены. Поскольку вы хотите нумеровать свои резервные копии последовательно, блок кода определяет номер последней резервной копии. Это делается путем удаления других частей имени файла в скрипте.
  • Одновременно записывается только 30 резервных копий, после чего сценарий перемещает все архивные файлы в папку ротации. Она создается первой, а затем все файлы, начинающиеся с букв b и t, перемещаются в новую папку. Ограничение на буквы объясняется тем, что в папке должны быть только файлы, помеченные этими признаками: backup и timestamp. Наконец, скрипт сбрасывает номер резервной копии на 1. Если ваш скрипт обнаружит, что 30 резервных копий еще не создано, он просто увеличит номер файла на 1 (++).
  • Теперь сценарий делает то, что он сделал в начале: Команды убеждаются, что имя файла снова полное — с новым номером.
  • Наконец, сценарий запускает собственно команду tar: В отличие от команды простого полного резервного копирования, здесь имеются дополнительные опции. С помощью параметра -g включается инкрементное резервное копирование. Для этого tar считывает временную метку каждого файла, сравнивает ее с данными, записанными на данный момент в файле timestamp.dat, и затем определяет, какие изменения были сделаны с момента последнего резервного копирования. Только они становятся частью нового архива.
Примечание

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

На этом сценарий создания инкрементной резервной копии с помощью tar завершен: Сохраните файл как резервную копию в каталоге bin. Вам также нужно экспортировать сюда путь и сделать сценарий исполняемым:

PATH=$PATH:$HOME/bin
chmod u+x $HOME/bin/backup

Теоретически, теперь вы можете запустить сценарий резервного копирования с помощью sudo backup. Но идея инкрементного резервного копирования заключается в том, что процесс автоматически запускается каждый день. Для этого вы получаете доступ к cron и изменяете так называемый Crontab. Это таблица, которая задает порядок выполнения заданий cron. Она состоит из шести разделов:

Минуты (0-59) Часы (0-23) Дни (1-31) Месяцы (1-12) Дни недели (0-7) Задача

В этих разделах вы можете ввести либо соответствующее числовое значение (указано в круглых скобках), либо звездочку (*). Последний вариант в принципе подходит для всех возможных значений. Особенностью является раздел «Дни недели». Здесь вы можете установить, что задание будет выполняться, например, каждый понедельник (1) или только в будние дни (1-5). Воскресенье может быть задано с помощью двух различных значений: 0 или 7 относится к воскресенью, так как для одних людей в этот день начинается неделя, а для других — заканчивается.

В командной строке откройте режим редактора cron с:

sudo crontab –e

Здесь введите следующую строку:

30 7 * * * /home/bin/backup

Это означает, что резервное копирование будет выполняться в 7:30 утра каждый день (и каждый месяц, независимо от дня недели). Сохраните изменения, и ежедневное инкрементное резервное копирование готово к использованию.

Примечание

Cron работает только в том случае, если ваша система запущена. Для веб-серверов это должно быть так в любом случае. Но если вы планируете установить скрипт для резервного копирования вашего ПК или ноутбука, то вам нужно убедиться, что устройство также запущено в 7:30 каждый день. Если устройство не активно, резервное копирование просто не произойдет. Одну из возможностей избежать этого предлагает программа anacron. Эта программа откладывает запланированное действие до того момента, когда устройство снова станет активным.

Восстановление системы из резервной копии

Никто никогда никому не пожелает этого, но иногда случается худшее, и систему необходимо полностью восстановить. С помощью tar это также относительно легко сделать и не требует дополнительных сценариев. Однако одна команда для полной резервной копии невозможна: в природе инкрементных резервных копий существует необходимость распаковки нескольких файлов. В консоли введите эти командные строки:

BACKUP_DIR=/targetdirectory/backup
cd /
for archive in ${BACKUP_DIR}/backup-*.tar.gz; do
tar -xpzf $archive -C /
done
Примечание

При восстановлении системы из резервной копии все каталоги и важные файлы перезаписываются.

Чтобы не пришлось извлекать каждый архивный файл по отдельности, используйте цикл for:

  1. На первом этапе определите каталог, содержащий резервные копии.
  2. С помощью команды cd / перейдите в корневой каталог, чтобы убедиться, что архив будет извлечен в нужное место.
  3. Теперь запустите цикл for: Эта команда повторяет все действия между do и done до тех пор, пока не будут выполнены все варианты. Чтобы задать команду, снова укажите путь к вашим резервным копиям со звездочкой в качестве подстановочного знака, поскольку вы хотите распаковать все файлы архива в этом каталоге.
  4. Команда tar задается следующим образом: Вы извлекаете (-x), сохраняя права доступа (-p), и распаковываете (-z) архив (-f $archive) в корневой каталог (-C /).
  5. После этого установите конец цикла.

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

В этом и заключается суть инкрементного резервного копирования: Полное восстановление системы. С небольшим отступлением можно даже восстановить только один файл и получить ранее заархивированную последнюю версию. Проделайте это в два этапа:

BACKUP_DIR=/targetdirectory/backup
ls -l ${BACKUP_DIR}
for archive in ${BACKUP_DIR}/backup-*tar.gz; do
tar -tzf $archive | grep searched-file;
done

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

  1. Снова определите каталог резервного копирования.
  2. Используйте команду ls для отображения всех файлов и папок в каталоге резервного копирования. Опция -l позволяет получить подробную информацию.
  3. Запустите цикл, например, для восстановления всего архива.
  4. Важное изменение содержится в опциях команды tar: Вместо создания (c) или извлечения (x) архива, отобразите содержимое архива (t). Но поскольку вы не хотите искать файл самостоятельно, передайте вывод команде grep с помощью трубы (вертикальной линии). Это позволит найти в выводе (то есть в содержимом архива) искомый файл.
  5. Завершите цикл.

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

for archive in ${BACKUP_DIR}/backup-*.tar.gz; do
tar -xzf $archive -C / targetdirectory/backup/searched-file
done

Теперь файл восстанавливается в исходное место и перезаписывает возможную более новую версию.

Оцените статью
cdelat.ru
Добавить комментарий