Написал скрипт для дампа. Помогите допилить.

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Lehan
рядовой
Сообщения: 44
Зарегистрирован: 2008-05-29 12:55:10

Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение Lehan » 2008-07-07 15:43:37

"Есть два типа системных администраторов: те, которые не делают бэкапы и те, которые теперь уже делают" (с) не помню кто
Так вот, я теперь отношусь ко второму типу и, в связи с этим, озаботился проблемой автоматизированного бэкапа. Хотелось простое и надежное решение. Пробовал amanda - впечатлило, но решение не очень тривиальное и прежде чем восстанавливать из бэкапа пришлось бы читать доки.
Выбор пал на стандартный набор из dump и restore.

Написал небольшой скрипт для автоматизации процесса бэкапа.

Суть сводится к следующему:
В /mnt/backup подмонтировано NAS-устройство с массивом и поддержкой NFS. Вобщем сути это не меняет, можно и на отдельный физический диск бэкапить. Скрипт при запуске читает файл /usr/local/etc/backup_fs.conf и выдергивает из него названия разделов (типа da2s1a и т.д.). После чего в цикле выполняет команду dump с параметрами описанными в переменных dump_flags, backup_dir.
Backup level задается исходя из текущего дня недели, т.е. вот так:

Код: Выделить всё

case $day_of_week in
    0) dump_level="1" ;;
    1) dump_level="2" ;;
    2) dump_level="1" ;;
    3) dump_level="2" ;;
    4) dump_level="3" ;;
    5) dump_level="4" ;;
    6) dump_level="0" ;;
esac
Соответственно, 0 - это воскресенье, 1 - понедельник и т.д.
Полный бэкап делаем в субботу, чтобы у скрипта была возможность продолжать работу и в воскресенье (когда данных много - полный бэкап у меня делается 28 часов).
В остальные дни - инкрементный бэкап.
dump при запуске проверяет файл /etc/dumpdates (man dump на предмет ключа -u) и берет из него дату последнего бэкапа и уровень этого бэкапа. Исходя из этих данные он решает какие файлы были изменены с последнего бэкапа. Вобщем в man dump более понятным языком описан принцип работы возрастающего бэкапа.

Хотелось бы получить комментарии или идеи по доработке этого скрипта. Или может быть кто-нибудь поделится своими скриптами для dump'а? Вобщем критика и комменты приветствуются.

Файл backup_fs.sh (у меня расположен в /usr/local/bin)

Код: Выделить всё

#!/bin/sh
#
# Files, directories and other options
#

# Path to the configuration file
config_file="/usr/local/etc/backup_fs.conf"

# Path where we will store the backup files (without last slash).
backup_dir="/mnt/backup"

# Log file path.
log_file="/var/log/backup_fs.log"

# Start the dump script with the following flags (see man dump for more options).
dump_flags="-L -u -C 32 -f -"

day_of_week="`date +%w`"
date_time="`date +%d.%m.%Y' '%H:%M`"

# Default backup level. If something wrong with calculating current backup level.
dump_level="0"

#
# Start working
#

# Check if backup directory exist
if [ ! -d $backup_dir ] ; then
    echo $date_time Fatal error! No such directory: $backup_dir>>$log_file
    exit 1
fi

# Read the configuration file
. ${config_file}

# 0 - Sunday, 1 - Monday, ..., 6 - Saturday
# Other numbers: incremental backup levels
# Now we can make full backup (level 0) every Saturday (6)
case $day_of_week in
    0) dump_level="1" ;;
    1) dump_level="2" ;;
    2) dump_level="1" ;;
    3) dump_level="2" ;;
    4) dump_level="3" ;;
    5) dump_level="4" ;;
    6) dump_level="0" ;;
esac

for device in ${devices}
do
    dump -${dump_level} ${dump_flags} /dev/${device} > ${backup_dir}/dump_${device}_${day_of_week}_${dump_level}.img
    echo $date_time Successfully dumped /dev/${device} to ${backup_dir}>>${log_file}
