Скрипт для архивации файлов linux

Элементарный Bash скрипт для резервного копирования данных

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

В данном случае, мы не будем использовать мощные программы, или даже целые системы для резервного копирования данных, ограничимся самым доступным что у нас есть. А именно — Bash скриптом.

Что должен выполнять наш скрипт?

Бэкапить веб проект, а именно:
— Делать резервную копию базы MySQL.
— Делать резервную копию файлов.
— Структурировать это.

И так, вот наш скрипт:

#!/bin/bash
PROJNAME= #Имя проекта
CHARSET= #Кодировка базы данных (utf8)
DBNAME= #Имя базы данных для резервного копирования
DBFILENAME= #Имя дампа базы данных
ARFILENAME= #Имя архива с файлами
HOST= #Хост MySQL
USER= #Имя пользователя базы данных
PASSWD= #Пароль от базы данных
DATADIR= #Путь к каталогу где будут храниться резервные копии
SRCFILES= #Путь к каталогу файлов для архивирования
PREFIX=`date +%F` #Префикс по дате для структурирования резервных копий

#start backup
echo «[———————————[`date +%F—%H-%M`]———————————]»
echo «[———-][`date +%F—%H-%M`] Run the backup script. »
mkdir $DATADIR/$PREFIX 2> /dev/null
echo «[++———][`date +%F—%H-%M`] Generate a database backup. »
#MySQL dump
mysqldump —user=$USER —host=$HOST —password=$PASSWD —default-character-set=$CHARSET $DBNAME > $DATADIR/$PREFIX/$DBFILENAME-`date +%F—%H-%M`.sql
if [[ $? -gt 0 ]];then
echo «[++———][`date +%F—%H-%M`] Aborted. Generate database backup failed.»
exit 1
fi
echo «[++++——][`date +%F—%H-%M`] Backup database [$DBNAME] — successfull.»
echo «[++++++—-][`date +%F—%H-%M`] Copy the source code project [$PROJNAME]. »
#Src dump
tar -czpf $DATADIR/$PREFIX/$ARFILENAME-`date +%F—%H-%M`.tar.gz $SRCFILES 2> /dev/null
if [[ $? -gt 0 ]];then
echo «[++++++—-][`date +%F—%H-%M`] Aborted. Copying the source code failed.»
exit 1
fi
echo «[++++++++—][`date +%F—%H-%M`] Copy the source code project [$PROJNAME] successfull.»
echo «[+++++++++-][`date +%F—%H-%M`] Stat datadir space (USED): `du -h $DATADIR | tail -n1`»
echo «[+++++++++-][`date +%F—%H-%M`] Free HDD space: `df -h /home|tail -n1|awk ‘‘`»
echo «[++++++++++][`date +%F—%H-%M`] All operations completed successfully!»
exit 0

Запускать можно парой способов:

— Простой запуск: ./backup.sh
— Запуск + запись в лог: ./backup.sh | tee backup.log
— а еще его можно в cron запихать: 00 20 * * 7 root sh /home/bond/backup.sh | tee /home/bond/backup/backup.log
После успешного завершения скрипта, мы увидим следующее:

$ sudo sh backup.sh
[———————————[2009-02-14—12-28]———————————]
[———-][2009-02-14—12-28] Run the backup script.
[++———][2009-02-14—12-28] Generate a database backup.
[++++——][2009-02-14—12-29] Backup database [images] — successfull.
[++++++—-][2009-02-14—12-29] Copy the source code project [itmages].
[++++++++—][2009-02-14—12-29] Copy the source code project [itmages] — successfull.
[+++++++++-][2009-02-14—12-29] Stat datadir space (USED): 1,3G /home/bond/backup
[+++++++++-][2009-02-14—12-29] Free HDD space: 49G
[++++++++++][2009-02-14—12-29] All operations completed successfully!
bond@serv:

В итоге наши бэкапы складываются в каталог который вы указали, + резервные копии лежат в каталогах именованых по дате.

Источник

Простой способ резервного копирования Linux-сервера с выгрузкой файлов по FTP

Здравствуйте.
О важности регулярного резервного копирования уже сказано очень много слов. В этой статье мы предлагаем вниманию читателей примеры простых скриптов для бэкапа файлов и баз данных MySQL с последующей выгрузкой архивов на удаленный FTP-сервер.
Несмотря на то что мы в NQhost предлагаем решения по сохранению snapshot’ов VPS-контейнеров, процесс бэкапа собственными силами — безусловно важнейшая вещь.

Хозяйство

Виртуальный или физический сервер с установленной Linux-ОС, веб-сервером и базами данных MySQL.
Файлы веб-сервера располагаются в директориях
/home/site1
/home/site2
/home/site3

Задача

