doc_memo/raspberry-pi/backup-restore.md

267 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Резервное копирование и восстановление Raspberry Pi (Orange Pi)
**Важно:** *На борту моего микрокомпьютера Orange Pi 5 встроен объемный SSD
(смонтированный в `/home/`). Он используется для создания и промежуточного образа системного
SD-накопителя.*
## Для облака _cloud.mail.ru_ или _360.yandex.ru/disk_
### Установка WebDav и подключения "облаков":
Установим поддержку файловой системы WebDav на наш Orange Pi:
```shell
sudo apt-get install davfs2
```
Включим пользователя `[user]`, от имени которого производится резервное копирование
(обычно **pi** -- для Raspberry Pi, и **orangepi** -- для Orange Pi), в группу `davfs2`:
```bash
sudo usermod -aG davfs2 [user]
```
**ВАЖНО** *В дальнейших примерах, хранение резервных копий осуществляется в [инфраструктуре
облака mail.ru (о-drive)](https://cloud.mail.ru/).*
Создадим папку для монтирования "облака" mail.ru:
```shell
sudo mkdir /media/maildisk
```
Дадим права пользователю `[user]` на монтирование "облака":
```shell
sudo chmod 4755 /sbin/mount.davfs
sudo chown -R [user]:[user] /media/maildisk/
```
С 1 января 2022 для подключения "облака" по WebDAV нужно использовать пароль внешнего приложения.
Доступ по обычному паролю закрыт, создать пароль приложения для mail.ru [надо по ссылке](https://help.mail.ru/mail/security/protection/external),
а для Yandex-Disk [тут](https://yandex.ru/support/id/authorization/app-passwords.html#app-passwords__create).
Изменим файл с паролями `/etc/davfs2/secrets` и запишем в него логин и пароль от "облака":
```shell
sudo nano /etc/davfs2/secrets
```
И добавим в конец файла, что-то типа:
```txt
/media/maildisk [ваш-логин]@mail.ru [пароль-внешнего-приложения]
```
К слову сказать, пароль от внешнего приложения через `/etc/davfs2/secrets` срабатывает
не всегда, поэтому я дублирую [пароль-внешнего-приложения] в файл `/media/mailru.pwd`:
```shell
sudo echo "[пароль-внешнего-приложения]" > /media/mailru.pwd
```
Для возможности не только читать, но и писать в облако, надо отредактировать файл
`/etc/davfs2/davfs2.conf` (расположение файла может варьироваться в зависимости от
используемого дистрибутива), найти в нём строчку, начинающуюся `# use_locks`, и заменить
её на:
```txt
use_locks 0
```
### Скрипт резервного копирования в "облако"
Создадим скрипт резервного копирования `backup_orange.sh` (я предпочитаю хранить скрипты
в папке `/home/[user]/scripts/`):
```shell
nano ~/scripts/backup_orange.sh
```
Скрипт резервного копирования (*не забудьте заменить `[user]` и `[login]`*) сохранит
zip-архивы образа flash-накопителя и домашний каталог `/home/` в папку
`/BackUps/orange-pi-home` "облака". Архивы будут разбиты на части по 1 Гб, т.к. облако
не позволяет загружать файлы больше 2 Гб. Старые архивы будут удаляться через 8 дней:
```shell
#!/usr/bin/bash
if [ ! -d /home/[user]/backup ]; then
mkdir -p /home/[user]/backup
fi
if [ ! -d /media/maildisk/BackUps ]; then
mkdir -p /media/maildisk/BackUps
mkdir -p /media/maildisk/BackUps/orange-pi-home
else
if [ ! -d /media/maildisk/BackUps/orange-pi-home ]; then
mkdir -p /media/maildisk/BackUps/orange-pi-home
fi
fi
echo -e "$(date +'%F %R:%S') - делаем образ flash-накопителя на локальный SSD-диск:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - делаем образ flash-накопителя на локальный SSD-диск:\n$(date +'%F %R:%S') - =========================\n"
dd if=/dev/mmcblk1 of=/home/[user]/backup/flash-disk.img >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
ls -alh /home/[user]/backup/flash-disk.img >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================\n";
echo -e "$(date +'%F %R:%S') - монтируем облако mail.ru в папку '/media/maildisk':\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - монтируем облако mail.ru в папку '/media/maildisk':\n$(date +'%F %R:%S') - =========================\n";
mount.davfs -o username=[login]@mail.ru https://webdav.cloud.mail.ru /media/maildisk < /media/mailru.pwd
echo -e "\n$(date +'%F %R:%S') - упаковываем образ flash-накопителя в облако mail.ru:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "\n$(date +'%F %R:%S') - упаковываем образ flash-накопителя в облако mail.ru:\n$(date +'%F %R:%S') - =========================\n";
cd /home/[user]/backup/
/bin/zip -s 1024m -9 /media/maildisk/BackUps/orange-pi-home/flash-disk--$(date +'%F').zip flash-disk.img >> /home/[user]/backup/backup.log
cd /home/[user]/
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
ls -al /media/maildisk/BackUps/orange-pi-home/flash-disk--$(date +'%F').* >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================\n";
echo -e "$(date +'%F %R:%S') - удаляем образ flash-накопителя с локального SSD-диска:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - удаляем образ flash-накопителя с локального SSD-диска:\n$(date +'%F %R:%S') - =========================\n";
rm -f /home/[user]/backup/flash-disk.img
rm -f /home/[user]/backup/flash-disk--*.*
echo -e "$(date +'%F %R:%S') - упаковываем home-том в облако mail.ru:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - упаковываем home-том в облако mail.ru:\n$(date +'%F %R:%S') - =========================\n";
/bin/zip --symlinks -s 1024m -r9q /media/maildisk/BackUps/orange-pi-home/home-volume--$(date +'%F').zip /home/ -x /home/[user]/backup/*.* >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
ls -al /media/maildisk/BackUps/orange-pi-home/home-volume--$(date +'%F').* >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================STOP\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================STOP\n";
echo -e "$(date +'%F %R') - удаляем старые файлы быкапов больше чем за два дня:\n$(date +'%F %R') - =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R') - удаляем старые файлы быкапов больше чем за два дня:\n$(date +'%F %R') - =========================\n";
/usr/bin/find /media/maildisk/BackUps/orange-pi-home/ -mtime +8 -delete >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R') - ВСЕ РЕЗЕРВНЫЕ КОПИИ В ОБЛАКЕ MAIL.RU:\n $(date +'%F %R') =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R') - ВСЕ РЕЗЕРВНЫЕ КОПИИ В ОБЛАКЕ MAIL.RU:\n $(date +'%F %R') =========================\n";
ls -alhc /media/maildisk/BackUps/orange-pi-home/ >> /home/[user]/backup/backup.log
echo -e "=========================\n" >> /home/[user]/backup/backup.log
echo -e "=========================\n";
echo -e "$(date +'%F %R') - Копируем log-бекапа в облако MAIL.RU:\n $(date +'%F %R') =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R') - Копируем log-бекапа в облако MAIL.RU:\n $(date +'%F %R') =========================\n";
cp /home/[user]/backup/backup.log /media/maildisk/BackUps/orange-pi-home/
echo -e "$(date +'%F %R') - отсоединяем облако mail.ru\n $(date +'%F %R') =========================\n" >> /home/[user]/backup/backup.log
echo -e "$(date +'%F %R') - отсоединяем облако mail.ru\n $(date +'%F %R') =========================\n";
umount /media/maildisk >> /home/[user]/backup/backup.log
```
## Для резервного копирования в _SMB-папку_ внутри домашней сети
### Установка Samba клиента:
Скорее всего поддержка **samba** уже включена, но на всякий случай установим её на наш
Orange Pi (если ещё не установлена):
```shell
sudo apt-get install samba samba-client smbclient cifs-utils
```
Создадим папку для монтирования samba-папки:
```shell
sudo mkdir /media/backup
```
Дадим права пользователю `[user]` на запись в samba-папку:
```shell
sudo chown -R 777 /media/backup/
sudo chown -R [user]:[user] /media/backup/
```
### Скрипт резервного копирования в SAMBA-папку внутри домашней сети
Скрипт резервного копирования (*не забудьте заменить `[ip]`, `[user]` и `[login]` -- ip-адрес NAS
в домашней сети, NAS-логин и NAS-пароль*) сохранит zip-архивы образа flash-накопителя и домашний
каталог `/home/` в папку `/NetBackup` на NAS. Старые архивы будут удаляться через 24 дня:
```shell
#!/usr/bin/bash
echo -e "$(date +'%F %R:%S') - монтируем SAMBA '/media/backup':\n$(date +'%F %R:%S') - =========================\n";
mount -t cifs -o username=[user],password=[login] //[ip]/NetBackup /media/backup/
echo -e "$(date +'%F %R:%S') - монтируем SAMBA '/media/backup':\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
if [ ! -d /media/backup/orange-pi-backup ]; then
mkdir -p /media/backup/orange-pi-backup
fi
echo -e "$(date +'%F %R:%S') - делаем образ flash-накопителя на локальный SSD-диск:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - делаем образ flash-накопителя на локальный SSD-диск:\n$(date +'%F %R:%S') - =========================\n"
dd if=/dev/mmcblk1 of=/home/orangepi/backup/flash-disk.img >> /home/orangepi/backup/backup.log
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
ls -alh /home/orangepi/backup/flash-disk.img >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================\n";
echo -e "\n$(date +'%F %R:%S') - упаковываем образ flash-накопителя в SAMBA:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "\n$(date +'%F %R:%S') - упаковываем образ flash-накопителя в SAMBA:\n$(date +'%F %R:%S') - =========================\n";
cd /home/orangepi/backup/
/bin/zip -9 /media/backup/orange-pi-backup/flash-disk--$(date +'%F').zip flash-disk.img >> /media/backup/orange-pi-backup/backup.log
cd /home/orangepi/
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
ls -al /media/backup/orange-pi-backup/flash-disk--$(date +'%F').* >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================\n";
echo -e "$(date +'%F %R:%S') - удаляем образ flash-накопителя:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - удаляем образ flash-накопителя:\n$(date +'%F %R:%S') - =========================\n";
rm -f /home/orangepi/backup/flash-disk.img
echo -e "$(date +'%F %R:%S') - упаковываем home-том в SAMBA:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - упаковываем home-том в SAMBA:\n$(date +'%F %R:%S') - =========================\n";
/bin/zip --symlinks -r9q /media/backup/orange-pi-backup/home-volum--$(date +'%F').zip /home/ -x /home/orangepi/backup/*.* >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
ls -al /media/backup/orange-pi-backup/home-volum--$(date +'%F').* >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================STOP\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R:%S') - =========================STOP\n";
echo -e "$(date +'%F %R') - удаляем старые файлы быкапов больше чем за два дня:\n$(date +'%F %R') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R') - удаляем старые файлы быкапов больше чем за два дня:\n$(date +'%F %R') - =========================\n";
/usr/bin/find /media/backup/orange-pi-backup/ -type f -name "flash-disk--*.*" -mtime +24 -exec rm {} \;
/usr/bin/find /media/backup/orange-pi-backup/ -type f -name "home-volum--*.*" -mtime +24 -exec rm {} \
echo -e "$(date +'%F %R') - ВСЕ РЕЗЕРВНЫЕ КОПИИ В SAMBA:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R') - ВСЕ РЕЗЕРВНЫЕ КОПИИ В SAMBA:\n$(date +'%F %R:%S') - =========================\n";
ls -alhc /media/backup/orange-pi-backup/ >> /media/backup/orange-pi-backup/backup.log
echo -e "=========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "=========================\n";
echo -e "$(date +'%F %R') - отсоединяем SAMBA\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
echo -e "$(date +'%F %R') - отсоединяем SAMBA\n$(date +'%F %R:%S') - =========================\n";
umount /media/backup
```
## Регулярное выполнение резервного копирования
Дадим права на выполнение скрипта:
```shell
sudo chmod +x scripts/backup_orange.sh
```
Запускать скрипт будем через `cron` от root-пользователя, поэтому отредактируем `crontab`:
```shell
sudo crontab -e
```
И добавим в конец файла строку (комментарии добавлять не обязательно):
```txt
# +-------------------------------- минуты (0 - 59)
# | +-------------------------- часы (0 - 23)
# | | +------------------ день месяца (1 - 31)
# | | | +---------- месяц (1 - 12)
# | | | | +-- день недели (0 - 7) (Воскресенье=0 или 7)
# | | | | |
# m h dom mon * команда для исполнения
#--------------------------------------------------------------------------
5 0 * * 1,3,5 bash /home/orangepi/scripts/backup_orange.sh
```
Скрипт будет запускаться каждый понедельник в 00:05. Таким образом в каждый момент времени
в облаке будет храниться две последних резервных копий (за две предыдущих недели).