- Простые инкрементальные бэкапы в Linux с помощью TAR и GPG
- How it works
- Exclude
- Если нужно распаковать
- Autorun
- Remove old backups
- Bash скрипт резервного копирования директорий системы Linux
- Простой сценарий оболочки
- Выполнение сценария
- Выполнение из терминала
- Выполнение с помощью cron
- Восстановление из архива
- Резервное копирование каталога в Ubuntu/Debian по расписанию
- Для того, чтобы настроить простое резервное копирование содержимого директории в Linux (Ubuntu, Debian) необходимо выполнить несколько простых действий. Предположим, что нам необходимо делать резервную копию фалов, загружаемых на сайт, который. Файлы, которые будем копировать находятся в директории /var/www/mysite/files, директория, в которую будем копировать файлы: /mnt/backup_device/mysite_data.
Простые инкрементальные бэкапы в Linux с помощью TAR и GPG
Обожаю UNIX-way, тут бэкапы можно делать значительно более гибкими.
Для бэкапа home директории я использую обычный tar с инкрементацией и шифрую его своим gpg ключом.
Для других файлов, например, для бэкапов моих видео, которые я записываю для ютуба я использую rsync. RSYNC более рационально использовать, когда не критична синхронизация большого количества файлов
#!/bin/bash NOW=$(date +%Y%m%d%H%M) MNOW=$(date +%Y%m) BACKUP_HOME="/tmp/home/" EMAIL="devpew" ARCHIVES_DIR="/tmp/backup/" DOW=`date +%a` # Day of the week e.g. Mon DOM=`date +%d` # Date of the Month e.g. 27 DM=`date +%d%b` # Date and Month e.g. 27Sep if [[ ! -d $$ ]] then mkdir $$ else echo &>/dev/null fi tar --exclude-from=/home/dm/mybin/.backup.excludes -v -z --create --file $$/$.tar.gz --listed-incremental=$$/$.snar $BACKUP_HOME &> $$/$.log if [ $(ls -d $$/*.tar.gz 2> /dev/null | wc -l) != "0" ] then gpg -r $EMAIL --encrypt-files $$/*.tar.gz \ && rm -rf $$/*.tar.gz fi scp $$/$.tar.gz.gpg $$/$.snar dm@192.168.0.152:/home/dm/backup/$
Если нужен более гибкий инкремент второго уровня, например, по неделям, то можно использовать такие условия
DOW=`date +%a` # Day of the week e.g. Mon DOM=`date +%d` # Date of the Month e.g. 27 DM=`date +%d%b` # Date and Month e.g. 27Sep if [ $DOM = "01" ]; then echo 'this is monthly backup' fi if [ $DOW = "Sun" ]; then echo 'this is weekly backup' else echo 'this is daily backup' fi
How it works
Теперь, коротко о том, что делает этот скрипт
Скрипт перейдет в указанную директорию для бекапов и создаст в ней директорию с именем года и месяца в формате “202205” если сейчас май 2022 года.
Далее все бэкапы за май будут находиться в этой папке.
Далее если в папке нет файла с инкрементом (например, мы впервые запустили скрипт или начался новый месяц) то у нас создастся полный бекап всей системы.
В дальнейшем при запуске этого скрипта будут создаваться инкременты от текущего полного бекапа
Кроме того появится файл с логом
После того как у нас сделался бекап, он у нас зашифруется нашим GPG ключом а файл TAR удалится.
После этого мы скопируем наш бэкап к нам на сервер
Exclude
Если нужно задать исключения. То есть файлы или директории, которые не нужно бекапить, то сделать это можно в файле с исключениями. Тут нужно быть аккуратным, любой лишний пробел может все сломать
➜ mybin cat /home/dm/mybin/.backup.excludes /tmp/home/Nextcloud /tmp/home/.cache /tmp/home/youtube-videos
Кроме того, ничего не будет работать, если вы поставите слэш в конце.
Например строка /tmp/home/Nextcloud будет работать, а вот строка /tmp/home/Nextcloud/ работать уже не будет. Так что будьте аккуратны
Если нужно распаковать
У нас делаются инкрементальные бекапы и шифруются. Если нам нужно получить данные, то для начала нам нужно расшифровать файл
Расшифровать можно командой
gpg --output 202205122134.tar.gz --decrypt 202205122134.tar.gz.gpg
После этого, начнем распаковывать tar начиная с самого первого. Для начала распаковываем архив от первого числа.
tar --extract --verbose --listed-incremental=/dev/null --file=202205010101.tar.gz
И после этого распаковываем остальные инкременты, если нужно восстановить состояние системы, например, на 11 число, то нужно последовательно распаковать tar-архивы со 2 по 11 в ту же папку
Если это кажется слишком долгим процессом и вы часто восстанавливаете данные, то можно добавить инкремент второго уровня, например, недельный.
Или если вручную для вас это кажется слишком длительным процессом, можете накидать небольшой скрипт для распаковки. В простейшем случае так:
tar --extract --incremental --file file0.tar tar --extract --incremental --file file1.tar tar --extract --incremental --file file2.tar
for i in *.tbz2; do tar -xjGf "$i"; done;
Если нужно извлечь только конкретные каталоги из архива:
tar -xjGf levelX.tar --wildcards 'example/foo*' 'example/bar*'
Autorun
Если бы в убунте или дебиане, то вам нужно запускать этот скрпит через крон. В арче нет крона и автозапуск делается иначе. В этом примере будем запускать наш скрипт каждый день в 03:30
sudo nvim /usr/lib/systemd/system/backup.service
[Unit] Description=backup [Service] Type=simple ExecStart=/home/dm/mybin/backup
sudo nvim /usr/lib/systemd/system/backup.timer
[Unit] Description=my backup [Timer] OnCalendar=*-*-* 03:30:00 [Install] WantedBy=multi-user.target
После этого можем запустить наш сервис
sudo systemctl start backup.timer sudo systemctl enable backup.timer
После этого проверим добавился ли он командой
sudo systemctl list-timers --all
sudo systemctl status backup.timer
Remove old backups
Кроме того, что мы постоянно создаем бэкапы, нам нужно удалять старые для того чтобы не забить все место на диске. Если у вас есть скрипт для этого поделитесь, а я опубликую сюда ваше решение.
Bash скрипт резервного копирования директорий системы Linux
Одним из самых простых способов резервного копирования системы является использование сценария оболочки. Например, с помощью сценария можно настроить, какие каталоги следует резервировать, и передать эти каталоги в качестве аргументов утилите tar, которая создает архивный файл. Затем архивный файл можно переместить или скопировать в другое место. Архив также может быть создан на удаленной файловой системе, например, на монтируемой системе NFS.
Утилита tar создает один архивный файл из многих файлов или каталогов. tar также может фильтровать файлы с помощью утилит сжатия, тем самым уменьшая размер архивного файла.
Простой сценарий оболочки
Следующий сценарий оболочки использует tar для создания архивного файла на удаленно смонтированной файловой системе NFS. Имя архивного файла определяется с помощью дополнительных утилит командной строки.
#!/bin/bash #################################### # Резервное копирование в NFS. #################################### # Что нужно копировать. backup_files="/home /var/spool/mail /etc /root /boot /opt" # Куда создать резервную копию. dest="/mnt/backup" # Создание имя файла архива. day=$(date +%A) hostname=$(hostname -s) archive_file="$hostname-$day.tgz" # Выведите сообщение о состоянии запуска. echo "Backing up $backup_files to $dest/$archive_file" date echo # Резервное копирование файлов с помощью tar. tar czf $dest/$archive_file $backup_files # Выведите сообщение о завершении работы. echo echo "Backup finished" date # Длинный список файлов в $dest для проверки размеров файлов. ls -lh $dest
- $backup_files: переменная, в которой перечислены каталоги, резервные копии которых вы хотите создать. Список должен быть настроен в соответствии с вашими потребностями.
- $day: переменная, содержащая день недели (понедельник, вторник, среда и т.д.). Это используется для создания архивного файла для каждого дня недели, что дает историю резервного копирования за семь дней. Есть и другие способы добиться этого, включая использование утилиты date.
- $hostname: переменная, содержащая короткое имя хоста системы. Использование имени хоста в имени архивного файла дает возможность размещать ежедневные архивные файлы из нескольких систем в одном каталоге.
- $archive_file: полное имя архивного файла.
- $dest: место назначения архивного файла. Каталог должен быть создан и в данном случае смонтирован перед выполнением сценария резервного копирования. Подробности использования NFS см. в разделе .
- сообщения о состоянии: необязательные сообщения, выводимые на консоль с помощью утилиты echo.
- tar czf $dest/$archive_file $backup_files: команда tar, используемая для создания архивного файла.
- c: создает архив.
- z: фильтрация архива через утилиту gzip, сжимающую архив.
- f: вывод в архивный файл. В противном случае вывод tar будет отправлен в STDOUT.
Это простой пример сценария оболочки резервного копирования; однако существует множество опций, которые можно включить в такой сценарий.
Выполнение сценария
Выполнение из терминала
Самый простой способ выполнения приведенного выше сценария резервного копирования — скопировать и вставить его содержимое в файл. Например, backup.sh. Файл необходимо сделать исполняемым:
Затем из приглашения терминала:
Это отличный способ протестировать сценарий, чтобы убедиться, что все работает так, как ожидалось.
Выполнение с помощью cron
Для автоматизации выполнения скрипта можно использовать утилиту cron. Демон cron позволяет выполнять скрипты или команды в указанное время и дату.
cron настраивается с помощью записей в файле crontab. файлы crontab разделены на поля:
- m: минута, в течение которой выполняется команда, от 0 до 59.
- h: час, в который выполняется команда, от 0 до 23.
- dom: день месяца, в который выполняется команда.
- mon: месяц, в котором выполняется команда, от 1 до 12.
- dow: день недели, в который выполняется команда, от 0 до 7. Воскресенье может быть указано с помощью 0 или 7, оба значения действительны.
- command: команда для выполнения.
Для добавления или изменения записей в файле crontab следует использовать команду crontab -e. Кроме того, содержимое файла crontab можно просмотреть с помощью команды crontab -l.
Чтобы выполнить приведенный выше сценарий backup.sh с помощью cron. Введите в терминале следующую команду:
Использование sudo с командой crontab -e редактирует кронтаб пользователя root. Это необходимо, если вы создаете резервные копии каталогов, доступ к которым имеет только пользователь root.
Добавьте следующую запись в файл crontab:
0 0 * * * bash /usr/local/bin/backup.sh
Теперь сценарий backup.sh будет выполняться каждый день в 12:00 дня.
Сценарий backup.sh необходимо скопировать в каталог /usr/local/bin/, чтобы эта запись выполнялась правильно. Сценарий может находиться в любом месте файловой системы, просто измените путь к сценарию соответствующим образом.
Восстановление из архива
После создания архива важно протестировать его. Архив можно протестировать, перечислив содержащиеся в нем файлы, но лучшим тестом будет восстановление файла из архива.
Чтобы просмотреть список содержимого архива. В терминале введите:
tar -tzvf /mnt/backup/host-Monday.tgz
Чтобы восстановить файл из архива в другой каталог, введите:
tar -xzvf /mnt/backup/host-Monday.tgz -C /tmp etc/hosts
Опция -C в tar перенаправляет извлеченные файлы в указанный каталог. В приведенном выше примере файл /etc/hosts будет извлечен в /tmp/etc/hosts. tar воссоздает структуру каталогов, в которых он находится.
Также обратите внимание, что в пути к восстанавливаемому файлу отсутствует лидирующий символ «/».
Чтобы восстановить все файлы в архиве, выполните следующие действия:
cd / sudo tar -xzvf /mnt/backup/host-Monday.tgz
Это приведет к перезаписи файлов, находящихся в настоящее время в файловой системе.
Резервное копирование каталога в Ubuntu/Debian по расписанию
Для того, чтобы настроить простое резервное копирование содержимого директории в Linux (Ubuntu, Debian) необходимо выполнить несколько простых действий. Предположим, что нам необходимо делать резервную копию фалов, загружаемых на сайт, который. Файлы, которые будем копировать находятся в директории /var/www/mysite/files, директория, в которую будем копировать файлы: /mnt/backup_device/mysite_data.
Напишем простой sh скрипт (назовем его backupdata.sh, он будет лежать в директории /home), который будет копировать все файлы из одной директории в другую:
#!/bin/sh cp -R /var/www/mysite/files/* /mnt/backup_device/mysite_data/
Для того, чтобы запускать скрипт по расписанию воспользуемся программой cron. Предположим, необходимо копировать файлы каждый день в 5 часов утра. Задание будет выглядеть следующим образом:
0 5 * * * sh /home/backupdata.sh
Так же можно упаковывать копируемые файлы в архив. Перепишем backupdata.sh таким образом, чтобы при каждом резервном копировании создавался новый архив директории с датой резервного копирования:
#!/bin/sh tar -cvzf /mnt/backup_device/mysite_data/backup-$(date +"%d.%m.%y").tar.gz /var/www/mysite/files
Таким образом, каждый день в 5 часов утра в директории /mnt/backup_device/mysite_data будет создаваться архив директоии /var/www/mysite/files с названием, например backup-14.07.17.tar.gz.
Установка webmin для операционной системы Armbian (Orange Pi / Raspberry Pi). Install webmin for armbian.
Простая реализация текстового поля с выпадающими подсказками (аналогично поиску у Яндекс и Google) при вводе текста на языке C# WPF. Реализация пользовательского элемента управления в C#/
В заметке описан способ доступа к фронтэнд (frontend) кэшу (cache) advanced приложения из бэкэнда (backend) для php фреймворка Yii2.