Создание скрипта для резервного копирования файлов и баз данных с сохранением на удаленном FTP-сервере и запуск его каждый день.

Решение

Для простоты примера работать мы будем из-под root`а, директория для хранения бэкапов файлов — /root/backup/server, а для дампов MySQL — /root/backup/mysql

Backup файлов

Здесь приводится пример скрипта для бэкапа файлов, для наглядности пояснения даны в квадратных скобках на русском языке.

#!/bin/sh
### System Setup ###
BACKUP=/root/backup/server

### FTP ###
FTPD=»/»
FTPU=»username» [имя пользавателя (логин) удаленного ftp-cервера]
FTPP=»megapassword» [пароль доступа к удаленному ftp-серверу]
FTPS=»my_remote_backup.ru» [собственно, адрес ftp-сервера или его IP]

### Binaries ###
TAR=»$(which tar)»
GZIP=»$(which gzip)»
FTP=»$(which ftp)»

## Today + hour in 24h format ###
NOW=$(date +%Y%m%d) [задаем текущую дату и время, чтобы итоговый файл выглядел в виде server-YYYYMMDD.tar.gz]

Читайте также:  Lsi 9260 4i установка windows 10 без raid

mkdir $BACKUP/$NOW
$TAR -cf $BACKUP/$NOW/etc.tar /etc [c целью сохранения настроек для простоты копируем весь /etc ]
$TAR -cf $BACKUP/$NOW/site1.tar /home/site1/
$TAR -cf $BACKUP/$NOW/site2.tar /home/site2/
$TAR -cf $BACKUP/$NOW/site2.tar /home/site3/

$TAR -zcvf $ARCHIVE $ARCHIVED

### ftp ###
cd $BACKUP
DUMPFILE=server-$NOW.tar.gz
$FTP -n $FTPS

Результатом работы данного скрипта будет созданный файл в директории /root/backup/server вида server-ГГГГММДД.tar.gz содержащий в себе tar-архивы директорий /etc, /home/site1, /home/site2 и /home/site3
Этот же файл будет загружен на FTP-сервер, который мы указали в начале скрипта.

Backup баз MySQL

Этим скриптом мы выгружаем базы данных MySQL (делаем т.н. «дампы). Каждая база выгружается в отдельный файл.

#!/bin/sh
# System + MySQL backup script
### System Setup ###
BACKUP=/root/backup/mysql

### Mysql ### [параметры доступа к нашим базам MySQL]
MUSER=»root»
MPASS=»megapassword»
MHOST=»localhost»

### FTP ###
FTPD=»/»
FTPU=»username» [имя пользавателя (логин) удаленного ftp-cервера]
FTPP=»megapassword» [пароль доступа к удаленному ftp-серверу]
FTPS=»my_remote_backup.ru» [собственно, адрес ftp-сервера или его IP]

### Binaries ###
TAR=»$(which tar)»
GZIP=»$(which gzip)»
FTP=»$(which ftp)»
MYSQL=»$(which mysql)»
MYSQLDUMP=»$(which mysqldump)»

## Today + hour in 24h format ###
NOW=$(date +%Y%m%d)

### Create temp dir ###

### name Mysql ###
DBS=»$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse ‘show databases’)»
for db in $DBS
do

Источник

bash: Бэкап без лишнего ПО

Бэкап важной информации — каждый системный администратор сталкивается с такой задачей. Задача казалось бы тривиальная и у многих читателей интереса не вызовет. Но, например, мне бы такая статья в определенный момент помогла бы весьма сильно, поэтому считаю, что этой статье быть.

Задача: Бэкап данных в локальную директорию и на отдельный сервер, с использованием минимума стороннего ПО, логированием и оповещением администратора в jabber при сбоях. Все основные функции большинства ПО для автоматического бэкапа, но без установки оного, а следовательно без его багов (что, собственно, и привело к подобной идее).

А теперь к делу.

Для начала создадим и откроем скрипт

Теперь в скрипте добавим строку

Объявим некоторые переменные.
TN — TASKNAME — имя задания.Используется для вывода в лог и определения названия файла.
Так как заданий несколько (ежемесячное, еженедельное, ежедневное) и писать на каждый случай скрипт было лень, я создал универсальный, в котором надо просто раскомментить нужные строки. Наименование заданий писать надо без пробелов, желательно в латинице, если не хотите проблем с кодировкой и неправильными параметрами команд.

OF — Output File — имя выходного файла. Получается из переменной TN, то есть имени задания.

Объявляем переменную с путем к файлу лога, и далее все сообщения об ошибках и остальном будем выводить в лог.

Сделаем запись в лог о начале бэкапа (дата, время, имя задания)

Есть проблема в том что если указывать в параметрах команд (напр. tar) имена каталогов с пробелами, скрипт срабатывает с ошибкой. Решение найдено на просторах интернета — операционная система linux использует пробел в качестве стандартного разделителя параметров команды. Переопределим стандартный разделитель (хранится в переменной $IFS) отличным от пробела, например \n – знаком переноса строки.
Запоминаем старое значение стандартного разделителя

Заменяем стандартный разделитель своим

SRCD — SouRCe Directory — каталог с данными для бэкапа
Теперь можно перечислять несколько каталогов, разделителем будет перенос строк как мы сами указали строкой выше

TGTD — TarGeT Directory — каталог в который будут складываться бэкапы

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

Сам процесс архивирования в варианте «Создать новый архив»

и в варианте «Обновить файлы в старом архиве»

Во втором случае лучше вместо $OF использовать конктретное имя файла потому что у меня например ежедневно апдэйтится еженедельный архив, а их $TN (имена задания) не совпадают, соответственно и $OF.

Читайте также:  Активаторы windows server 2012 r2 datacenter

В переменной «?» ханится статус выполнения последней команды. Сохраним его, чтобы воспользоваться позже.

Возвращаем стандартный разделитель к исходному значению

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

В процессе мы копируем архив из локального хванилища в удаленное. Естественно, проверяем, что каждая операция успешно завершена, и пишем все в логи.
Для отсылки сообщения администратору я использую XMPP сообщение, так как в организации поднят Jabber-сервер, и я больше люблю получить быстрое сообщение о сбое, чем лезть в почту, вбивая пароли, тыкая на ссылки, и ожидая пока браузер мне все отобразит. В любом случае никто не мешает вам использовать sendmail вместо sendxmpp.
Файл /usr/local/etc/XMPP_settings следующего содержания:

В файле fstab строка описывающая подключение шары Windows

Теперь осталось только добавить задание в cron. Это можно сделать с помощью файла /etc/crontab, но я, в силу привычки к GUI, оставшейся в наследство от виндовс, пользую вэб-интерфейсы для таких случаев. Команда должна выполняться с правами рута, то бишь, к примеру, sudo bash backup_script. Добавляя команду в cron можно определить что она будет сразу выполняться от имени root`а

