Небольшая заметка по созданию актуальной копии как MajorDoMo, так и всей ОС с настройками установленными приложениями.
Обновлено 2022-05-13 в связи с изменениями в ядре Debian.
Для корректной работы рекомендую обновлять и загрузочный раздел карты памяти.
Некоторое время назад, я считал, что наиболее лучший способ создания копии SD карты Raspberry является создание образа карты. Но этот способ имеет несколько недостатков: один из которых для создания образа необходим перерыв в работе, к тому же сохранение образа или же восстановление карты памяти может занимать длительное время.
Для себя опробовал несколько измененный вариант резервного копирования.
Нам понадобится ещё одна карта памяти и SD-USB картридер.
Первоначально делаем образ вначале на ПК с помощью программы для работы с образами (я пользуюсь USB Image tool), об его использовании немного написано в одной из заметок Установка базового образа MajorDoMo на Raspberry P... и клонируем на резервную карточку.
Подключаем с помощью картридера в один из USB разъёмов резервную карту памяти.
Проверяем определилась ли карта:
lsblk
ответ системы:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 29.1G 0 disk
├─sda1 8:1 1 43.2M 0 part /boot
└─sda2 8:2 1 14.4G 0 part
mmcblk0 179:0 0 14.5G 0 disk
├─mmcblk0p1 179:1 0 43.2M 0 part
└─mmcblk0p2 179:2 0 14.4G 0 part /*
Можем посмотреть доп информацию:
lsblk -fp
NAME FSTYPE LABEL UUID MOUNTPOINT
https://connect.smartliving.ru/cms/data_images/1453_image.png
├─/dev/sda1 vfat boot 3725-1C05 /boot
└─/dev/sda2 ext4 rootfs fd695ef5-f047-44bd-b159-2a78c53af20a
/dev/mmcblk0
├─/dev/mmcblk0p1 vfat boot 3725-1C05
└─/dev/mmcblk0p2 ext4 rootfs fd695ef5-f047-44bd-b159-2a78c53af20a /
Как видим у нас присутствуют две карты памяти одинаковые по размеры с одинаковыми разделами.
SDA1 - загрузочный раздел резервной карты памяти (установленной в картридер).
SDA2 - корневой раздел со всеми данными.
mmcblk0 основная карта памяти RPI, с которой на данный момент работает система. mmcblk0p1 -загрузочный раздел, mmcblk0p2 корневой раздел.
Создаем папки для монтирования:
sudo mkdir /mnt/usb
sudo mkdir /mnt/usb/backup_root/
sudo mkdir /mnt/usb/backup_boot/
Теперь монтируем карты памяти с помощью команд mount в созданную директорию:
sudo mount /dev/sda1 /mnt/usb/backup_boot/
sudo mount /dev/sda2 /mnt/usb/backup_root/
Можем просмотреть что находится на резервной карте памяти
sudo ls -l /mnt/usb/backup_root/
Создаем файл исключений, того, что не стоит резервировать:
nano /home/pi/not_backup
Со Следующим содержимым:
/boot/*
/debootstrap/*
/dev/*
/media/*
/mnt/*
/proc/*
/sys/*
/tmp/*
/run/*
/var/tmp/*
/var/cache/*
/var/log/*
/var/run/*
И запустим команду на синхронизацию данных (при этом измененные и новые файлы копируются на резервную карту памяти, если на ней есть неактуальные директории и файлы, то они удаляются).
sudo rsync -aHv --delete --delete-after --exclude-from=/home/pi/not_backup / /mnt/usb/backup_root/
sudo rsync -aHv --delete --delete-after /boot/ /mnt/usb/backup_boot/
Первое копирование может занять довольно значительное время, особенно если от момента создания образа, до его синхронизации было много изменений.
Перейдём к нашему " Умному дому".
Открываем Панель управления - Сценарии и создадим новый со следующим содержимым (его я включил в раздел Режимы работы)
$filename = ROOT . '/database_backup/db.sql';
$mysqlDumpPath = "/usr/bin/mysqldump";
$mysqlDumpParam = " --user=" . DB_USER . " --password=" . DB_PASSWORD;
$mysqlDumpParam .= " --no-create-db --add-drop-table --databases " . DB_NAME;
if (file_exists($filename)) rename($filename, $filename . '.prev');
exec($mysqlDumpPath . $mysqlDumpParam . " > " . $filename);
exec ("sudo mkdir -p /mnt/usb/backup_boot");
exec ("sudo mkdir -p /mnt/usb/backup_root");
exec ("sudo mount -p /dev/sda1 /mnt/usb/backup_boot/");
exec ("sudo mount -p /dev/sda2 /mnt/usb/backup_root/");
exec ("sudo rsync -aHv --delete --delete-after --exclude-from=/home/pi/not_backup / /mnt/usb/backup_root/ 2>&1 &");
exec ("sudo rsync -aHv --delete --delete-after /boot/ /mnt/usb/backup_boot/2>&1 &");
say("Сохранение выполнено",2);
Сценарий можно разделить на две части.
Первая по умолчанию при установке из базового образа, база данных сохраняетсь не постоянно, а через 15 минут, поэтому принудительно схраним её.
Вторая часть, практически повторение, то что делали из командной строки: создаем директорию для монтирования (игрнорируя ошибки), монтируем карту памяти в эту директорию и производим синхронизацию, по окончании выдаём отчёт о выполнении.
Переходим в панели управления к Меню Управления и добавим новый раздел BackUpToFlash. Его настройки на скрине:
После этого у нас появится в разделе на главной странице сервис новая кнопка, BackUpToFlash
При нажатии на которую будет выполнена синхронизация данных. В качестве иллюстрации на скрине для проверки приведён htop.
Последнее действие - проверка актуальной версии. Выключаем питание, меняем местами карточки в малинке. При загрузке видим пункт резервного копирования в меню. Значит способ заработал ))
При включенной малине не забываем перед извлечением резрвной карты памяти или картридера необходимо размонтировать карту. Выполняется это командой
umount /dev/sda2
Вот и пока всё, немного добавлю:
у меня работает уже несколько недель, при этом разница с копированием boot раздела не заметил, поэтому этот пункт я осознно пропустил, работает и без него.
В связи с большими обновлениями Debian после выхода заметки, рекомендую обновлять и загрузочный раздел.
При обновлении только корневого раздела, после резервирования данных рабочего на базовый образ (проверено на v 4_44) появляется большое количество проблем (не определяется WiFi, не подключается переферия через usb порты и т.д.)
Второй вариант исправления ситуации - загрузиться с образа и выполнить обновление ОС (sudo apt-get update sudo apt-get upgrade).
На мой взгляд довольно удобная штука не только для создания резервирования, но и для просмотра изменений, отката на рабочую версию, как системы MajorDoMo, так и самой ОС, сторонних сервисов и программ .
Минск, Беларусь
На форуме: udvnl