Главная > Операционные системы > 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
|