Сценарии Shell

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

Утилита tar создает один архивный файл из множества файлов и каталогов. tar может также пропускать файлы через утилиты сжатия, уменьшая таким образом размер архивного файла.

Простой Shell сценарий

Следующий shell сценарий использует tar для создания архивного файла на удаленно смонтированной файловой системе. Имя архива определяется с помощью дополнительных утилит командной строки.

#!/bin/sh
####################################
#
# Backup to NFS mount script.
#
####################################

# What to backup. 
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Where to backup to.
dest="/mnt/backup"

# Create archive filename.
day=$(date +%A)
hostname=$(hostname -s)
archive_file="$hostname-$day.tgz"

# Print start status message.
echo "Backing up $backup_files to $dest/$archive_file"
date
echo

# Backup the files using tar.
tar czf $dest/$archive_file $backup_files

# Print end status message.
echo
echo "Backup finished"
date

# Long listing of files in $dest to check file sizes.
ls -lh $dest
~~ **$backup_files**: переменная для перечисления какие каталоги вы желаете сохранять. Список может быть изменен под ваши требования.
~~ **$day**: переменная, содержащая день недели. Она используется для создания архивных файлов на каждый день недели, обеспечивая историю резервного копирования на семь дней. Существуют иные способы получения такого результата, включая использование утилиты **date**.
~~ **$hostname**: переменная, содержащая короткое сетевое имя системы. Использование сетевого имени в имени архива позволяет вам помещать ежедневные архивы от разных систем в один каталог.
~~ **$archive_file**: полное имя архива.
~~ **$dest**: место расположения архивного файла. Каталог должен быть создан и в данном случае смонтирован до выполнения сценария резервного копирования. Смотрите раздел [[wiki:руководство_по_ubuntu_server:файловые_сервера:nfs|Сетевая файловая система (NFS)]] для уточнения деталей использования NFS.
~~ **status messages**: необязательные сообщения, выводимые в консоль с использованием утилиты **echo**.
~~ **tar czf $dest/$archive_file $backup_files**: команда **tar**, используемая для создания архивного файла.
  ~~ **c**: создание архива.
  ~~ **z**: пропускание архива через утилиту сжатия **gzip**.
  ~~ **f**: вывод в архивный файл. В противном случае **tar** будет посылать результат в STDOUT.
~~ **ls -lh $dest**: необязательный оператор, выводящий **//-l//** длинный вариант списка в **//-h//** читаемом виде целевого каталога. Это удобно для быстрой проверки размера архивного файла. Эта проверка не заменяет тестирования целостности архивного файла.

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

Выполнение сценария

Выполнение сценария из терминала

Простейший способ выполнить приведенный выше сценарий - это скопировать его содержимое в файл. Например, backup.sh. Затем ввести в терминале:

sudo bash backup.sh

Это прекрасный способ проверить сценарий, чтобы убедиться что все работает как задумывалось.

Выполнение с помощью cron

Утилита cron может быть использована для автоматизации выполнения сценария. Сервис cron позволяет выполнять сценарии или команды в определенное время.

cron настраивается через записи в файле crontab. Файлы crontab разделяются на поля:

# m h dom mon dow   command
  1. m: минуты запуска команды, от 0 до 59.

  2. h: час запуска команды, от 0 до 23.

  3. dom: день месяца для выполнения команды.

  4. mon: месяц даты выполнения команды.

  5. dow: день недели для выполнения команды, от 0 до 7. Воскресенье может быть обозначено как 0 так и 7, оба значения допустимы.

  6. command: выполняемая команда.

Для добавления или изменения записей в файле crontab используется команда crontab -e. Кроме того, содержимое файла crontab можно просмотреть с помощью команды crontab -l.

Для выполнения сценария backup.sh, приведенного выше с помощью cron, введите следующее в терминале:

sudo crontab -e
Использование sudo для выполнения команды crontab -e изменяет файл crontab пользователя root. Это требуется для резервного копирования каталогов, доступ к которым разрешен только root.

Добавьте следующую запись в файл crontab:

# m h dom mon dow   command
0 0 * * * bash /usr/local/bin/backup.sh

Сценарий backup.sh будет теперь выполняться каждый день в полночь.

Сценарий backup.sh требуется скопировать в каталог /usr/local/bin/ чтобы данная запись выполнялась правильно. Сценарий можно разместить где угодно на файловой системе, просто соответственно измените путь к сценарию в crontab.

Для более глубокого изучения опций crontab смотрите секцию Ссылки.

Восстановление из архива

Как только архив создан, важно проверить архив. Архив может быть проверен выводом списка файлов, которые в нем находятся, но лучшей проверкой будет восстановление файлов из архива.

1. Чтобы посмотреть содержимое архива, наберите в терминале:

tar -tzvf /mnt/backup/host-Monday.tgz

2. Чтобы восстановить файлы из архива в другой каталог введите:

tar -xzvf /mnt/backup/host-Monday.tgz -C /tmp etc/hosts

Параметр -C команды tar перенаправляет извлекаемые файлы в указанный каталог. Приведенный пример извлечет файл /etc/hosts в /tmp/etc/hosts. tar создает заново структуру каталогов для извлекаемых файлов.

Также обратите внимание на отсутствие лидирующего "/" в пути извлекаемого файла.

3. Для восстановления всех файлов архива введите следующее:

cd /
sudo tar -xzvf /mnt/backup/host-Monday.tgz
Это перепишет все файлы, находящиеся в файловой системе.

Ссылки

~~ Для дополнительной информации по shell сценариям смотрите руководство [[http://tldp.org/LDP/abs/html/|Advanced Bash-Scripting Guide]].
~~ Книга [[http://safari.samspublishing.com/0672323583|Teach Yourself Shell Programming in 24 Hours]] доступна в сети и является замечательным ресурсом для создания shell сценариев.
~~ Страница [[https://help.ubuntu.com/community/CronHowto|CronHowto Wiki]] содержит подробности по дополнительным опциям **cron**.
~~ Смотрите руководство [[http://www.gnu.org/software/tar/manual/index.html|GNU tar Manual]] для дополнительных параметров **tar**.
~~ Статья [[http://en.wikipedia.org/wiki/Backup_rotation_scheme|Wikipedia Backup Rotation Scheme]] содержит информацию по другим схемам ротации архивов.
~~ Shell сценарий использует **tar** для создания архива, но существует много других утилит, которые можно использовать. Например:
  ~~ [[http://www.gnu.org/software/cpio/|cpio]]: используется для копирования файлов в и из архива.
  ~~ [[http://www.gnu.org/software/coreutils/|dd]]: часть пакета **coreutils**. Утилита нижнего уровня, которая может копировать данные из одного формата в другой.
  ~~ [[http://www.rsnapshot.org/|rsnapshot]]: утилита получения снимка файловой системы, используемая для получения копий всей файловой системы.
  ~~ [[http://www.samba.org/ftp/rsync/rsync.html|rsync]]: гибкая утилита, используемая для копирования измененных частей файлов (инкрементное копирование).