Главная | Контакты



Главная > Операционные системы > UNIX > BSD > FreeBSD

Простая система бэкапа для Unix или средство от бессоницы

Автор: nmind . konstantin kalachev

Введение

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

В этом туториале описан способ установки скриптов в /usr/local/tools/backup а самих бэкапов в /usr/local/backup. Будте внимательны, если захотите изменить эти пути.

Инсталяция

Вся инсталяция заключается в создании рабочей директории, скачивании архива со скриптами и их распаковки

# mkdir -p /usr/local/tools
# cd /tmp
# wget backup.2006.03.tutorial.ru.tar.gz
# tar -zxvf backup.2006.03.tutorial.ru.tar.gz -C /usr/local/tools
# rm -f backup.2006.03.tutorial.ru.tar.gz
# chmod -R 644 /usr/local/tools/backup

Теперь в директории /usr/local/tools/backup находятся семь файлов. Вкраце о всех:
backup_daily.sh - делает ежедневный бэкап
backup_weekly.sh - копирует ежедневный бэкап в папки с еженедельным бэкапом
backup_monthly.sh - копирует ежедневный бэкап в папки с ежемесячным бэкапом
backup_single.sh - создает архив из указаной директории или файла
backup_list.sh - создает по архиву на каждую поддиректорию или подфайл
exclude.txt - текстовый файл, содержащий пути, которые не должны бэкапиться
crontab - строки, которые должны быть добавлены в /etc/crontab

Скрипты backup_single.sh и backup_list.sh

Обоим скриптам на вход нужно давать два параметра:
1. Директория или файл, которые будут бэкапиться
2. Директория, куда будет складываться бэкап

backup_single.sh делает один файл из директории или файла. То есть, если вы хотите забэкапить директорию /home/www/some.ru в /usr/local/backup/daily/www , то команда "backup_single.sh /home/www/some.ru /usr/local/backup/daily/www" сделает в директории /usr/local/backup/daily/www только один архив (файл), в котором будет все содержимое директории /home/some.ru. Он будет называться /usr/local/backup/daily/www/YYYY.MM.DD/YYYY.MM.DD-HH.MM.SS-some.ru.tar.gz . Такое непростое название файла обеспечивает его уникальность и информативность, что важно для бэкапа.

backup_list.sh делает отдельный архив на каждую поддиректорию. Зачем это нужно? Например для очень больших директорий, каждый подкаталог которых является отдельным сайтом. Итак, если в /home/www находится несколько каталогов (some.ru, another.ru, site.ru), то команда "backup_list.sh /home/www /usr/local/backup/daily/www" сделает в /usr/local/backup/daily/www три архива из каталогов some.ru, another.ru, site.ru

Файл exclude.txt

Так же в нашей системе бэкапа должен присутствовать файл exclude.txt . В него пишутся все файлы и дериктории, которые не должны попасть в архив.

В этот файл можно записывать как имена директорий, которые вы не хотите архивировать, с полными путями, так и строки, которые они могут включать. Например, если вы не хотите архивировать все папки с именами Maildir и конкретно папку /home/www/tutorial.ru/tmp , то файл exclude.txt будет выглядеть так

Maildir
/home/www/tutorial.ru/tmp

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

Скрипты backup_daily.sh , backup_weekly.sh и backup_monthly.sh / Основная настройка

Самым важным из них является backup_daily.sh, в нем описаны все директории и файлы, которые нужно бэкапить. В приведеном примере директория /var/lib/mysql будет сохраняться в директорию /usr/local/backup/daily/mysql_data как несколько файлов с помощью backup_list.sh. А директория /usr/local/apache/conf будет сохраняться в /usr/local/backup/daily/apache_conf одним файлом с помощью backup_single.sh. Таким образом каждая база mysql будет сохранена в отдельный архив, а вся конфигурация apache будет сохранена в один архивный файл.

Это содержимое backup_daily.sh. Замените приведеные примеры с базой mysql и конфигурацией apache на свои параметры. Например для бэкапа директории /home/www подойдет такая строчка "sh ${SCRIPT_ROOT}/backup_list.sh /home/www ${BACKUP_ROOT}/www"