done

# EOF
Файл конфигурации backup_fs.conf (у меня расположен в /usr/local/etc)

Код: Выделить всё

#
# The default path of this file is /usr/local/etc/backup_fs.conf
# Filesystems to backup (without /dev/).
#

devices="da2s2a da2s2e da2s4d"
Хотелось бы научиться проводить на шелле проверку выполнения команды. Т.е. если dump вышел в errorlevel 0 тогда пришем в лог successfully, если с errorlevel 1 - тогда failed.
Еще хотел сделать так, чтобы названия разделов брались из fstab или хотя бы с вывода команды mount. Но не умею. Есть идеи как?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение terminus » 2008-07-07 20:31:49

$? - код выполнения предыдущей команды

Код: Выделить всё

if [ "$?" -eq "0" ]; then
делать это если предыдцщая команда закончилась с errorlevel 0 (без ощибок)
fi
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

void*
ефрейтор
Сообщения: 52
Зарегистрирован: 2008-01-03 13:25:13
Контактная информация:

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение void* » 2008-07-07 20:45:49

У меня кстати по непонятным мне причинам дамп "живой" ФС делался некорректно, хотя ключ -L был указан. Во время restore-а вилазило куча сообщений, уже не помню точно каких, і после рестора на диске физически отсутствовала _половина_ файлов :( несколько дней потом переустанавливал и настраивал все :(

Аватара пользователя
Morty
ст. лейтенант
Сообщения: 1370
Зарегистрирован: 2007-07-17 23:25:12

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение Morty » 2008-07-07 23:01:07

если есть желание, может кончено не совсем то что тебе нада ,
но можно еще из портов поставить clonehdd, никаких скриптов писать не нада,
считай готовый фронтенд(хоть и ставит в рамки) к dump/restore и по крону бэкапить ....

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение zg » 2008-07-08 5:32:25

Lehan писал(а):Еще хотел сделать так, чтобы названия разделов брались из fstab или хотя бы с вывода команды mount. Но не умею. Есть идеи как?
слишком грамотно скрипт написан для "не умею", если кочено его написал ты.
Lehan писал(а):man dump
если маном умеешь пользоваться, то почему не умеешь пользоваться шеллом? man sh тебе всё поведает.

Lehan
рядовой
Сообщения: 44
Зарегистрирован: 2008-05-29 12:55:10

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение Lehan » 2008-07-08 9:34:57

zg писал(а):
Lehan писал(а):Еще хотел сделать так, чтобы названия разделов брались из fstab или хотя бы с вывода команды mount. Но не умею. Есть идеи как?
слишком грамотно скрипт написан для "не умею", если кочено его написал ты.
Просто есть большой опыт работы с php.
Lehan писал(а):man dump
если маном умеешь пользоваться, то почему не умеешь пользоваться шеллом? man sh тебе всё поведает.[/quote]

man sh не впечатлил. Особенно после мануалов для php. Нашел доку "Advanced Bash Scripting" - вот там все есть.

Lehan
рядовой
Сообщения: 44
Зарегистрирован: 2008-05-29 12:55:10

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение Lehan » 2008-07-08 9:36:52

Morty писал(а):если есть желание, может кончено не совсем то что тебе нада ,
но можно еще из портов поставить clonehdd, никаких скриптов писать не нада,
считай готовый фронтенд(хоть и ставит в рамки) к dump/restore и по крону бэкапить ....
Дело в том, что я в этот скрипт включу потом и бэкап БД. Сейчас это делается отдельным скриптом. Да и все-таки хочется стандартными средствами. Ибо, например, с amanda я не понял как потом восстанавливаться.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение zg » 2008-07-08 11:13:47

Lehan писал(а):man sh не впечатлил. Особенно после мануалов для php.
ну, он не сразу даётся, но там есть вся нужная информация.
Lehan писал(а):Нашел доку "Advanced Bash Scripting" - вот там все есть.
bash это немного другое, не стоит путать.

Lehan
рядовой
Сообщения: 44
Зарегистрирован: 2008-05-29 12:55:10

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение Lehan » 2008-07-08 11:27:42

Допилил вот до такого состояния:

Код: Выделить всё

#!/bin/sh
#
# Files, directories and other options
#

# Path to the configuration file
config_file="/usr/local/etc/backup_fs.conf"

# Path where we will store the backup files (without last slash).
backup_dir="/mnt/backup"

# Log file path.
log_file="/var/log/backup_fs.log"

# Start the dump script with the following flags (see man dump for more options).
dump_flags="-L -u -C 32 -f -"

day_of_week="`date +%w`"
date_time="`date +%d.%m.%Y' '%H:%M`"

# Default backup level. If something wrong with calculating current backup level.
dump_level="0"

#
# Start working
#

# Check if backup directory exist
if [ ! -d $backup_dir ] ; then
    echo $date_time Fatal error! No such directory: $backup_dir>>$log_file
    exit 1
fi

# Check if configuration file exist
if [ ! -f $config_file ] ; then
    echo $date_time Fatal error! Configuration file not found: $config_file>>$log_file
    exit 1
fi

# Read the configuration file
. ${config_file}

# 0 - Sunday, 1 - Monday, ..., 6 - Saturday
# Other numbers: incremental backup levels
# Now we can make full backup (level 0) every Saturday (6)
case $day_of_week in
    0) dump_level="1" ;;
    1) dump_level="2" ;;
    2) dump_level="1" ;;
    3) dump_level="2" ;;
    4) dump_level="3" ;;
    5) dump_level="4" ;;
    6) dump_level="0" ;;
