=== disk_prepare.sh === #!/bin/bash # Финальный эталонный скрипт разметки UEFI (api/disk_prepare.sh) cd "$(dirname "$0")" CONFIG_FILE="install_config.txt" LOG_FILE="/tmp/install.log" # Безопасная функция записи, обходящая конфликты прав http/root log_msg() { echo "$1" | /usr/bin/tee -a "$LOG_FILE" > /dev/null echo "$1" } # ===================================================================== # 1. Принудительное удаление логов и сброс монтирований (Авто-очистка буфера) # ===================================================================== # полностью освобождая виртуальный dev-буфер для нового прогона sudo /usr/bin/umount -l /mnt/dev/pts 2>/dev/null sudo /usr/bin/umount -l /mnt/dev 2>/dev/null sudo /usr/bin/umount -l /mnt/proc 2>/dev/null sudo /usr/bin/umount -l /mnt/sys 2>/dev/null sudo /usr/bin/umount -l /mnt/run 2>/dev/null # чтобы mkfs.vfat никогда не спотыкался о занятые дескрипторы sudo /usr/bin/umount -R /mnt/boot/efi 2>/dev/null # предотвращая аппаратную блокировку "Device or resource busy" sudo /usr/bin/umount -R /mnt 2>/dev/null sudo /usr/bin/umount -R /tmp/recovery_pool 2>/dev/null # полностью освобождая диски sdb и sdc от фоновой блокировки ядра sudo /usr/bin/btrfs device scan --forget 2>/dev/null # Если файл лога существовал, мгновенно стираем его, обходя любые конфликты прав sudo /usr/bin/rm -f "$LOG_FILE" # Создаем абсолютно новый, девственно чистый файл лога echo "[PROGRESS] 0" > "$LOG_FILE" # Сразу даем ему права 666, чтобы в него могли дописывать строки и http, и root (через sudo) /usr/bin/chmod 666 "$LOG_FILE" # Пишем первый синий маркер старта echo "[INFO] Инициализация разметки дисковых массивов Btrfs..." >> "$LOG_FILE" # ===================================================================== if [ ! -f "$CONFIG_FILE" ]; then log_msg "[ERROR] Конфигурация install_config.txt не найдена!" exit 1 fi # ===================================================================== # 2. Чтение конфигурации с ЖЕСТКОЙ зачисткой от символов \r (Windows) # ===================================================================== set -a # Команда tr -d '\r' полностью вычищает скрытые переносы строк Windows source <(tr -d '\r' < "$CONFIG_FILE") set +a # 3. Безопасное уничтожение файла конфигурации на диске # Сохраняем бэкап конфига для system_install.sh перед удалением оригинала cp "$CONFIG_FILE" "install_config.txt.bak" 2>/dev/null /usr/bin/shred -u "$CONFIG_FILE" log_msg "[INFO] Конфигурация импортирована, install_config.txt безвозвратно уничтожен." # ===================================================================== # 4. Сбор дисков из памяти # ===================================================================== log_msg "[PROGRESS] 10" if [ -z "$SELECTED_DISKS" ]; then SELECTED_DISKS="sdb sdc" fi IFS=' ' read -r -a DISKS_ARRAY <<< "$SELECTED_DISKS" # ===================================================================== # НОВОЕ: Динамический сброс таблиц разделов ядра для выбранных дисков # ===================================================================== # Этот цикл заставит ядро Linux принудительно перечитать структуру именно # тех накопителей, которые выбрал пользователь, полностью исключая "Device or resource busy" for raw_disk in "${DISKS_ARRAY[@]}"; do disk=$(echo "$raw_disk" | tr -d '\r') sudo /usr/bin/blockdev --rereadpt "/dev/$disk" 2>/dev/null done # ===================================================================== # 5. Принудительная зачистка (Wipe Out) сигнатур прошлых ФС через sudo # ===================================================================== log_msg "[INFO] Очистка старых таблиц разделов и сигнатур..." for disk in "${DISKS_ARRAY[@]}"; do sudo /usr/bin/wipefs -a -f "/dev/$disk" | /usr/bin/tee -a "$LOG_FILE" > /dev/null 2>&1 done log_msg "[PROGRESS] 20" log_msg "[INFO] Создание новой разметки GPT и UEFI-разделов через fdisk..." # ===================================================================== # 6. Автоматическая нарезка таблиц GPT через fdisk (Чистый синтаксис) # ===================================================================== log_msg "[PROGRESS] 30" for raw_disk in "${DISKS_ARRAY[@]}"; do # Намертво вычищаем фантомные переносы строк из имени каждого диска disk=$(echo "$raw_disk" | tr -d '\r') sudo /usr/bin/fdisk "/dev/$disk" <> "$LOG_FILE" 2>&1 g n 1 +512M t 1 n 2 w EOF done # ИСПРАВЛЕНО: Явное извлечение и очистка имени первого диска для форматирования EFI CLEAN_FIRST_DISK=$(echo "${DISKS_ARRAY[0]}" | tr -d '\r') # Форматируем созданный первый раздел в FAT32 (UEFI) через стабильный mkfs.vfat log_msg "[INFO] Форматируем созданный первый раздел в FAT32 (UEFI) ..." sudo /usr/bin/mkfs.vfat -F 32 "/dev/${CLEAN_FIRST_DISK}1" >> "$LOG_FILE" 2>&1 # ===================================================================== # 7. Форматирование ВТОРЫХ РАЗДЕЛОВ в пул Btrfs RAID-1 (БЕЗОПАСНО) # ===================================================================== log_msg "[PROGRESS] 40" # Используем разделы (sdb2, sdc2), а не диски целиком (sdb, sdc) TARGET_PARTITIONS=$(printf " /dev/%s2" "${DISKS_ARRAY[@]}") if [ "$DISK_MODE" == "raid1" ]; then sudo /usr/bin/mkfs.btrfs -f -d raid1 -m raid1 $TARGET_PARTITIONS | /usr/bin/tee -a "$LOG_FILE" > /dev/null 2>&1 else sudo /usr/bin/mkfs.btrfs -f $TARGET_PARTITIONS | /usr/bin/tee -a "$LOG_FILE" > /dev/null 2>&1 fi # 8. Передача эстафеты следующему этапу log_msg "[INFO] Дисковая структура готова. Переход к клонированию системы..." echo "[PROGRESS] 50" | /usr/bin/tee -a "$LOG_FILE" > /dev/null # ===================================================================== # 🔍 ИНСПЕКЦИЯ ЭТАПА РАЗМЕТКИ И ФОРМАТИРОВАНИЯ (ФИЗИЧЕСКИЙ КОНТРОЛЬ) # ===================================================================== log_msg "[DIAGNOSTIC] === СТАРТ ФИЗИЧЕСКОЙ ПРОВЕРКИ ТАБЛИЦЫ РАЗДЕЛОВ ===" # 1. Выводим реальный статус физических разделов sdb и sdc из ядра Linux sudo /usr/bin/lsblk -o NAME,FSTYPE,SIZE,UUID /dev/sdb >> "$LOG_FILE" 2>&1 sudo /usr/bin/lsblk -o NAME,FSTYPE,SIZE,UUID /dev/sdc >> "$LOG_FILE" 2>&1 # 2. Временно монтируем чистый корень sdb2 наружу для проверки структуры sudo /usr/bin/mkdir -p /tmp/diag_btrfs sudo /usr/bin/mount /dev/sdb2 /tmp/diag_btrfs 2>/dev/null log_msg "[DIAGNOSTIC] Проверка созданных подтомов Btrfs на реальном диске sdb2:" sudo /usr/bin/btrfs subvolume list /tmp/diag_btrfs >> "$LOG_FILE" 2>&1 sudo /usr/bin/umount /tmp/diag_btrfs 2>/dev/null sudo /usr/bin/rmdir /tmp/diag_btrfs log_msg "[DIAGNOSTIC] === КОНЕЦ ФИЗИЧЕСКОЙ ПРОВЕРКИ РАЗМЕТКИ ===" # ===================================================================== sudo -E /srv/http/installer/api/system_install.sh