#!/bin/sh
### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ###
###
### © tutorial.ru / nmind / konstantin kalachev
### -== look for more tutorials in Russian on http://tutorial.ru ==-
###
### date: 2006.03.22
###
### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ###
BACKUP_ROOT=/usr/local/backup/daily
SCRIPT_ROOT=/usr/local/tools/backup
rm -rf ${BACKUP_ROOT}/*
sh ${SCRIPT_ROOT}/backup_list.sh /var/lib/mysql ${BACKUP_ROOT}/mysql_data
sh ${SCRIPT_ROOT}/backup_single.sh /usr/local/apache/conf ${BACKUP_ROOT}/apache_conf
Скрипт backup_weekly.sh занимается тем, что копирует всю информацию из папки /usr/local/backup/daily в /usr/local/backup/weekly .

Содержимое файла backup_weekly.sh :

#!/bin/sh
### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ###
###
### © tutorial.ru / nmind / konstantin kalachev
### -== look for more tutorials in Russian on http://tutorial.ru ==-
###
### date: 2006.03.22
###
### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ###
BACKUP_ROOT=/usr/local/backup/weekly
BACKUP_DAILY=/usr/local/backup/daily
rm -rf ${BACKUP_ROOT}/*
cp -R ${BACKUP_DAILY} ${BACKUP_ROOT}
Скрипт backup_monthly.sh делает тоже самое. Копирует все их папки /usr/local/backup/daily в /usr/local/backup/monthly

Содержимое файла backup_monthly.sh :

#!/bin/sh
### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ###
###
### © tutorial.ru / nmind / konstantin kalachev
### -== look for more tutorials in Russian on http://tutorial.ru ==-
###
### date: 2006.03.22
###
### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ###
BACKUP_ROOT=/usr/local/backup/monthly
BACKUP_DAILY=/usr/local/backup/daily
rm -rf ${BACKUP_ROOT}/*
cp -R ${BACKUP_DAILY} ${BACKUP_ROOT}

Важно! Перед тем, как новый бэкап будет сохранен в директорию, старый будет оттуда удаляться. При этом используется команда "rm -rf" . Будте предельно внимательны, если захотите изменить пути в скриптах на свои, чтобы скрипты, сделаные для сохранности информации не стали работать прямо противоположным способом.

Проверка

После того, как все будет настроено можно попробывать запустить каждый из скриптов по отдельности

# sh /usr/local/tools/backup/backup_daily.sh
# sh /usr/local/tools/backup/backup_weekly.sh
# sh /usr/local/tools/backup/backup_monthly.sh

Все работает правильно? Тогда можно продолжать дальше.

Файл crontab

В нем находятся три строчки, которые нужно вставить в /etc/crontab .

00      04      *       *       *       root    sh /usr/local/tools/backup/backup_daily.sh
00      05      *       *       6       root    sh /usr/local/tools/backup/backup_weekly.sh
00      06      *      15       *       root    sh /usr/local/tools/backup/backup_monthly.sh

Таким образом backup_daily.sh будет запускаться в 4 часа ночи каждый день, backup_weekly.sh в 5 часов ночи каждую субботу, backup_monthly.sh в 6 часов ночи каждое 15-е число.

Если вы захотите вставить их в свой кронтаб с помощью команды "crontab -e", не забудьте убрать параметр root.

P.S.

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

1. Перекачивать бэкапы по сети.
Тут все зависит от того, есть ли у вас такая возможность. Этот способ работает в случае нескольких серверов, желательно находящихся в одном сегменте сети, чтобы не загружать канал и не переводить трафик. На сервере с бэкапами можно сделать ftp-аккаунт, с которого они будут доступны. А второй сервер будет переодически их оттуда через этот ftp-аккаунт скачивать. Для большей безопасности можно поднять ftp-сервер на отдельном порту и открыть туда доступ только для проверенных ip на вашем firewall. Еще один вариантом безопасной передачи данных на другой сервер является sftp. Это передача данных по ssh в зашифрованном виде. Почитайте man sftp.
Аналогичную систему можно организовать и в обратную сторону. И получится, что на сервере А у вас есть бэкап сервера Б, а на Б бэкап А. Если один из них умрет, со второго всегда можно будет достать все необходимое.

2. Переписывать на отдельный винчестер.
Цены на железо падают, а цена на информацию повышается. Подумайте, что проще, купить 120gb IDE винчестер меньше чем за сто долларов или потерять все данные, которые стоят в разы дороже.
Надеюсь, убедил :) В общем, если вы этот винчестер все таки купили, то вот вам мое предложение. После того, как бэкапы сделаны монтировать винчестер (mount) и переписывать их на него, после чего демонтировать (umount). Благодаря этому "rm -rf" ему не страшен. Понятно, что в случае умышленного взлома информацию с него так же могут стереть, но дополнительная безопасность никогда не бывает лишней и в большинстве случаев может помочь.

3. Записывать все на CD руками.
Да, это тоже работает.
Крепких вам снов .)


Главная > Операционные системы > UNIX > BSD > FreeBSD