В ходе обсуждений затронули проблему разрастания логов. Пошел по простейшему (на мой взгляд) пути: будем хранить только последние N строк лога, например 300. В скрипт добавятся две строки, в которых мы сохраним последние 300 строк лога во временный файл, потом затрем им лог

Источник

Warl0ck’s Blog

Про GNU/Linux и софт вообще

Backup в Linux: Самописные скрипты v2

Как и обещал, переписал с нуля пост о бэкапе. Честно говоря, это первый пост, на написание которого я потратил полтора дня (с перерывами конечно), а не 5 минут. Поэтому хотелось бы прочитать отзывы о стиле изложения и какие-то конкретные замечания.

Разумеется, создавать резервные копии данных и целых разделов в Linux можно разными способами. Можно пользоваться коммерческими или бесплатными системами резервного копирования, можно вручную архивировать корневой раздел, можно пользоваться утилитами вроде dd или rsync. А можно написать либо позаимствовать написанный кем-то раньше скрипт, который будет создавать резервные копии самостоятельно. О последнем способе я и хочу написать в этом посте.

Создание резервных копий.

Для начала создадим каталог, куда будут сохраняться архивы. У меня они сохраняются в домашний каталог. Это удобно потому, что у меня 2 логических диска, / и /home и даже при переустановке системы можно форматировать корневой раздел не форматируя /home. И, конечно же, программы при переустановке системы сохраняют все настройки, так как хранятся настройки в домашнем каталоге.

— тильдой обозначается домашний каталог текущего пользователя, то есть вместо mkdir

/backup я мог бы написать mkdir /home/имя_пользователя/backup (естественно, вместо имя_пользователя подставьте свое имя пользователя)
Можете создать каталог где-нибудь еще, только не забудьте потом в самом скрипте в строке cd /home/имя_пользователя/backup /home/имя_пользователя/backup заменить на ваш путь.

Теперь напишем скрипт, который создавал бы резервные копии указанных каталогов в корневом разделе. Автор скрипта — не я, я его нашел и переписал кое-что в нем под себя.

Запускаем текстовый редактор

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

и пишем там такие строки

#!/bin/bash
filename=»`date +%d_%m_%y`.tar.bz2″ # шаблон, который используется для создания имен файлов
cd /home/имя_пользователя/backup # переходим в каталог, в который осуществляется бэкап
echo «`date` — Start» >> /home/имя_пользователя/backup/backup.log # записываем дату и время начала бэкапа
tar cvpjf $filename /bin /boot /dev /etc /lib /opt /root /sbin /srv /usr /var /initrd.img /vmlinuz # перечисляем каталоги в /, которые хотим заархивировать
echo «`date` — Finish» >>/home/имя_пользователя/backup/backup.log # записываем дату и время окончания бэкапа
day=»`date +%d`»
dday=`echo $day-3|bc -l`
dfilename=»`printf ‘%02d’ $dday`_`date +%m_%y`.tar.bz2″
rm /home/имя_пользователя/backup/$dfilename # все 4 строчки нужны для удаления бэкапов двухдневной давности

