notes/orangepi5plus_backup.md

148 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Описание процесса создания резервной копии eMMC OrangePi 5 Plus
В OrangePi 5 Plus нельзя изменить приоритет загрузки, в первую очередь загрузка происходит с SD карты, если загрузчик на SD карте не находится, производится попытка загрузки с eMMC и т.д. Таким образом, для того, чтобы создать образ диска eMMC достаточно загрузиться с SD карты и средствами команды `dd` выполнить создание образа диска eMMC.
1. Обеспечить подключение к хранилищу резервных копий по SSH на основе ключа пользователю root, т.к. скрипт будет выполняться от его имени
```bash
root@host-usb:~ $ ssh-keygen
root@host-usb:~ $ ssh-copy-id da2001@nas.dav.lan
```
5. Создать конфигурационный файл EEPROM, который вернёт загрузку на SD
```bash
pi@host-usb:~ $ sudo mkdir /opt/backup_rpi && sudo vim /opt/backup_rpi/sd_eeprom.conf
```
```bash
pi@host-usb:~ $ cat /opt/backup_rpi/sd_eeprom.conf
[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
BOOT_ORDER=0xf1
```
6. Подготовить основной скрипт, который выполнит создание образа SD-карты и передаст его по SSH в сетевое хранилище
```bash
pi@host-usb:~ $ sudo vim /opt/backup_rpi/rpi_backup.sh
```
```bash
#!/bin/bash
###################################################################################################
# Скрипт создаёт образ SD-карты Raspberry PI и отправляет его на удалённый сервер по SSH,
# при этом на удалённом сервере происходит сжатие образа для экономии места.
# Сжатие происходит на удалённом сервере, чтобы минимизировать операции записи на Flash память,
# с которой произведена загрузка RPI.
# После создания образа, происходит обновление конфигурации EEPROM Raspberry PI для загрузки с SD карты.
# В директории с этим скриптом должен находится конфигурационный файл EEPROM - $eeprom_conf
# Для корректной работы скрипта, EEPROM RPI должен поддерживать режим переключения загрузки SD<=>USB.
###################################################################################################
# Убедиться, что запуск происходит от root
if [ "$EUID" -ne 0 ]
then echo "Скрипт необходимо запускать от администратора"
exit
fi
# Удалённый сервер. Необходимо предварительно обеспечить доступ по ключам - ssh-keygen && ssh-sopy-id user@server
server=da2001@nas.dav.lan
# Путь сохранения на удалённом сервре
remote_path=/mnt/main/data/Backup/bastion_rpi
# Директория, в которой хранится конфигурационный файл EEPROM
eeprom_conf_path=/opt/backup_rpi
# Необходимо убедиться, что в папке присутствует конфиг EEPROM для изменения порядка загрузки
eeprom_conf="sd_eeprom.conf"
if [ ! -e "$eeprom_conf_path/$eeprom_conf" ]; then
ssh $server "echo Файл настроек EEPROM $eeprom_conf не найден" > $remote_path/lastlog 2>&1
exit
fi
# Необходимо синхронизировать время, т.к. сейчас оно отстаёт на неделю.
# Для этого используем утилиту ntpdate, Её необходимо заранее установить sudo apt install ntpdate.
ntpdate ntp1.vniiftri.ru
# Имя образа
name=$(echo $(date +%Y-%m-%d)_${HOSTNAME}_image.img.gz | sed 's/-usb//')
# Имя диска, над которым будем работать. SD в RPI называется mmcblk0
disk=/dev/mmcblk0
# запишем в переменную последний сектор последнего раздела диска
last_sector=$(fdisk -l -o end $disk | tail -1)
# Считаем, что размер сектора составляет 512 Байт, тогда необходимо сохранить ($last_sector+1)*512 Байт.
# Или ($last_sector+1)*512/1024/1024 Мб.
count=$(($(($last_sector+1))*512/1024/1024))
# Команда создания образа
dd if=$disk bs=1M count=$count conv=noerror,sync | ssh $server "gzip -c > $remote_path/$name 2>> $remote_path/lastlog" && \
ssh $server "echo `date +"%A, %d %B %Y"` - Образ создан успешно >> $remote_path/log" || \
ssh $server "echo `date +"%A, %d %B %Y"` - При создании образа произошла ошибка >> $remote_path/log"
# Необходимо хранить только последние 20 строк в файле log
ssh $server 'echo "$(tail -5 $remote_path/log)" > $remote_path/log'
# Необходимо хранить только последние 3 резервные копии
count_copies=3
ssh $server "find $remote_path -type f -name '*_image.img.gz' -printf '%T@ %p\n' | sort -nr | cut -d' ' -f 2- | tail -n +$(($count_copies+1)) | xargs rm -f --"
# Необходимо переключить EEPROM на загрузку с SD карты
rpi-eeprom-config -a $eeprom_conf_path/$eeprom_conf
# Перезагрузка
/usr/sbin/reboot
```
Добавить права на выполнение
```bash
pi@host-usb:~ $ sudo chmod +x /opt/backup_rpi/rpi_backup.sh
```
7. Обеспечить выполнение скрипта при загрузке с USB. Сервис systemd
Для этого вам нужно создать скрипт запуска systemd и поместить его в каталог `/etc/systemd/system/`.
```bash
pi@host-usb:~ $ sudo vim /etc/systemd/system/rpi_backup.service
```
```bash
pi@host-usb:~ $ cat /etc/systemd/system/rpi_backup.service
[Unit]
Description=Run a Backup Script at Startup
After=default.target
[Service]
ExecStart=/opt/backup_rpi/rpi_backup.sh
[Install]
WantedBy=default.target
```
Перечитать скрипты и активировать созданный сервис
```bash
pi@host-usb:~ $ sudo systemctl daemon-reload
pi@host-usb:~ $ sudo systemctl enable rpi_backup.service
```
***
<https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#raspberry-pi-4-bootloader-configuration>
<https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#raspberry-pi-4-boot-eeprom>
<https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#BOOT_ORDER>