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 · Последнее изменение: 2025/04/07 10:39 —