esac
for device in ${devices}
do
    dump -${dump_level} ${dump_flags} /dev/${device} > ${backup_dir}/dump_${device}_${day_of_week}_${dump_level}_tmp.img
    if [ "$?" -eq "0" ]; then
        rm -f ${backup_dir}/dump_${device}_${day_of_week}_${dump_level}.img
        mv ${backup_dir}/dump_${device}_${day_of_week}_${dump_level}_tmp.img ${backup_dir}/dump_${device}_${day_of_week}_${dump_level}.img
        echo $date_time Successfully dumped /dev/${device} to ${backup_dir}>>${log_file}
    elif [ "$?" -eq "1" ]; then
        echo $date_time Dump failed: /dev/${device} to ${backup_dir}>>${log_file}
    fi
done

# EOF
Добавил проверку на существования файла конфига (мало ли удалю случайно). Добавил проверку на errorlevel dump'а. Если 0 - то все ок: удаляем старый бэкап, берем файл _tmp.img и переименовываем в нормальное имя. Если 1 - ругаемся в лог.

Аватара пользователя
Morty
ст. лейтенант
Сообщения: 1370
Зарегистрирован: 2007-07-17 23:25:12

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение Morty » 2008-07-08 11:55:59

можно еще сжатие добавить ...место сэкономит гдето в 2 раза(правда по времени дольше будет)

Код: Выделить всё

/dev/${device} > ${backup_dir}/dump_${d
гзипить или бзипить :good:

Код: Выделить всё

/dev/${device} | gzip > ${backup_dir}/dump_${d
/dev/${device} | bzip2 > ${backup_dir}/dump_${d

Lehan
рядовой
Сообщения: 44
Зарегистрирован: 2008-05-29 12:55:10

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение Lehan » 2008-07-08 12:08:24

Morty писал(а):можно еще сжатие добавить ...место сэкономит гдето в 2 раза(правда по времени дольше будет)
Сильно дольше получается. Особенно при full backup.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35439
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Написал скрипт для дампа. Помогите допилить.

Непрочитанное сообщение Alex Keda » 2008-07-08 21:46:49

гзипом - не сильно дольше, не рассказывайте.
про шелл - http://www.lissyara.su/?id=1075
=======
баш - это не родное. шелл - есть везде.
Убей их всех! Бог потом рассортирует...