Содержание

OVH — установка любого Windows через bin456789/reinstall

Универсальный способ переустановить выделенный сервер OVH (UEFI) на любую версию Windows с помощью скрипта bin456789/reinstall. Алгоритм проверен на сервере OVH (платформа ASRockRack, AMI UEFI, 2×NVMe, Ryzen). Ниже — пошаговый рецепт «на будущее».

Плейсхолдеры: <SERVER_IP> — адрес сервера; <SSH_USER> / <SSH_PASSWORD> — доступ к установленной Linux/rescue (в Debian это НЕ root, а обычный пользователь с sudo); <WIN_USER> (обычно administrator), <WIN_PASSWORD>, <RDP_PORT> (обычно 3389).

Главная проблема OVH: RAID1 по всем дискам

Инсталлятор OVH ставит Linux на программный RAID1 (mdadm) сразу поверх всех NVMe:

Тогда reinstall.sh в EFI-ветке определяет целевой диск по ESP (/boot/efi → /dev/md1 → lsblk --inverse) и получает два диска — из-за этого efibootmgr собирается криво и падает с ошибкой Could not add efi entry. Главный диск (/ → /dev/md3) тоже даёт два диска, и скрипт уходит в интерактивный выбор. Лечится разбором RAID на всех дисках, кроме целевого.

Шаг 0 — диагностика

Подключаемся к установленной Linux (например, Debian из rescue/инсталлятора OVH) и собираем данные:

ssh <SSH_USER>@<SERVER_IP>
sudo -i
lsblk -o NAME,SIZE,TYPE,PARTUUID,FSTYPE,MOUNTPOINT
cat /proc/mdstat
findmnt -T /boot/efi -no SOURCE        # например /dev/md1
findmnt -no SOURCE /                   # например /dev/md3
lsblk -rn --inverse /dev/md1 | grep -w disk   # два диска = проблема
efibootmgr
mokutil --sb-state                     # должно быть SecureBoot disabled
apt-get install -y mdadm gdisk util-linux efibootmgr

Шаг 1 — разбираем RAID на лишнем диске

Оставляем один целевой диск (например, /dev/nvme0n1), второй (<UNWANTED_DISK>, например /dev/nvme1n1) освобождаем и чистим:

swapoff <UNWANTED_DISK>p4 2>/dev/null
mdadm /dev/md1 --fail <UNWANTED_DISK>p1 && mdadm /dev/md1 --remove <UNWANTED_DISK>p1
mdadm /dev/md2 --fail <UNWANTED_DISK>p2 && mdadm /dev/md2 --remove <UNWANTED_DISK>p2
mdadm /dev/md3 --fail <UNWANTED_DISK>p3 && mdadm /dev/md3 --remove <UNWANTED_DISK>p3
mdadm --zero-superblock <UNWANTED_DISK>p1 <UNWANTED_DISK>p2 <UNWANTED_DISK>p3
sgdisk --zap-all <UNWANTED_DISK>
wipefs -a <UNWANTED_DISK>
efibootmgr -b <BOOT_NUM> -B            # убрать битую запись от стёртого диска

Проверяем, что оба массива теперь указывают только на целевой диск:

lsblk -rn --inverse /dev/md1 | grep -w disk
lsblk -rn --inverse /dev/md3 | grep -w disk

Шаг 2 — (по желанию) восстанавливаем Linux-запись

Если после затирания лишнего диска запись в NVRAM осталась битой, пересоздаём её на целевом диске:

efibootmgr -c -d <TARGET_DISK> -p 1 -L linux -l '\EFI\<distro>\grubx64.efi'

Шаг 3 — запускаем reinstall.sh

cd "$HOME"
curl -fsSL -O https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh
bash reinstall.sh windows \
  --image-name "Windows Server 2022 ServerStandard" \
  --lang en \
  --username <WIN_USER> \
  --password "<WIN_PASSWORD>" \
  --rdp-port <RDP_PORT> \
  --allow-ping \
  --force-boot-mode efi

Аргумент --image-name берётся из списка в README проекта. Для Windows Server 2022: ServerStandard = Desktop Experience (GUI); ServerStandardCore = Core. Для других ОС указывается свой --image-name или свой --iso (ссылка на образ).

Скрипт сам: находит ISO, определяет MAIN DISK, скачивает grub и netboot, собирает initrd, создаёт EFI-запись и выставляет BootNext.

Шаг 4 — ручная перезагрузка

Скрипт сам не перезагружает — перезагружаем вручную:

efibootmgr | head -3     # BootNext должен указывать на новую запись reinstall
sync && reboot

После ребута grub грузит Alpine netboot, он скачивает ISO, распаковывает образ напрямую на диск (wimlib), прописывает BCD и перезагружается уже в Windows.

Шаг 5 — проверка результата

nc -z -G3 <SERVER_IP> <RDP_PORT>          # OPEN = Windows/RDP поднялся

Подключение по RDP с рабочей машины:

xfreerdp /v:<SERVER_IP> /u:<WIN_USER> /p:'<WIN_PASSWORD>' /cert:ignore

Важные нюансы

Полезные ссылки