# в строке tar cvpjf $filename /bin /boot /dev /etc /lib /opt /root /sbin /srv /usr /var /initrd.img /vmlinuz можно сделать более сложные конструкции. Ну, например, убрать /usr, если вам не нужна его копия целиком, а добавить нужные, например /usr/bin, /usr/sbin и так далее.
# И конечно, замените везде имя_пользователя на свое имя пользователя.

Читайте также:  Windows server 2012 sstp vpn server

Делаем этот файл выполняемым

Запускать архивирование можно вручную командой

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

Автоматизация резервного копирования.

Если же вам необходимо запускать автоматически этот скрипт, либо просто лень, то можно автоматизировать запуск. Запланируем, например, запуск скрипта раз в два дня в 17:30. Для этого нам понадобится отредактировать файл /etc/crontab.

Формат записи в этом файле такой:

Минуты (0-59) часы (0-23) день месяца (1-31) месяц (1-12 либо краткое название, например jan, feb…) день недели (0-7, где 0 и 7 обозначают воскресенье; либо краткое название-mon, sun…) имя пользователя, от которого выполняется команда выполняемая команда.

Звездочка (*) обозначает «любой».
Можно использовать дефис (1-3 будет означать, что будет выполняться каждую 1, 2 и 3ю единицу времени), либо перечисление через запятую (2, 3, 5, 10 — соответствующие единицы времени).
Можно использовать смешанные сочетания из дефисов и запятых (1-3, 5, 10 — каждая 1, 2, 3, 5 и 10я единицы времени)
А, например, вот такая */3 строка будет значить, что задание будет выполняться каждую третью единицу времени.

Подробнее о формате записей можно почитать, например, тут

Итак, нам нужно запускать скрипт раз в два дня в 17:30. Смотрим на формат, и пишем такую строчку:

30 17 */2 * * root mybackup >> /dev/null

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

Извлечение из резервной копии.

Извлекать из резервной копии можно, например, загрузившись с Live-CD, или из-под другой ОС Linux. Оба этих вариантов ничем не отличаются, так что рассмотрим только вариант с Live-CD. Кстати, многие Live-CD автоматически ищут и монтируют файловые системы, так что, если у вас такой дистрибутив — можно сразу перейти к извлечению архивной копии, монтировать и размонтировать в этом случае ФС не надо.

Загружаемся с любого Live-CD дистрибутива. Если у вас используется файловая система Ext4, то дистрибутив должен быть с поддержкой этой ФС.

Монтирование файловых систем:

Создадим каталог, в который будет монтироваться корневая файловая система

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

Примонтируем корневую файловую систему в созданный каталог

sudo mount -t ext4 /dev/sda9 /mnt/koren

ext4 — тип файловой системы. Естественно, у вас она может быть другой. Если это так — замените на свой тип.
/dev/sda9— логический раздел, который соответствует корневой ФС. То есть тот, у которого точка монтирования — /.

Если не знаете, как размечен ваш диск, наберите в консоли df -h. Получите примерно такой результат:

Нас интересует строка

и, если домашние каталоги размешены на отдельном разделе, эта:

В случае, если у вас, как у меня, каталог /home находится на отдельном логическом разделе, а архив вы не скопировали предварительно на флешку, то нужно точно так же, как и /, примонтировать /home.

sudo mkdir /mnt/dom
sudo mount -t ext4 /dev/sda10 /mnt/dom

Если же вы скопировали архив на флешку (воткните флешку кстати, если на ней архив;) или /home не на отдельном логическом диске, то это все делать не надо.

Извлечение из архива:

Переходим в каталог, в который примонтировали корневую файловую систему

и разархивируем архивную копию

tar xvpjf /mnt/home/имя_пользователя/backup/имя_файла.tar.bz2

/mnt/dom/имя_пользователя/backup/ — это путь до файла. У меня бэкап хранился в директории /home/имя_пользователя/backup/, а логический диск с /home я примонтировал в каталог /mnt/dom. Естественно, у вас это могут быть другие пути.

Отмонтируем примонтированные файловые системы после окончания извлечения из архива

sudo umount /mnt/koren
sudo umount /mnt/dom

Перезагружаемся и извлекаем диск.

Ссылки: Скрипт, использованный в посте, взят отсюда

Источник

Оцените статью