projects:linux:manual_backup_scripts:create_img
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| projects:linux:manual_backup_scripts:create_img [2025/04/07 10:39] – | projects:linux:manual_backup_scripts:create_img [2025/04/11 17:43] (текущий) – | ||
|---|---|---|---|
| Строка 11: | Строка 11: | ||
| # ==DIS/ | # ==DIS/ | ||
| # === Create Img === | # === Create Img === | ||
| - | # create_image.sh — создание ограниченного образа | + | # 04_create_image.sh — создание ограниченного образа |
| - | # с возможностью сохранить на внешний диск или сетевой ресурс (NAS) | + | # с отключением журналов для минимизации записей на SD карту |
| + | # | ||
| + | |||
| + | echo " | ||
| + | echo " | ||
| set -euo pipefail | set -euo pipefail | ||
| - | # --- Определение источника --- | + | # --- Поиск |
| - | echo " | + | |
| - | mapfile -t SOURCES < <( | + | |
| - | lsblk -nrpo NAME, | + | |
| - | mount=$4; label="" | + | |
| - | if (mount == "/" | + | |
| - | printf(" | + | |
| - | }' | + | |
| - | ) | + | |
| - | + | ||
| - | if [[ ${# | + | |
| - | echo "❌ Нет доступных источников." | + | |
| - | exit 1 | + | |
| - | fi | + | |
| - | + | ||
| - | i=1 | + | |
| - | echo "" | + | |
| - | for src in " | + | |
| - | IFS=":" | + | |
| - | echo "$i - $dev ($size, $fs, $mp)$label" | + | |
| - | ((i++)) | + | |
| - | done | + | |
| - | + | ||
| - | echo "0 - Отмена" | + | |
| - | read -rp "🔍 Выберите | + | |
| - | [[ " | + | |
| - | (( choice < 1 || choice > ${# | + | |
| - | + | ||
| - | SEL_SRC=" | + | |
| - | IFS=":" | + | |
| - | + | ||
| - | if [[ " | + | |
| - | SRC_PARENT=$(lsblk -no PKNAME " | + | |
| - | SRC_PARENT="/ | + | |
| - | else | + | |
| - | SRC_PARENT=" | + | |
| - | fi | + | |
| - | + | ||
| - | # --- Выбор цели ( диск/каталог | + | |
| NAS_PATH="/ | NAS_PATH="/ | ||
| if mountpoint -q " | if mountpoint -q " | ||
| Строка 68: | Строка 34: | ||
| fi | fi | ||
| - | echo "💿 Выберите место для сохранения образа:" | + | echo "💾 Выберите место для сохранения образа:" |
| i=1 | i=1 | ||
| for dev in " | for dev in " | ||
| Строка 80: | Строка 46: | ||
| echo "0 - Отмена" | echo "0 - Отмена" | ||
| - | read -rp "🔍 Ваш выбор: " | + | read -rp "👉 Ваш выбор: " |
| - | [[ " | + | |
| - | (( dchoice < 1 || dchoice > ${# | + | |
| - | SEL_DEV=" | + | if ! [[ " |
| + | echo "❎ Отменено или неверный ввод." | ||
| + | exit 0 | ||
| + | fi | ||
| + | |||
| + | SEL_DEV=" | ||
| IFS=":" | IFS=":" | ||
| - | TEMP_MOUNTED=false | ||
| + | # Проверка на USB (влияние на сеть) | ||
| + | DEV_BUS=$(udevadm info -q property -n " | ||
| + | DEV_USB_DRIVER=$(udevadm info -q property -n " | ||
| + | if [[ " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | fi | ||
| + | |||
| + | # Определение целевого каталога | ||
| + | TEMP_MOUNTED=false | ||
| if [[ " | if [[ " | ||
| TARGET_DIR=" | TARGET_DIR=" | ||
| Строка 106: | Строка 86: | ||
| FIRST_PART=$(lsblk -nrpo NAME " | FIRST_PART=$(lsblk -nrpo NAME " | ||
| if [[ -z " | if [[ -z " | ||
| - | echo "❌ Не найден раздел." | + | echo "❌ Не найден раздел |
| exit 1 | exit 1 | ||
| fi | fi | ||
| if sudo mount " | if sudo mount " | ||
| + | echo "✅ Раздел $FIRST_PART примонтирован в $MNT_PATH" | ||
| TARGET_DIR=" | TARGET_DIR=" | ||
| TEMP_MOUNTED=true | TEMP_MOUNTED=true | ||
| else | else | ||
| - | echo "❌ Не удалось примонтировать." | + | echo "❌ Не удалось примонтировать |
| exit 1 | exit 1 | ||
| fi | fi | ||
| Строка 119: | Строка 100: | ||
| fi | fi | ||
| - | # --- Выбор имени файла --- | + | # --- Подготовка |
| DATE=$(date +%F_%H-%M-%S) | DATE=$(date +%F_%H-%M-%S) | ||
| echo "" | echo "" | ||
| Строка 149: | Строка 130: | ||
| FINAL_IMG=" | FINAL_IMG=" | ||
| - | END_SECTOR=$(sudo fdisk -l "$SRC_PARENT" | awk -v dev="$SRC_DEV" | + | # --- Проверка перезаписи --- |
| - | SECTOR_SIZE=$(sudo blockdev --getss | + | if [[ -f "$FINAL_IMG" |
| + | echo " | ||
| + | read -rp "❗ Перезаписать? | ||
| + | [[ " | ||
| + | fi | ||
| + | |||
| + | # --- Остановка сервисов --- | ||
| + | echo "[*] Остановка логов и фоновых сервисов..." | ||
| + | SERVICES=(" | ||
| + | for svc in " | ||
| + | if systemctl is-active --quiet " | ||
| + | echo " | ||
| + | sudo systemctl stop "$svc" || true | ||
| + | fi | ||
| + | done | ||
| + | sync | ||
| + | sudo sysctl | ||
| + | |||
| + | # --- Расчёт объёма --- | ||
| + | echo "[*] Определение размера / | ||
| + | END_SECTOR=$(sudo fdisk -l /dev/mmcblk0 | awk '/ | ||
| + | SECTOR_SIZE=$(sudo blockdev --getss | ||
| TOTAL_BYTES=$(( (END_SECTOR + 1) * SECTOR_SIZE )) | TOTAL_BYTES=$(( (END_SECTOR + 1) * SECTOR_SIZE )) | ||
| TOTAL_MB=$(( (TOTAL_BYTES + 1024*1024 - 1) / (1024*1024) + 16 )) | TOTAL_MB=$(( (TOTAL_BYTES + 1024*1024 - 1) / (1024*1024) + 16 )) | ||
| + | # --- Снятие образа --- | ||
| echo "[*] Снимаю образ: $FINAL_IMG ($TOTAL_MB МБ)..." | echo "[*] Снимаю образ: $FINAL_IMG ($TOTAL_MB МБ)..." | ||
| - | sudo dd if=" | + | sudo dd if=/ |
| sync | sync | ||
| + | # --- Проверка --- | ||
| if sudo fdisk -l " | if sudo fdisk -l " | ||
| echo "✅ Образ сохранён: | echo "✅ Образ сохранён: | ||
| Строка 165: | Строка 169: | ||
| fi | fi | ||
| - | $TEMP_MOUNTED && sudo umount | + | # --- Очистка --- |
| + | if $TEMP_MOUNTED; then | ||
| + | sudo umount " | ||
| + | fi | ||
| + | |||
| + | # --- Восстановление сервисов --- | ||
| + | echo "[*] Восстановление остановленных сервисов..." | ||
| + | for svc in " | ||
| + | echo " | ||
| + | sudo systemctl start " | ||
| + | done | ||
| exit 0 | exit 0 | ||
| + | |||
| </ | </ | ||
| + | ===== ******* ===== | ||
| + | [[https:// | ||
projects/linux/manual_backup_scripts/create_img.1744011582.txt.gz · Последнее изменение: —
